2011-02-07 34 views
3

Simulinkに別の問題があります。Simulink:デバッグのようなモードのシミュレーション

実行中にシミュレーションを一時停止することはできますか? "ユニット遅延"を介していくつかのステップを構築した後、次のステップが完了する前にシミュレーションを一時停止して(ユーザーに表示する値を表示するため)後で言えば、シミュレーションをクリックすると一歩進み、手順が繰り返されます。 これは何らかの種類のデバッグ機能を持っているはずです。

私はこれをどのように実現するのか非常に堅実ではありません。私はどこかにシミュレーションパラメータのどこかを推測するが、どこでどのように?

答えて

7

これについて私が知っている通りに行く方法は3つあります。

方法1:シミュレーションを一時停止しないでください。代わりに、適切な行にスコープを使用して、シミュレーションで何が起きたかを知るための十分な情報を提供してください。

利点:実行の順番やシミュレーションの一時停止によって混乱する結果を招くことはありません。

短所:特に、すべてのシミュレーションステップを実行するわけではない場合は、頭の中の異なるスコープラインを「時間同期」するのは難しいことがあります。 (これは部分的にスコープブロックグラフがステップ関数として現れるため、実際には散布図です。

方法2:組み込みのSimulinkデバッガを使用しないでください)このツールを使用すると、使用しているモデルのツール> Simulinkデバッガメニューオプションから開くことができます。このツールを使用すると、特定のブロック、一度に1ブロックずつ、または2つの組み合わせでブレークポイントを設定できます。

利点:

短所:実際には、このツールは使い方が紛らわしく、Matlabがクラッシュする傾向があります。実行のr。

方法3:シミュレーションの実行順序の先頭に埋め込みMatlab関数を作成します。ここに例があります:

関数y = func(x); y = x;

この機能をシミュレーション開始時の信号線の1つにドロップすると(実行順序が強制されます)。それから、y = xにデバッグポイントを置く。ライン。さて、あなたのシミュレーションがこのラインに当たったときは、シミュレーションはMatlabエディタの "continue"ボタンをクリックするのを待って一時停止します。

利点:信頼性が高く、簡単です。

デメリット:実行順序に注意してください。実行の

注文:

あなたはSimulinkでの実行の順序に慣れていない場合、私はあなたがモデルメニューから「書式>ブロックを表示>ソート順」をオンに示唆しています。これは、各ブロックに、ブロックがあなたのシミュレーションで実行される順番を何とか示している、暗い数字/文字コードを入れます。お使いのモデルやレイアウトによっては、これらの数字/文字コードがかなりの意味を持つ場合もあれば、そうでない場合もあります。私はこのソート順の表示を一般的な方法で使用することを推奨しません。代わりに、SimulinkがSorted Order/Execution Orderをどのように決定するかを学び、理解することをお勧めします。

重要なことは、デバッグポイント(Simulinkデバッガまたは組み込みMatlabを使用する天気)が実行順序の一部であることです。つまり、デバッグポイントにヒットした場合、そのポイント以降のブロックは状態を更新しません。これは多くの意味がありますが、表示されたスコープは、実行の早い段階でブロックされた信号線に接続されていても、状態を更新する最後のブロックの一部になっていることがあります。これらのディスプレイとスコープが(非原子的な)サブシステムの内部にあり、デバッグポイントがそのサブシステムの外側にある場合でも、これは当てはまります。ディスプレイまたはスコープに表示される値がシミュレーションの最後のタイムステップの値である場合があります。

どうすれば対処できますか?表示とスコープを含む原子サブシステムの内部にすべてのシミュレーションを入れます。次に、このサブシステムの外側にデバッグポイントを置きます。これにより、デバッグポイントがヒットするたびに、すべてのブロック(ディスプレイとスコープを含む)の状態が一貫していることが保証されます。

これが意味をなさない場合は、教えてください。

+0

うわー、あなたの非常に詳細なanwerのおかげで:)私はあなたの提案のいくつかを試す必要があると思う。私は "Enabled Subsystems"でシミュレーションを構築すると思いますので、各サブシステムが処理されるときに判断することができます。私は方法2か3がより快適に使用できるかどうか、私はテストしなければならないと思う。私に少し混乱させる唯一のことは、なぜメソッド3はすべての1行にこの関数をドロップすると、どのような順序を強制するのでしょうか?あなたのすばらしい答えをお約束します! – poeschlorn

+0

方法3のブロックを1つだけ作成する必要があります。シグナルライン上にドロップすることをお勧めします。たとえば、すべてのサブシステムの前後にある行にドロップすることができます。これにより、デバッガブロックが最初に実行されることがわかります。このようにして、シミュレーションが一時停止すると、他のすべてのブロックは一定の時間ステップで固定されます。 – Miebster

関連する問題