SimulinkでのS関数フォーマット

3298 ワード

意味
s関数はsystem Functionの略称で、simulinkで直接提供できないモジュールを実現するために独自のsimulinkモジュールを書く.s関数はsimulinkが提供するモジュールに限らずmatlabの豊富なリソースを利用することができ、cやc++などの言語で書かれたs関数はハードウェアポートの操作を実現することができる.
S関数フォーマット
matlabのworkspaceでedit sfuntmplを打つと、matlabが自分で提供したs関数テンプレートが見え、テンプレートのS関数のフォーマットの意味は以下のように分析されます.まず
function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)

sfuntmplは自分で定義したS関数で、s-functionの主関数として、主関数は4つの入力があり、4つの出力は以下にそれぞれの変数の意味を説明する:入力変数:t-サンプリング時間x-状態変数u-入力変数、すなわちsimulinkモジュールの入力flag-シミュレーションプロセスの状態フラグ出力変数:sys-sys配列は、あるサブ関数が返す値を含み、flagによってx 0-状態変数の初期値が変化し、常に空行列str-保持パラメータts-システムサンプリング時間を返し、1*2のベクトルであり、ts(1)はサンプリング周期である.ts(2)は、オフセット量tsが1つの2列のマトリクスであり、サンプリング時間とオフセット量の2つのパラメータを含み、[0]に設定すると、連続するサンプリング時間ステップ毎に実行され、[−1 0]は、接続されたモジュールのサンプリングレートに従って行われ、[0.25 0.1]は、シミュレーション開始の0.1 s後に0.25 s毎に実行され、サンプリング時点はTimeHit=n*period+offsetである.DirFeedthroughは、システムの出力が直接入力に関連付けられているかどうか、すなわち入力が出力側に現れるかどうかのフラグが1であれば0であり、一般的にflag=3のときにmdlOutputs関数が入力uを呼び出すか否かによって直接供給されているか否かを判断することができる
switch flag,                  %  flag,         

次に各サブ関数:S関数で現在サポートされているflagは0、1、2、3、4、9などのいくつかの数値を選択し、以下に異なるflagの場合のS関数の実行状況を説明する.
flag=0の場合、システムの初期化プロセスを行い、mdlInitializeSizes関数を呼び出し、パラメータを初期化します.sysは構造体で、モジュールのいくつかのパラメータを設定します.各パラメータの詳細は以下の通りです.
case 0,						%     
    [sys,x0,str,ts]=mdlInitializeSizes; 
    size = simsizes;        		%             simsizes   
    sizes.NumContStates = 0;		%           
    sizes.NumDiscStates = 0;		%           
    sizes.NumOutputs     = 0;		%         
    sizes.NumInputs      = 0;		%         
    sizes.DirFeedthrough = 1;		%          
    sizes.NumSampleTimes = 1;		%         ,     
    sys = simsizes(sizes);   		%      sys  
    x0 = [];    					%        ,        
    str = [];    					%     , []    
    ts = [0 0]; 					%      0       

flag=1はこのとき連続状態を計算する微分を表し、mdlDerivatives関数を呼び出し、sysは状態導関数、すなわちdxを表す
 case 1,
   sys=mdlDerivatives(t,x,u);

flag=2は離散状態変数の更新を行い、mdlUpdate関数を呼び出し、sysは次の離散状態、すなわちx(k+1)を表す
case 2,
       sys=mdlUpdate(t,x,u);

flag=3は、このときシステムに要求される出力信号を表し、mdlOutputs関数を呼び出し、sysは出力、すなわちyを表す
case 3,
      sys=mdlOutputs(t,x,u);

flag=4は、この時点で次のサンプリングを計算する時間を表し、離散サンプリングシステムでのみ有用(すなわち、上述のmdlInit ializeSizesで述べたts設定ts(1)は0ではない)であり、sysによって返される
case 4,
       sys=mdlGetTimeOfNextVarHit(t,x,u);

flag=9はこの時点でシステムが終了することを示し、一般的にはmdlTerminate関数にsys=[]と書けばよいが、終了時に何かを設定する場合は、この関数に書く.
case 9,
       sys=mdlTerminate(t,x,u);

実際のシミュレーションの過程で、Simulinkは自動的にflagを0に設定して、初期化の過程を行って、それからflagの数値を3に設定して、モジュールの出力を計算して、1つのシミュレーションの周期の後で、Simulinkはflagの数値を前後して1と2に設定して、システムの連続と離散の状態を更新して、更にそれを3に設定して、モジュールの出力を計算して、このように循環してシミュレーションの終了条件が満たすまで.
簡単なS関数の例
s関数はまた、simulinkのgainモジュール機能と同様に、ユーザパラメータを持つこともできます.
function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)
switch flag,
case 0,
      sizes = simsizes;
      sizes.NumContStates = 0;
      sizes.NumDiscStates = 0;
      sizes.NumOutputs     = 1;
      sizes.NumInputs      = 1;
      sizes.DirFeedthrough = 1;
      sizes.NumSampleTimes = 1;
      sys = simsizes(sizes);
      x0=[];
      str=[];
      ts=[0,0];
case 3,
      sys=gain*u;
case {1,2,4,9},
    sys = [];
end