2017-11-12 13 views
0

Simulink에서 새롭고 S-function을 사용하는 모델을 가지고 있습니다. mdlDerivatives의 출력이 mdlOutputs의 출력과 어떤 관련이 있는지 이해할 수 없습니까? 다른 말로하면, (시뮬링크를 사용하지 않고) mfile을 쓰고 싶다면 상태는 무엇이고 출력은 무엇입니까? 나는 MFILE를 작성하고 DDQ, DQ와 q를 찾을 수 있지만,이 두 부분의 상태는 출력을 어떻게 얻을하지 않습니다 싶어? (파일 첨부) 비선형 상태 공간 모델이 구성되어S-function Simulink에서 mdlDerivatives 출력과 mdlOutputs 사이의 관계를 설명하는 방법

function [sys,x0,str,ts]=s_function(t,x,u,flag) 
switch flag, 
case 0, 
e[sys,x0,str,ts]=mdlInitializeSizes; 
case 1, 
sys=mdlDerivatives(t,x,u); 
case 3, 
    sys=mdlOutputs(t,x,u); 
case {2, 4, 9 } 
    sys = []; 
otherwise 
    error(['Unhandled flag = ',num2str(flag)]); 
end 

function [sys,x0,str,ts]=mdlInitializeSizes 
sizes = simsizes; 
sizes.NumContStates = 4; 
sizes.NumDiscStates = 0; 
sizes.NumOutputs  = 4; 
sizes.NumInputs  = 2; 
sizes.DirFeedthrough = 0; 
sizes.NumSampleTimes = 0; 
sys=simsizes(sizes); 
x0=[0;0;0;0]; 
str=[]; 
ts=[]; 
function sys=mdlDerivatives(t,x,u) 
q1=x(1);dq1=x(2); 
q2=x(3);dq2=x(4); 
dq=[dq1;dq2]; 

% The model is given by Slotine and Weiping Li(MIT 1987) 
alfa=6.7;beta=3.4; 
epc=3.0;eta=0; 
m1=1;l1=1; 
lc1=1/2;I1=1/12; 
g=9.8; 
e1=m1*l1*lc1-I1-m1*l1^2; 
e2=g/l1; 

H=[alfa+2*epc*cos(q2)+2*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2); 
    beta+epc*cos(q2)+eta*sin(q2),beta]; 
C=[(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2))*dq2; 
    (epc*sin(q2)-eta*cos(q2))*dq1,0]; 
G=[epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1); 
    epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)]; 

tol(1)=u(1); 
tol(2)=u(2); 

ddq=inv(H)*(tol'-C*dq-G); 
sys(1)=x(2); 
sys(2)=ddq(1); 
sys(3)=x(4); 
sys(4)=ddq(2); 
function sys=mdlOutputs(t,x,u) 
sys(1)=x(1); 
sys(2)=x(2); 
sys(3)=x(3); 
sys(4)=x(4); 
+0

이 블록의 출력은 상태와 일치합니다. 'mdlOutputs'는 두 번째 인자'x'를받습니다 (이 x는 시스템의 상태입니다). 그리고 그것을'sys'에 반환합니다. – AVK

답변

0

식 :

x_dot = F (X, U, t)

Y = g (X, U, t)

시스템이 선형이

제 (아마도 더 친숙한 형태)로 줄일 경우

x_dot = A * x + B의 * U

Y = C * 시뮬 원하는 경우 X + D * 유

레벨-1 M-코드 S-경우 기능

(당신이 바로 이것이다), 블록의 상태 유도체를 계산하여야 mdlDerivatives을 호출하고 블록의 출력이 0이 아니면 mdlOutputs을 호출합니다.

즉, x_dot에 대해 위 식을 구현하고, mdlOutputsy에 대해 위 식을 구현합니다.

+0

설명해 주셔서 감사합니다 – mvtn