Exposableパラメータ
exposableパラメータの定義、使用方法、制限について紹介します。
定義
新規ブロックの作成やFMUのエクスポートなど、スーパーブロックのコードを生成する場合、スーパーブロック内のダイアグラムのパラメータ化に使用されるOML変数は、その数値がコード生成に使用される場合は固定とみなすことができますが、コード生成後でもその値を変更できる場合は、公開可能とみなすことができます。
スーパーブロックの公開可能なパラメータは、コード生成で作成された新しいブロックのブロックパラメータや、エクスポートされたFMUのパラメータとして使用することが可能です。
選択
変数をExposableパラメータとして指定するには、OML Exposable関数とスーパーブロックのマスクを使用する2つの方法があります。
- Exposable関数による選択
- Exposable関数を明示的に使用する場合、パラメータをExposableとして定義する方法があります。これは、スーパーブロックの任意の場所で、パラメータをExposableに定義する簡単な方法です。例えば、以下のスーパーブロックでは、GainブロックのGainパラメータは、Aという名前のExposableパラメータとして定義されており、デフォルト値は3です。
また、このパラメータは、以下のようにダイアグラムのコンテキストで定義することもできます。
A=exposable(‘A’,3)
また、ブロックのゲインパラメータ値を定義するために使用されます。この場合、スーパーブロックのコード生成時に、パラメータ A (ゲイン値)が公開されます。Exposable関数の第2引数は、パラメータのデフォルト値を定義します。
パラメータAとそのデフォルト値の公開は、例えば CCustomBlockやスーパーブロックのFMUを作成するコード生成ツールを使用することで可能です。
OMLの基本環境において、A が定義されていない場合、Aが公開されていないかのように(値3)、シミュレーションは正常に実行されます。モデル評価フェーズでは exposable関数は、GetFromBase関数のように動作します。
このようにパラメータを指定する方法は、深いレベルのパラメータをモデルを修正することなくexposableを作成にする場合などに有効ですが、ほとんどの場合、exposableパラメータを定義する最も便利な方法とは言えません。自動マスキングなどでスーパーブロックをマスクするのにexposableパラメータを選択するには、スーパーブロックの内部で使用されるが定義されていない変数を指定し、その変数を使用するのが一般的な方法です。
- マスキングによる選択
-
マスクされていないスーパーブロックでは、どのダイアグラムパラメーターも公開可能とはみなされません(前述したように、 exposable関数を使用して明示的に定義されたものを除きます)。スーパーブロックの内部で使用されている変数が、スーパーブロックの外部で定義されている場合でも同様です。しかし、後者の場合、ブロックが自動マスクされていれば、変数はマスクパラメータとなり、必要に応じて公開パラメータとして定義することができます。
モデル初期化スクリプトで変数Aが定義され、スーパーブロック内部で使用されている(Gainブロックのパラメータ値を定義する)次のモデルを考えます。スーパーブロックがマスクされていない場合、パラメータは公開されず、スーパーブロックの生成コードにはA=1の数値が使用されます。Gainブロックのパラメータの値を1に設定した場合と同じになります。
この場合の変数Aは、スーパーブロックが自動マスキングされるとマスクパラメータになりますが(自動マスキング操作により、スーパーブロックの内部で使われている変数と外部で定義されている変数、この場合はAを識別します)、ここに示すように、公開パラメータとして定義されているわけではありません。
スーパーブロックのマスキングは、exposableパラメータを定義するための方法の1つです。特に、マスクされたスーパーブロックに対してコードを生成する場合、マスクパラメータの値の定義に使用される変数はすべてexposableパラメータとして定義されます。なお、自動マスキング操作でマスキングされた場合、マスクパラメータに確実に対応した数が与えられます。ただし、マスクパラメータの値を定義する式には、スーパーブロックの外部で定義された任意の変数を含めることができます。
前図のようなモデルを考えてみます。スーパーブロックのマスクパラメーターは、A、その値も同様です。このスーパーブロックのコード生成では、Aはexposableと見なされ、そのデフォルト値は1となります。なおここで、Aがexposableとみなされるのは、マスク パラメーターの値がAとして定義されているためであり、たまたまマスク パラメーターの名前がAであり、スーパー ブロックのローカル変数に対応するためではありません。そこで、次に示すように、コード生成前にマスクパラメータAの値を数値で定義した場合:
一方、以下の例では、Aのパラメータ値が他の変数(特にBおよびC)の関数として定義されています。
この場合、Aはexposableではないことに注意してください。これは単にスーパーブロックのローカル変数となります。
exposableパラメータを定義する2つの方法(スーパーブロックのマスクパラメーター経由とexposable 関数の明示的使用)は、同じダイアグラムに対して同時に使用することができます。その結果、公開パラメータには、マスキングによって公開したパラメータと、exposable関数を使用したパラメータの両方が含まれることになります。
台車上の古典的倒立振子
古典的な倒立振子を台車に載せた場合の問題を考えます。

