www.gusucode.com > mbcexpr 工具箱 matlab 源码程序 > mbcexpr/@cgfuncexpr/buildsl.m

    function [h,p,msg] = buildsl(e,blockname,Sopts) %#ok<*INUSD>
%BUILDSL build simulink block for expression
% 
% [h,p,msg] = buildsl(e,blockname,Sopts)

%  Copyright 2007-2012 The MathWorks, Inc. and Ford Global Technologies, Inc.

ename = getname(e);
msg = '';
list = get(e,'ptrlist');

% convert to indexed 
funcStr = convertToIndexedInputs(e);

if length(list)>1 && any(strcmp(e.BlockType,{'Fcn','MATLABFcn'}))
    block = add_block('built-in/SubSystem',blockname,...
        'MakeNameUnique','on',...
        'Tag','FcnSubsystem');
    blockname = [get_param(block,'Parent'),'/',get_param(block,'Name')];
    add_block('built-in/Outport',[blockname,'/y'],...
        'position',[170 20 190 40]);
    
    Fcnblock = createFcnBlock(e,[blockname,'/',ename],funcStr,list);
    ename = get_param(Fcnblock,'Name');
    dport = 'y/1';
    srcport = [ename,'/1'];
    add_line(blockname,srcport,dport,'autorouting','on');
    add_block('cgeqlib/Mux',[blockname,'/',ename,'Mux'],...
        'inputs',num2str(length(list)),...
        'position',[70 20 75 50*length(list)]);
    dport = [ename,'/1'];
    srcport = [ename,'Mux','/1'];
    add_line(blockname,srcport,dport,'autorouting','on');
    for index = 1:length(list)
        add_block('built-in/Inport',[blockname,'/u',num2str(index)],...
            'position',[20 40*(index-1)+30 40 40*(index-1)+50]);
        dport = [ename,'Mux','/',num2str(index)];
        srcport = ['u',num2str(index),'/1'];
        add_line(blockname,srcport,dport,'autorouting','on');
    end
else
    block = createFcnBlock(e,blockname,funcStr,list);

end
h=get_param(block ,'handle');
p=list;

function funcStr = convertToIndexedInputs(e)
% Replace uk sequences with u(k) where k is an integer.  The regexp is broken down as
% follows:
%
% (?<Start>\W|\<)   - match either a non-word or beginning of word
% u                 - match a u
% (?<Num>\d+)   - match a number immediately following u
    % expression bracketed by start or non word and non word or end
funcStr = get(e,'func');
funcStr = regexprep(funcStr, '(?<Start>\W|\<)u(?<Num>\d+)', '$<Start>u\($<Num>\)');
if strcmp(funcStr,get(e,'func')) 
    % if variables are not u1, u2, etc
    vars = getsymbols(e.function);
    if ~isequal(vars,{'u'})
        for i=1:length(vars)
            % replace variables with u(1),u(2),...
            funcStr = regexprep(funcStr, ['(?<Start>\W|\<)',vars{i}],['$<Start>u\(',int2str(i),'\)']);
        end
    end
end

function block = createFcnBlock(e,blockname,funcStr,list)
blk = sprintf( 'built-in/%s',e.BlockType);
block = add_block(blk,blockname,...
    'MakeNameUnique','on',...
    'position',[100 20 170 40]);

switch e.BlockType
    case 'Fcn'
        % change sign to sgn
        funcStr = regexprep(funcStr, '(?<Start>\W|\<)sign\(', '$<Start>sgn\(');
        % change not operators
        funcStr = strrep(funcStr,'~=','!=');
        funcStr = strrep(funcStr,'~','!');
        funcStr = strrep(funcStr,'&','&&');
        funcStr = strrep(funcStr,'|','||');

        set_param(block,'expr',funcStr)
    case 'MATLABFcn'
        set_param(block,'MATLABFcn',funcStr)
    case {'Signum','Abs'}
        % no paramters
    case 'Logic'
        op = e.Operator;
        set_param(block,'Operator',op,'Inputs',int2str(length(list)))
        
    otherwise
        op = e.Operator;
        if strcmp(op,'antilog10')
            op = '10^u';
        end
        set_param(block,'Operator',op)
end
set_param(block,'userdata',address(e),...
    'linkstatus','none',...
    'copyfcn','set_param(gcb,''userdata'',[])');