コード生成とエクスポート

コード生成とエクスポートダイアログボックスで使用できる機能の概要です。

このダイアログボックスでは、さまざまなターゲットのコード生成機能にアクセスでき、各ターゲットについて、対応するコード生成パラメータを定義できます。

すべての場合において、Super Bock full nameパラメータを使用して、コードが生成されるスーパーブロックを選択する必要があります。スーパーブロックは現在のモデルに存在しなければなりません。スーパーブロックは、モデル内でフルネームで指定する必要があります。これを行うには、ダイアグラム内でスーパーブロックを選択し、Get Selected Blockをクリックします。

備考:コード生成はスーパーブロックに適用する必要があります。モデルには適用できません。コード生成をフルモデルに適用する場合は、まずそのトップダイアグラムをスーパーブロックに配置し、コード生成をスーパーブロックに適用する必要があります。スーパーブロックメニューを使用することで、この操作が容易になります。

コード生成技術

Activateでは、異なるターゲットに対して2つのコード生成技術を利用できます。

標準コードジェネレーターは、シミュレーション中に使用されるActivateブロックに関連する関数に依存するCコードを生成します。このコードジェネレーターが生成するコードは、シミュレーション中に元のスーパーブロックの動作と、同一ではないにせよ、類似した動作を実現します。生成されたコードは、ブロックシミュレーション関数への一連の関数呼び出しで構成されているため、いくつかのActivateコアライブラリに依存しています。また、最適化もインライン化もされていません。結果のコードがActivate環境内で使用される場合、依存性は問題になりませんが、このコードジェネレーターは他の環境へのコードのエクスポートには適応していません。

インライン(またはP)コードジェネレーターは、標準コードジェネレーターに代わるものです。Pが生成するコードは高度に最適化されています。コードは、モデルのパラメータ値を考慮して生成されます。特に、生成されるコードは、信号のタイプやサイズに関する情報を使用して特殊化され、定数は可能な限り伝搬されます。このことは、生成されたコードによってモデルパラメータが公開されても、そのようなパラメータは内部信号のタイプやサイズを変更できないことを意味します。Pコード生成は、コードが高度に最適化されるだけでなく、生成されたコードには依存性がほとんどないため、生成されたコードが外部環境にエクスポートされるほとんどのアプリケーションで使用されます。

サポート対象

コードの生成とエクスポートダイアログボックスには、以下のターゲットがあります:Activate Block、FMU、Host Standalone、Python、Embed Block。

Activateブロック

このターゲットのコード生成は、新しいActivateスーパーブロックを作成し、選択されたスーパーブロックをこの新しいスーパーブロックに置き換えます。

注: このターゲットに対してコードが生成されると、モデルが変更されます。そのため、元に戻す操作によって元のモデルを復元することは可能ですが、その前にモデルを保存しておくことをお勧めします。

生成されたスーパーブロックは主にCCustomBlockを含み、元のスーパーブロックの内容に対応するシステムの動的挙動を実現します。生成されたスーパーブロックに存在するかもしれない他のブロックは、Activateでの動作が元のスーパーブロックの動作と一致するように、CCustomBlockをアクティブにするために使用されます。

このターゲットには、標準コードジェネレーターとPコードジェネレーターの両方が使用できます。コードジェネレーターの選択は、アプリケーションによって異なります。Activate用の新しいブロックを生成するためにコード生成が使用される場合(パフォーマンスやコンテンツの隠蔽のため)、生成されたコードのライブラリ依存性が問題にならないため、標準のコードジェネレータを使用することができます。このコードジェネレーターは、ブロックがアトミック宣言されている場合のシミュレーションに使用されます。しかし、コードをエクスポートする前に、生成されたコードをActivate環境(元のモデル)でテストするためにコード生成を使用する場合は、エクスポートされたコードは、ほとんどの場合、Pを使用して生成されるため、Pコードジェネレーターを使用する必要があります。

いくつかのパラメータを設定することで、生成されるコードに必要とする動作を組み込むことができます。

FMU

FMUターゲットは、ME(モデルエクスチェンジ)とCS(連成シミュレーション)の両方のタイプで、FMI 2および3標準に準拠したコードを生成します。このターゲットには、どちらのコード生成技術も使用できますが、依存関係がないか、ほとんどないため、多くの場合、Pが使用されます。

FMUターゲットには特定のパラメータがあります。FMUタイプ、バージョン番号、FMU ファイル名を選択できます。オプションで、生成されたコードのCソースもFMUファイルに含めることができます。

他のターゲットでも利用可能な他のパラメータは、このドキュメントの後半で紹介します。

スタンドアロンホスト

このターゲットでは、ホスト(WindowsまたはLinux)上にメインファイルが生成されます。生成されたメインファイルは一例であり、ユーザーが特定のアプリケーションに適合させる必要があります。このファイルでは、システムの入力はコンソールから取得され、出力は標準出力に書き込まれます。たいていの場合、特定のアプリケーションでは、これらの読み書き関数を置き換えるだけで十分です。

