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'',[])');