MATLABユーザーコミュニティー

MATLAB和Si万博1manbetxmulinkユーザーコミュニティー向け日本語ブログ

ちょっと高度なカスタムブロック,“MATLAB系统ブロック”を使いこなせ!

皆さんこんにちは。トレーニングエンジニアの遠藤と申します。
このブログでは”仿万博1manbetx真软件MATLABとをつなぐ”をコンセプトとして,主に技術的な内容について書いています。

先日ついにMATLAB R2021bがリリースされましたね!万博1manbetx仿真软件MATLABとをつなぐような新機能もあるようで,今回のブログ記事でもそれについて書こうかなとも考えたのですが,さすがにもう少し自分で使ってから紹介したいなという部分があり,新機能紹介はまた次の機会にしようかなと思います。

ということで,今回は”MATLAB系统ブロック“にフォーカスを当てていきたいと思います。万博1manbetx仿真软件MATLABでコードを使う機能としては,以前のブログ記事でも紹介した”MATLAB函数ブロック“が有名で,MATLAB系统ブロックは少しマイナーな部類に入るかと思います。しかし,実装したい処理によってはMATLAB系统ブロックの方が適している場面も少なくありません。

特に,以下のような方はMATLAB系统ブロックを使いこなすことでより効率的にモデルを作れるようになるかもしれませんので,必見です!

  • MATLAB函数ブロックで永続変数をよく使う
  • MATLAB函数ブロック内でコード生成対応外の関数を使う機会が多い
  • MATLAB函数ブロックのコード内のパラメータを調整することが多い

目次:

  1. MATLAB系统ブロックとは吗?
  2. MATLAB系统ブロックのメリット
    1. ブロックダイアログからパラメータを設定できる
    2. 内部状態を持つことができる
    3. シミュレーション開始時に1度だけ実行したい処理を簡単に実装できる
    4. コード生成に対応していない関数もそのまま使用可能
  3. おわりに

MATLAB系统ブロックとは吗?

まずはMATLAB系统ブロックについて簡単に説明したいと思います。MATLAB系统ブロックは,系统对象を用いて動作をカスタマイズできるブロックです。系统对象はあまり馴染みのない方もいるかもしれませんが、簡単に言うとシミュレーションやストリーミング処理用につくられた、変数や関数を内部に持つことのできるオブジェクトです(詳しく知りたい方はリンク先のドキュメントを参照ください)。

実際にMATLAB系统ブロックを使ってみましょう。まずはモデル上にMATLAB系统ブロックを置いてみます。

最初は系统对象が何も紐づいていないので赤いエラーが表示されています。ダブルクリックしてブロックダイアログを開くと,既存の系统对象を指定,または新規で系统对象を作成することができます。新規作成の際には”標準”“詳細設定”“万博1manbetx仿真软件拡張”の3つのテンプレートから作成することができますが,この記事では一番簡単な”標準“テンプレートの使い方を説明していきたいと思います。

標準テンプレートのコードが自動で開きました。MATLAB函数ブロックの関数に比べると少し複雑で抵抗感を感じる方もいるかもしれませんが、1つ1つの役割さえ覚えてしまえばそこまで難しくはありません、

まず最も重要なのが,テンプレートコードの下部にあるstepImpl関数です。この関数は,各タイムステップでMATLAB系统ブロックの出力を計算する際に実行される関数です。MATLAB函数ブロックで作る関数と基本的には同じ役割ですね。この関数の中に出力の計算処理を書いていきます。

函数y = stepImpl (obj, u)
%的实现算法。计算y作为输入u和的函数
%离散状态。
y = 2 * u;%入力を2倍して出力する
结束

その他,MATLAB函数ブロックとは違い,以下のようなものもテンプレートに用意されています。

  • 属性
    ここではブロックダイアログから変更できる変数を定義することができます(後述)。
  • 属性(DiscreteState)
    ここでは離散状態用の変数を定義できます。少し上級者向けですのでこの記事では説明は割愛しますが,詳しく知りたい方はこちらのドキュメントをご確認ください。
  • 属性(访问=私人)
    ここでは系统对象の関数内から値を変更可能な変数を定義することができます(後述)。
  • setupImpl関数
    シミュレーション開始時に1度だけ実行される関数です。変数の読み込みなど1度だけ実行すればよい処理はここに記載します。
  • resetImpl関数
    DiscreteState属性のプロパティを初期化,リセットするための関数です。DiscreteStateを使っていない場合は特に何も書く必要はありません。

これらをうまく使うと,MATLAB函数ブロックで実装するのが面倒臭い処理,難しい処理を簡単に実装することができます。早速MATLAB系统ブロックのメリットを具体的に見ていきましょう。

MATLAB系统ブロックのメリット

1.ブロックダイアログからパラメータを設定できる

MATLAB系统ブロックは,コード内で使用するパラメータの値をブロックダイアログから設定することができます。

やり方はとても簡単,設定したいパラメータを属性の部分で定義するだけです。

属性
k = 10;%パラメータ用の変数を定義
结束

このように、属性で変数を定義すると,MATLAB系统ブロックをダブルクリックしたときに開くダイアログにこの変数が表示され,値が変更できるようになります。

获得ブロックなどと同様,エディットボックスで変数名を指定すれば,MATLABのワークスペース上の変数の値を使うこともできます。

ただし,この変数をコード内で使用する場合,コードの書き方に注意が必要です。属性に定義した変数は、変数名だけではアクセスできません。”obj.変数名” という表記が必要です。

函数y = stepImpl (obj, u)
%的实现算法。计算y作为输入u和的函数
%离散状态。

y = obj。k * u;% obj。kという表記で,定義したパラメータkにアクセス
结束

また、属性に定義した変数の値はコード中で変更できない点にも注意です。

2.内部状態を持つことができる

ブロックの処理をMATLABのコードで実装していると,“変数の値を次のタイムステップの計算に使うために残しておきたい”という状況にしばしば遭遇します。MATLAB函数ブロックでは「永続変数」を使うことで変数の値がリセットされるのを防ぐことができますが、シミュレーション後に Clear する必要がある、条件分岐などの追加コードが必要になりコードが見づらくなる、といった点で少し使いづらいです。これに対し、MATLAB System ブロックでは、properties(Access = private) を使うことで、簡単に値を保存、使用することができます。

1例えば今の入力とつ前のタイムステップの入力を足し算する処理を作ってみましょう。まずは1つ前の入力を保存するための変数を属性(访问=私人)に定義します。

属性(访问=私人)
uOld = 0;
结束

ここで定義した変数の値は,シミュレーションが終わるまでリセットされません。そのため,過去の値を保存しておくことができます。この変数を使えば出力の計算も簡単に作れますね。

函数y = stepImpl (obj, u)
%的实现算法。计算y作为输入u和的函数
%离散状态。
y = u + obj.uOld;%現在の入力と1つ前の入力を加算
obj。uOld = u;%次のタイムステップのために入力を保存
结束

前述の属性同様,こちらも”obj。“をつけなくてはいけない点に注意です。

3.シミュレーション開始時に1度だけ実行したい処理を簡単に実装できる

データの読み込みや初期設定など,シミュレーション開始時に1回だけ実行したい処理が必要な場合,MATLAB函数ブロックでは永続変数などと組み合わせて初回実行かどうかの判定を行う必要があります。

これに対し,MATLAB系统ブロックはstepImpl関数を使うことで初回実行処理を簡単に実装することができます。例えば,シミュレーション開始時に.matファイルからパラメータを読み込みたい場合は以下のようになります。

属性(访问=私人)
一个;
b;%パラメータ保存用の変数を用意
结束

函数setupImpl (obj)
%一次性计算,如计算常数
data =负载(“myData.mat”);
obj。一个=结合;
obj。b = data.b;%初回のみデータファイルからパラメータを読み込む
结束

函数y = stepImpl (obj, u)
%的实现算法。计算y作为输入u和的函数
%离散状态。

y = obj。A * u + obj.b;%初回に読み込んだとbを使って出力を計算
结束

前述した属性(访问=私人)と組み合わせ,初回時のみデータファイルからパラメータを読み込み,それを使って出力を計算する処理の例です。実行されるタイミングによって関数が分かれている分コードも見やすいですね。

4.コード生成に対応していない関数もそのまま使用可能

MATLAB函数ブロックはコード生成対応していない関数を使いたい場合は编码器。外在関数でコード生成対象外にしなければいけませんでした。これに対し,MATLAB系统ブロックはコード生成を行ってシミュレーションを実行する”コード生成“モードと,コード生成を行わずシミュレーションを行う”インタープリター型実行“モードを切り替えることができます。

そのため,インタープリター型実行を選択すれば,コード生成に対応していない関数を自由に使うことができます。コード生成に対応していない関数を使いたいだけなら解释MATLAB函数ブロックもありますが,こちらは状況に応じてコード生成もインタープリター実行も行えるのが大きなメリットですね。

ただし,インタープリター型実行モードに設定した場合,MATLAB系统内の処理はすべてMATLAB側で行われることになります。そのため,MATLABと仿真万博1manbetx软件の間でやり取りが発生し,シミュレーションが遅くなる可能性があることには注意しましょう。

おわりに

今回はMATLAB系统ブロックの簡単な使い方とメリットについての内容でした。万博1manbetx仿真软件を使っていると,ついつい”ブロックのカスタマイズ= MATLAB函数ブロック”となってしまいがちですが,MATLAB系统ブロックだけに限らず,カスタムブロックにはそれぞれ適した場面があります(こちらも参照)ので,自分が実装したい処理にはどのブロックが最適なのかを一度見直してみると,モデルやコードをさらにシンプルにわかりやすくできるかもしれませんよ!

|

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。