最小構成のMBD事例 第2章 バックナンバー

最小構成のMBD事例 第2章 バックナンバー事例
最小構成のMBD事例 第2章 バックナンバー
スポンサーリンク

はじめに

第1章のバックナンバーはこちら

Modelicaによるプラント設計。
それをFMUにして他のプラットフォーム(Python等)での再利用。
さらに制御器との様々な接続方法(ASAM XCP等)の事例を紹介していく話。
Modelica用ツールとしてはOpenModelicaを使用する。

OpenModelica

ASAM XCP

参考書籍等

スポンサーリンク

導入編

  • 恒例の太郎くんの悩み事からスタート。
  • プラントモデルを作成する必要がある。
    • それっぽいものを作るだけならば過去の記事を参照すればOK。
      • 一次遅れ系。
      • モーター伝達関数。
  • 本シリーズはModelicaを使用した話に踏み込む予定。
    • Modelica用のツールは雰囲気的にはSimulinkに似ていることが多い。
スポンサーリンク

Modelica

  • Modelicaの説明。
    • オブジェクト指向のマルチドメイン・モデリング言語。
    • 機械、電気、電子、油圧、熱、制御などの領域を横断して記述できる。
  • Modelicaはプログラミング言語だが、一般的な言語とは性質が異なる。
    • シミュレーション特化言語。
    • モデル定義としてパラメータと方程式を内包。
  • Modelicaのプログラミング言語として性質を知るためモデル定義確認。
    • Massモデルを参照。
    • ある質量とある長さをもった完全剛体を1Dとして両端に力を加えられるモデル。
  • 一般的なプログラムと異なり代入式ではなく方程式を定義していく。
    • シーケンシャル且つ代入になる書き方もあるが一般的なプログラムのそれとは異なる。
  • Massモデルの中にあるextendsは継承を示すキーワード。
  • PartialキーワードはModelの不完全性を示しており、継承以外の利用ができないよう制約を掛けている。
    • OOPの抽象class的なもの。
  • PartialRigidモデルは剛体モデル。
    • 直線運動する剛体モデルを作る際はこのモデルを継承すると吉。
  • Flangeの説明。
    • 様々な領域で使われる用語ということもあり「円筒形の物体」程度の定義。
  • ModelicaのFlange。
    • connectorタイプでModel間の接続用インターフェース。
    • flow接頭辞は運動の第3法則(作用・反作用)を実現するのに便利。
      • 力(Force)の宣言で利用されてる。

スポンサーリンク

Modelicaツール

  • Modelicaを扱えるツールは様々。
    • Amesim、Simplorer、Dymola、MapleSim、SimulationX、OpenModelica。
  • 自動車業界ではMapleSim、SimulationXが多め。
    • HILS、Simulinkの相性の都合。
  • OpenModelicaはオープンソースなツール。

スポンサーリンク

OpenModelica

  • OpenModelicaの説明。
    • Wikiepdia英語ページから引用。
    • 自動車、水処理、発電所の領域で使われている。
    • 自動車業界でも開発フェーズだと相互運用性都合でプロプライエタリ品を使うことが多い。
  • 複数のツールで構成されている。
    • コンパイラ、エディタ、インターフェス、プラグインなど。
  • OpenModelica Compiler (OMC)はコンパイラ。
    • C言語を生成する。
    • インタプリタ用言語を生成してデバッグ動作を実現。
  • OpenModelica Connection Editor (OMEdit)
    • グラフィックエディタ。
    • C++/Qtで作成されているためマルチプラットフォーム。
  • OpenModelica Shell (OMShell)について説明。
    • その名の通りシェル。
    • MATLABのコマンドウィンドウに近い。
  • OpenModelica Notebook (OMNotebook)の説明。
    • コマンドの実行とその結果を含めてドキュメント化できる機能。
    • Jupyter Notebookに近い。
  • OpenModelica Python Interface (OMPython)
    • Python自動化インターフェース
  • OpenModelica Matlab Interface (OMMatlab)
    • 上記のMATLAB版
  • Modelica Development Tooling (MDT)
    • Eclipseインターフェース
  • OpenModelicaのダウンロード。
    • Windows、Linux、Mac版がある。
    • 32bit、64bit用に分かれている。
  • OpenModelicaのインストール。
    • 基本はウィザードに従って「次」へ進んでいくだけ。
    • トータルで10Gbyteほどのサイズになるので、15Gbyteくらいの空き容量があった方が良い。

スポンサーリンク

