2012-04-14 24 views
0

注:これは初めてのMATLAB S関数を使用したもので、Simulinkを使用したことがあります。s関数の直接フィードスルー

S機能の入力変数inpを使用しようとすると、3NaNが返されます。システムへの入力は、バス作成者を介してシステムに接続された3つの単純なステップ関数である。システムをシミュレートしようとすると、エラーメッセージが表示されます。inpでテストプリントを実行してNaNであることがわかりました。何か案は?


詳細:
私はクラスのプロジェクトとしてセグウェイをシミュレートしています。 Simulinkのアクチュエータ(DCモータ)とプラント(Segway自体)を別々のS-functionブロックとしてシミュレートしています。モータは3つの入力をとります:電圧、セグウェイの速度、およびピッチ軸に関連する角速度セグウェイ(逆起電力による)。出力は電機子電流です。

これはシンプルでリニアな非差動システムです。そのため、州は存在しません。実行される唯一の計算は、入力から出力へのフィードスルーです。次のようにコードは次のとおりです。

function [sys,X0]=nl_pend(time,state,inp,FLAG,ICs); 
% actuator parameters: 
% R_m: motor armature resistance 
% K_b: motor back emf constant 
% K_t: motor torque constant 
% r: radius of the wheel 
global R_m K_b K_t r; 

if FLAG == 0, % initialize system parameters and states 
% Call file that initializes parameters 
    segway_dcmotor_pars; 
% This system has: 
% 0 states (theta,thetatheta_dot), 
% 3 input (v,x_dot,theta_dot), 
% 1 outputs (i) 
nx = 0; % # of states 
nu = 3; % # of inputs 
ny = 1; % # of outputs 
sys = [nx; 0; ny; nu; 0; 0]; 
% Initial Conditions (will be passed as and argument) 
X0 = ICs; 
elseif FLAG == 1, % states derivatives 
    %blank 
elseif FLAG == 3, % system outputs 
    %inp(1) = motor voltage 
    %inp(2) = segway velocity 
    %inp(3) = segway pitch angular velocity 
    display(inp); 
    y(1) = (1/R_m)*inp(1) - (K_b/(r*R_m))*inp(2) + (K_b/R_m)*inp(3); 
    sys = y; 
else, 
    sys = []; 
end 
+0

まあ、私は解決策を見つけたを設定する必要がありますので、それは、直接フィードスルーです。私は状態を持たずに、アーマチュアの電荷である単一の状態qを持つように変更しました。 これは解決策ではないので、私は最初の方法がうまくいかなかった理由について質問を開いたままにします。 – Ataraxia

答えて

1

あなたが述べたように、あなたが

sys(6)=1 in flag==0... 
関連する問題