システムの動的挙動は body.cというファイルで生成されます。このファイルはコールバック関数をエクスポートします。コールバック関数はターゲットごとに異なるインターフェースで使用されます。コールバックは、時間ステップの取得、初期化、終了のための関数を提供します。システムが連続時間動的挙動を含み、組み込みソルバーオプションが選択されていない場合、時間ステップ関数step0は、指定された時間まで、離散イベントがない場合に時間を進めるために提供されます。これは陽解法Eulerソルバーを使用して行われます。スーパーブロックが起動するイベントの数に応じて、離散時間ステップ関数step1step2...も提供されます。

body.cファイルを編集する必要はありません。特定のアプリケーションのための修正は、インターフェース関数、この場合はmain.c関数を調整します。

main.exeを作成するためのmakefileも生成されます。このターゲットでは、Pコード生成のみが提供されています。

生成されたファイルを置くフォルダーは、コード生成パラメータです。他のターゲットに共通するその他のパラメータについては後述します。

Python

ターゲットの名前から想像されるのとは異なり、生成される主なコードはPythonではありません。HostスタンドアロンターゲットとEmbed Blockターゲットで使用される同じbody.cが生成されます。しかし、Python言語で公開された関数にアクセスするためのインターフェースPythonコードも提供されています。Pythonエクスポートは、主にPythonの機械学習に特化したライブラリを使用するために設計されています。Activateモデルが連続時間動的挙動であることを前提としています。Hostスタンドアローンターゲットに関しては、Eulerソルバーを実装し、それに基づいて時間を進めます。離散時間アクティベーションのサポートは、主にリセットと実行の再開のためです。

PythonターゲットはPコード生成技術のみを使用しています。

生成されたファイルを置くフォルダーは、コード生成パラメータです。他のターゲットに共通するその他のパラメータについては後述します。

選択されたフォルダー内の生成されたファイルには、コードが生成されたスーパーブロックの名前に基づいて命名されたPythonファイルが含まれており、拡張子は .PYです。このファイルは、シミュレーションを実行するためにPythonで使用する4つのPython関数を定義しています:

  • init(): この関数は、生成されたCコードとPytonを動的にリンクするために、最初に一度だけ呼び出す必要があります。
  • finish(): この関数は最後に一度だけ呼び出され、リンクを削除します。
  • t, outputs = step(inputs, t, dt): これは、ステップサイズdtのEulerソルバーを使って時間をtまで進めます。
  • outputs = reset(inputs, t): コードが生成されるスーパーブロックにアクティベーション入力ポートがある場合、この関数は時間を t まで進めた後(time=t までのステップ)、対応するアクティベーションに関連するアクションを実行します。これは主に機械学習ライブラリで使用するシミュレーションを再開するためにt=0で使用します。また、他の時間インスタンスの離散時間イベントアクションを実装するために使用することもできます。
注:

入力と出力は、ブロックの入力と出力のPython配列を表します。それらの要素は、個々の入力と出力を表すnumpy配列です。

一般的な使い方では、step関数を使用して時間を進め、t=0でリセットを使用してシミュレーションを再開します。ただし、離散システムでは、リセットを使用して、起動時にシステムの状態と出力を更新することができます。例えば、SuperBlockという名前のスーパーブロックのPythonターゲットのコードを生成するときに、embedded solverオプションを使用すると、SuperBlock.pyファイルで提供される関数resetがシステムの完全な動的挙動を実現します。

生成されたPythonコードは、PyCustomBlockを使用してActivate環境でテストできます。このブロックでは、ブロックのシミュレーション機能をPythonで定義します。前述のSuperBlockコードの場合、スーパーブロックが1つの入力と1つの出力を持つ場合、コードは次の画像のようにActivateモデルでテストすることができます:

サンプルクロックの周期は、組み込みソルバーのステップサイズに対応します。このブロックのシミュレーションコードは次のように表現できます:

import hwx.activate.apis
import numpy
import sys
sys.path.append("SuperBlockFolder")
import SuperBlock
def PyBlockFunction(block,flag):
	apis = hwx.activate.apis
	u1=apis.vssGetInputData(block,1)
	nevprt=apis.vssGetEventCode(block)
	if flag == apis.vssBlockInitializeFlag():
		SuperBlock.init()
	elif flag == apis.vssBlockReinitializeFlag():
		pass
	elif flag == apis.vssBlockTerminateFlag():
		SuperBlock
	elif flag == apis.vssBlockOutputUpdateFlag():
		y1 = SuperBlock.reset([u1], apis.vssGetTime(block))
		apis.vssSetOutputData(block,1,y1[0],apis.vssGetOutputDataType(block,1))

