可変性の実現(可変点の設計・実装)
コア資産は、スコープに含まれる複数の製品での利用を想定して開発されるため、その内部に可変点を含むことがあります。この可変点の設計が適切かどうかで、将来にわたるコア資産の維持管理性や再利用効率が変わってきます。ここでは、モデルやコードに対して、組込みソフトウェア開発で使用される代表的な可変点の設計・実装テクニックを紹介します。
これらのテクニックを用いて開発したコア資産を、開発する製品に合わせて自動的にコンフィグレーションして利用する、すなわち導出する方法については、「可変性の決定に基づく製品の導出」のページを参照して下さい。
※ここで取り上げるのは一例であり、他にも様々な実現方法があります。
SimulinkモデルにおけるSPL可変点の実装
制御系システムや数値解析の分野では、MATLAB/Simulinkを使って開発を行う事例が増えています。Simulinkモデルでは、可変点を設計するために以下のような方法が利用できます。
Simulinkモデルにおける可変点の設計
(Enabled/Triggeredサブシステムの利用)
この方式では、Simulinkの標準ライブラリで「条件実行サブシステム」として定義されているEnabled Subsystem, およびTriggered Subsystemを利用します。製品毎に異なる制御ロジックを全てモデルに盛り込み、制御信号によってロジックの実行パターンの選択ができるように、モデルを設計します。その手順は以下のとおりです。
※以下の例はEnabled Subsystemを用いて説明しますが、Triggered Subsystemでも同様です。
1.共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に実行パターンの異なる制御ロジック部をEnabled Subsystemで表現します。
2.可変部の実行パターンを切り替える制御信号の追加
可変部として設計されたEnabled Subsystemの実行パターン(実行有無やタイミング等)を制御する信号をモデルに追加します。
こうすることで、製品開発時にはこの制御信号の内容を決定し、ロジックの実行パターンを選択することができます。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(Function-Callサブシステムの利用)
この方式では、Simulinkの標準ライブラリで定義されているFunction-Call Subsystemを利用します。製品毎に異なる制御ロジックを全てモデルに盛り込み、制御信号によってロジックの実行パターンの選択ができるように、モデルを設計します。その手順は以下のとおりです。
1.共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に実行パターンの異なる制御ロジック部をFunction-Call Subsystemで表現します。
2.可変部の実行パターンを切り替える制御信号の追加
可変部として設計されたFunction-Call Subsystemへ実行パターン(実行有無やタイミング等)を制御する信号を与えるために、Function-Call Generatorをモデルに追加します。
こうすることで、製品開発時にはこの制御信号の内容を決定し、ロジックの実行パターンを選択することができます。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
( If/Switch Caseサブシステムの利用)
この方式では、Simulinkの標準ライブラリで「制御フローサブシステム」として定義されているIf Subsystem, およびSwitch Case Subsystemを利用します。製品毎に異なる制御ロジックを全てモデルに盛り込み、入力信号の値によって制御ロジックの選択ができるように、モデルを設計します。その手順は以下のとおりです。
※以下の例はIf Subsystemを用いて説明しますが、Switch Subsystemでも同様です。
1.共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に異なる制御ロジック部をIf Action Subsystemで表現します。
2.可変部を選択するIfブロックの追加
可変部として設計されたIf Action Subsystemを選択するためのIfブロックをモデルに追加します。そして、このIfブロックに与える入力信号によって、実行するIf Action Subsystemが切り替えられるように、Ifブロックの設定を行います。
こうすることで、製品開発時にはこの入力信号の内容を決定し、実行する制御ロジックを選択することができます。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(Configurableサブシステムの利用)
この方式では、Simulinkの標準ライブラリで定義されているConfigurable Subsystemを利用し、「インタフェースと実装の分離」の原則に基づいてシステムを設計します。すなわち、インタフェースは共通ながら、中身(実現)の異なるサブシステムを、ライブラリとして設計します。その手順は以下のとおりです。
1.共通のインタフェースを持つライブラリ・サブシステムの設計
外部インタフェースは共通ながら、その内部ロジックが異なる部分を、ライブラリ・サブシステムとして設計します。この時、ライブラリの中にConfigurable Subsystemを配置し、全てのロジックをサブシステムとして定義します。
2.ライブラリ・サブシステムを含んだ、共通となるモデルの設計
先に作成したライブラリ・サブシステムを含むモデルを設計します。この時、定義したライブラリ・サブシステムの中で最もよく利用されるものを、デフォルト値として設定(バインド)しておきます。
こうすることで、製品開発時にはライブラリの中から利用するサブシステムを選択できるようになります。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(Variantサブシステムの利用)
この方式は基本的にはConfigurableサブシステムの利用と同じですが、Configurableサブシステムの代わりにVariantサブシステムを利用します。これにより、指定する条件によってモデルを切り替えることができるようになります。その手順は以下のとおりです。
1.共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に実行パターンの異なる制御ロジック部をVariantサブシステムで表現します。
2.Variantサブシステムへのパラメタ(条件)の追加
可変部として設計されたVariantサブシステムに対して、異なる内部設計を与えるための条件をパラメタとして追加します。
3. 追加した条件に対応する各サブシステムの設計
条件を追加した際に作成されたサブシステムの内部設計を行います。必要に応じて、各サブシステムの名前を変更します。
製品開発時には条件を指定することで、利用するサブシステムを選択できるようになります。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(Switchブロックの利用)
この方式では、Simulinkの標準ライブラリで定義されているSwitch Blockを利用します。製品毎に異なる制御ロジックを全てモデルに盛り込み、スイッチング変数を使った条件分岐によって、制御ロジックの選択ができるように、モデルを設計します。その手順は以下のとおりです。
1. 共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に異なる制御ロジックは全てモデルに含め、それらをSwitch Blockによって切り替えられるように設計します。
2. 可変部を選択する定数の追加
製品毎に異なる制御ロジックを切り替えるための定数値を、Switch Blockに追加します。
こうすることで、製品開発時にはこの定数値を決定し、実行する制御ロジックを選択することができます。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計(パラメタの利用)
この方式では、定数値を表わすConstantブロックを利用します。製品毎に値の異なる入力や、挙動を切り替えるための変数をパラメタとして定義し、その値を容易に変更できるようにします。その手順は以下のとおりです。
1. 共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、製品毎に値が異なるパラメタをConstantブロックで表現します。
2. Constantブロックのパラメタの設定
モデル中のConstantブロックパラメタの定数値に、数値ではなくパラメタ名を設定します。
製品開発時にはこのパラメタの値を決定することで、モデルの挙動を制御することができます。パラメタの取り得る値が数パターンに限定されるなら、パターン数分のパラメタファイルをコア資産として用意しておき、製品に合わせて選択することもできます。
Simulinkモデルにおける可変点の設計
(Lookupテーブルの利用)
この方式では、入力に対する出力特性を表わすLookup Tableブロックを利用します。製品毎に入出力特性の異なる部分をパラメタとして定義し、その値を容易に変更できるようにします。その手順は以下のとおりです。
1. 共通となるモデルの設計
対象としているコンポーネントを利用する全ての製品をカバーするように、モデルを設計します。この時、入出力特性が製品毎に異なる部分にLookup Tableを使用します。
2. テーブルデータの作成
対象とする製品の仕様に合わせて、テーブルデータを作成します。
このように、開発する製品に合わせてテーブルデータを作成してモデルから参照するように設定することで、製品用のモデルを構成することができます。テーブルデータの取り得る値が数パターンに限定されるなら、パターン数分のテーブルデータをコア資産として用意しておき、製品に合わせて選択することもできます。
Simulinkモデルにおける可変点の設計
(Modelブロックの利用)
この方式では、Simulinkの標準ライブラリで定義されているModelブロックを利用し、「インタフェースと実装の分離」の原則に基づいてシステムを設計します。すなわち、インタフェースは共通ながら、中身(実現)の異なるサブシステムを、Referenced Modelとして設計します。その手順は以下のとおりです。
1. 共通のインタフェースを持つサブモデルの設計
外部インタフェースは共通ながら、その内部ロジックが異なる部分を、サブモデルとして設計します。この時、各サブモデルは別ファイルとして作成します。
2. Modelブロックを含む、共通となるモデルの設計
Simulinkの標準ライブラリで定義されているModelブロックを使用して、1.で作成したモデルのいずれか一つへの参照を含むモデルを設計します。サブモデルへの参照は、ModelブロックのModelReferenceパラメタで指定します。
製品開発時には、Modelブロックの参照先を変更することで、サブモデルの中から参照するモデルを選択できるようになります。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(Model Variantsブロックの利用)
この方式は基本的にはModelブロックの利用と同じですが、Modelブロックの代わりにModel Variantsブロックを利用します。これにより、指定する条件によって参照するモデルを切り替えることができるようになります。その手順は以下のとおりです。
1. 共通のインタフェースを持つサブモデルの設計
外部インタフェースは共通ながら、その内部ロジックが異なる部分を、サブモデルとして設計します。この時、各サブモデルは別ファイルとして作成します。
2.Modelブロックを含む、共通となるモデルの設計
Simulinkの標準ライブラリで定義されているModel Variantsブロックを使用して、当該コンポーネントを利用する全ての製品をカバーする共通のモデルを設計します。そして、Model VariantsブロックのModelReferenceパラメタで、参照先のサブモデルと、そのサブモデルを選択する条件を指定します。
製品開発時には条件を指定することで、サブモデルの中から参照するモデルを選択できるようになります。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計(ライブラリの置換)
1. 共通のインタフェースを持つライブラリの設計
外部インタフェースは共通ながら、その内部ロジックが異なる部分を、ライブラリとして設計します。この時、各ライブラリは別ファイルとして作成します。
2. ライブラリ・リンクを含む、共通となるモデルの設計
1.で作成したライブラリのいずれか一つを用いて、そのライブラリへのリンクを含む共通のモデルを設計します。
製品開発時には、Simulinkのreplace_blockコマンドを用いて、共通のモデルに含まれるライブラリ・リンクのリンク先を切り替えます。その後でモデルをコードジェネレータ(RealtimeWorkshop/TargetLink等)にかければ、製品用のコードを生成することができます。
Simulinkモデルにおける可変点の設計
(コマンドによるモデル要素の編集)
この方式では、コア資産として設計されたモデルを、add_block/delete_block/add_line/delete_line/set_param等のモデル編集コマンドを用いて製品開発時に変更/修正します。その手順は以下のとおりです。
1.全製品で共通となるモデルの設計
対象としているコンポーネントが、スコープ内の全ての製品をカバーするようにモデルを設計します。この時、通常は以下のいずれかのアプローチを取ります。
A) 最大アプローチ
全ての製品をカバーするために含みうる、全てのモデル要素を入れたモデルを設計します。
B) 平均アプローチ
全製品で共通、および多くの製品で必要なモデル要素を入れたモデルを設計します。
C) 最小アプローチ
全製品で共通のモデル要素のみを入れたモデルを設計します。
製品開発時には、モデルを編集するコマンドを実行することで、製品固有のモデルを作成します。モデル編集のパターン数が限定されるなら、パターン数分のコマンドファイルをコア資産として用意しておき、製品に合わせて選択することもできます。
SPL専門コンサルタント