【问题标题】:global variable not initialized in level 2 s-function未在 2 级 s 函数中初始化的全局变量
【发布时间】:2016-08-24 09:53:20
【问题描述】:

我正在尝试制作一个类似于缓冲区的 2 级 S-Function(我刚开始学习 S-Function)。现在我想要的是,每次输入进入时,它都会存储在下一个索引中,直到缓冲区变满,然后它开始将存储的数据从第 2 个到最后一个索引推送到第一个到第二个索引,并在采样时间后自我更新 我将附上我的代码,以便更好地理解相关内容

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 未定义,有人知道我在做什么错吗?

【问题讨论】:

  • 您应该使用 DWork 向量,而不是全局变量。请参阅How to Use DWork vectors 了解如何执行此操作。
  • @PhilGoddard 谢谢你的建议....过了一会儿我意识到了这一点,并用它编写了一个代码,现在我的缓冲区功能完美运行,谢谢你的建议

标签: matlab simulink mex s-function


【解决方案1】:

i 必须在每个使用它的函数中声明为全局的:

function Update(block)

global i

% ...... 

一行也有错误

block.OutputPort(1).Data(i) = block.InputPort(1).Data;

这是因为setup 中的block.InputPort(2).Data 为空,而block.OutputPort(1).Data 的大小为1。在 s-block 参数对话框中而不是在块的第二个输入中设置缓冲区大小可能会更好吗?

【讨论】:

  • 这就是为什么我很困惑,为什么尽管必须在每个函数中声明相同的脚本i,但我使用了 Dwork Vector 并且它现在可以工作了......非常感谢你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多