外部データを使う
モデリングプロセスの間には外部データが使いたくなることもある.外部データは,センサーからのリアルタイムの入出力データだったり,記録された測定値だったり,場合によってはCADや画像のような外部ファイルだったりするだろう.このチュートリアルでは,モデルの中で外部データを使う方法について説明する.
このチュートリアルに使用されているモデル
|
CelsiusToFahrenheit FreeFloating ModelAndMeasurements |
記録されたデータ
モデルには実験の測定値のように記録されたデータを加えることができる.これは,データフィッティングアプリケーションやプロセスの物理的なモデリングが難しいアプリケーション等では非常に一般的である.Model Centerで自分のデータをCombiTimeTableとして加えてコンパイルされたモデルに入力としてフィードしたり,Wolfram言語で書いた自分のSystemModelに加えたりできる.
CombiTimeTable
自分のエキスペリメントからのカスタムデータはCombiTimeTableコンポーネントを使って簡単にロードできる.このコンポーネントはModelica.Blocks.Sourcesパッケージにある.tableパラメータとして時間と値のペアの配列を指定する.必要に応じて出力を調整するために,時間のスケーリング,滑らかさ,外挿用にはさまざまなオプションがある.
以下で,モデルのパラメータを実験データに対してキャリブレートする.測定値はバネから吊り下げられた物質の高さを示しす.
測定値をモデルにするために空モデルにCombiTimeTableコンポーネントを加え,後でデータに簡単にアクセスできるようにコネクタが追加されている.
CombiTimeTableタイプとRealOutputタイプのコンポーネントで作成されたMeasurementsモデル
elevationDataコンポーネントを選択して測定データを入力し,tableパラメータにデータを加える.
CombiTimeTableコンポーネントのtableパラメータに測定データを加える
測定値はシステムに大きな損失があることを示しているので,システムのモデルには質量とバネに加えて減衰も含める必要がある.
World,Fixed,SpringDamperParallel,Body,AbsolutePositionの各タイプのコンポーネントを使って作られたSpringOnMassモデル
モデルパラメータをキャリブレートするためには,測定値とSpringOnMassモデルの両方を含む新しいモデルを作成する.ModelAndMeasurementsに示されているように,パラメーターのキャリブレーションを便利にするためにキャリブレーション用に選択されたパラメーターをトップレベルに上げることができる.
ModelAndMeasurementsモデルで設定されたパラメーター値を使用して測定値とシミュレーションの比較を示す進行中のキャリブレーション
関連事項:CombiTable1Dv,CombiTable2Ds,CreateDataSystemModel,Modelica CombiTimeTable
シミュレーション入力データ
記録されたデータをコンポーネントとして表すのではなくモデルから分離しておくことが望ましい場合がある.そのような場合はモデルへのトップレベルの入力を介して記録データを提供することが可能である.その場合の実験データは「シミュレーション入力データ」と呼ばれる.
以下ではこの手法を使用して摂氏から華氏へのコンバータに温度データを供給する.
最初のステップはモデルを作成することである.Modelicaライブラリのコンポーネントを次の方法で接続する(摂氏の温度データが提供される最上位のRealInputに注意のこと).
RealInput,Gain,Constant,Add,RealOutputの各タイプのコンポーネントを使って作成されたCelsiusToFahrenheitモデル
次に,モデルのシミュレーションを行う.これでモデルのコンパイルされたバージョンが作成され,接続されていないトップレベルの入力にデフォルトの定数ゼロ軌道が提供される.tempCとtempFの結果をプロットする.
トップレベル入力にデータをフィードせずにシミュレーションを行う
モデルにシミュレーション入力データを提供するためには,CombiTimeTable形式を使って摂氏温度の読取り値をテキストファイルに保存する.最初の列は時間,2番目の列は温度である.
#1
double tempC(6, 2)
0 5
5 20
10 25
20 25
30 15
40 10
エクスペリメントブラウザの入力変数データファイルセレクタを使う
再度シミュレーションを行う.プロットされる結果の変化に注意のこと.
トップレベル入力にフィードされた記録済みデータを使ってシミュレーションを行う.
Wolfram言語では,シミュレーションの入力データはSystemModelSimulateの"Inputs"オプションで与えられる.
リアルタイムの入出力
リアルタイムの接続性にはいくつかのアプリケーションがある.ループ内のコントローラアプリケーションあるいはループ内のハードウェアアプリケーションのためにこれを使うことができる.あるいは,センサーデータをプロットして現実世界のシステムを研究することもできる.このセクションでは,現実世界のアプリケーションとインタラクトするいくつかの方法を見てみる.
OPC
OPCUA Modelicaライブラリを使うとシミュレーションモデルを現実世界のアプリケーションに拡張することができる. オープンなOPC Unified Architectureの通信プロトコルを使えば,自分のシミュレーションでさまざまなプラットフォーム上のプロセスやハードウェアとインタラクトすることができる.OPC Classicサーバとの通信のためのOPCClassic ライブラリもあるが,このライブラリについては本チュートリアルでは詳述しない.
以下ではOPC UAプロトコルを使ったデータの読み書きについて示す.
必須事項:instructions in the library documentationに従ってOPCUAライブラリがロードされており,例題サーバが起動されていること
デモンストレーション用のモデルはシミュレーションからサーバへ信号を連続的に送信し,サーバからシミュレーションにこれを読み戻す.
ExpSine,Write,Read,OPCUAServerのタイプのコンポーネントを使って作成されたExpSineOverOPCUAモデル
うまく通信できなければならないパラメータは,nodeID,nodeIDType,nodeNamespaceである.これらはデータの読み書きを行いたいサーバ上のノードを識別する.指定するノードはサーバ上に存在していなければならず,読み書き等の実行したい操作が行えるものでなければならない.expSine.fパラメータに値を与え,writeRealコンポーネントとreadRealコンポーネントを以下のように設定する.
エクスペリメント設定で,Synchronize with real time(リアルタイムと同期)をtrue に,Interval length(区間長)は0.1秒に設定し,モデルのシミュレーションを行って結果をプロットする.
ExpSineOverOPCUAモデルのエクスペリメント設定
シミュレーションの結果はOPC UAサーバを迂回すると,0.2秒ごとに連続時間信号の更新された読取り値が与えられることを示している.
ModelPlug
Wolfram ModelPlugライブラリを使うと,Arduinoボード(またはFirmataプロトコルに従う他の任意のボード)を介して自分シミュレーションモデルを現実世界と繋ぐことができる.ModelPlugは,例えばボタン,スイッチ,入力センサ情報,あるいはモータ=やサーボなどのアクチュエータを介して自分のModelicaモデルでインタラクトするさまざまな方法を開く.
以下で,シミュレーションがArduinoボード上のLEDの点滅をどのように制御できるかを示す.
必須事項:ModelPlugライブラリがードされていること,Arduino IDE,Arduinoボード
まず,Firmataコードを自分のボードにアップロードすることでArduinoの準備を行う.このコードはArduino(v1.0.5以降)に例題の一部として含まれている.Arduino IDEを開いてFiles ▶ Examples ▶ Firmata ▶ StandardFirmataと進む(以下の図を参照のこと).sketchを開いてこれを自分のボードにアップロードする.
Arduino IDEでStandardFirmataの例を見付ける
この例題のモデルには3つのコンポーネントしかない.後はコンポーネントの設定だけである.
BooleanPulse,DigitalOutput,Arduinoのタイプのコンポーネントを使って作られたBlinkLedモデル
値(例えば1秒)をbooleanPulse.periodパラメータに与え,arduinoコンポーネントとdigitalOutputコンポーネントを以下のように設定する.
arduinoコンポーネントの設定.Portパラメータの右にあるアイコンをクリックしてSerial Port Selector ウィンドウを開く
digitalOutputコンポーネントの設定.Arduinoボード上のLEDはピン13で制御される
このエクスペリメント設定で,Synchronize with real time(リアルタイムと同期)をtrueに,Interval length(区間長)を0.001秒に設定し,モデルのシミュレーションを行ってLEDの点滅を注視する.
BlinkLedモデルのエクスペリメント設定
より詳しくはModelPlugのGettingStartedドキュメントを読まれるとよいだろう.
グラフィックス
モデルの中にはアニメーション用のCADオブジェクトやアイコン用の画像のようにグラフィカルアセットが必要なものもある.このセクションでは,これらのタイプのアセットの使い方について説明する.
画像
アイコンを使うことでモデルを情報豊かにすることができる.描画ツールを使ってカスタムデザインを作成することも単純にアイコンビューに画像を加えることもできる(Modelica SpecificationはSVG,PNG,JPEG,BMPをサポートしている).
以下では,車種のモデルがアイコンによって強調されている.まず,車の既存の画像を見付けるかカメラまたは描画ツールで新たに作成するかしてみよう.
新たなモデルを作ってそのアイコンビューを開くことから始めよう.アイコンビューにアクセスできるのはModelerのユーザに限られるのでご了承いただきたい.
角が丸い矩形とコンポーネント名のラベルだけのモデルの初期アイコン
アイコンビューにドラッグアンドドロップすることでアイコンに画像を加える.アイコン内の希望の部分を閉めるように位置やスケールを調整する.自動的に加えられた角が丸い矩形を除くことはできるが,アイコンに枠を付けるのは,特にコネクタがあるモデルの場合は一般に望ましいことである.
CAD形状
MultiBodyライブラリからのコンポーネントを使ってCADデータをBodyShape,BodyBox,FixedShape等のコンポーネントに添付できる.
以下では,蝶ナットの形状を使って剛体の動きのアニメーションを作成する.まず,Wolfram言語あるいは他の任意の CADツールを使って蝶ナットのCADモデルを作成することから始める.
まず,パッケージ構造の中のモデルを作る.例えばCADShapesというような名前の新たなパッケージを作り,FreeFloating という名のモデルをパッケージ内に作る.この場合のモデルは基本的にBodyShapeコンポーネントだけである.
WorldとBodyShapeのタイプのコンポーネントを使って作成されたFreeFloatingモデル
本体が自由に動くようにモデル化するために,worldコンポーネントのgravityTypeパラメータを変更して重力を無効にする.wingNutの質量を指定して,最終的なアニメーションがよりおもしろくなるように線形速度と角速度の両方を使ってその動きを初期化する.バンドルされているFreeFloatingモデルを参照することができる.
Save in directory structureバリアントを使ってパッケージを保存して,パッケージのトップレベルのディレクトリの「CADShapes」の下に「Resources」という新たなディレクトリを作る.「Resources」ディレクトリの「wingnut.stl」にCADファイルを保存する(外部リソースの適切な整理は本チュートリアルの範囲外である).
Model Centerに戻ってwingNutコンポーネントを選択し,CAD形状をこれに添付する.Modelica URIを使ってアニメーションタブのshapeTypeパラメータがCADファイルを指すようにする.
最後に,シミュレーションを行ってアニメーションウィンドウでそのシミュレーションを再生し,結果を見る.
注意深い読者は,剛体の質量と慣性モーメントを正しくパラメータ化するための注意が払われていないことに気付くだろう.Wolfram言語関数CreateSystemModelは,CAD形状に基づいてそのような特性を自動的に計算するために使用でき,CAD形状のアニメーションに使用されるのと同じ座標系に関して特性が表現されることを保証するための堅牢なメカニズムを提供する.この手法は,ブログ投稿「Simulating Zero Gravity to Demonstrate the Dzhanibekov Effect and Other Surprising Physics Models」の蝶ナットやその他の形状に適用されている.