マルチドメインモデリング環境である、OpenModelicaを使用した電気回路のシミュレーションの例を通して、その使用感や言語的側面に触れたいと思います。
想定読者としてはModelicaに触れたことがない人で、バックグラウンドとして回路シミュレーションに多少なりとも興味がある人、という感じでしょうか。ちょっとした使い方に関するチュートリアルも兼ねているかもしれません。
Modelicaとは
オブジェクト指向のモデリング言語です。他分野に跨る複雑なシステムのモデリング(例えば、機械、電気、電子、油圧、熱、制御、等々)のシミュレーションを記述するのが得意で、微分方程式なども記述できます。
ざっくりいうと、常微分方程式で解けるくらいの数値解析のためのモデリングをするのに便利な言語です。また、適用分野ごとに使える標準ライブラリなども用意されており、手早くモデルを構築することができます。いろいろな分野の計算に使えるので、「マルチドメインモデリング言語」と言われることもあります。
Modelica言語の仕様は Modelica Association で策定されており、最近ではModelica 3.4が2017年5月にリリースされました。
Modelica言語を実装するシミュレータとしては下記のようなものがあります。(Wikipediaさんありがとう)
- CATIA Systems
- Dymola
- LMS AMESim
- JModelica
- MapleSim
- MathModelica
- OpenModelica
- SCICOS
- SimulationX
メジャーなシミュレーションツールである、MATLABがこの中に入っていないところは注目すべき点かもしれません。
OpenModelicaとは
Open Source Modelica Consortium(OSMC)が開発を進めている、オープンソースのModelica処理系です。OSMC は Modelica Association と連携して規格を策定しているようです。
OSMCはこの他にFMI(Functional Mockup Interface)規格というのを策定していて、規格の異なるモデル間の協調動作を規定しています。相互運用性を高めてMATLABを食っちまおう!という意気込みを感じるような気もしますが、どうなんでしょうか。
さて、ソフトウェアとしてのOpenModelicaに話を戻して、OpenModelicaの構成等について説明します。
OpenModelicaに含まれるもの
OpenModelicaは概ね、下記のツールから成り立ちます。
- OMEdit - モデルエディタです。この後、これを使用してモデリングを実施します。
- OMPlot - プロッティングツールです。シミュレーション結果を表示します。
- OMShell - Modelica言語のインタープリタを起動します。いわゆるREPLです。
- OMNotebook - OpenModelicaのドキュメンテーションのために作られたツールのようです。立ち上げるとOpenModelicaのクイックツアーが出てきます。
まぁ、OMEditが本体かな、というところです。
早速モデルを作ってみる
まずは立ち上げる
OMEditを起動します。
左側のペインにパッケージがたくさん並んでいるのが見えます。
モデルを作る
とりあえず "New Modelica Class" とかやって、モデルを作ります。そして左側のペインからドラッグ&ドロップすると部品を落とし込めます。
部品のプロパティを設定できます。
出来上がったのがこちら。(3分クッキングかよ!)
昇圧チョッパー回路です。
感想としては、この手のツールのUIにしては使いやすい方です。
実行してみる。
とりあえず、実行。
とりあえず、何も考えずに一秒間、2000プロットくらいで試してみようと思います。
なにかエラーは出るが実行はされる。
適当に右側から項目を選ぶとプロットしてくれます。電圧を見てみます。
なんか、電圧跳ね上がってるし、落ち着いてないし、、、
電流も見てみます。
うーん、これはおそらくコンデンサのチャージ電流ですね。。。
(↑こいつのせいだ)
モデルをしげしげと眺めてみる
Modelica言語との関係
よく考えたら、Modelica言語全然出てきてない、って思います。(思うよね?)
ここまで表示してきたモデルは実はDiagram Viewというもので表示していました。これをText Viewに切り替えると。。。
Modelica言語による表現が出てきます。
なんとなく、HDL系の言語に雰囲気が似ていますかね。
これまで、ドロップしてきた部品のリストが上の方に出ています。実はペインの左側からドロップするという行為は、クラスのインスタンス化宣言をするということだったようです。また、部品のパラメータを入れるという行為はインスタンスの定数値を決定するということだったようです。
また、結線を行っていたものは下の方にconnect()という式によって表現されています。
なるほど。。。つまり、ここまで私はOMEditを使用してビジュアルプログラミングをしていたということになりそうです。
なお、annotation...となっている部分は表示上省略されていますが、これは図面の見え方を規定している模様です。
なんでこれで回路シミュレーションができるのか
さて、モデルを再度しげしげと見てみましょう。感想として「回路図やん!」というのが出てくると思います。(え?)
どう見ても回路図。。。
マルチドメイン言語じゃないの?回路だけ特別なの?って思ったりします。電流とか、電圧とか、それぞれ計算ルールが違うやん、それなのに、なんでつなぐだけで計算できるん??
これ、ちょっとだけ説明しておこうと思います。
実は、電気部品はそれぞれでPinというコネクタをインスタンス化しています。Pinの定義は下記のようになっています。
VoltageとCurrentを持っているということです。あれ?Currentにはflowというキーワードが、、、
Modelicaの世界では通常、接続された物同士は等しい物として扱われます。PinコネクタにおけるVoltageでいうと、接続した点での電圧が等しいという制約を受けることになります。つまりこれはキルヒホッフの電圧則を表しているということになりますね。一方、flowを付与されて接続されたもの同士は和がゼロになるという制約を受けることになります。これは、、、キルヒホッフの電流則ですね。
こうやって接続された物同士に異なる制約を設けることによって電気回路の法則を表現しているわけです。
まとめ(個人の感想です)
OpenModelicaの特徴として下記が挙げられます。
- その辺の簡単な回路シミュレーター位のことはやってのけてしまいます。
- マルチドメインで異なるドメインをまたいだシミュレーションもできます。
- ユーザーインタフェースは比較的使いやすいと思います。(圧倒的とは言わん)
- 自分でModelica言語を書いて拡張することもできます。
- オープンソースなので問題があったらフィードバックすることも、自分で修正することも可能です。
- なにより、購入する手間もなく、ダウンロードしてすぐに使えます。
これは、使ってみない手はないのではないでしょうか。
おわび
スナップショットの撮り方が怠惰だったらしく、ウィンドウの影が残ってしまいました。ちょっと暗い四角が写り込んでいるように見えるのはそのせいです。すみません。