メインコンテンツ

Python Code ブロックを使用した Simulink への Python コードの統合

このトピックでは、Python Code ブロックを使用して既存のネイティブ Python® コードを Simulink® に統合する方法を示します。このブロックは、ブロック ダイアログ ボックスを使用してネイティブ Python コードを Simulink に直接インポートするか書き込むために使用します。ブロック ダイアログ ボックスを使用して Python コードとインターフェイスをとるには、ブロックの入力端子、出力端子、パラメーター、および永続変数を定義します。Python Code ブロックを使用すると、コードを既存の Simulink または MATLAB® フレームワークにリファクタリングすることなく、既存のネイティブ Python コードを Simulink に統合できます。

Python を使用するためのシステムの構成

Simulink で Python コードを実行するには、互換性のあるバージョンの Python がインストールされている必要があります。これに伴い、Linux および Mac では対応する Python 開発ヘッダーのインストールが必要になる場合があります。サポートされている Python バージョンと、MATLAB および Simulink で Python を使用するためのシステムの設定の詳細については、Python を使用するためのシステムの構成を参照してください。

すべての標準 Python ライブラリ、サードパーティの機能、またはユーザーが作成したモジュールにアクセスできます。MATLAB および Simulink での Python の使用の詳細については、MATLAB から Python モジュールへのアクセス - 入門を参照してください。

MATLAB で Python の ExecutionModeInProcess として設定する必要があります。Python Code ブロックでは、アウトプロセス実行モードの Python 環境はサポートされません。Linux または Mac を使用している場合は、MATLAB Python のバージョンに対応する Python 開発ヘッダーをインストールする必要があります。

Simulink での Python Code ブロックの使用

次の cuboid_class.py ファイルは、体積と表面積を計算するメソッドをもつ Cuboid クラスを定義しています。

class Cuboid:       
    
    def setParameters(self, length, height, breadth):
        self.length = length
        self.height = height
        self.breadth = breadth 
    
    def calculateVolume(self):
        return (self.length*
                self.breadth*
                 self.height)

    def calculateSurfArea(self):
        return 2*(self.length*self.breadth + 
        self.breadth*self.height + 
        self.height*self.length)

このセクションでは、Python Code ブロックを使用してこのコードを Simulink に統合する手順を示します。ブロック アルゴリズムは次の条件を実装します。

  • ブロック コードで直方体オブジェクトがインスタンス化され、永続変数として保存される。

  • 直方体オブジェクトの長さと幅の値がブロック入力として構成される。

  • 直方体オブジェクトの高さがブロック パラメーターとして構成される。

  • 各タイム ステップで直方体の体積と表面積が計算され、出力される。

  1. このコードを Simulink に統合するには、Simulink モデルを開いて Python Code ブロックを追加します。Simulink の [ライブラリ ブラウザー][Simulink][User-Defined Functions][Python Code] でブロックを見つけます。

    Empty Python Code block

  2. ブロックをダブル クリックして、次のセクションを含むブロック ダイアログ ボックスを開きます。

    • コード: このセクションを使用して、ブロックの Python コードをインポートして指定します。[初期化][出力][終了] の 3 つのコード タブがあります。

      [初期化] タブでは、ブロックがシミュレーションの開始前に実行する必要がある 1 回限りの設定タスクを記述します。[出力] タブでは、各タイムステップのブロック出力を定義する Python コードを指定します。[終了] ペインでは、ブロックがシミュレーションの終了前に実行する必要があるタスクを指定します。

    • 端子とパラメーター: このセクションでは、ブロックの入力、出力、パラメーター、および永続オブジェクトを指定できます。[追加] をクリックして、これらの要素のいずれかをブロックに追加します。要素ごとに次のプロパティを指定します。

      1. 名前: Python コードで使用する要素の名前を指定します。

      2. スコープ: 要素のスコープを設定します。[入力][出力][パラメーター][永続] として設定できます。永続変数を使用して構成された Python Code ブロックでは、連続サンプル時間およびシミュレーションのステップを戻す機能はサポートされません。

      3. ラベル: ブロック端子またはダイアログ ボックスに表示される要素の名前を指定します。このプロパティは永続スコープをもつ要素には適用されません。

      4. : 要素のデータ型を設定します。Simulink でサポートされているデータ型、ユーザー定義のバス型、または Python オブジェクトを格納するための [PythonObject] 型を指定できます。Simulink データ型の詳細については、Simulink でサポートされているデータ型を参照してください。

      5. 次元: 要素のサイズを指定します。

      6. 端子: この要素の端子番号を指定します。このプロパティは永続スコープをもつ要素には適用されません。

    Empty block dialog of python code block

  3. [端子とパラメーター] テーブルを使用して、ブロック インターフェイスを定義します。[追加] ボタンをクリックして、テーブルに新しい要素を追加します。要素に該当する場合は、名前、スコープ、ラベル、タイプ、次元、および端子番号を指定します。

    直方体コードの場合は、次の要素を追加します。

    1. 長さの入力端子。

    2. 幅の入力端子。

    3. 高さのブロック パラメーター。

    4. 直方体オブジェクトの PythonObject 型の永続変数。

    5. 体積の出力端子。

    6. 表面積の出力端子。

    Ports and parameters

  4. ブロック ダイアログ ボックスのコード セクションの [初期化][出力]、および [終了] ペインを使用して、ブロック アルゴリズムを定義します。

    直方体コードの場合は、[初期化] タブを使用して、クラス定義のインポートと直方体オブジェクトの初期化を行います。Python 検索パスにユーザー定義の Python モジュールを追加する必要があります。詳細については、ユーザー定義の Python モジュールの呼び出しを参照してください。

    Initialize code pane of the block

    [出力] タブで、オブジェクト パラメーターの設定、体積の計算、表面積の計算を行います。これらのメソッドの出力を指定された出力要素に代入します。

    Output code pane of the block

    これらのコード ペインのブロック コードで Python print() 関数を使用すると、ノーマル モードとアクセラレータ モードのシミュレーションで Simulink 診断ビューアーにテキストを表示できます。これは、ラピッド アクセラレータ モードのシミュレーションではサポートされません。

  5. ブロックをダブルクリックして、パラメーター フィールドを含むブロック マスクを開きます。ブロックのパラメーターを指定します。

    Block dialog mask with code-defined parameters

  6. Python Code ブロックに必要な端子、パラメーター、およびブロック アルゴリズムが構成されました。指定したブロック端子をもつように更新されたブロック線図を確認します。これで、必要に応じて端子を接続し、モデルをシミュレートできます。

    Python Code block with configured ports

参考

トピック