Level 2 S-Function block port sampling mode error

조회 수: 31 (최근 30일)
Richard Crozier
Richard Crozier 2020년 7월 15일
답변: Zhimin Wang 2020년 9월 3일
When I try to run a model containing Level-2 m-code S-Function block I have created I get the following error:
Level-2 MATLAB S-function 'wrappedGymPyEnvL2Sfcn' in 'test_sfcn/Level-2 MATLAB S-Function1' does not have a 'SetInputPortSamplingMode' method. When a Level-2 MATLAB S-function with multiple output ports has dynamic sampling mode setting for any of its ports, it is necessary to register a 'SetInputPortSamplingMode' method
In this block I set the input port size and one of the output port sizes based on a dialog parameter. My setup function for this block is shown below:
function setup(block)
block.NumDialogPrms = 3;
block.DialogPrmsTunable = { 'Nontunable' ...
, 'Nontunable' ...
, 'Nontunable' ...
};
% Register number of ports
block.NumInputPorts = 1;
block.NumOutputPorts = 2;
% Setup port properties to be inherited or dynamic
% block.SetPreCompInpPortInfoToDynamic;
% block.SetPreCompOutPortInfoToDynamic;
% Override input port properties
% action input
block.InputPort(1).Dimensions = [1, block.DialogPrm(1).Data];
block.InputPort(1).DimensionsMode = 'Fixed';
% block.InputPort(1).Dimensions = [1, 100]; % maximum dimensions
block.InputPort(1).DatatypeID = 0; % double
block.InputPort(1).Complexity = 'Real';
block.InputPort(1).DirectFeedthrough = false;
% Override output port properties
% the state values
block.OutputPort(1).Dimensions = [1, block.DialogPrm(2).Data];
block.OutputPort(1).DimensionsMode = 'Fixed';
% block.OutputPort(1).Dimensions = [1, 100]; % maximum dimensions
block.OutputPort(1).DatatypeID = 0; % double
block.OutputPort(1).Complexity = 'Real';
% current reward value
block.OutputPort(2).Dimensions = [1, 1];
block.OutputPort(2).DimensionsMode = 'Fixed';
block.OutputPort(2).DatatypeID = 0; % double
block.OutputPort(2).Complexity = 'Real';
% block.OutputPort(1).SamplingMode = 'Sample';
% block.OutputPort(2).SamplingMode = 'Sample';
% Register sample times
% [0 offset] : Continuous sample time
% [positive_num offset] : Discrete sample time
%
% [-1, 0] : Inherited sample time
% [-2, 0] : Variable sample time
block.SampleTimes = [0 0];
% Specify the block simStateCompliance. The allowed values are:
% 'UnknownSimState', < The default setting; warn and assume DefaultSimState
% 'DefaultSimState', < Same sim state as a built-in block
% 'HasNoSimState', < No sim state
% 'CustomSimState', < Has GetSimState and SetSimState methods
% 'DisallowSimState' < Error out when saving or restoring the model sim state
block.SimStateCompliance = 'DefaultSimState';
% block.SimStateCompliance = 'DisallowSimState';
block.RegBlockMethod('InitializeConditions', @InitializeConditions);
block.RegBlockMethod('Outputs', @Outputs); % Required
block.RegBlockMethod('Update', @Update);
block.RegBlockMethod('Terminate', @Terminate); % Required
%
% SetInputPortSamplingMode:
% Functionality : Check and set input and output port
% attributes and specify whether the port is operating
% in sample-based or frame-based mode
% C MEX counterpart: mdlSetInputPortFrameData.
% (The DSP System Toolbox is required to set a port as frame-based)
%
% block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
end
No matter what I do I cannot get rid of this error. I tried adding the following SetInputPortSamplingMode function (see the last commented statement in setup:
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
end
But if I do this, then I get the following error:
'test_sfcn/Level-2 MATLAB S-Function1' has unknown frame status for its output port 2. When all input ports have known frame status, then all output ports must have known frame status
To be honest though, I haven't a clue what this SetInputPortSamplingMode stuff is about, because as far as I can tell, it is not documented anywhere, so I would also welcome a link to documentation if I have missed it.

채택된 답변

Zhimin Wang
Zhimin Wang 2020년 9월 3일
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
block.OutputPort(2).SamplingMode = fd;
end

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Simulink Functions에 대해 자세히 알아보기

제품


릴리스

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by