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

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

Risposte (1)

stozaki
stozaki il 19 Ott 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 Commenti

Katotyan_pe
Katotyan_pe il 19 Ott 2020
大変勉強になります。
因みに複数のIn/Outがモデル内にある場合で、解2の手法でシミュレートする事は出来ますか?
stozaki
stozaki il 20 Ott 2020
Modificato: stozaki il 20 Ott 2020
はい、出来ます。
プログラムを作成することになりますが、GUIを使って対話的に設定を行うことも可能です。手順の詳細に関してはルートInport信号データのマッピングを参照頂きたいと思います。
例として添付のモデルを使って以下の順番で実施してみてください。
  1. A.slxを開いて、シミュレーション実行
  2. ワークスペースに保存されたlogsoutを.matファイルに保存 (添付mySignal.mat)
  3. B.slxを開いて、シミュレーションタブの「準備」グループの「入力を接続」を選択 (ルートInportマッパーを開く)
  4. MATファイルからを選択し、2で作成した.matファイルを読み込み
  5. 左ペインのアイコンを選択し、「モデルにマッピング」を実行
  6. 「シミュレーション用にマーク」を実行
  7. B.slxのシミュレーションを実行
  8. シミュレーションデータインスペクターを開いて結果を確認
上記は全てスクリプトで実行することが可能なので、tic;tocで実行時間を計測することが可能です。3~7は「ルートInportマッパー」で設定後、「MATLABスクリプトの生成」で自動実行スクリプトを生成できます。(添付myTest.m)
また、3で設定した内容を保存したものが添付のoutData.mldatxです。
上記手順を実行するために、若干コンフィグレーションセットの設定値を変更しましたが、原理的には解2を拡張したものと考えてください。
stozaki
Katotyan_pe
Katotyan_pe il 21 Ott 2020
 その後、Merge blockやIF Action block等の接続線の信号ログが取れないことが分かりました。
 そこで、0.1秒毎に実行されるタスクと0.2秒ごとに実行されるタスクが混在しているモデル(.slx)に対してファイルを分けるのではなく、0.1秒経ったらEnableSubsystemのトリガーをONし、次の0.1秒後にまたONすると言ったような動作となればと考えております。
 整理しきれていないですが、Data store Memoryを用いてカウントするモデルを作りトリガーにする。
またはモデルの分割機能で同じような動作が出来そうな気がしてるのですが。宜しくお願い致します。
Sample添付ファイル有。
stozaki
stozaki il 21 Ott 2020
Modificato: stozaki il 21 Ott 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 il 22 Ott 2020
Modificato: Katotyan_pe il 22 Ott 2020
 データーインスペクターで基本サンプル時間通りに実行出来る事を確認しました。また、情報のオーバレイ内の機能を使う事で、視覚的に検証しやすく大変為になりました。
 先日の質問の続きですが、異なるサンプル周期でモデルをシミュレートする場合、From WorkspaceやData store Memoryで再現できますか?また、他にもっとスマートな手法など御座いましたらご教示頂きたいです。
※添付ファイル有。
stozaki
stozaki il 26 Ott 2020
添付頂いたAB2.slxを少々編集いたしました。
Rate Transitionブロックで異なるサンプル周期で駆動するようにしました。
0.01[s]のみで、2回に1回だけデータを取得するのであれば、Stateflow若しくはカウンタを作成する必要があります。
ご確認お願いいたします。
stozaki

Accedi per commentare.

Categorie

Prodotti

Richiesto:

il 19 Ott 2020

Commentato:

il 26 Ott 2020

Community Treasure Hunt

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

Start Hunting!