massモデル

  • 使用するモデルはMassとconstantForce。
  • 直線運動をふんわり知って置いた方が良い。
    • 加速度、速度、距離、力、運動量、仕事、仕事率。
  • OpenModelica Connection Editorで各モデルを配置&接続
    • Modelica→Mechanics→Translationalに目的のモデルがある。
  • 前回作成したモデルが何を示しているか確認。
    • massを引っ張り合ってるモデル。
    • グラフィックエディタだと分かりにくいがマイナス符号を付けないと逆向きの力にはならない。
  • シミュレーション結果を事前に予測してみる。
    • 運動方程式を使用する。
    • 質量と力が分かっているので、加速度が求められる。
    • 加速度から速度、速度から距離。
  • シミュレーションするモデルと前回の予測を再掲。
    • constantForce、massの組み合わせ。
    • \(1[m/s^2]\)の加速度。
  • シミュレーション開始方法。
    • OpenModelica Connection Editor上部の矢印アイコンをクリックするだけ。
  • シミュレーション結果確認。
    • 予測通りの結果が得られた。
  • 他のシミュレーション結果のパラメータを確認
    • 加速度に加えて、速度と移動距離。
    • OpenModelica Connection Editorのプロットの画面の変数ブラウザでチェックを入れるだけで確認可能。
  • それぞれのパラメータの関係性を確認。
    • 加速度を積分して速度。
    • 速度を積分して移動距離。
  • OpenModelicaはローコード、ノーコードの性質がある。
    • しかし、コードの読み書きも出来ていた方が良い。
  • massモデルのソースコードを確認。
    • equationではconnectキーワードで接続と定義。
    • annotationキーワードでグラフィカルな情報が追記されソースコード内で情報が完結している。
  • Modelicaコードを弄ることでいろいろと効率化される可能性がある。
  • 実際にparameterキーワードを使って変数を定義。そして、それをconstantForceに設定。
    • 今のままでは動作は何も変わらない。
    • ソースコード上でパラメータ調整をし易くなったくらいの効能しかない。
    • 即値で調整するのでは労力に差はさなそう。
  • 「Modelicaのソースコードに変数を設置」の効能はモデル編集ではなくシミュ―ション時。
  • シミュレーションをするためには毎回モデル検査、Cコード生成、コンパイルが入る。
    • 規模が大きくなれと結構待たされる。
  • parameterキーワードで宣言した変数はコンパイル後にも修正可。
    • コンパイルせずに再シミュレーション可能。
  • Modelicaコードで変数追加後のOpenModelica Connecter Editor上の見え方確認。
  • まずは普通にシミュレーション。
  • 変数ブラウザで変数を書き換えたあとに再シミュレーション。
  • モデルチェック、コンパイル無しで即シミュレーション結果が得られた。
  • ちょっとしたテクニックをしってるだけで効率化可能。
  • Modelicaコードに追加したパラメータが増えると管理が大変。
    • 注釈が欲しい。
  • 他のモデルもModelicaコードで書かれたものであるが変数ブラウザで注釈が確認できる。
    • つまり、注釈が入れられるはず。
  • 変数の隣にダブルクォーテーションでくくった文字を入れれば注釈。
    • 変数ブラウザでも確認可能。
  • ソースブロックによっては様々な信号を入力できる。
    • ソースブロックは信号を生成してくれるブロック。
  • 信号を生成するソースブロックと物理量に変換するソースブロックがある。
    • 今回はtrapezoidが信号生成、forceが物理量変換。
  • Modelicaライブラリは大量にあるがライブラリブラウザで検索ができるようになってる。
  • trapezoidブロックとForceブロックを配置。
  • ForceブロックはModelica→Mechanics→Translational→Sourcesにある。
  • trapezoidブロックはModelica→Blocks→Sources→Trapezoidにある。
  • 本来はtrapezoidを修正する必要があるが今回は不要。
  • trapezoidの設定もせずにおもむろにシミュレーション。
    • 矩形波的な出力になった。
  • 変数ブラウザでtrapezoidの設定を編集。
    • 台形波的な出力に変化。
  • このように、変数ブラウザからパラメータ変更が可能なソースブロックはそこそこある。
    • これらを知っているといろいろとサボれて楽できる。
スポンサーリンク

