我试图做一个2级的S-功能,将像一个缓冲区(我刚开始学习S-功能)。现在我想的是,每一个输入进来的这时候被存储在一个索引,直到缓冲区满然后开始采样时间后,从第2存储到最后索引的数据推到1日至倒数第二个指数和自我更新我会附上我的代码什么是相关以便更好地理解
function Buffer(block)
global i;
i = 1;
setup(block);
function setup(block)
% Register number of ports
block.NumInputPorts = 2;
block.NumOutputPorts = 1;
% Setup port properties to be inherited or dynamic
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
% Override input port properties
block.InputPort(2).Dimensions = 1;
block.InputPort(2).DatatypeID = 0; % double
block.InputPort(2).Complexity = 'Real';
block.InputPort(2).DirectFeedthrough = true;
% Override input port properties
block.InputPort(1).Dimensions = 1;
block.InputPort(1).DatatypeID = 0; % double
block.InputPort(1).Complexity = 'Real';
block.InputPort(1).DirectFeedthrough = true;
% Override output port properties
block.OutputPort(1).Dimensions = [1 block.InputPort(2).Data];
block.OutputPort(1).DatatypeID = 0; % double
block.OutputPort(1).Complexity = 'Real';
block.SampleTimes = [-1 0];
block.SimStateCompliance = 'DefaultSimState';
block.RegBlockMethod('Outputs', @Outputs);
block.RegBlockMethod('Update', @Update);
block.RegBlockMethod('Terminate', @Terminate);
function Outputs(block)
block.OutputPort(1).Data(i) = block.InputPort(1).Data;
% block.Dwork(1).Data
%end Outputs
%%
%% Update:
%% Functionality : Called to update discrete states
%% during simulation step
%% Required : No
%% C-MEX counterpart: mdlUpdate
%%
function Update(block)
if(i == block.InputPort(2).Data)
block.OutputPort(1).Data(1:block.InputPort(2).Data - 1) = block.OutputPort(1).Data(2:block.InputPort(2).Data);
else
i = i + 1;
end
%end Update
function Terminate(block)
现在的问题是,虽然我已经宣布i
作为一个全局变量,当我运行它说我是未定义的功能,没有人知道我在做什么错?
i
必须声明在使用它的每一个功能的全球:
function Update(block)
global i
% ......
也有在行错误
block.OutputPort(1).Data(i) = block.InputPort(1).Data;
这是因为在block.InputPort(2).Data
是setup
空block.OutputPort(1).Data
有大小1
。可能最好是设置S-块参数对话框,而不是在块的第二输入缓冲区的大小?