Я пытаюсь сделать s-функцию уровня 2, которая будет действовать как буфер (я только начал изучать S-функции). Теперь я хочу, чтобы каждый раз, когда вход поступает в него, он сохраняется в следующем индексе до тех пор, пока буфер не будет заполнен, тогда он начнет толкать данные, хранящиеся от второго до последнего индекса, до первого и второго последних индексов и обновляется после времени выборки я приложу свой код, что будет иметь значение для лучшего пониманияглобальная переменная, не инициализированная в 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
как глобальные переменные, когда я запускаю функцию он говорит, я не определен, кто-нибудь знает, что я Я делаю неправильно?
Вы должны использовать векторы DWork, а не глобальные. См. [Как использовать векторы DWork] (https://www.mathworks.com/help/simulink/sfg/how-to-use-dwork-vectors.html#brd2qpw), чтобы узнать, как это сделать. –
@PhilGoddard Спасибо за предложение .... Я понял это через некоторое время и сделал код из этого теперь моя функция буфера работает отлично, спасибо за предложение – Umar