DCモータ

  • ModelicaのDCモータモデルのサンプルの位置をライブラリブラウザで確認。
  • DCモータモデルをとりあえずシミュレーション。
    • 制御電圧、制御電流、角速度の結果を確認。
  • 今回は電圧をランプ関数で制御したシンプルなもの。
    • ランプ関数は0を起点に徐々に上がっていく関数。
  • ModelicaのDCモータモデルをちょっと掘り下げ。
    • 以下が絡んでくる。
      • 電気/電子領域。
      • 古典力学領域。
      • 幾何学(材料力学)領域。
  • 物理モデリングは伝達経路、伝達関数、微分方程式解決、シミュレーションの4つの工程がある。
    • Modelicaは伝達関数、微分方程式解決をサボれるツール。
  • DCモータモデルのModelicaコードを確認。
    • 半分くらいはannotationなのでそれほど規模は大きくない。
  • 見るべきポイントを列挙。
    • 先頭のparameter部。
    • 中間のモデル宣言部。
    • 真ん中DcPermanentMagnetData。
      • これが今回のサボりポイントの目玉となる。
  • Modelicaコードのparameter部を確認。
    • parameterに関しては以前やった。
    • しかし、今回はReal型ではない。
    • 厳密には、Real型に単位の定義を付加したもの。
      • 電圧だったら”V”。
      • トルクなら”N.m”。
  • SI単位系で存在するものはModelica.SIunitsの中にすでに定義済み。
  • Modelicaコード モデル宣言部を確認した。
    • 以下が存在しており、OpenModelica Connection Editor上にもある。
      • DC_PermanentMagnet、Ramp、SignalVoltage、Inertia、TorqueStep。
  • DcPermanentMagnetDataが特殊な位置づけ。
  • DcPermanentMagnetDataをOpenModelica Connection Editorで確認。
    • UI上で様々なパラメータを設定可能。
    • さらにそのパラメータをDC_PermanentMagnetに渡すことでモデル初期化している。
  • 初期化するモデルが一個だとあまり意味がないかもだが、同特性モデルが複数あるとサボれる。

スポンサーリンク

FMI(Fumction Mockup Interface)

  • Modelicaモデルを外部から利用する手段は一応ある。
    • OpenModelicaからFMIをもったFMUを出力可能。
  • FMIは物理モデルをモジュール化したものの標準インターフェース。
    • MODELISARプロジェクトで策定。
    • その後、Modelica Association Project(MAP)で管理。
  • FMI仕様の公開場所確認。
    • FMI-Standardにて公開されている。
  • FMI/FMUはMATLAB/Simulinkで言うところのS-Functionみたいなもの。
    • コンセプトとしてはほぼ一緒。
    • FMI/FMU側は標準仕様と言うことでもうマルチプラットフォームを意識したものとなっている。
  • FMU/FMIの存在価値について確認。
    • S-Functionと同等とすると存在価値が薄くなる。
  • 自動車業界なりの狙いはある。
    • サプライヤから納入される部品と同等の振る舞いするモデルモジュールをもらい、完成車メーカ側で統合する。
  • FMU/FMIはSimulink、LabViewをプラットフォームとして入出力を繋げられる。
  • 知ってる範囲でFMU/FMIに対応しているツールを調べてきた。
    • 自動車業界限定且つメジャー所だと5社ほど。
      対応Versionやアドオン追加などのの制約はある。
      対応ツールは多いので結構使えそう。
      • ただし、Vector社製品のようにCANoeは対応しているが、CANapeは対応していない。などはある。
  • 各社ツールでFMU/FMIの利用で追加費用は発生しない。
    • 非競争領域と考えて広めることを重要視している可能性が高い。
    • 2016年くらいから流行り始めている。
      • SDKのリリースが2014年なのが理由かも。
  • FMU/FMIのVersionは1.0と2.0がある。
    • ただし、互換性はない点に注意が必要。
  • FMU/FMIのシミュレーション方式は2種類ある。
    • Model Exchange(通称ME)。
      • 外部にSolver。
    • Co-Simulation(通称CS)。
      • 内部にSolver。
  • SolverはODE Solverのこと。
    • 常微分方程式を解決する機能。
      • オイラー法、ホルン法などが有名
  • FMU/FMIのシミュレーション方式とSolverの位置づけを図解した。
  • MEは近似精度を調整したい場合に有利。
    • ECUの粗い制度を再現したい。
    • プラントの演算負荷を下げてシミュレーションを高速化したい。
  • CSは内部にSolverがあり、繋ぐだけで動くので設定が簡単。
    • CSのみのサポートしかしていないツールもある。
  • FMU/FMIはあまり一般的に知られているものではないので利用方法の情報が皆無。
    • よって、仕様に踏み込まないと利用方法も見えない。
  • 仕様書を読み込むのも大変なのでFMU自体の中身を見て行った方が理解としては楽そう。
    • 実はFMUは特定のファイルとフォルダ構成をzip圧縮したもの。
      • つまり解凍して中身を参照できる。
  • FMUとzipとして解凍してみた。
    • 何個かのフォルダとxmlファイルがあった。
  • binariesにプラットフォーム別のライブラリが格納。
  • resourcesフォルダに依存関係があるファイル群を格納。
  • modelDescription.xmlにinput。output、内部パラメータが定義されている。
  • FMU/FMIのプラットフォーム上での位置づけを再確認。
  • FMUのユーザ視点に於いての位置づけを確認。
    • modelDescription.xmlとMotor.DLLの位置づけなど。
    • これを元に仕様の性質から予測される利用手順を列挙。
  • やはりmodelDescription.xmlの中身が気になるので、簡単に説明予定。
  • modelDescription.xmlの中身を確認。
    • name、valueReference、description、variability、causality、Real unitが存在。
  • valueReferenceについて仕様確認。
    • 変数ハンドル用で数値の衝突は禁止。
    • ただし、エイリアスはその限りではない。
  • modelDescription.xmlのvariabilityの仕様について。
    • constant(定数)、fixed(固定値)、tunable(調整可能値)、discrete(離散)、continuous(連続)。
      • fixedはシミュレーション前であれば変更可能。
      • tunableは変更時にODE演算のイベントが発生。
  • modelDescription.xmlのcausalityの内容を確認。
    • parameter、calculatedParameter、input、output、local、independentの6種が存在。
    • parameterはModelicaのparameter相当。
    • calculatedParameterは初期値関連。
  • FMU/FMIを読めそうなツールを確認。
    • 以前、太郎くんが調査した情報をベースに確認。
      • CANoeがすぐ使えそうだった。
  • CANoeでFMU/FMIの変数確認。
    • 問題無く確認できた。
    • FMU/FMIの変数をCANoeのシステム変数に割り付ける形。
      • よって、CAPLからでも簡単に制御できそう。

