Main Content

S-Function とコード生成

S-Function を使用してシミュレーションとコード生成の Simulink® サポートを拡張します。たとえば、次のようなことができます。

  • カスタム アルゴリズムの表現

  • 既存の外部のコードと Simulink モデルおよび生成コードのインターフェイス

  • ハードウェアとのインターフェイスのためのデバイス ドライバーの表現

  • 組み込みシステム用の高最適化コードの生成

  • Simulink シミュレーションの一部としてサブシステム用に生成されたコードの検証

S-Function の記述に使用されるアプリケーション プログラム インターフェイス (API) は、Simulink 環境での汎用アルゴリズムの実装を高度な柔軟性で可能にします。S-Function をコード生成のモデルに使用する場合、柔軟性のレベルが変わります。たとえば、コード ジェネレーターで使用する S-Function から MATLAB® ワークスペースにアクセスすることはできません。このトピックでは、S-Function の使用時に注意が必要な状況について説明します。ただし、このトピックに記載されている方法を使用すれば、生成コードを使用する大部分のアプリケーションで S-Function を作成することができます。

S-Function にはモデルに複雑なアルゴリズムを実装するための一般的で柔軟なソリューションが用意されていますが、基になる API によってメモリおよび計算リソースに関するオーバーヘッドが発生します。追加のリソースは、ほとんどの場合、リアルタイムのラピッド プロトタイピング システムで許容されます。ただし、リアルタイムの組み込みアプリケーションでは追加のリソースはほとんど利用できません。コード ジェネレーターに備わっている Target Language Compiler テクノロジーで S-Function をインライン化することによって、メモリおよび計算リソースを最小化することができます。既存の外部コードについて S-Function を生成する場合は、S-Function および関連する TLC ファイルの生成にレガシ コード ツールの使用を検討してください。

このトピックは、以下の概念が理解されていることを前提としています。

  • レベル 2 S-Function

  • Target Language Compiler (TLC) のスクリプト作成

  • コード ジェネレーターで C/C++ コードを生成およびビルドする方法

メモ

この情報はコード ジェネレーター ユーザーを対象としています。現在コード ジェネレーターを使用していなくても、S-Function を作成するとき、特に汎用の S-Function を作成するときにはこれらの手法に従ってください。

S-Function のタイプ

シミュレーションとコード生成の S-Function 実装に選択する例には次のものがあります。

  1. "効率は気にしません。アルゴリズムを 1 バージョン作成して、Simulink およびコード ジェネレーター製品で自動的に動作させたいのです。"

  2. "Simulink とコード ジェネレーター製品に、組み込みブロックに類似していて効率的なコードを生成する高度に最適化されたアルゴリズムを実装します。"

  3. "インターフェイスを設定しなければならない手書きコードがたくさんあります。Simulink およびコード ジェネレーター製品から関数を効率的に呼び出します。"

それぞれ、上記の状況は次の MathWorks® 用語に対応します。

  1. インラインでない S-Function

  2. インライン化 S-Function

  3. 外部コード用自動生成 S-Function

インラインでない S-Function

インラインでない S-Function は、Simulink エンジンおよび生成コードによって同一のものとして処理される C または C++ MEX S-Function です。一般的にアルゴリズムは S-Function API に従って 1 回実装します。Simulink エンジンおよび生成コードは、モデルの実行中に S-Function ルーチン (mdlOutputs など) を呼び出します。

インラインでない S-Function ブロックの各インスタンスでは、追加のメモリおよび計算リソースが必要になります。ただし、アルゴリズムをモデルとコード生成アプリケーションに組み込むこのルーチンは、効率が重視されないプロジェクトのプロトタイピング フェーズでは一般的です。効率を考慮しないことでの利点は、モデル パラメーターと構造体を迅速に変更できることです。

インラインでない S-Function の作成は、TLC コードの作成には無関係です。インラインでない S-Function は、モデルで MEX S-Function を一度作成すると Ctrl+B キーを押してモデルをビルドする前に他に準備することはないという意味で、ビルド プロセスの default ケースです。

makefile を生成する際は、インラインでない S-Function の名前と位置に関する制約がいくつかあります。インラインでない S-Function の記述を参照してください。

インライン化 S-Function

S-Function が Simulink 環境で動作するよう、いくつかのオーバーヘッド コードが生成されます。コード ジェネレーターが (sfunction.tlc ファイルがない状態で) S-Function を含んでいるモデルからコードを生成する場合、生成コードにこのオーバーヘッド コードがいくつか組み込まれます。リアルタイムのコードを最適化してオーバーヘッド コードをいくつか削除するには、S-Function を "インライン化" し (または組み込ま) なければなりません。これには、生成コードからオーバーヘッド コードを削除する TLC (sfunction.tlc) ファイルの作成が関係してきます。Target Language Compiler は、sfunction.tlc ファイルを処理して生成コード内の S-Function アルゴリズムをインライン化する方法を定義します。

