2016-08-24 12 views
1

버퍼처럼 작동하는 레벨 2 s- 함수를 만들려고합니다. (방금 S- 함수를 배우기 시작했습니다). 이제 내가 원하는 것은 입력이 들어올 때마다 버퍼가 가득 차게 될 때까지 다음 인덱스에 저장됩니다. 마지막 인덱스에서 마지막 인덱스까지 저장 한 데이터를 첫 번째 인덱스에서 마지막 인덱스 두 번째까지 밀어 넣기 시작하고 샘플링 시간 후에 자체를 업데이트합니다. 더 나은 이해를 위해 관련 일 것입니다 무슨 내 코드를 첨부합니다레벨 2에서 초기화되지 않은 전역 변수 s-function

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; 

setup에서 block.InputPort(2).Data가 비어 있고 block.OutputPort(1).Data 크기 1을 가지고 있기 때문이다 . 블록의 두 번째 입력보다는 s- 블록 매개 변수 대화 상자에서 버퍼 크기를 설정하는 것이 더 좋을 수 있습니까?

+0

그 이유는 왜 내가 같은 스크립트를 사용했는지 왜 ' 나는 각각의 함수에서 선언되어야한다. 대신에 Dwork Vector를 사용했고, 이제는 작동한다 ... 대답을 많이 고맙다. – Umar