function [x,y,typ]=MBLOCK(job,arg1,arg2) // // Copyright INRIA Oct 2006 x=[];y=[];typ=[]; select job case 'plot' then standard_draw(arg1) case 'getinputs' then [x,y,typ]=standard_inputs(arg1) case 'getoutputs' then [x,y,typ]=standard_outputs(arg1) case 'getorigin' then [x,y]=standard_origin(arg1) case 'set' then x=arg1 model=arg1.model graphics=arg1.graphics //label=graphics.exprs; exprs=graphics.exprs //Compatibility if type(exprs)==15 then paramv=list(); pprop=[]; //must do something better than that ! for i=1:size(model.rpar,'*') paramv($+1)=string(model.rpar(i)) pprop($+1) = 0 end exprs = tlist(["MBLOCK","in","intype","out","outtype",... "param","paramv","pprop","nameF","funtxt"],... exprs(1)(1),.. exprs(1)(2),.. exprs(1)(3),.. exprs(1)(4),.. exprs(1)(5),.. paramv,... sci2exp(pprop(:)),.. exprs(1)(7),exprs(2)) end //lab_1 = [in,intype,out,outtype,param,nameF] lab_1 = list(exprs.in,.. //1 exprs.intype,.. //2 exprs.out,.. //3 exprs.outtype,.. //4 exprs.param,.. //5 exprs.pprop,.. //6 exprs.nameF) //7 //lab_2 = [paramv] lab_2 = exprs.paramv //already a list //store exprs before modif //exprs.prev_exprs=exprs; //exprs.prev_exprs.prev_exprs=tlist("MBLOCK"); while %t do // [ok,Tin,Tintype,Tout,Touttype,Tparam,Tparamv,Tfunam,lab]=.. // getvalue('Set Modelica generic block parameters',.. // ['Input variables: ';.. // 'Input variables types: ';.. // 'Output variables: ';.. // 'Output variables types:';.. // 'Parameters in Modelica:';.. // 'Parameter values: ';.. // 'Function name: '],.. // list('str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1),label(1)) //warning here lab_1 is a list [ok,Tin,Tintype,Tout,Touttype,Tparam,pprop,Tfunam,lab_1]=.. getvalue('Set Modelica generic block parameters',.. ['Input variables ';.. 'Input variables types ';.. 'Output variables ';.. 'Output variables types';.. 'Parameters in Modelica';.. 'Parameters properties ';.. 'Function name '],.. list('str',-1,'str',-1,'str',-1,'str',-1,'str',-1,.. 'vec',-1,'str',-1),lab_1) //Cancel case if ~ok then break end // ierr=execstr("in=stripblanks(evstr(Tin));.. // intype=stripblanks(evstr(Tintype));.. // out=stripblanks(evstr(Tout));.. // outtype=stripblanks(evstr(Touttype));.. // param=stripblanks(evstr(Tparam));.. // paramv=evstr(Tparamv);.. // funam=stripblanks(Tfunam)",'errcatch') // //first stage of checking variable name //put string symbolic parameters in variable ierr=execstr("in=stripblanks(evstr(Tin));.. intype=stripblanks(evstr(Tintype));.. out=stripblanks(evstr(Tout));.. outtype=stripblanks(evstr(Touttype));.. param=stripblanks(evstr(Tparam));.. funam=stripblanks(Tfunam)",'errcatch') if ierr<>0 then //You loose ! Try again ! Insert coin ! //x_message("Error, try again please!") x_message("Error in evaluation of variables.") ok=%f //break end //check for valid name variable //in if ok then for i=1:size(in,'*') r=%f; ierr=execstr('r=validvar(in(i))','errcatch') if ~r then ok=%f break end end if ~ok then x_message(["Invalid variable name for the input "+string(i)+"."; """"+in(i)+""""; "Please choose another variable name."] ); end end //out if ok then for i=1:size(out,'*') r=%f; ierr=execstr('r=validvar(out(i))','errcatch') if ~r then ok=%f break end end if ~ok then x_message(["Invalid variable name for the output "+string(i)+"."; """"+out(i)+""""; "Please choose another variable name."] ); end end //param if ok then param=param(:) for i=1:size(param,'*') r=%f; ierr=execstr('r=validvar(param(i))','errcatch') if ~r then ok=%f break end end if ~ok then x_message(["Invalid variable name for the parameter "+string(i)+"."; """"+param(i)+""""; "Please choose another variable name."] ); end end // type checking //typeok=%t; if ok then for i=1:size(intype,'*') if intype(i)<>'E'&intype(i)<>'I' then //typeok=%f; x_message("Input type should be ''E'' or ''I''!"); ok=%f break end end end // if ~typeok then // ok=%f // //break // end if ok then for i=1:size(outtype,'*') if outtype(i)<>'E'&outtype(i)<>'I' then //typeok=%f; x_message("Output type should be ''E'' or ''I''!"); ok=%f break end end end // if ~typeok then break, end //cross size checking if ok then if or(size(intype)<>size(in)) then x_message("Input variables are not well defined!"); ok=%f //break; end end if ok then if or(size(outtype)<>size(out)) then x_message("Output variables are not well defined!"); ok=%f //break; end end //check param properties if ok then pprop = pprop(:) if (size(param,'*')<>size(pprop,'*')) then x_message(["There is differences in"; "size of param and size "; "of param properties." ]) ok=%f //break; end end if ok then if max(pprop)>2 | min(pprop)<0 then x_message(["Parameters properties must be :"; "0 : if it is a paramaters"; "1 : if it is an initial value of state,"; "2 : it it is a fixed initial state value." ]) ok=%f //break; end end //check name of modelica file if ok then if funam=='' then x_message("The filename is not defined!") ok=%f //break end end if ok then [dirF,nameF,extF]=fileparts(funam); if (extF<>'' & extF<>'.mo')|(dirF<>'' & extF<>'.mo') then x_message("Filename extention should be ''.mo '' !") ok=%f //break end end if ok then //set_io checking intypex=find(intype=='I'); outtypex=find(outtype=='I'); //[model,graphics,ok]=check_io(model,graphics,ones(in),.. // ones(out),[],[],intypex,outtypex) [model,graphics,ok]=set_io(model,graphics,list([ones(in),ones(in)],ones(in)),.. list([ones(out),ones(out)],ones(out)),.. [],[],intypex,outtypex) end //***************************************************************************** //generate second dialog box from Tparam if ok then Tparam_lab=evstr(Tparam) //labels Tparam_sz=size(Tparam_lab,'*') //numbers of labels //adjust size of lab_2 according to size of Tparam lab_2_tmp=list();ee=evstr(exprs.param); for i=1:Tparam_sz flg=0; for j=1:size(ee,'*') if ee(j)==Tparam_lab(i) then lab_2_tmp(i)=lab_2(j); flg=1; break end end if flg==0 then lab_2_tmp(i)="0";end end lab_2=lab_2_tmp //generate lhs, label and rhs txt for getvalue if Tparam_sz<>0 then //if param lhs_txt="" //lhs txt lab_txt="" //label txt rhs_txt="" //rhs txt for i=1:Tparam_sz lhs_txt=lhs_txt+'%v'+string(i)+',' if pprop(i) == 0 then lab_txt=lab_txt+''''+Tparam_lab(i)+''';' elseif pprop(i) == 1 then lab_txt=lab_txt+''''+Tparam_lab(i)+' (state) '';' elseif pprop(i) == 2 then lab_txt=lab_txt+''''+Tparam_lab(i)+' (fixed state) '';' end rhs_txt=rhs_txt+'''vec'',-1,' end lhs_txt=part(lhs_txt,1:length(lhs_txt)-1) lab_txt=part(lab_txt,1:length(lab_txt)-1) rhs_txt=part(rhs_txt,1:length(rhs_txt)-1) //generate main getvalue cmd //warning here lab_2 is a list in input and a string in output getvalue_txt = '[ok,'+lhs_txt+',lab_2]=getvalue(''Set parameters values'',['+.. lab_txt+'],'+.. 'list('+rhs_txt+'),lab_2)' //display the second dialog box execstr(getvalue_txt) //restore original lab_2 if not ok if ~ok then lab_2 = exprs.paramv end end end //put output param in the form of a list //in paramv if ok then paramv=list(); for i=1:Tparam_sz execstr('paramv('+string(i)+')=%v'+string(i)) end end //***************************************************************************** //============================---------MBLOCK2 if ok then if extF=='.mo' & fileinfo(funam)<>[] then tt=mgetl(funam) else tt=exprs.funtxt mo=model.equations //if mo.model<>nameF then // tt=[] //end end //============================ [ok,tt]=MODCOM(funam,tt,in,out,param,paramv,pprop) if ~ok then break end end if ok then //------------------ mo=modelica() mo.model=nameF mo.inputs=in; mo.outputs=out; if max(pprop)>0 then mo.parameters=list(param',paramv,pprop') else mo.parameters=list(param',paramv) end model.equations=mo //------------------ //model.rpar=paramv; model.rpar=[] for i=1:lstsize(paramv) model.rpar=[model.rpar; double(paramv(i)(:))]//value end model.sim(1)=funam //------------------ exprs.in=lab_1(1) exprs.intype=lab_1(2) exprs.out=lab_1(3) exprs.outtype=lab_1(4) exprs.param=lab_1(5) exprs.paramv=list(); if Tparam_sz<>0 then //if param if type(lab_2)==15 then //for eval for i=1:lstsize(lab_2) exprs.paramv(i)=lab_2(i);//string end else for i=1:size(lab_2,'*') exprs.paramv(i)=lab_2(i); end end end exprs.pprop=lab_1(6) exprs.nameF=lab_1(7) exprs.funtxt=tt //label(2)=tt //------------------ x.model=model graphics.gr_i(1)(1)='txt=[''Modelica'';'' ' + nameF + ' ''];' graphics.in_implicit =intype graphics.out_implicit=outtype //graphics.exprs=label graphics.exprs=exprs x.graphics=graphics break end end //Define case 'define' then in=['u1'] intype=['I'] out=['y1';'y2'] outtype=['I';'E'] param=['R';'L']; //paramv=[0.1;0.0001]; paramv=list(0.1,.0001) pprop=[0;0]; nameF='generic' //label=list([sci2exp(in),sci2exp(intype,sci2exp(out),.. // sci2exp(outtype),sci2exp(param),sci2exp(paramv),nameF]',[]) exprs = tlist(["MBLOCK","in","intype","out","outtype",... "param","paramv","pprop","nameF","funtxt"],... sci2exp(in(:)),.. sci2exp(intype(:)),.. sci2exp(out(:)),.. sci2exp(outtype(:)),.. sci2exp(param(:)),.. list(string(0.1),string(.0001)),... sci2exp(pprop(:)),.. nameF,[]) model=scicos_model() model.blocktype='c' model.dep_ut=[%f %t] //model.rpar=paramv; model.rpar=[] for i=1:lstsize(paramv) model.rpar=[model.rpar; paramv(i)(:)] end mo=modelica() mo.model=nameF mo.parameters=list(param,paramv) model.sim=list(mo.model,30004) mo.inputs=in mo.outputs=out model.in=ones(size(mo.inputs,'r'),1) model.out=ones(size(mo.outputs,'r'),1) model.equations=mo gr_i=['txt=[''Modelica'';'' '+nameF+' ''];'; 'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'')'] //x=standard_define([3 2],model,label,gr_i) x=standard_define([3 2],model,exprs,gr_i) x.graphics.in_implicit =intype x.graphics.out_implicit=outtype end endfunction