システムの状態には、台車の位置と速度、振り子の角度と角速度が含まれています。振り子を垂直に立てた状態で安定させるために、状態フィードバック制御を行います。このモデルには、制御の遅延がコントローラの性能に及ぼす影響を調べるための遅延ブロックが含まれています.

スーパーブロックの中に振り子力学のモデルが配置されています。ここでは、このスーパーブロックに様々なコード生成方法を適用し、その仕組みと違いを説明します。
スーパーブロックは、1つの入力(台車に加わる力)と1つの出力(状態の4つの要素すべてを含むベクトル)を持っています。内部で使用され、外部で定義されたパラメータは、台車と振り子の質量、M、m、振り子の長さ、 l、その慣性モーメント、J、初期状態x0 (Integratorブロックの初期状態) と重力定数 gです。これらのパラメータは、スーパーブロックの自動マスキングで見ることができます。
スーパーブロックは、マスクをパラメータGUIとして、通常ブロックと同様に使用することができるようになります。このGUIは、以下のようにマスクを編集することでカスタマイズすることができます。

- コード生成
-
このスーパーブロックにコード生成を適用すると、前述したようにマスクパラメータの値が同じ名前の変数として定義されているため、すべてのマスクパラメータが公開されます。コード生成ツールを適用すると、ここに示す標準コード生成の場合のように、oparパラメータ x0、J、M、g、l、mを持つC Customブロックが生成されます。
C Customブロックは、同じパラメータでマスクされたスーパーブロックに自動的に配置されます。
- 公開するExposableパラメータの選択
-
公開するパラメータは、必ずしもスーパーブロックのマスキングで得られるパラメータと同じとは限りません。例えば、台車 - 振り子システムにおいて、より自然なパラメータセットは、m、M、lと初期位置を公開することです。慣性モーメントは振り子の質量と長さ(J=ml2/12)、 g=9.81の関数です。また、完全な初期状態は必要ない場合が多く、システムの初期位置(カートの位置と振り子の角度)、 z0= x0(1) とθ0 =x0 (3) だけが考慮されます。これを公開パラメータとして使用するには、元のシステムのマスクパラメータ値を以下のように変更します。
なお、初期速度は0に設定されています。
z0 (z0)とθ0(th0)の初期値を定義した後、例えばモデル初期化スクリプトで、コード生成を適用すると、予想通り、以下のような公開パラメータのセットが得られる(ここでの公開パラメータの値は、手動で数値に置き換えています)。
同様に、スーパーブロックを使ってFMUをエクスポートした場合、エクスポートされたFMUは同じパラメータを持ちます。
公開パラメータによる制限
スーパーブロックのexposableパラメータは、スーパーブロックのダイアグラム内のブロックのパラメータの値を定義する式で直接使用するか、スーパーブロックのコンテキストで使用して、そのように使用する他の変数を定義することができます。しかし、exposableパラメータの使用には制限があります。
基本的な演算子(加算、減算、乗算...)、行列の抽出と連結、基本的な数学および三角関数を含むOML式で、exposableパラメータを使用することができます。これらの関数は、exposableパラメータを受け取るためにオーバーロードされてます。演算子のオーバーロードを用いる実装のため、基本演算子を含む関数の呼び出しやオーバーロードされた関数を含む式もサポートされています。ただし、オーバーロードされていない組み込み関数では、exposableパラメータを使用することはできません。例えば、OMLの組み込み関数cheby1を用いてブロックパラメータを計算するChebyshevフィルターブロックの実装では、cheby1がオーバーロードされていないため、マスクのパラメータ(フィルタパラメータ)を公開することができません。
exposableパラメータを含む式が有効であっても、すべてのブロックパラメータ値の定義に使用できるとは限りません。その理由は、Twin Activateライブラリのすべてのブロックパラメータが、exposableパラメータを持つ式を受け入れるわけではないからです。構造ブロックパラメータは明確に除外されており、信号のサイズやタイプに影響を与えるパラメータも除外されています。その他のブロックパラメータは、ほとんどの場合、exposableパラメータを持つ式を受け入れます。exposableパラメータの使用をサポートするブロックパラメータの一覧を以下に示します。
公開可能なブロックパラメータ一覧
以下のTwin Activateブロックパラメータは、Exposableパラメータによる式に対応しています。
Twin Activateブロック | Exposableパラメータ |
---|---|
Accumulator | x0 |
Bias | B |
CompareToConstant | C |
ConditionalSelect | Thra |
Constant | C |
ContStateSpace | x0 |
ContTransFunc | Num, den |
Counter | Minim, step |
Deadzone | lower, upper |
DFlipFlop | init |
DLatch | init |
DiscreteDelay | init_cond, maxim, Initv |
DiscreteIntegral | x0 |
DiscrTransFunc | num, den |
EventDelay | delay |
EventGenerate | etimes.time{1} |
FixedDelay | T |
Gain | gain |
Horner | coeffs |
Integral | x0 |
JKFlipFlop | init |
LookupTable | xx, yy |
LookupTable2D | xx, yy, zz |
LookupTableND | Ff, dimi{i} |
MatrixGain | gain |
MathExpression | 式で使用されるすべてのパラメータ |
MatrixExpression | 式で使用されるすべてのパラメータ |
ModuloCounter | ini_state, base, step |
Power | power |
PID | Kp, Ki, Kd |
Ramp | slope, startt, initout |
RampSaturate | Height, duration, offset, startTime |
Random | A, B |
Saturation | upper, lower |
Sawtooth | Period, up, down |
SignalGenerator | xx, yy (only scalar double signals, without output derivatives) |
SineWaveGenerator | M, F, P, offs |
SquareWaveGenerator | FV, SV, period, dutyCycle, offset |
SRFlipFlop | init |
StepGenerator | steptime, iniv, finv |
Trapezoid | Amplitude, rising, width, falling, period, startTime, offset |
Exposableパラメータに適用できるOML演算子および関数
Exposableパラメータは、exposableブロックパラメータの値の計算に使用することができます。この計算は、OML式に限定することも、スーパーブロックコンテキストに含まれる1つまたは複数のスクリプトの実行に基づくこともできます。結果の式の複雑さに明確な制限はないが、使用は"単純な"式に限定することを推奨します。複雑な式は評価効率が悪く、失敗することもあります。
ExposableパラメータおよびExposableパラメータに依存する他の変数は、任意の大きさの行列にすることができます。以下の演算子、関数で使用可能です。
- 基本演算子:
+ - * / \ .* .\ ./ ^ .^ == ~= > < >= <= & | ‘ .’ : - 行列の行と列の連結、行列の抽出(':'と'end'によるアクセスに対応)
- Primitive関数: sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, exp, log, sqrt, min, max, transpose, floor, ceil, round, svd
- 数値を返すPrimitive関数: size, length, isvector, isscalar, issquareExposableパラメータのサイズは固定で、その値には依存しないので、これらの関数の出力はコンパイル時に決定することができます。
- 上記の演算子および関数のみを定義内で使用するOML関数、または同じ型の他のOML関数。
- X + Y
- Z = X .*Y; sin(Z)^2
- X(1,:)* X(:,1)
- Z = [X, Y]; Z’
- if isscalar(X), Z=X; else Z=Y; end
最後の文は、コンパイル時にXがスカラーかどうか、そのデフォルト値から分かるので有効です。
- eig(X)
- eye(X,Y)
- if X > 0, Z = X; else Z=0; end
- Z = max(0, X);