Skip to content
Snippets Groups Projects
Commit 3049ddbb authored by Federico Felici's avatar Federico Felici
Browse files

Update SCDsignal for Simulink use

parent 6a2af3dc
No related branches found
No related tags found
No related merge requests found
......@@ -2,8 +2,8 @@ classdef SCDsignal
properties
Value {mustBeNumericOrLogical,mustBeNonempty} = 0;
QualityTag (1,1) QualityTag = 0;
ProductionState (1,1) ProductionState = 0;
QualityTag (1,1) QualityTag = 'INVALID';
ProductionState (1,1) ProductionState = 'STOPPED';
end
methods
......@@ -49,9 +49,9 @@ classdef SCDsignal
function valid = isvalid(obj)
% true if GOOD and RUNNING
isRunning = (obj.ProductionState == 'RUNNING');
isGood = (obj.QualityTag == 'GOOD');
valid = isRunning && isGood;
isRunning = ([obj.ProductionState] == 'RUNNING');
isGood = ([obj.QualityTag] == 'GOOD');
valid = isRunning & isGood;
end
function [BusesObj] = createBus(obj)
......
function [BusObjList,BusNameList] = SCDsignal_struct_to_bus(mystruct,BusName,busDescription)
% convert struct to bus objects and names names
% Generalises Simulink.Bus.CreateObject but allows SCDsignals to be in
% some of the leaves.
if nargin==2, busDescription = ''; end
BusObjList = {}; BusNameList = {}; % init
fields = fieldnames(mystruct)';
nFields = numel(fields);
Elems = repmat(Simulink.BusElement,nFields,1);
for ii=1:nFields
myfield = fields{ii};
Name = myfield;
Value = mystruct.(myfield);
% fill element datatype and size depending on example value object
if isnumeric(Value) || islogical(Value) % accepted regular types
DataType = class(Value);
if isvector(Value), Dimensions = numel(Value);
else, Dimensions = size(Value) ;
end
else
% this node is a bus in itself
if isa(Value,'SCDsignal') % Special SCDsignal class
newBusName = Value.BusName; % use SCDsignal method to get bus name
newBusObj = Value.createBus; % use SCD signal method to create bus;
elseif isstruct(Value)
% recurse
[newBusObj,newBusNameList] = SCDsignal_struct_to_bus(Value,[Name,'Bus']);
BusNameList = [newBusNameList(2:end),BusNameList]; %#ok<AGROW> % append these
newBusName = [Name,'Bus'];
else
error('Unsupported datatype %s',class(Value));
end
Dimensions = 1;
DataType = newBusName;
if ~any(strcmp(BusNameList,newBusName)) % Bus not yet defined
% add Buses generated here to list
BusObjList = [{newBusObj}, BusObjList]; %#ok<AGROW> % add to list of buses
BusNameList = [newBusName, BusNameList]; %#ok<AGROW>
end
end
%% Complete bus
% Elements
myElem = Elems(ii); % init;
myElem.Name = Name;
myElem.DataType = DataType;
myElem.Dimensions = Dimensions;
Elems(ii) = myElem;
end
myBus = Simulink.Bus;
myBus.HeaderFile = '';
myBus.Description = busDescription;
myBus.DataScope = 'Auto';
myBus.Alignment = -1;
myBus.Elements = Elems;
BusObjList = [{myBus}, BusObjList];
BusNameList = [BusName,BusNameList];
end
\ No newline at end of file
......@@ -132,5 +132,13 @@ classdef SCDsignal_test < matlab.unittest.TestCase
testCase.verifyEqual(in.QualityTag.Data,out.QualityTag.Data,...
'input and output QualityTag not equal');
end
function test_struct_to_bus(testCase)
% Test creation of complex bus from structure which may contain
% SCDsignals at leaves
S_sub = struct('sig1',{SCDsignal(ones(3,1))},'sig2',rand(5,5));
S = struct('a',1,'b',ones(3,1),'c',true(4,2),'sub',S_sub,'sig',{SCDsignal(ones(4,1))});
[BusObj,BusNames] = SCDsignal_struct_to_bus(S,'myTestBus','Bus with several data types for testing');
end
end
end
\ No newline at end of file
function isvalid = SCDsignal_isvalid(SCDsignals)
% true if GOOD and RUNNING
isvalid = false(size(SCDsignals));
for ii=1:numel(SCDsignals)
isRunning = strcmp(char(SCDsignals(ii).ProductionState) , 'RUNNING');
isGood = strcmp(char(SCDsignals(ii).QualityTag) , 'GOOD');
isvalid(ii) = isRunning & isGood;
end
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment