MATLAB Answers

2つのファイル間で、​​値(I/O)のやり​取​りは出来る?例:​A.​slxのOut​値をB​.slxのI​nに渡す​。

8 views (last 30 days)
Katotyan_pe
Katotyan_pe on 19 Oct 2020
Commented: stozaki on 26 Oct 2020
2つのモデルファイル(.slx)間での値のやり取りをするにはどの様にすれば良いでしょうか?
例えばA.slxのOut値をB.slxのInへ受け渡し実行。最後にシミュレートにかかった時間を表示。

  0 Comments

Sign in to comment.

Answers (1)

stozaki
stozaki on 19 Oct 2020
Katotyan_pe 様
ご質問の回答ですが、2通り考えてみました。
添付モデルを使って試してみてください。
解1 : モデル参照を使ってモデルAとモデルBを一つのモデルとして呼び出して実行する
モデル参照という機能・ブロックを使用します。モデル参照は複数のモデル、ここではモデルAとモデルBをモデルCから呼び出して、一つのモデルとしてシミュレーションを実行出来るようにしました。
モデル参照の境界では、「信号属性は伝播しない」等の制約があるのでドキュメントをよく読んでください。
bdclose all;
clear all;
load_system('A');
load_system('B');
load_system('C');
tic;
COut = sim('C');
toc;
out1 = COut.logsout{1}.Values.Data;
time1 = COut.logsout{1}.Values.Time;
f1 = figure;
plot(time1,out1);
解2 : コンフィグレーションパラメータの「データのインポート・アウトポート」の設定を使い実行する
モデルAとモデルBのコンフィグレーションパラメーターの「データのインポート・アウトポート」の設定をカスタマイズしてモデルAを実行した後にモデルBを実行して、結果を得ます。
bdclose all;
clear all;
load_system('A');
load_system('B');
set_param('A','ReturnWorkspaceOutputs','on');
set_param('A','ReturnWorkspaceOutputsName','myOut');
set_param('B','ReturnWorkspaceOutputsName','on');
set_param('B','ExternalInput','[myOut.yout.get(1).Values.Time, myOut.yout.get(1).Values.Data]');
tic;
myOut = sim('A');
result = sim('B');
toc;
out2 = result.logsout{1}.Values.Data;
time2 = result.logsout{1}.Values.Time;
f2 = figure;
plot(time2,out2);
各々の方法で処理が異なるため、シミュレーション時間は異なります。
stozaki

  6 Comments

Show 3 older comments
stozaki
stozaki on 21 Oct 2020
色々とお試し頂きまた、モデル添付頂きありがとうございます。
AB.slxを拝見いたしました。当初のご質問を解決する前に幾つかモデルの設定やブロックの使用方法に問題があるように見えます。モデルAはサンプル周期0.1[s]、モデルBはサンプル周期0.2[s]で接続してシミュレーションしたいとのことで理解しました。
  1. モデル設定(コンフィギュレーション設定) において、可変ステップとなっていますが、固定ステップ且つ離散ソルバーではないでしょうか?
  2. AB.slxに0.1SEC毎にトリガーをかける旨が記載されていますが、0.1[s]毎にサンプリングするのではないでしょうか? それとも、サンプル周期はもっと短い時間間隔で、0.1[s]毎にトリガーが掛かるのでしょうか?
  3. If-else + Action Subsystemの構成において、2つのAction Subsystemが排他実行となっていませんが、なぜでしょうか? If-elseは何れか一方を排他的に処理するため、2つのAction Subsystemが連結されていると動作しないように見えます。
  4. 2の話と関係しますが、Ifブロックのみトリガーが掛からないのですが、なぜでしょうか?
  5. 仮に、2つのサンプル周期が混在するのであれば、Rate Transitionブロックで接続しなければ、異なるサンプル周期間でデータの転送が整合しないと思われます。
  6. 条件付き実行サブシステム(enabled や If-Actionなどサブシステムの上辺にポートを持つもの) 内において、出力ポートブロックの「ディスエーブル時の出力」設定、「初期出力」設定がデフォルトのままですが、正しいでしょうか?また、Enableブロックの「イネーブル時の状態」は「保持」であっていますか?これらの設定値によっては、シミュレーション結果が異なります。
参考までに、モデルのサンプル周期を0.1[s] とし、入力信号はAB.slxに倣ったモデルAB2.slxを添付いたします。入力の条件より、Act1サブシステムが実行されact1Outがインクリメントするようにしてみました。シミュレーション実行すると赤い枠で囲まれたブロックはサンプル周期0.1[s]で動作しています。ピンクは定数サンプルなので、固定値が出続けます。モデル内に幾つか注釈を付記いたしましたのでご確認ください。
こちらのモデルで、条件付き実行サブシステムの動作や、離散ソルバーでのサンプル周期の設定をご確認頂けますでしょうか。
ご検討のほど、よろしくおねがいします。
Katotyan_pe
Katotyan_pe on 22 Oct 2020
 データーインスペクターで基本サンプル時間通りに実行出来る事を確認しました。また、情報のオーバレイ内の機能を使う事で、視覚的に検証しやすく大変為になりました。
 先日の質問の続きですが、異なるサンプル周期でモデルをシミュレートする場合、From WorkspaceやData store Memoryで再現できますか?また、他にもっとスマートな手法など御座いましたらご教示頂きたいです。
※添付ファイル有。
stozaki
stozaki on 26 Oct 2020
添付頂いたAB2.slxを少々編集いたしました。
Rate Transitionブロックで異なるサンプル周期で駆動するようにしました。
0.01[s]のみで、2回に1回だけデータを取得するのであれば、Stateflow若しくはカウンタを作成する必要があります。
ご確認お願いいたします。
stozaki

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!