モデルベース開発

事例

【PyFMI】最小構成のMBD事例 第2章 その130【リアルタイム描画㉔】

描画を止める以外で負荷低減方法を検討してみた。 スレッドの利用案が出たが以下の理由で不可。 GIL(Global Interpreter Lock)仕様の影響で期待するスレッドのコンテキストスイッチにならない。 よって、負荷はほぼ減らない。 下手したら増える可能性もある。 というわけで対策としては見送り。
事例

【PyFMI】最小構成のMBD事例 第2章 その129【リアルタイム描画㉓】

前回の負荷を安定化する方法を検討。 描画に処理時間を持っていかれているっぽからpauseで描画だけ停止していた。 案の定、負荷安定化。 上記より、フェーズを分けた利用法が考えられる。 デバッグフェーズは波形を見ながら。 ある程度デバッグが完了したら波形無しの高精度状態で検証する。
事例

【PyFMI】最小構成のMBD事例 第2章 その128【リアルタイム描画㉒】

修正コードでとりあえず動作させてみた。 問題無く動作した。 負荷確認実施。 カクついているが人間の操作のせいの可能性もある。 sin波の自動入力で確認。 やはりカクついている。 よって、操作の問題ではない。 CPU負荷を見て、さらにmatpotlibの波形拡大で詳細確認。 FMU処理以外の処理負荷大きそう。
事例

【PyFMI】最小構成のMBD事例 第2章 その127【リアルタイム描画㉑】

実験用Pythonコードのクラス化。 基本、関数横断変数をメンバ変数にした。 つまり、メンバ変数になっているものが暗黙的なグローバル変数だった。 「実はグローバル変数だったのかー!」ってのはあるある。 前回と同様の動きはしていそうなので、このコードをベースに実験を継続する。 特に負荷関連が残っている。
事例

【PyFMI】最小構成のMBD事例 第2章 その126【リアルタイム描画⑳】

現状のソースコード確認。 暗黙的なものも含めてグローバル変数が点在している。 GUIイベントとかタイマハンドラで関数が分離しているので仕方ない面もある。 折角なのでクラスとしてまとめてみようと試みる。 基本的なロジックは出来ているのでそれほど修正時間はかからない見込み。
事例

【PyFMI】最小構成のMBD事例 第2章 その125【リアルタイム描画⑲】

現状のコードで動作確認をしてみた。 FMUの波形表示OK。 Scaleで指令値変更OK。 まだ以下の課題が残っている。 ソースコードがちょっとヤッツケ。 負荷関連の評価が出来ていない。 実際の負荷状態。 描画処理の影響有無の評価。 なんとなく現状でも負荷の影響が見え隠れはしている。
事例

【PyFMI】最小構成のMBD事例 第2章 その124【リアルタイム描画⑱】

plot_handlerことmatplotlibリアルタイム更新処理のコード提示。 以前のリアルタイム描画実験との差は以下。 deque使用。 plot時にnp.arrayに変換しているが無くてもOK。 CPU負荷描画チェックボックス確認。 dequeのように要素数が分からない場合は-1による末尾指定が便利。
事例

【PyFMI】最小構成のMBD事例 第2章 その123【リアルタイム描画⑰】

FMU_handlerことFMUシミュレーション用処理のコードを提示。外部の変数を使用するためにglobal定義している変数あり。実時間の経過を元にFMUシミュレーション時間を決定している。 実時間にシミュレーション時間を追いつかせる方式。ただし、開始と終了のstepが重複したり欠落したりするので微小時間の調整が必要。
事例

【PyFMI】最小構成のMBD事例 第2章 その122【リアルタイム描画⑯】

必要なタイマハンドラは2つ FMU処理用とmatplotlib描画用。 描画用側の負荷が高いので、こっちは長めの周期で実施。 FMU処理用タイマハンドラ内で時間関連の演算が入るため、タイマハンドラ外で下準備が必要。 Masterの初回呼び出し時のオプションと2回目以降で変える必要がある。initializeオプション。
事例

【PyFMI】最小構成のMBD事例 第2章 その121【リアルタイム描画⑮】

FMU関連処理前準備を一気に説明。 いままでやってきたものなので細かい説明は省略。 deque関連の初期化。 dequeはcollectionsライブラリの一部。 maxlenで最大要素数を指定できる。 指定なしの場合は無限に入れられる。 実際には物理的な限界はあるだろうが・・・。