Matlab Level 2 S-functions and Arrays

조회 수: 2 (최근 30일)
Yves
Yves 2015년 2월 17일
편집: Yves 2020년 2월 26일
My Question is the following:
I want to write an S-Function which takes an n-dimensional input, and gives as output the same Array with an added collumn in a chosen dimension.
When I try that I always end up with errors about a missmatch of dimensions:
"Error in 'SetOutputPortDimensions' method of 'Test_simple/Level-2 MATLAB S-Function1'. The dimension of output port 0 should have been set to [4x1], but was instead set to [4x2]."
&
"Error in port widths or dimensions. Output port 1 of 'Test_simple/Constant' is a [4x1x2] matrix."
How can I fix this missmatch of dimensions?
My code: -----------------------------------------------------------------------------------------------------------------------------------------------------------------
function VPSFUNC4S(block)
setup(block);
function setup(block)
block.NumInputPorts = 1;
block.NumOutputPorts = 1;
block.AllowSignalsWithMoreThan2D = 1;
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
block.InputPort(1).DirectFeedthrough = true;
block.OutputPort(1).DimensionsMode = 'Variable';
block.NumContStates = 1;
block.SampleTimes = [0 0];
block.SetAccelRunOnTLC(false);
block.SimStateCompliance = 'DefaultSimState';
block.RegBlockMethod('SetOutputPortDimensions', @SetOutPortDims);
block.RegBlockMethod('Outputs', @Outputs);
function SetOutPortDims(block, idx, di)
di=block.InputPort(1).Dimensions;
di(2)=di(2)+1;
block.OutputPort(idx).Dimensions = di;
function Outputs(block)
Grosse=size(block.InputPort(1).Data);
X=Grosse(2);
block.OutputPort(1).Data=block.InputPort(1).Data;
block.OutputPort(1).Data=[block.OutputPort(1).Data,zeros(1,Grosse(1))];
for k=1:4;
block.OutputPort(1).Data(k,X+1,1)=block.InputPort(1).Data(k,X,:)+10;
end

채택된 답변

Yves
Yves 2015년 2월 17일
  댓글 수: 2
Richard Crozier
Richard Crozier 2020년 2월 17일
편집: Richard Crozier 2020년 2월 17일
Sadly the newsreader is dead and therefore so is this link. Can you share the solution agin?
Yves
Yves 2020년 2월 26일
편집: Yves 2020년 2월 26일
I have no clue what it was, but I still have the code I wrote back then (which works as intended), so I hope this example gives you the information you seek.
function SF_FP(block)
setup(block);
function setup(block)
block.NumDialogPrms = 5;
block.DialogPrmsTunable = {'Tunable','Tunable','Tunable','Tunable','Tunable'};
block.NumInputPorts = 1;
block.NumOutputPorts = 2;
block.AllowSignalsWithMoreThan2D = 1;
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
block.InputPort(1).DirectFeedthrough = true;
block.InputPort(1).DatatypeID = 0;
block.OutputPort(1).DatatypeID = 0;
block.SampleTimes = [0 0];
block.NumContStates = 1;
block.SetAccelRunOnTLC(false);
block.SimStateCompliance = 'DefaultSimState';
block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
block.RegBlockMethod('SetInputPortDimensions', @SetInpPortDims);
block.RegBlockMethod('Outputs', @Outputs);
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
block.OutputPort(2).SamplingMode = fd;
function SetInpPortDims(block, idx, di)
block.InputPort(idx).Dimensions = di;
di(2)=di(2)+1;
block.OutputPort(1).Dimensions = di;
block.OutputPort(2).Dimensions = di;
As far as I remember: this did the trick, I think setting the outputport dimension within
function SetInpPortDims(block, idx, di)
Was the solution, you gotta try it, I haven't done any coding in MATLAB since years.
You are really lucky I happen to be at the place were I made this again and got the same email I used to have back then otherwise you would have had no chance for an answer.
If you have closed loops you want to evaluate with your s-functions (example below) you have to evaluate the length of the closed loop in the init function of your s-function block. However as far as I rember I had troubels with properly setting init values using the init functions when blocks rely on data provided by other s-functions.
example:
source ->in_1 mixer -> some process -> split stuff out_1-> go on
^ in_2 | out_2
|_________________________|
You should also check:
block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
and
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
block.OutputPort(2).SamplingMode = fd;
I can't remember why I had to do that, but it might be connected to it.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by