ブロックに組み込み MATLAB 関数を使用する Simulink モデルがありますが、組み込み MATLAB ブロックと GUI の間でデータをリアルタイム (つまり、モデルの実行中) に移動する方法がわかりません。モデルに「ワークスペースへ」ブロックを実装しようとしましたが、正しく使用する方法がわかりません。
データを Simulink ブロックからリアルタイムで GUI に移動する方法を知っている人はいますか?
ブロックに組み込み MATLAB 関数を使用する Simulink モデルがありますが、組み込み MATLAB ブロックと GUI の間でデータをリアルタイム (つまり、モデルの実行中) に移動する方法がわかりません。モデルに「ワークスペースへ」ブロックを実装しようとしましたが、正しく使用する方法がわかりません。
データを Simulink ブロックからリアルタイムで GUI に移動する方法を知っている人はいますか?
非リアルタイム ソリューション:
GUI でパラメーターを設定し、それらのパラメーターを使用してモデルをシミュレートし、シミュレーション出力を GUI に表示する場合は、blinkdagger.comに優れたチュートリアルがあります。彼らが説明する 1 つの解決策は、SIMSET関数を使用して、Simulink モデルが対話するワークスペースを定義することです。代わりに、Simulink モデルを呼び出している GUI 関数のワークスペースとの間でデータが送受信されるように、ベース ワークスペースを置き換えることができるはずです。
リアルタイムソリューション
MikeTが提案したように、 RuntimeObjectを使用できます。最初にget_param関数を使用して、ブロックから RuntimeObject を取得する必要があります。
rto = get_param(obj,'RuntimeObject');
obj
はブロック パス名またはブロック オブジェクト ハンドルです。GCB関数を使用して、最後に選択したブロックのパス名を取得できます (この場合、 に置き換えることができますobj
) gcb
。次に、次の方法でブロックの出力を取得できます。
blockData = rto.OutputPort(1).Data
ドキュメントからの 1 つの追加の警告:
データ フィールドに正しいブロック出力が含まれるようにするには、 [コンフィギュレーション パラメーター] ダイアログ ボックスの [最適化]ペインで[信号ストレージの再利用] オプション (信号ストレージの再利用を参照) をオフにし ます。
シミュレーションが実行されている限り、RuntimeObject から出力データを継続的に取得するループまたはタイマー ルーチンが GUI で実行されることになる可能性があります。ドキュメントには次のようにも記載されています。
実行時オブジェクトは、ブロックを含むモデルの実行中または一時停止中にのみ存在します。モデルが停止している場合
get_param
は、空のハンドルを返します。モデルを停止または一時停止すると、ランタイム オブジェクトの既存のハンドルはすべて空になります。
したがって、ループまたはタイマー ルーチンは、最初に RuntimeObject が存在することを確認し続け、(存在しない場合) 停止するか、(存在する場合) そこからデータを取得する必要があります。RuntimeObject の存在を確認する正確な方法はわかりませんが、オブジェクトが空であるかどうか、またはオブジェクトのBlockHandleプロパティが空であるかどうかを確認すると思います。
isempty(rto) % Check if the RuntimeObject is empty
%OR
isempty(rto.BlockHandle) % Check if the BlockHandle property is empty
あなたの回答から、シミュレーションの実行中に結果を見たいと思っていると思いますが、それでよろしいですか? blinkdagger.com のチュートリアルでは、シミュレーションの実行後にシミュレーションの結果を表示できますが、実行中は表示できません。基本的に、スコープ ブロックのようなものを GUI に埋め込みたいですか?
これを行うにはいくつかの方法がありますが、おそらく最善の方法は、EML ブロックのランタイム オブジェクトを使用することです。これを使用すると、実行中に EML ブロックの出力を確認できるはずです。