ある特定のブロックの計算速度を速くし、グラフを出力することはできますでしょうか。
3 ビュー (過去 30 日間)
古いコメントを表示
simulink上のある2つのブロック(グラフを出力します)について、1つのブロックの計算をもう片方のブロックよりも速く終わらせ、グラフを重ねあわせる方法はありませんでしょうか。
2つのブロックには外部から任意の値が入力され(どんな値が入力されるかは、その時刻にならなければ分からないようになっています。)、ブロック内の関数とその値を基にグラフを出力します。
具体的には添付させて頂いた資料の手法が知りたいです。
よろしくお願いいたします。
2 件のコメント
Atsushi Ueno
2022 年 7 月 5 日
添付図も分かり易く、情報量としては問題無いのですが、どうも質問の本質が理解できません。
「ある特定のブロックの計算速度を速くする」という事がどういう事か考えました。
Simulinkは並べられた各ブロックを周期的に実行しますが、流れる時間は一定で、通常はサンプル時間毎に1回の処理が実行されます。ですがそれだけではなく、複数の処理の集合でも傍から見て一瞬で処理されたとみなす事が出来ます。(Simulink上のシミュレーション時間であって、実時間に間に合うかどうかは別の話です)
「ある特定のブロックの計算速度を速くする」を実現するには、1周期タスク内で時間の掛かる処理を纏めて実行すれば良いです。具体的にはループ処理を実行したりサブルーチン(Function-callサブシステムやAtomicサブシステム)を実行します。当然処理に実時間は掛かりますが、Simulink上の時間としては1サンプル時間で済ませた事になります。
この事を説明する資料や動画があれば良いのですが...
採用された回答
Atsushi Ueno
2022 年 7 月 6 日
>特定のブロックを他のブロックよりも先に計算する方法はあるでしょうか。
⇒特定のブロック(例えばサブシステム)を一塊のブロックと同じAtomicサブシステムと定義する方法があります。
すると、どんなに処理数の多いサブシステムでもモデルの1サンプル時間内に実行させる事が出来ます。条件付きで実行開始するには、TriggeredサブシステムやFunction-callサブシステムなどの形にします。サブシステム全体を繰り返し処理とするには各種反復サブシステムを選んで使う事が出来ます。Subsystemの他にはコードを収めたS-functionブロックやMATLAB Function ブロックを使う事も出来ます。
質問の例で言うと、ブレーキ指令がONになった時の車や球の初期条件から、例えば球が車の内壁に衝突する迄の動きをモデル全体とは別次元の時間軸でシミュレーション実行する事ができます。その時のシミュレーション時間は「精神と時の部屋(部屋の中の1年が外界の1日に相当する)」のように、外界(モデル)とは別次元の時間が流れるとイメージすると分かり易いかと思います。(ドラゴンボール世代ではないですねはいすいません)
【具体的な事例】
上記モデル(実行周期は0.01[s])で実行した事は下記の通りです。
- 1[Hz]のパルス信号を作成(Scope画面の1番上)
- 上記信号の立下りエッジで1周期だけONになるパルス信号を作成(Scope画面の2番目)
- 上記信号を入力とし空処理を10万回繰り返す反復サブシステムを作成
注目すべきはScope画面の1番下に表示した「反復サブシステムの繰り返し回数」が階段状に増加していくのではなく、1サンプル時間の間に1[回]からいきなり10万[回]に飛んでいる事です。またモデルから見るとWhile Iterator Subsystemの入力信号In1 は一瞬だけ単発でONになるインパルス信号ですが、While Iterator Subsystem内ではそのインパルス信号がずっとONになり続けている事になります。つまり10万回の繰り返し処理はSimulinkモデルから見ると1サンプル時間(実行周期の0.01[s])で完了したとみなされているのです。別の言葉で表現すると「上記反復システム10万回の繰り返し処理に掛かる時間は考慮しない」「10万回繰り返す反復サブシステムも、その外から見るとブロックを1回実行しているのと同じ」「精神と時の部屋(部屋の中の1年が外界の1日に相当する)(<しつこい)」という事です。
7 件のコメント
Atsushi Ueno
2022 年 7 月 11 日
>「時間軸を変更することは出来るのでしょうか」
Clockブロックの出力を5倍する事は可能で、提示モデルのMATLAB Functionの出力は期待通りの出力になります。しかしながら、Simulinkモデルの実行を部分的に5倍速くする事は出来ません。提示モデルにおいては積分する値は5倍になった時刻に従い出力されますが、肝心の積分ブロックが5倍の速さで実行されないのです。
>やはり少し複雑なプログラムを書かなければ要件を満たすことは出来ないのでしょうか。
複雑な事はありません。回答内容を実際に適用しました。下記の例では2倍(2回繰返実行)です。界王拳5倍は体に無理が...もとい表示の都合です。
- 速く実行する方をFor Iterator Subsystemで包んで指定回数繰り返す
- クロック信号を同サブシステムに引っ張りこんで倍数を掛ける
- MATLAB Functionの出力は繰り返し回数分加算(積分)しておく
- あとは提示のモデルと同じ動き
グラフに表示された通り、2倍の動作になっている事が確認できます。モデル内の各ブロックが1回実行される間に、For Iterator Subsystemの内部だけ2回繰り返し実行されているのです。あくまでもサンプリング時間は元のまま(提示モデルでは0.01秒)で変わっていません。
※可変サンプル時間では分かり難いので、固定サンプル時間に設定して理解する事をお勧めします。
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!