MATLAB/Simulink の画面切り替えとはおさらば!モデルコールバックのススメ
皆さんこんにちは、トレーニングチームの遠藤です。このブログでは、「MATLAB と Simulink を繋ぐ」をテーマに、主に技術的な記事を書いています。
前回の投稿は MATLAB Expo 後なので、約3か月ぶりの投稿になりますね。前回の内容はプログラミングコンテストの紹介でしたが、今回は通常通り技術的な内容となります。MATLAB と Simulink をうまく組み合わせて作業の効率化を行う機能について説明していきたいと思います。
0. Simulink モデリング・シミュレーションの自動化や効率化の悩み
Simulink でのモデリングやシミュレーションの作業の自動化・効率化に役立つ機能として、今まで Simulink API や App Designer でのアプリ開発、といった機能を紹介してきました。
しかし、これらの機能は基本的には MATLAB 側で使うものです。Simulink をメインで使っている人にとっては「いちいち MATLAB に画面を移すのは面倒!」という方もいらっしゃるかと思います。
そこで、そういった方向けに、今回の記事では Simulink 側で作業の自動化・効率化を行うことができる便利機能の一つ、「モデルコールバック」についてこの記事では紹介していきたいと思います。
1.モデルコールバックとは
モデルコールバックとは、モデルが特定の処理を行う際に自動で実行される処理のことです。
例えば、人からもらったモデルや MathWorks のデモモデルを開いた際に、いつの間にかワークスペースに変数が作成されていた、という経験はないでしょうか?特に何かスクリプトを実行したわけでもなく単にモデルを開いただけなのに変数が読み込まれて困惑した、という方もいらっしゃるかもしれません。実は、これらのモデルでは、モデルコールバックによって「モデルを開く」直前に「変数の読み込み」が自動で行われているんです。
例:f14 というデモモデルを開くと、必要なパラメータが自動的にワークスペースに読み込まれます。
このように、モデルコールバックを使用することでモデルを実行する際に必要な処理を自動化できるため、Simulink のモデルに意識を集中できるのがモデルコールバックの大きなメリットとなります。
2. モデルコールバックの設定方法
モデルコールバックの設定方法はとても簡単です。Simulink の「モデル化」タブの「モデル設定」をクリックして、「モデル プロパティ」を選びます。
すると、「モデル プロパティ」ウィンドウが開きますので、「コールバック」タブを開きます。
“PreLoadFcn”, “PostLoadFcn” など、さまざまなコールバック名が表示されています。これらのコールバックは実行タイミングがそれぞれ異なっています。コールバック名と実行タイミングの対応は以下のようになっています。
PreLoadFcn | モデルを読み込む直前 |
---|---|
PostLoadFcn | モデルを読み込んだ直後 |
InitFcn | モデルのコンパイル開始時 |
StartFcn | シミュレーション開始時 |
PuaseFcn | シミュレーションの一時停止時 |
ContinueFcn | シミュレーションの再開時 |
ContinueFcn | シミュレーションの終了時 |
PreSaveFcn | モデルを保存する直前 |
PostSaveFcn | モデルを保存した直後 |
StopFcn | モデルを閉じる前 |
StopFcn | シミュレーションの終了時 |
また、各コールバックを選ぶと、右にコードを書くための枠が表示されます。ここに MATLAB 言語でコードを書いていくことで、その処理がコールバックとして実行されます。
3.便利な使い方
①シミュレーションに必要な変数の読み込みの自動化(PreLoadFcn)
おそらくモデルコールバックを使用する用途として最も多いのがこれかと思います。モデルを読み込む際に実行されるPreLoadFcnに変数を読み込む処理を記述しておくことで、いちいちMATLAB側で変数を読み込む必要はなくなります。
例えば下記のようなバネ・マス・ダンパモデルを考えます。
このモデルを実行するためには m, c, k というパラメータが必要になります。これらのパラメータの準備には、コマンドウィンドウで定義する、m ファイルにコードを書く、.mat ファイルに保存して読み込む、などなどいろいろな方法がありますが、どれも一度 MATLAB 側に戻って操作を行わなくてはいけないので少し面倒です。
そこで、これらのパラメータの定義を行う処理を PreLoadFcn に記述してみましょう。
この状態でモデルを開いてみると……
ワークスペースに3つの変数が自動で作成されました!このように、PreLoadFcn に変数の定義や読み込みの処理を記述しておくと、MATLAB 側でわざわざコマンドやスクリプトを実行しなくていいのでとっても楽ですね。
②シミュレーション結果の可視化・解析の自動化(StopFcn)
シミュレーション後の可視化や解析もStopFcnを使えば自動化できます。試しに先ほどのモデルのシミュレーション実行後に出力信号の最大値を診断ダイアログに表示してみましょう。
出力信号に「信号のログ」を設定し、StopFcn に disp 関数でその最大値を表示する処理を記述しておくと……
診断ビューアーに最大値が表示されました!このように、シミュレーション結果の簡単な解析処理は StopFcn で診断ビューアーに表示してしまえば、いちいち MATLAB 側で結果を表示しないでいいので楽ですね。
他にも、Scope ブロックやシミュレーションデータインスペクターなどでは描画できないような高度なプロットを行いたい場合は、 StopFcn で実装してしまってもよいかもしれません。
③シミュレーション実行時のスコープ起動の自動化(StartFcn)
StartFcnを使えば、シミュレーション実行時に特定の操作を行うことも可能です。
例えばシミュレーションしたいモデルの複数個所にスコープブロックが散らばっている場合、いちいちモデルを開いてからモデル上のスコープを全部開くのは結構手間がかかります。この「モデル上のスコープブロックを全部開く」という作業を Simulink API を使って StartFcn にコードとして記述してしまえば、モデル実行時にスコープを全部自動で開くことができます。
具体的なコードはこんな感じ。
scopes = find_system(gcs,"BlockType","Scope");
for i = 1:length(scopes)
open_system(scopes{i},"parameter");
end
少し複雑ですが、find_system 関数を用いてモデル上の全ての Scope ブロックを検索し、open_system 関数で Scope 画面を開いています。これを StartFcn に書いてシミュレーションを行うと……
実行時にすべてのスコープが開きました!
このように、シミュレーションを実行する直前に何か準備が必要なモデルは、StartFcn に処理を記述しておくことで自動化することができて便利です。
補足
今回の例ではすべての処理をそのままコールバックに記述しましたが、コールバックのエディタは MATLAB のエディタと異なり、文字の色分けがされておらず補完も効きません。そのため、複雑な処理を作る場合は、一度 MATLAB のスクリプトとして作成し、それをコールバックで呼び出すようにすると開発しやすいのでオススメです。
4. 終わりに
今回はモデルコールバック機能を紹介しました。モデルコールバックは、ちょっとした処理を手軽に自動化するためにも使えますし、Simulink API などと組み合わせて高度な処理を行うことにも使える、とっても便利な機能です。なんでも Simulink 側で処理したい、という方にはうってつけの機能となりますので、興味のある方はぜひ一度使ってみてください。
チームメンバーにモデルコールバックを作り込んだモデルを渡してあげれば、自動でいろんな処理が行われてびっくりする姿を見ることができるかも……?
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.