10

現在スクリプトから実行されている(つまり、関数ではない)Simulinkモデルがあります。スクリプトは変数値をMATLABワークスペースに書き込み、モデルシミュレーション(これらの値を使用)を実行してから、モデルが追加の値をワークスペースに書き込みます。スクリプトを関数に変換しようとすると(つまりfunction [output] = runSim()、ファイルの先頭に配置することで)、Simulinkは、変数がMATLABワークスペースにないためか、変数について知らないと文句を言います。関数スコープ。

Simulinkモデルに入力を提供し、ワークスペースに貼り付ける以外にSimulinkモデルから出力を取得するエレガントな方法はありますか?

4

4 に答える 4

11

sim()明らかではありませんが、コマンドと呼び出し元の関数のワークスペースからデータを入出力できます。私は以前にそれを行い、実際に例を示しましたが、確認のために月曜日までそこに着くことができません。ただし、Mathworksのサイトにリストされているソリューションを試してください。

解決:

Simulinkで可変マスクパラメーターを使用する場合、ベースワークスペースはSimulinkのデフォルトのソースワークスペースです。ただし、SIMSETコマンドを使用すると、このワークスペースを変更できます。次に、SIMは、SIMSETによって作成されたこのオプション構造で使用されます。以下は、これを行う方法の例です。

  options = simset('SrcWorkspace','current');
  sim('modelname',[],options)

...これはParallelComputingToolboxとの非互換性のため、R2009bでは非推奨になっているようですが> :(正しい解決策は、を使用してシミュレーションのモデルワークスペース(ベースワークスペースとは異なる)に変数を明示的にプッシュすることですassignin()

http://www.mathworks.com/matlabcentral/newsreader/view_thread/292544

2つのオプションがあります:

  1. R2009bより前のリリースについては、SIMSETのドキュメントを参照してください。これにより、「SrcWorkspace」プロパティを「current」に設定して、関数からのデータを使用できます。

http://www.mathworks.com/support/solutions/en/data/1-1BWDA/?solution=1-1BWDA

  1. 新しいリリースでは、このオプションはParallel Computing ToolboxおよびPARFORに準拠していないため、非推奨になっています。私がお勧めするのは:

http://www.mathworks.com/support/solutions/en/data/1-ASPEIV/?solution=1-ASPEIV

于 2011-03-12T15:14:30.667 に答える
2

evalin()関数を使用して、独自の関数から特定のワークスペースで(文字列として)MATLAB式を実行できます。この場合、SIMULINKがそれらを見つけるための「ベース」です。ただし、ワークスペースを直接使用したくない場合は、From /ToFileブロックを使用してMATファイルから/への信号または変数をロードおよび保存できます。

于 2011-03-12T03:35:53.717 に答える
0

簡単な答え:いいえ。

私は間違っているかもしれませんが、いくつかの背景を説明しましょう。私は非常に大きなSimulinkモデルに取り組んでおり、何年にもわたって取り組んできました。今日でも、必要なすべての変数をワークスペースからロードしています。これは長い間私の不満でしたので、MathWorksはSimulink.save_vars関数を提供することでこの問題に対処しました。スクリプト/関数を使用して変数を既に設定しているように思われるため、Simulink.save_varsはあまり役に立ちません。

一部の変数に構造体を使用してワークスペースをクリーンアップできます。ほとんどのSimulinkブロックは構造体をサポートしていませんが、一部はサポートしています。また、モデルに必要な変数以外のものをワークスペースに配置することは避けてください。

于 2011-03-12T00:18:38.803 に答える
0

単純な関数からそれを行う方法はわかりませんが、クラス関数(メソッド)内からそれを行うのは本当に便利です。バージョン2009bで正常に動作します。

コードをファイルTest.mに配置します。

classdef Test < handle
    properties
        mdl
        % Default input signal
        t = [0 1 1 2]'
        u = [0 0 1 1]'
    end

    methods
        function this = Test(mdl)   % Constructor
            this.mdl = mdl;
        end

        function sim(this)
            % Load model
            load_system(this.mdl);
            % Prepare model configuration
            conf = getActiveConfigSet(this.mdl);
            cs = conf.copy();
            set_param(cs, 'StopTime', '4');
            set_param(cs, 'LoadExternalInput', 'on');
            set_param(cs, 'ExternalInput', '[test.t test.u]');  % <-- 1
            % Run simulation
            simout = sim(this.mdl, cs);
            % Plot results
            tout = simout.find('tout');
            yout = simout.find('yout');
            plot(tout, yout(:,1), 'b--');
        end
    end
end

次に、ちょうど:

>> test = Test('TestSim');
>> test.sim();

何が起こるのですか?フィールドtとuを定義したオブジェクトテストを作成します。次に、メソッドsim()で、入力'[test.ttest.u]'を探すようにSimulinkに指示します。Simulinkとメソッドsim()の両方がこの変数にアクセスできます(これが最も重要なことだと思います)。

OK、それでも番号1でマークされている大きな欠点があります。クラスインスタンスへの参照がワークスペースでどのように命名されるかを明示的に知る必要があります(この場合は「test」)。コンストラクターで名前を渡すことで回避できます。または、静的変数とメソッドを使用できますが、この方法では、入力シグナルを動的に変更することはできません。

于 2013-02-03T23:13:02.687 に答える