Generate packageオプションは、setup.pyスクリプト経由で C/C++ 拡張をビルドするPythonパッケージを生成します。拡張機能を自動的にコンパイルするには、以下の方法でパッケージをインストールしてください:

import hwx.activate.apis as apis 
apis.install_package('path to package')
インストール後、run 'path to package'/test/testの実行を試してください。

Embedブロック

このターゲットでは、Altair Embed製品で使用されるEmbedブロックが生成されます。EmbedブロックはAltair Embedに簡単にロードでき、シミュレーションとコード生成の両方に使用できます。このコードでは、初期化、終了、時間ステップの取得に、他のターゲットで使用されているのと同じ body.cを使用しています。Embedにエクスポートできるのは離散時間システムだけなので、連続時間ダイナミクスを含むダイアグラムは、embedded solverオプションを使用してエクスポートする必要があります。エクスポートされたブロックは離散時間Embedブロックです。

EmbedブロックターゲットはPコード生成技術のみを使用します。

生成されたファイルを置くフォルダーは、コード生成パラメータです。他のターゲットに共通するその他のパラメータについては後述します。

PLC構造化テキスト

構造化テキスト(STまたはSTX)はPLC(Programmable Logic Controllers)で使用される言語です。IEC 61131-3規格でサポートされています。コード生成を使用すると、ブロック図のSTコードを作成できます。このターゲットには、どちらのコード生成技術も使用できます。

2つの特定のターゲット(OpenPLC、TwinCAT3)は、プログラミング環境にSTコードを簡単にロードするための追加XMLファイルでサポートされています。その他のターゲットには、OpenPLCまたはTwinCAT3の生成されたSTコードを使用できます。

コード生成パラメータ

ここでは、複数のターゲットに共通するパラメータを示します。

強制アトミックプロパティ

このプロパティは、ブロックの内容をアクティブにする方法を指定します。多くの場合、コンパクトなコードを生成するには、このオプションを選択する必要があります。このオプションでは、スーパーブロックの各起動入力ポートに対して離散時間起動が考慮されます。対応する外部イベントは非同期とみなされます。アトミックオプションを使用しない場合、入力の活性化の可能な組み合わせごとに離散時間の活性化が考慮されます。スーパーブロックにはn個のポートがあり、2のn乗マイナス1乗の異なるコードが生成されます。また、常時アクティブと宣言されていない各通常入力の既存のアクティブ化ポートに、アクティブ化入力ポートが追加されます(このプロパティについては後述します)。Activateブロックターゲットの例外的な状況を除き、アトミックプロパティは強制されなければなりません。

入力を常にアクティブにする

スーパーブロックのコードが生成されるとき、そのポートのプロパティの一部は、モデル環境での設定から取得されます。ポートの種類とサイズは環境から取得します。これらのプロパティは、スーパーブロック内の対応するブロックポートのブロックパラメータとして定義することもできます。

ただし、入力が連続時間信号(常にアクティブな信号)であるかどうかの情報は、環境から自動的に取得することはできません。この情報は、スーパーブロック内の対応するブロックポートのブロックパラメータとして、各入力ポートに対して定義することができます(ブロックの時間依存プロパティ)。すべてのスーパーブロック入力が常にアクティブである場合、すべての入力ブロックポートの時間依存性を設定する代わりに、コード生成入力を常にアクティブにする(Force input to always active)プロパティを設定することができます。

入力が常にアクティブ(連続時間)である場合、生成されるコードの複雑さを軽減するために、このプロパティを設定することが重要です。

強制組み込みソルバー

このオプションを使用すると、システムの連続時間動的挙動に使用される数値ソルバーアルゴリズムが生成されたコードに含まれます。その結果、ソルバーの時間ステップに対応する周期クロックによって起動される離散時間システムが得られます。

このオプションを選択すると、GUIのEmbedded solverタブで埋め込みソルバーパラメータ、時間ステップ、およびソルバーの選択を定義できます。組み込みソルバーの使用選択とそのパラメータは、モデル内部で定義することもできます。その場合、異なるスーパーブロックに対して異なる組み込みソルバーを使用することもできます。

組み込みソルバーは、標準コードジェネレーターとPコードジェネレーターの両方で使用できます。ただし、主にPコードジェネレーターで使用されます。埋め込みソルバーオプションは、このオプションが選択されていないときに使用されるEulerソルバーよりも多くのソルバーの選択肢を提供します。このオプションを使用すると、Pコードジェネレーターは、このオプションを使用しない場合よりも多くのブロックをサポートします。したがって、モデルに連続時間動的挙動がない(ソルバーが実装されていない)場合でも、このオプションを使用することをお勧めします。

組み込みソルバーを適用するには、スーパーブロックに外部起動ポートがない必要があります。スーパーブロックの内部では、サンプルクロックなどの離散時間起動ソースを使用できます。