classdef SCDclass_mdsobjcontainer % This class is a container class % for all MDS objects required for handling % a no-nocompile Simulink SCD model % % Presently it implements methods for handling % objects of the following classes: % SCDclass_mdsparam (and childrens) % SCDclass_mdswavegen (and childrens) properties numparams % number of configured params objects mdsparams % params objects array numwavegens % number of configured wavegens objects mdswavegens % wavegens objects array simstructlist % list of names of simstructs to be transferred to % base workspace upon expcode setup modeltoactualize % model name to actualize ('all' for all) modeltogenerate % model name to generate conf script ('all' for all) end methods function obj = SCDclass_mdsobjcontainer() % contructor, empty container obj.numparams=0; obj.numwavegens=0; obj.modeltoactualize='all'; obj.modeltogenerate='all'; end function obj = addparameter(obj, param) % Adds a parameter object if obj.numparams==0 obj.mdsparams=param; else obj.mdsparams=[obj.mdsparams; param]; end obj.numparams=obj.numparams+1; end function obj = printparameters(obj) % prints the parameters object list if obj.numparams>0 for ii=1:obj.numparams obj.mdsparams(ii).printinfo(); end end end function obj = actualizeparameters(obj, shot) % actualize the parameters on the gove data dictionary, % naive version with a mds acces for every parameter if obj.numparams>0 for ii=1:obj.numparams if(strcmp(obj.modeltoactualize,'all')) obj.mdsparams(ii).actualizedata(shot); else if(strcmp(obj.modeltoactualize,obj.mdsparams(ii).getmodelname)) obj.mdsparams(ii).actualizedata(shot); end end end end end function obj = bindparameters(obj, modelname, datadictionary, exportedtps) if obj.numparams>0 for ii=1:obj.numparams obj.mdsparams(ii)=obj.mdsparams(ii).setmodelname(modelname); obj.mdsparams(ii)=obj.mdsparams(ii).setdatadictionary(datadictionary); end if numel(exportedtps)>0 for ii=1:obj.numparams obj.mdsparams(ii)=obj.mdsparams(ii).setparamstructure(exportedtps{end}); end end end end function obj = bindlastparameter(obj, modelname, datadictionary, exportedtps) if obj.numparams>0 obj.mdsparams(end)=obj.mdsparams(end).setmodelname(modelname); obj.mdsparams(end)=obj.mdsparams(end).setdatadictionary(datadictionary); if numel(exportedtps)>0 obj.mdsparams(end)=obj.mdsparams(end).setparamstructure(exportedtps{end}); end end end function obj = addwavegen(obj, wavegen) % adds a wavegen object if obj.numwavegens==0 obj.mdswavegens=wavegen; else obj.mdswavegens=[obj.mdswavegens; wavegen]; end obj.numwavegens=obj.numwavegens+1; end function obj = bindlastwavegen(obj, modelname, datadictionary, timingsrc) if obj.numwavegens>0 obj.mdswavegens(end)=obj.mdswavegens(end).setmodelname(modelname); obj.mdswavegens(end)=obj.mdswavegens(end).setdatadictionary(datadictionary); obj.mdswavegens(end)=obj.mdswavegens(end).settiminginfo(timingsrc); end end function obj = setwavegenbasestruct(obj, basestruct) if obj.numwavegens>0 for ii=1:obj.numwavegens obj.mdswavegens(ii)=obj.mdswavegens(ii).setbasestruct(basestruct); end end end function obj = printwavegens(obj) % prints the wavegen list if obj.numwavegens>0 for ii=1:obj.numwavegens obj.mdswavegens(ii).printinfo(); end end end function obj = actualizewavegens(obj, shot) % actualize the wavegen waves timeseries % naive version, a mds connection is called for every object if obj.numwavegens>0 for ii=1:obj.numwavegens if(strcmp(obj.modeltoactualize,'all')) obj.mdswavegens(ii).actualizedata(shot); else if(strcmp(obj.modeltoactualize,obj.mdswavegens(ii).getmodelname)) obj.mdswavegens(ii).actualizedata(shot); end end end end end function obj = cleanwavegens(obj) % clean wavegens leaving a consistent (with model buses) % empty timeseries data structure if obj.numwavegens>0 for ii=1:obj.numwavegens obj.mdswavegens(ii).cleandata; end end end function obj = importmdsobjects(obj, source) % parameters import destparamtargets={}; if obj.numparams>0 for ii=1:obj.numparams destparamtargets{end+1}=obj.mdsparams(ii).gettargetparam; end end numparamstoimport = source.numparams; paramstoimport = source.mdsparams; if numparamstoimport>0 for ii=1:numparamstoimport if ~ismember(paramstoimport(ii).gettargetparam, destparamtargets) obj=obj.addparameter(paramstoimport(ii)); else warning('SCDclass_mdsobjcontainer:importmdsobjects','A mds object driving ''%s'' is already present in the dest. expcode, skipping!',paramstoimport(ii).gettargetparam); end end end % wavegens import destwavegentargets={}; if obj.numwavegens>0 for ii=1:obj.numwavegens destwavegentargets{end+1}=obj.mdswavegens(ii).gettargetwavegen; end end numwavegenstoimport = source.numwavegens; wavegenstoimport = source.mdswavegens; if numwavegenstoimport>0 for ii=1:numwavegenstoimport if ~ismember(wavegenstoimport(ii).gettargetwavegen, destwavegentargets) obj=obj.addwavegen(wavegenstoimport(ii)); else warning('SCDclass_mdsobjcontainer:importmdsobjects','A mds object driving ''%s'' is already present in the dest. expcode, skipping!',wavegenstoimport(ii).gettargetwavegen); end end end end function printMARTe2parconfig(obj, shot) switch obj.modeltogenerate case 'all' iorder = getParamsServerTreeOrder(obj); % order entries following mdsserver, mdstree order prevServer = ''; % init % Header for MDS for loader %loaderStr = sprintf('\n\n+MDSParameters = {\n Class=MDSObjLoader\n Shot=%d\n',shot); loaderStr = sprintf('\n\n+MDSParameters = {\n Class=MDSObjLoader\n Shot=MDSSRCSHOT\n'); fprintf("%s",loaderStr); for ii=1:obj.numparams mymdsparam = obj.mdsparams(iorder(ii)); currentServer = mymdsparam.getMDSserver; % generate header for MDSsource if necessary if ~strcmp(currentServer,prevServer) %if a new server needs to be opened if ii~=1, fprintf(' }\n'), end % close bracket for previous one % print new source header fprintf("%s\n",mymdsparam.genMARTe2MDSsourcestr); end prevServer = currentServer; % generate data source entry str = mymdsparam.genMARTe2entry(shot); fprintf(" %s\n",str); end fprintf(" }\n}\n\n"); otherwise for ii=1:obj.numparams if(strcmp(obj.modeltogenerate,obj.mdsparams(ii).getmodelname)) str=obj.mdsparams(ii).genMARTe2entry(shot); fprintf(" %s\n",str); end end end end function iorder = getParamsServerTreeOrder(obj) % find server-tree order of parameters mdsservertree = cell(numel(obj.mdsparams),2); for ii=1:numel(obj.mdsparams) mdsservertree{ii,1} = obj.mdsparams(ii).getMDSserver; mdsservertree{ii,2} = obj.mdsparams(ii).getMDStree; end [~,iorder] = sortrows(mdsservertree); end function printMARTe2wgconfig(obj, shot) for ii=1:obj.numwavegens if(strcmp(obj.modeltogenerate,'all')) str=obj.mdswavegens(ii).genMARTe2entry(shot); fprintf(" %s\n",str); else if(strcmp(obj.modeltogenerate,obj.mdswavegens(ii).getmodelname)) str=obj.mdswavegens(ii).genMARTe2entry(shot); fprintf(" %s\n",str); end end end end function overalldim = printMARTe2wgbusconfig(obj, shot, ddname, busname) dd=SCDconf_getdatadict(ddname); bus=dd.getEntry(busname).getValue; nelems=numel(bus.Elements); server=''; tree=''; dimension=0; for elem=1:nelems signame=bus.Elements(elem).Name; found=false; for wgs=1:obj.numwavegens %signame %obj.mdswavegens(wgs).gettarget if(strcmp(obj.mdswavegens(wgs).gettarget,signame)) found=true; break; end end if(~found) error('SCDclass_mdsobjcontainer:wgnotfound','Signal %s not found in configured wavegens objects', signame); else actserver=obj.mdswavegens(wgs).getMDSserver; acttree=obj.mdswavegens(wgs).getMDStree; if(~strcmp(actserver,server) || ~strcmp(acttree,tree)) if(~strcmp(server,'') || ~strcmp(tree,'')) error('SCDclass_mdsobjcontainer:multipleconnections','multiple MDS+ connections/trees not supported within the same wavegen generator'); else server=actserver; tree=acttree; fprintf(' Server=%s\n', server); fprintf(' Tree=%s\n', tree) end end entrystring=obj.mdswavegens(wgs).genMARTe2entry(shot); fprintf(' %s\n', entrystring); dimension=dimension+bus.Elements(elem).Dimensions; end end overalldim=dimension; end function iorder = getWavegensServerTreeOrder(obj) % find server-tree order of wavegens mdsservertree = cell(numel(obj.mdswavegens),2); for ii=1:numel(obj.mdswavegens) mdsservertree{ii,1} = obj.mdswavegens(ii).getMDSserver; mdsservertree{ii,2} = obj.mdswavegens(ii).getMDStree; end [~,iorder] = sortrows(mdsservertree); end end end