diff --git a/code/classes/SCDclass_mdspar.m b/code/classes/SCDclass_mdspar.m index d2bb9595dc794a076a6c3be6d8df97ef6e7bbe42..656e6f183565f6f301709268275f9b68bd720d5c 100644 --- a/code/classes/SCDclass_mdspar.m +++ b/code/classes/SCDclass_mdspar.m @@ -32,8 +32,8 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous assignstring % actualizedata specific denanstring % actualizedata specific caststring % actualizedata specific - + unlinked % unlinked parameter, no actualization will be performed (this is set via an empty MDS source path) end properties @@ -75,7 +75,12 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous obj.modelname=obj.cparser.Results.modelname; obj.datadictionary=obj.cparser.Results.datadictname; obj.modeltpstruct=obj.cparser.Results.modeltpstruct; - obj.skippable=obj.cparser.Results.skippable; + obj.skippable=obj.cparser.Results.skippable; + if isempty(obj.cparser.Results.srctdimodel) + obj.unlinked=1; + else + obj.unlinked=0; + end end function name=getmodelname(obj) @@ -96,28 +101,34 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous end function obj=preactualizecommon(obj, shot) - % Opening the tree - obj.mdsconnect(shot); - % Checking if data can be retrieved, updating get command - [obj, obj.value]=obj.getdata(shot); + if(~obj.unlinked) + % Opening the tree + obj.mdsconnect(shot); + % Checking if data can be retrieved, updating get command + [obj, obj.value]=obj.getdata(shot); - pointspos=strfind(obj.modelparam,'.'); - baseparam=obj.modelparam(1:pointspos(1)-1); - structparam=obj.modelparam(pointspos(1):end); - obj.assignvar=sprintf('%s.Value%s',baseparam,structparam); - obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand); - obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar); - obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + pointspos=strfind(obj.modelparam,'.'); + baseparam=obj.modelparam(1:pointspos(1)-1); + structparam=obj.modelparam(pointspos(1):end); + obj.assignvar=sprintf('%s.Value%s',baseparam,structparam); + obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand); + obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar); + obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + end end function obj=postactualizecommon(obj, shot) - if obj.verbose==1 - fprintf('Actualizing parameter: ''%s'' <- ''%s'' (%s, shot %d)\n', obj.modelparam, obj.tdiexprused, obj.classname, shot); - end - - evalin('base', obj.assignstring); - evalin('base', obj.denanstring); - evalin('base', obj.caststring); + if(~obj.unlinked) + if obj.verbose==1 + fprintf('Actualizing parameter: ''%s'' <- ''%s'' (%s, shot %d)\n', obj.modelparam, obj.tdiexprused, obj.classname, shot); + end + + evalin('base', obj.assignstring); + evalin('base', obj.denanstring); + evalin('base', obj.caststring); + else + fprintf('Actualizing parameter: ''%s'', parameter unlinked, SKIPPED!\n', obj.modelparam); + end end function [obj,value]=getdatacommon(obj, shot) @@ -150,13 +161,19 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous function printinfocommon(obj) fprintf('%s (class %s):\n', obj.modelparam, obj.classname); fprintf(' Simulink model: ''%s'', data dictionary: ''%s''\n', obj.modelname, obj.datadictionary); - fprintf(' MDS+ source server: ''%s'', Tree: ''%s''\n', obj.mdsserver, obj.mdstree); - fprintf(' MDS+ TDI expressions, model: ''%s''', obj.tdiexprmodel); - if(strcmp(obj.tdiexprmodel, obj.tdiexprshot)) - fprintf(', shot: same.\n'); + if(~obj.unlinked) + fprintf(' MDS+ source server: ''%s'', Tree: ''%s''\n', obj.mdsserver, obj.mdstree); + fprintf(' MDS+ TDI expressions, model: ''%s''', obj.tdiexprmodel); + if(strcmp(obj.tdiexprmodel, obj.tdiexprshot)) + fprintf(', shot: same.\n'); + else + fprintf(', shot: ''%s''\n', obj.tdiexprshot); + end + else - fprintf(', shot: ''%s''\n', obj.tdiexprshot); + fprintf(' UNLINKED!\n'); end + end function out = gettargetparam(obj) diff --git a/code/classes/SCDclass_mdswgsigarray1.m b/code/classes/SCDclass_mdswgsigarray1.m index 268f288aaacd81399ba1fec3019e21b15801e38f..54096a6b7003d1481635ad83996baccd2cf08c7b 100644 --- a/code/classes/SCDclass_mdswgsigarray1.m +++ b/code/classes/SCDclass_mdswgsigarray1.m @@ -36,7 +36,7 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg obj.srcstopidx=srcinterval(end); obj.deststartidx=dstinterval(1); obj.deststopidx=dstinterval(end); - + obj.classname=mfilename; obj.marteclassname='MDSWgSigArray1'; end @@ -143,7 +143,10 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg end end - function entrystring = genMARTe2entry(obj, shot) + function entrystring = genMARTe2entry(obj, shot) + if(srcstartidx~=deststartidx || srcstopidx~=deststopidx) + error('SCDclass_mdswgsigarray1:genMARTe2entry','Signal position remapping not yet implemented in the MARTe version of this class'); + end entrystring=obj.genMARTe2entrycommon(shot); entrystring=[entrystring ' StartIdx=' num2str(obj.srcstartidx) ' StopIdx=' num2str(obj.srcstopidx) ' }']; end @@ -164,7 +167,7 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg for ii=obj.srcstartidx:obj.srcstopidx expandedtdi = sprintf(obj.tdiexpr, ii); martename=expandedtdi; - sigentry=sprintf(' %s={ NodeName=%s Type=float32 NumberOfElements=1 DataManagement=0 HoleManagement=1 }\n',martename, expandedtdi); + sigentry=sprintf(' %s={ NodeName=%s Type=float32 NumberOfElements=%d DataManagement=0 HoleManagement=1 }\n',martename, expandedtdi); expentries=[expentries sigentry]; end end diff --git a/code/classes/SCDclass_task.m b/code/classes/SCDclass_task.m index 28d77a20f3423d2bfd10b822da4ccd0df1648387..145d698665226195ae394070d582069aff107264 100644 --- a/code/classes/SCDclass_task.m +++ b/code/classes/SCDclass_task.m @@ -9,7 +9,7 @@ classdef SCDclass_task < matlab.mixin.Heterogeneous datadictionary % data dictionary hosting the parameter, if empty base workspace modelname % name of the Simulink model using the parameter classname % class name for logging - + cparser % constructor parameters parser % Properties for a MDS+ related task (not necessarly used) mdsserver % MDS+ server for a MDS+ related task @@ -32,32 +32,34 @@ classdef SCDclass_task < matlab.mixin.Heterogeneous function obj=SCDclass_task(id,varargin) % MDS source and model destination constructor - p=inputParser; - addRequired(p,'id',@(x) ischar(x)); + obj.cparser=inputParser; + addRequired(obj.cparser,'id',@(x) ischar(x)); - addParameter(p,'srcsrv','tcvdata',@(x) ischar(x)); - addParameter(p,'srctree','tcv_shot',@(x) ischar(x)); - addParameter(p,'srctdimodel','',@(x) ischar(x)); - addParameter(p,'srctdishot','',@(x) ischar(x)); - addParameter(p,'modelname','',@(x) ischar(x)); - addParameter(p,'datadictname','',@(x) ischar(x)); - - parse(p,id,varargin{:}{:}); + addParameter(obj.cparser,'srcsrv','tcvdata',@(x) ischar(x)); + addParameter(obj.cparser,'srctree','tcv_shot',@(x) ischar(x)); + addParameter(obj.cparser,'srctdimodel','',@(x) ischar(x)); + addParameter(obj.cparser,'srctdishot','',@(x) ischar(x)); + addParameter(obj.cparser,'modelname','',@(x) ischar(x)); + addParameter(obj.cparser,'datadictname','',@(x) ischar(x)); + + obj.verbose=1; + end + + function obj=parseconstructorcommon(obj, id, varargin) + parse(obj.cparser,id,varargin{:}{:}); - obj.id=p.Results.id; - obj.mdsserver=p.Results.srcsrv; - obj.mdstree=p.Results.srctree; - obj.tdiexprmodel=p.Results.srctdimodel; - if isempty(p.Results.srctdishot) - obj.tdiexprshot=p.Results.srctdimodel; + obj.id=obj.cparser.Results.id; + obj.mdsserver=obj.cparser.Results.srcsrv; + obj.mdstree=obj.cparser.Results.srctree; + obj.tdiexprmodel=obj.cparser.Results.srctdimodel; + if isempty(obj.cparser.Results.srctdishot) + obj.tdiexprshot=obj.cparser.Results.srctdimodel; else - obj.tdiexprshot=p.Results.srctdishot; + obj.tdiexprshot=obj.cparser.Results.srctdishot; end - obj.modelname=p.Results.modelname; - obj.datadictionary=p.Results.datadictname; - - obj.verbose=1; - end + obj.modelname=obj.cparser.Results.modelname; + obj.datadictionary=obj.cparser.Results.datadictname; + end function name=getmodelname(obj) name=obj.modelname; diff --git a/code/classes/SCDclass_taskmdscheckbusnames.m b/code/classes/SCDclass_taskmdscheckbusnames.m index 39cf89b1e1193aede08c8e1e2a1a2e8d62aa93c3..757b859db8fa42dc32bf96ad4e020b4cfe2c7c78 100644 --- a/code/classes/SCDclass_taskmdscheckbusnames.m +++ b/code/classes/SCDclass_taskmdscheckbusnames.m @@ -14,9 +14,11 @@ classdef SCDclass_taskmdscheckbusnames < SCDclass_task methods - function obj=SCDclass_taskmdscheckbusnames(id, modelbus, varargin) + function obj=SCDclass_taskmdscheckbusnames(id, varargin) obj@SCDclass_task(id, varargin); - obj.modelbus=modelbus; + obj.cparser.addRequired('modelbus',@(x) ischar(x)); + obj=obj.parseconstructorcommon(id, varargin); + obj.modelbus=obj.cparser.Results.modelbus; obj.classname=mfilename; end @@ -27,7 +29,7 @@ classdef SCDclass_taskmdscheckbusnames < SCDclass_task [obj,value]=obj.getdata(shot); if obj.verbose==1 - fprintf('Cheking bus: ''%s'' <-> ''%s'' (%s, shot %d)\n', obj.modelbus, obj.tdiexprused, obj.classname, shot); + fprintf('Checking bus: ''%s'' <-> ''%s'' (%s, shot %d)\n', obj.modelbus, obj.tdiexprused, obj.classname, shot); end d=Simulink.data.dictionary.open(sprintf('%s',obj.datadictionary)); diff --git a/code/classes/SCDclass_taskmdsloadprevADC.m b/code/classes/SCDclass_taskmdsloadprevADC.m new file mode 100644 index 0000000000000000000000000000000000000000..817d0e7607e02b5beb9c67c04d9f0af41129f8db --- /dev/null +++ b/code/classes/SCDclass_taskmdsloadprevADC.m @@ -0,0 +1,120 @@ +classdef SCDclass_taskmdsloadprevADC < SCDclass_task + % This is a special class which loads previous + % values of the ADCs for the acquiring nodes + properties + modelbus + node + workspacedatabasestructure + end + + methods + + function obj=SCDclass_taskmdsloadprevADC(id, varargin) + obj@SCDclass_task(id, varargin); + obj.cparser.addRequired('modelbus',@(x) ischar(x)); + obj.cparser.addParameter('node', 0, @(x) (isnumeric(x) && (x==2))); + obj=obj.parseconstructorcommon(id, varargin); + obj.modelbus=obj.cparser.Results.modelbus; + obj.node=obj.cparser.Results.node; + switch(obj.node) + case 2 + obj.workspacedatabasestructure='SCDsimdata.SCDnode02simdata.adc'; + otherwise + obj.workspacedatabasestructure=''; + end + obj.classname=mfilename; + end + + function init(obj, shot) + mdsconnect(obj.mdsserver); + mdsopen(obj.mdstree, shot); + + switch(obj.node) + case 2 + obj.actualizeNode02(shot); + end + end + + function [obj, value] = getdata(obj,shot) + %obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot); + %value=eval(obj.getcommand); + + switch(obj.node) + case 2 + [~,value]=obj.getdataNode02ACQ196(shot); %% Here we need to switch betweeen old and new acquisition unit and tcv standard also + end + end + + function printinfo(obj) + obj.printinfocommon; + fprintf(' Init model bus: %s, node: %d, ws base struct: %s\n',obj.modelbus, obj.node, obj.workspacedatabasestructure); + end + + end + + methods(Access = private) + + function obj = actualizeNode02(obj, shot) + dd=SCDconf_getdatadict(obj.datadictionary); + adcbus=dd.getEntry(obj.modelbus).getValue; + [~,data]=obj.getdata(shot); + T=timeseries; + if obj.verbose==1 + fprintf('Actualizing data for bus: ''%s'' (%s, shot %d) ', obj.modelbus, obj.classname, shot); + end + for ii=1:192 + T.Time=data.Time; + T.Data=int16(data.Data(:,ii)); + assignin('base','temp',T); + assigncmd=sprintf('%s.%s=temp;',obj.workspacedatabasestructure, adcbus.Elements(ii).Name); + evalin('base',assigncmd); + if obj.verbose==1 && mod(ii,4)==0 + fprintf('.'); + end + end + evalin('base','clear temp'); + if obj.verbose==1 + fprintf('\n'); + end + end + + function [obj, value] = getdataNode02ACQ196(obj, shot) + T=timeseries; + timebase=mdsvalue('dim_of(\top.crpprt02.board1.adc_01)'); %% TODO: check with marte + d_time = double(mdsvalueraw( '\top.crpprt02.params:d_time' ))*1.0e-6; + %timebase = round(timebase.*1/d_time)*d_time-d_time/2; + timebase = round(timebase.*1/d_time)*d_time-d_time/100; + T.Time=timebase; + T.Data=zeros(numel(timebase),192); + if obj.verbose==1 + fprintf('Getting data for bus: ''%s'' (%s, shot %d) ', obj.modelbus, obj.classname, shot); + end + for ii=1:96 + % NOTE: physical2logical remapping is only for + % data acquired with the present ACQ196 system + % it must go away when using the new ACQ2106 system + %fprintf('Loading channel %d:%d ...\r',1,physical2logical(ii)); + + channelstr=sprintf('\\top.crpprt02.board1.adc_%02d.raw',physical2logical(ii)); + T.Data(:,ii)=int16(mdsvalue(channelstr)); + if obj.verbose==1 && mod(ii,4)==0 + fprintf('.'); + end + end + for ii=1:96 + %fprintf('Loading channel %d:%d ...\r',2,physical2logical(ii)); + channelstr=sprintf('\\top.crpprt02.board2.adc_%02d.raw',physical2logical(ii)); + T.Data(:,ii+96)=int16(mdsvalue(channelstr)); + if obj.verbose==1 && mod(ii,4)==0 + fprintf('.'); + end + end + value=T; + if obj.verbose==1 + fprintf('\n'); + end + end + + end +end +