スポンサーリンク

FMILibrary

  • C言語からFMU/FMIを制御するライブラリはFMILibrary
  • Windows版のFMILibraryはあるにはあるが…。
    • win32版のみ。
    • 64bit版は自分でビルドする必要がある。
  • OpenModelica64bit版のFMUは恐らく64bitビルド。
    • FMILibrary 64bit版を用意することに。
  • FMILibraryのビルド環境準備。
    • Visual Studio 2017 express。
    • cmake。
      • コンパイラ非依存なビルド自動化ツール。
  • FMILibraryのソースコード。
    • zipアーカイブかGithubで入手できる。
    • 今回はFMILibrary-2.0.3-src.zipを使用。
  • FMILibraryのビルド手順を確認。
    • 開発者コマンドプロンプト起動、cmakeでビルド、ライブラリインストール。
  • cmakeへのオプションがちょっとややこしい。
    • FMILIB_INSTALL_PREFIXでインストール先。
    • FMILIB_FMI_PLATFORMでプラットフォーム。
    • -Gでビルドする環境指定。
  • cmakeの前回のコマンドを使ってコンフィグレーション開始。
    • 問題無く完了。
  • そのままcmakeでビルド開始。
    • ビルドの途中でエラーが発生。
    • xmlparse.cの中でBLOCKとsという構造体とメンバ変数の絡みでエラーが起きたようだが・・・。
    • とりあえず、頑張って調べてみる。
  • FMILibraryのビルドエラーの原因究明。
    • stddef.hにoffsetofが定義されていなかった。
    • 厳密にはC++向けには定義されていたが、C言語向けには定義されていなかった。
    • Visual Studio自体がC++を想定した環境であるためC言語のケアが薄いためなのかもしれない。
  • 再びFMILibraryのビルドにチャレンジ。
    • 今回は無事ビルドが通った。
      • ライブラリが生成されたのも確認。
    • その後、指定したインストール先にライブラリ及びヘッダファイルが配置された。
  • FMILibraryビルド時にサンプルプロジェクトが生成されているので、今後はこれをベースに話を進める予定。
  • FMILibraryのサンプルプロジェクトを確認。
    • 大量にある。
    • 今回はfmi2_import_cs_testを使用。
    • すでにビルド済みのものが存在。
  • fmi2_import_cs_testは引数を要求するタイプの実行プログラム。
    • よって、ただ起動しただけでは何もしてくれない。
    • 引数については次回説明予定。

スポンサーリンク

コメント

タイトルとURLをコピーしました