モデルおよび生成コードからの外部 C コードの呼び出し
レガシ コード ツールを使用して、既存の外部関数をシミュレーションまたは生成されたコードから呼び出します。
以下の方法について説明します。
Simulink® モデル シミュレーションの一部である C 関数を評価する。
C 関数をモデルから生成したコードから呼び出す。
モデル例の詳細については、C コード生成のためのコントロール アルゴリズム モデルの準備を参照してください。
置換プロセス
モデル例 rtwdemo_PCG_Eval_P4
を開きます。
Simulink® モデルだけでなく、多くのモデルベース デザイン アプリケーションの設計に含まれる既存の C 関数のセットは、テストおよび検証が行われています。これらの関数を Simulink® モデルと統合し、関数を使用するコードを生成できます。
この例では、既存の C 関数を呼び出すカスタム Simulink® ブロックを作成します。その後、ブロックをモデルに追加し、Simulink® のモデル シミュレーションを介してシステム全体をテストをすることができます。
モデル例では、PI コントローラーの Lookup ブロック (ルックアップ テーブル) を既存の C 関数への呼び出しと置き換えることができます。この関数はファイル SimpleTable.c
と SimpleTable.h
で定義されています。
C 関数を呼び出すブロックの作成
既存の C 関数の呼び出しを指定するには、S-Function ブロックを使用します。レガシ コード ツールを使用すると、S-Function ブロックの作成を自動化することができます。このツールを使用して、最初に既存の C 関数とのインターフェイスを指定します。そして、そのインターフェイスを使用して S-Function ブロックを作成します。
レガシ コード ツールを使用して SimpleTable.c
内の既存の C 関数用の S-Function ブロックを作成します。
def = legacy_code('initialize')
構造体 def
を使用して既存の C コードとの関数インターフェイスを定義できます。
legacy_code('sfcn_cmex_generate',def)
legacy_code('compile',def)
legacy_code('slblock_generate',def)
生成された S-Function ブロックにより、SimpleTable.c
で C 関数が呼び出されます。これで、この S-Function ブロックをモデル内で使用できます。
legacy_code('sfcn_tlc_generate',def)
このコマンドは、ブロック用コードの生成方法を指定する S-Function のコンポーネントである TLC ファイルを作成します。
シミュレーションによる外部コードの確認
Simulink® モデル内で既存の C コードを統合する場合、生成された S-Function ブロックを確認します。
Lookup ブロックの置換を確認するために、Lookup ブロックで生成されたシミュレーション結果を新しい S-Function ブロックで生成された結果と比較します。
1. 確認モデルを開きます。
Sine Wave ブロックは範囲が [-2 : 2] の出力値を生成します。
ルックアップ テーブルの入力範囲は次のとおりです。[-1 :1]。
ルックアップ テーブルは入力の絶対値を出力します。
ルックアップ テーブルは、入力の限界値で出力を切り取ります。
2. 確認モデルを実行します。
次の図に検証結果を示します。既存の C コードと Simulink® テーブル ブロックは同じ出力値を生成します。
C コードを Simulink® モデルの一部として検証
既存の C 関数コードをスタンドアロン コンポーネントとして検証した後、S-Function をモデル内で検証します。検証作業を完了するには、テスト ハーネス モデルを使用します。
シミュレーション結果はゴールデン値と一致しています。
生成コードからの C 関数の呼び出し
コード ジェネレーターは S-Function ブロックをシステムの他のブロックと同様に処理するために TLC ファイルを使用します。コード ジェネレーターは、S-Function ブロックによって、複数の計算を単一の出力計算にまとめる演算である "式の畳み込み" を実装することができます。
2. 生成コードを PI_Control_Reusable.c
で調査します。
生成コードは C 関数 SimpleTable
を呼び出します。
次の図に、C コードを統合する前後の生成コードを示します。統合前は、コードは生成されたルックアップ ルーチンを呼び出します。統合後は、生成コードは C 関数 SimpleTable
を呼び出します。