C Function ブロック内の開始アクションと終了アクション
この例では、C Function ブロックを使用して、開始アクションと終了アクションをもつレガシ C 関数を統合する方法を示します。
モデルを開きます。
model = 'slexCFunctionStartTerm';
open_system(model)
この例では、レガシ C 関数が fault.h
に定義されており、fault.c
に実装されています。
C Function ブロックからの C 関数の呼び出しを有効にするため、モデルの [コンフィギュレーション パラメーター]、[シミュレーション ターゲット] ペインにヘッダー ファイルとソース ファイルを指定します。このモデルは、ログ ファイルを開き、そこにデータを書き込んだ後、ログ ファイルを閉じます。C Function ブロックの [開始コード] セクションで関数 openLogFile
が呼び出され、[終了コード] セクションで関数 closeLogFile
が呼び出されます。[出力コード] セクションで、関数 incAndLogFaultCounter
が呼び出されます。レガシ関数のプロトタイプは以下のとおりです。
void* openLogFile()
closeLogFile(void* fid)
incAndLogFaultCounter(void *fid, unsigned int counter, double time)
ここで、void *fid
はファイル ポインターで、unsigned int counter
はフォルト カウンターで、double time
は時間を示します。InputVal
信号の最大値は 255 になることができます。信号が定数値 250 以上になるたびに、障害状態が発生し、出力コード incAndLogFaultCounter
が呼び出されます。出力コードはフォルト カウンターを 1 だけ増やし、slex_CFunction_fault.log
ファイルにタイムスタンプ付きの新しい行を追加します。このモデルでは、故障信号は FaultVal
信号で表されます。
この例では、C Function ブロックの端子は次のように設定されます。
関数
openLogFile
で返されるファイル ポインターと、フォルト カウンターは、C Function ブロックの永続シンボルです。C Function ブロックの入力は時間にマッピングされます。
モデルをシミュレートし、Scope ブロックを使用して出力を可視化します。出力では、InputVal
信号の値と FaultVal
信号の値が比較されます。
sim(model);