C チャートでの C ライブラリ関数の呼び出し
Simulink® モデルの Stateflow® チャートには、ステート アクションと遷移アクションの構文を定義するアクション言語プロパティがあります。チャート キャンバスの左下隅にあるアイコンが、チャートのアクション言語を示します。
アクション言語は MATLAB®。
アクション言語は C。
C Library 関数の呼び出し
C Math Library 関数の以下のサブセットを呼び出すことができます。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Stateflow | |||||
** この関数のサブセットでは、C Math Library の呼び出しは、アプリケーション固有の実装で置き換えることも可能です。詳細については、アプリケーション実装による数学ライブラリ関数の置換を参照してください。 |
これらの関数を呼び出すとき、すべての入力引数が明示的に単精度でなければ、倍精度が適用されます。型の不一致が発生した場合、必要な型に入力引数をキャストすると、元の引数が置換されます。たとえば、関数 sin
を整数の引数で呼び出した場合は、入力引数を double
型の浮動小数点数にキャストすることで、元の引数が置換されます。
メモ
C ライブラリ関数への入力引数は最初に浮動小数点数にキャストされるため、int64
型または uint64
型の引数を使用した関数呼び出しの結果、桁落ちが発生する可能性があります。
上記以外の C ライブラリ関数を呼び出す場合は、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[シミュレーション ターゲット] ペインで、カスタム コードの構成の説明に従って適切な #include
ステートメントを入力してください。
関数 abs の呼び出し
Stateflow abs
関数の解釈は、以下に示すすべての型の整数および浮動小数点の引数に対応しているという点で、標準的な C バージョンよりも優れています。
x
がint32
型またはint64
型の整数である場合は、標準 C 関数abs
がx
に対して適用され、abs(x)
となります。x
がint16
またはint8
型の整数である場合は、標準 C 関数abs
は、int32
型の整数としてキャストされたx
に対して適用され、abs((int32)x)
となります。x
がdouble
型の浮動小数点数である場合は、標準 C 関数fabs
がx
に対して適用され、fabs(x)
となります。x
がsingle
型の浮動小数点数である場合は、標準 C 関数fabs
は、double
型としてキャストされたx
に対して適用され、fabs((double)x)
となります。x
が固定小数点である場合は、標準 C 関数fabs
は、double
としてキャストされた固定小数点に対して適用され、fabs((double) Vx)
となります (Vx
はx
の実際値)。
厳密な意味で標準的な C の関数 abs
を使用する必要がある場合は、引数または戻り値を整数型にキャストしてください。型キャスト演算 を参照してください。
メモ
x
をカスタム コードで宣言する場合は、標準 C 関数 abs
がすべての事例で適用されます。チャートにカスタム コードを挿入する場合の詳細については、Stateflow チャートでのカスタム コードの再利用を参照してください。
関数 min および関数 max の呼び出し
min
および max
は、生成されるコードの先頭で以下のマクロが自動的に発行されることで使用可能になります。
#define min(x1,x2) ((x1) > (x2) ? (x2):(x1)) #define max(x1,x2) ((x1) > (x2) ? (x1):(x2))
min()
または max()
という名前のユーザー グラフィカル関数との互換性を確保するために、生成されるコードでは、次のような形式のマングル ネームが使用されます。<prefix>_min
。 ただし、min()
または max()
グラフィカル関数をモデルのその他のチャートにエクスポートした場合は、生成されるコードでこれらの関数の名前がマングル ネームで発行されず、矛盾が発生します。この矛盾を回避するには、min()
および max()
グラフィカル関数の名前を変更します。
アプリケーション実装による数学ライブラリ関数の置換
コード ジェネレーターを設定して、コードがアプリケーション要件を満たすように、数学ライブラリ関数用に生成するコードを変更できます。これを行うには、コードの生成時にコード置換ライブラリ (CRL) を適用するようにコード ジェネレーターを構成します。Embedded Coder® のライセンスをお持ちの場合は、カスタム コード置換ライブラリを開発して適用できます。
MathWorks® が提供するコード置換ライブラリを使用したコード置換の詳細については、コード置換とは (Simulink Coder)およびコード置換ライブラリ (Simulink Coder)を参照してください。カスタム コード置換ライブラリの開発の詳細については、What Is Code Replacement Customization? (Embedded Coder)およびCode You Can Replace From Simulink Models (Embedded Coder)を参照してください。
カスタム C コード関数の呼び出し
シミュレーションや C コード生成のために C チャートで使用するカスタム コード関数を指定できます。詳細については、カスタム コードの構成を参照してください。
チャートでカスタム C 関数を呼び出す場合のガイドライン
関数は、その名前、引数 (かっこ内)、オプションのセミコロンで定義します。
一重引用符を使用して、ユーザー記述関数にパラメーターを渡します (たとえば、
func('string')
)。アクションでは、関数呼び出しを入れ子形式にすることができます。
アクションでは、スカラー値 (MATLAB 関数の場合は
double
型、ユーザー記述 C 関数の場合は任意の型) を返す関数を呼び出すことができます。
入力ベクトルにアクセスするカスタム C 関数を書き込むためのガイドライン
sizeof
関数を使用して入力ベクトルの長さを判断します。たとえば、カスタム関数は、以下のように
sizeof
を使用する for ループを含めることができます。for(i=0; i < sizeof(input); i++) { ...... }
カスタム関数が、入力ベクトル長の値を複数回使用する場合は、入力ベクトル長を指定する関数に 1 つの入力をインクルードします。
たとえば、
sum
関数に対する 2 番目の入力としてinput_length
を以下のように使用することができます。int sum(double *input, double input_length)
sum
関数は、入力ベクトルのすべての要素を反復する for ループを含むことができます。for(i=0; i < input_length; i++) { ...... }
遷移アクションでの関数呼び出し
遷移アクション表記法による関数呼び出しの形式例は以下のチャートに表示されてます。
以下の条件の 1 つ以上が当てはまる場合、fcn1
に対する関数呼び出しは arg1
、arg2
、および arg3
で発生します。
S1
はアクティブです。イベント
e
が発生します。条件
c
は真です。遷移先
S2
は有効です。
S2
から S3
への遷移に設定された遷移アクションは、別の関数呼び出し内で入れ子関数呼び出しを示しています。
ステート アクションでの関数呼び出し
ステート アクション表記法による関数呼び出しの形式例は以下のチャートに表示されます。
チャートの実行は、以下の要領で発生します。
S1
へのデフォルト遷移が発生すると、S1
は有効となります。entry
アクション、すなわち指定された引数でfcn1
に対する関数呼び出しが実行されます。シミュレーション時間が 5 秒経過後、
S1
は無効となり、S2
が有効になります。during
アクション、すなわち指定された引数でfcn2
に対する関数呼び出しが実行されます。シミュレーション時間が 10 秒経過後、
S2
は無効となり、S1
は再び有効になります。シミュレーションが終了するまで、手順 2 から 5 が繰り返されます。
参照による引数渡し
Stateflow アクションでは、値ではなく参照によってユーザー記述関数に引数を渡すことができます。特に、値自体ではなく値へのポインターを渡すことができます。たとえば、アクションに以下の呼び出しを含むことができます。
f(&x);
f
はカスタム コードの C 関数であり、x
に対するポインターを引数として想定しています。
x
が Stateflow 階層に定義されたデータ項目の名前に該当する場合は、以下のルールが適用されます。
ポインターを使用して、データ項目に Simulink モデルからの入力を渡さないでください。
入力項目を参照によって渡す必要がある場合は (たとえば、配列)、項目をローカルなデータ項目に割り当て、ローカル項目を参照によって渡してください。
x
のデータ型がboolean
である場合は、コーダー オプション [ステート構成を保存するためにビットセットを使用] の選択を解除しなければなりません。x
が、先頭のインデックス プロパティが 0 に設定された配列 (データ プロパティの設定を参照) である場合は、次の方法で関数を呼び出さなければなりません。f(&(x[0]));
これにより、
x
の先頭要素に対するポインターが関数に渡されます。x
が、先頭のインデックス プロパティが 0 以外の数値 (たとえば、1) に設定された配列である場合は、以下の方法で関数を呼び出す必要があります。f(&(x[1]))
;これにより、
x
の先頭要素に対するポインターが関数に渡されます。