昨今、車載システム開発で取り入れられることが多くなったMBD(Model Based Development)。
システムを構築する制御や制御対象をモデル化し、並行してシミュレーションすることで検証を行いながら設計開発を進めていく手法になります。
MATLAB/Simulinkがツールとしては有名なのはご存知の方も多いと思います。
基本的にはモデル設計することで完結する手法なのですが、仕様が複雑でモデルで表現できない場合や、コードを自動生成するがゆえに処理速度に問題が生じる場面に遭遇することも少なくありません。
その際に用いられるのがS-FunctionというSimulinkに用意されている拡張機能です。
このS-Functionにはいくつかの種類が存在し、それぞれを用途に応じて選択する必要があります。
1.インラインではないS-Function
- リソースや効率的なコードを意識しない場合。主にSimulink上でのシミュレーション。
- C または C++ MEX S-Functionで、シミュレーションを実行時に各ブロックのインスタンスで追加メモリを消費する。ソースの中でメモリ確保(callocしている)
- TLCコード[1]の作成には無関係。
2.インライン化したS-Function
- 効率を重視した最適なアルゴリズムを実装する。主に組み込み製品の中で動作させる。
- 効率重視のコードを作る為にTLCファイルを使ってオーバーヘッドコード[2]を削除する。
- 完全にインライン化したS-Functionを作る為には2回の実装が必要。
1回目はMEXファイル、もう一回は、TLCファイルを使ってのコード生成。
3.外部コード用自動生成 S-Function
- 手書きコードが多数あり、関数を効率的に呼び出す場合。
- レガシーコードツールを使用することを推奨。
レガシーコードツールは、完全インライン化 S-Functionと対応するTLCファイルの生成を手軽に作ることができる。
いずれもC/C++ソースやモデルで苦手な処理等を1つのブロック(S-Function)として、モデル内に組み込むことが可能です。
ざっくりとS-Functionの紹介させていただきました。
次回はこの機能の仕組みや使い方について解説したいと思います。