2つのファイル間で、値(I/O)のやり取りは出来る?例:A.slxのOut値をB.slxのInに渡す。
Mostra commenti meno recenti
2つのモデルファイル(.slx)間での値のやり取りをするにはどの様にすれば良いでしょうか?
例えばA.slxのOut値をB.slxのInへ受け渡し実行。最後にシミュレートにかかった時間を表示。
Risposte (1)
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);
モデル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
il 19 Ott 2020
はい、出来ます。
例として添付のモデルを使って以下の順番で実施してみてください。
- A.slxを開いて、シミュレーション実行
- ワークスペースに保存されたlogsoutを.matファイルに保存 (添付mySignal.mat)
- B.slxを開いて、シミュレーションタブの「準備」グループの「入力を接続」を選択 (ルートInportマッパーを開く)
- MATファイルからを選択し、2で作成した.matファイルを読み込み
- 左ペインのアイコンを選択し、「モデルにマッピング」を実行
- 「シミュレーション用にマーク」を実行
- B.slxのシミュレーションを実行
- シミュレーションデータインスペクターを開いて結果を確認
上記は全てスクリプトで実行することが可能なので、tic;tocで実行時間を計測することが可能です。3~7は「ルートInportマッパー」で設定後、「MATLABスクリプトの生成」で自動実行スクリプトを生成できます。(添付myTest.m)
また、3で設定した内容を保存したものが添付のoutData.mldatxです。
上記手順を実行するために、若干コンフィグレーションセットの設定値を変更しましたが、原理的には解2を拡張したものと考えてください。
stozaki
Katotyan_pe
il 21 Ott 2020
色々とお試し頂きまた、モデル添付頂きありがとうございます。
AB.slxを拝見いたしました。当初のご質問を解決する前に幾つかモデルの設定やブロックの使用方法に問題があるように見えます。モデルAはサンプル周期0.1[s]、モデルBはサンプル周期0.2[s]で接続してシミュレーションしたいとのことで理解しました。
- モデル設定(コンフィギュレーション設定) において、可変ステップとなっていますが、固定ステップ且つ離散ソルバーではないでしょうか?
- AB.slxに0.1SEC毎にトリガーをかける旨が記載されていますが、0.1[s]毎にサンプリングするのではないでしょうか? それとも、サンプル周期はもっと短い時間間隔で、0.1[s]毎にトリガーが掛かるのでしょうか?
- If-else + Action Subsystemの構成において、2つのAction Subsystemが排他実行となっていませんが、なぜでしょうか? If-elseは何れか一方を排他的に処理するため、2つのAction Subsystemが連結されていると動作しないように見えます。
- 2の話と関係しますが、Ifブロックのみトリガーが掛からないのですが、なぜでしょうか?
- 仮に、2つのサンプル周期が混在するのであれば、Rate Transitionブロックで接続しなければ、異なるサンプル周期間でデータの転送が整合しないと思われます。
- 条件付き実行サブシステム(enabled や If-Actionなどサブシステムの上辺にポートを持つもの) 内において、出力ポートブロックの「ディスエーブル時の出力」設定、「初期出力」設定がデフォルトのままですが、正しいでしょうか?また、Enableブロックの「イネーブル時の状態」は「保持」であっていますか?これらの設定値によっては、シミュレーション結果が異なります。
参考までに、モデルのサンプル周期を0.1[s] とし、入力信号はAB.slxに倣ったモデルAB2.slxを添付いたします。入力の条件より、Act1サブシステムが実行されact1Outがインクリメントするようにしてみました。シミュレーション実行すると赤い枠で囲まれたブロックはサンプル周期0.1[s]で動作しています。ピンクは定数サンプルなので、固定値が出続けます。モデル内に幾つか注釈を付記いたしましたのでご確認ください。
こちらのモデルで、条件付き実行サブシステムの動作や、離散ソルバーでのサンプル周期の設定をご確認頂けますでしょうか。
ご検討のほど、よろしくおねがいします。
Katotyan_pe
il 22 Ott 2020
Modificato: Katotyan_pe
il 22 Ott 2020
Categorie
Scopri di più su モデル コンポーネントのスケジュール in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!