メモ

"インライン" という用語を C++ の "インライン" というキーワードと混同しないでください。インラインとは、一般的な S-Function API ルーチン (mdlOutputs など) の呼び出しの代わりにテキストを指定することを意味します。たとえば、TLC ファイルを使用して S-Function をインライン化する場合、C/ C++ コード (通常は S-Function ルーチン内に表示される) が生成コードに含まれ、S-Function そのものはビルド プロセスから削除されています。

完全インライン化 S-Function は、組み込みブロックとは区別のできない方法で、アルゴリズム (ブロック) を生成コードに組み込みます。通常、完全インライン化 S-Function ではアルゴリズムを 2 回実装しなければなりません。1 回は Simulink モデル (C/C++ MEX S-Function) に対して、もう 1 回はコード生成 (TLC ファイル) に対して行います。TLC ファイルの複雑度は、アルゴリズムの複雑度と、生成コードで実現しようとしている効率性のレベルによって変わります。TLC ファイルは、構造によって単純にも複雑にもなります。S-Function のインライン化を参照してください。

レガシまたはカスタム コードの自動生成 S-Function

手書きの C/C++ コードをモデルに呼び出す必要がある場合、Simulink レガシ コード ツールの使用を検討してください。レガシ コード ツールでは、レガシ コード ツールのデータ構造体に登録する情報に基づいて、完全インライン化 S-Function と対応する TLC ファイルの生成を自動化することができます。

詳細については、Integrate C Functions Using Legacy Code Toolおよびレガシ コード ツールによって外部コードへの呼び出しを生成コードにインポートを参照してください。

非インライン化およびインライン化 S-Function の実装に必要なファイル

このトピックでは、インラインでない S-Function とインライン化 S-Function の作成に必要なファイルと関数について簡単に説明します。

  • インラインでない S-Function には、C または C++ MEX S-Function ソース コード (sfunction.c または sfunction.cpp) が必要です。

  • sfunction.tlc ファイルは、完全インライン化 S-Function で必要になります。完全インライン化 S-Function は、パラメーター化される S-Function について最適なコードを生成します。これは、モデルの実行時に固定された S-Function パラメーターに依存する特定のモードで機能する S-Function です。特定の動作モードに対し、sfunction.tlc ファイルは、そのモードでアルゴリズムを実装するために生成される正確なコードを指定します。たとえば、mdlRTW ルーチンでの完全インライン化 S-Function の記述に記載されている直接インデックス ルックアップ テーブル S-Function には、等間隔に分布した x-data 用と非等間隔に分布した x-data 用に 2 つの動作モードがあります。

    メモ

    レガシまたはカスタム C/C++ コードを呼び出すために生成される完全インライン化 S-Function にも、レガシ コード ツールで生成される sfunction.tlc ファイルが必要になります。

完全インライン化 S-Function には、S-Function MEX ファイルの sfunction.c または sfunction.cppmdlRTW ルーチンを配置する必要があります。mdlRTW ルーチンでは、model.rtw に情報を配置できます。model.rtw はモデルを指定するレコード ファイルであり、コード ジェネレーターはコードを生成する際に Target Language Compiler を呼び出して処理を行ってから sfunction.tlc を実行します。

TLC ファイルに調整できないパラメーターを導入する場合、mdlRTW ルーチンを含めると役立ちます。このようなパラメーターは S-Function の特定のインスタンスでアクティブになる動作モードを決めるのに使われます。この情報に基づいて、S-Function の TLC ファイルはその動作モードに対応する効率の高い最適なコードを生成します。

コード生成をサポートする S-Function 記述のガイドライン

  • C/C++ MEX、MATLAB 言語および Fortran MEX S-Function をコード生成で使用できます。

  • インライン化された TLC ファイルを指定することにより、コード生成用に S-Function をインライン化できます。Target Language Compilerの「S-Function インライン化」を参照してください。MATLAB S-Function および Fortran MEX S-Function はインライン化しなければなりません。C/C++ MEX S-Function はコードを効率化するためにインライン化または非インライン化できます。

  • レガシ コードまたはカスタム コードを呼び出すための完全インライン化 C MEX S-Function を自動生成するには、レガシ コード ツールを使用します。詳細については、Integrate C Functions Using Legacy Code Toolおよびレガシ コード ツールによって外部コードへの呼び出しを生成コードにインポートを参照してください。

  • コード効率が考慮事項をオーバーライドしない場合は、たとえば、ラピッド プロトタイピング時に C/C++ MEX S-Function をインライン化しないように選択できます。詳細については、インラインでない S-Function の記述を参照してください。

関連するトピック