2016-08-24 3 views
1

Я пытаюсь сделать 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 как глобальные переменные, когда я запускаю функцию он говорит, я не определен, кто-нибудь знает, что я Я делаю неправильно?

+1

Вы должны использовать векторы DWork, а не глобальные. См. [Как использовать векторы DWork] (https://www.mathworks.com/help/simulink/sfg/how-to-use-dwork-vectors.html#brd2qpw), чтобы узнать, как это сделать. –

+0

@PhilGoddard Спасибо за предложение .... Я понял это через некоторое время и сделал код из этого теперь моя функция буфера работает отлично, спасибо за предложение – Umar

ответ

0

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-блока, а не во втором вводе блока?

+0

Вот почему я был в замешательстве, что, несмотря на то, я должен быть объявлен в каждой функции, я использовал Dwork Vector вместо этого, и теперь он работает ... Спасибо, что за ответ – Umar

Смежные вопросы