モデル スライサーを使用したモデルの予期せぬ動作のプログラムによる解決
この例では、Simulink® モデルを評価し、予期せぬ動作を検出します。また、モデル スライサーを使用して予期せぬ動作をプログラムによって分離し、解決します。API コマンドを再利用し、他のモデルでも使用できるようにする場合、プログラムによる方法が便利です。
必要条件
モデル スライサーの動作と目的について、またモデル スライサー API の機能について理解していること。機能の依存関係の強調表示に、モデル スライサーのユーザー インターフェイスを使用してモデルを確認する方法の簡単な説明が記載されています。関数slslicer
、slsliceroptions
および slslicertrace
のリファレンス ページにはモデル スライサー API コマンドのヘルプが含まれています。
予期せぬ動作を引き起こすモデルの領域の検出
sldvSliceCruiseControlHarness テスト ハーネス モデルにはクルーズ コントローラー サブシステム sldvSliceCruiseControl と、ブロック TestCases が含まれ、このサブシステムのテスト ケースが含まれています。まず、モデルのシミュレーションを行い、テスト ケースを実行します。次に、モデルの動作を評価し、予期せぬ動作を引き起こすモデルの領域を検出、分離します。
1.クルーズ コントロール モデルのテスト ハーネス sldvSliceCruiseControlHarness を開きます。
open_system('sldvSliceCruiseControlHarness')
メモ: 実際の操作モードが予測される操作モードと異なる場合、Assertion ブロックは [アサーションが失敗したときにシミュレーションを中止] に設定されます。
TestCases ブロックには "sldvSliceCruiseControl" のテスト入力がいくつか含まれます。
2.TestCases の [信号エディター] で [すべて実行] ボタンをクリックし、含まれているすべてのテスト ケースを実行します。ResumeWO テスト ケースの実行中にエラーが発生しました。実際の操作モードが予測される操作モードと異なったため、Assertion ブロックは 27 秒でシミュレーションを停止しました。[OK] をクリックしてこのエラー メッセージを閉じます。
3."sldvSliceCruiseControlHarness" モデルで Assertion ブロックをダブルクリックし、[アサーションを有効にする] をオフにして、[OK] をクリックします。
set_param('sldvSliceCruiseControlHarness/Assertion','Enabled','off')
4."TestCases" の Signal Editor ブロックの [アクティブ グループ] を、エラーが含まれるテスト ケースに設定し、再度シミュレーションを実行します。
set_param('sldvSliceCruiseControlHarness/TestCases',"ActiveScenario", "ResumeWO") sim('sldvSliceCruiseControlHarness')
モデルの Scope ブロックには 3 つの信号が含まれます。
operation_mode - サブシステムの実際の操作モードを表示します。
expected_mode - テスト ケースによって提供される、サブシステムの予測される操作モードを表示します。
verify - 操作モードと予測されるモードを比較するブール値を表示します。
スコープは 27 以降の時間について、予測される操作モードと実際の操作モードの間の相違を示しています。これで予期せぬ動作が表示されている出力端子と予期せぬ動作が含まれる時間枠が判明したので、モデル スライサーを使用して予期せぬ動作を分離および解析します。
予期せぬ動作を引き起こすモデルの領域の分離
1.slslicer
を使用して、モデルのモデル スライサー構成オブジェクトを作成します。コマンド ウィンドウにはこのモデル スライサー構成のスライスのプロパティが表示されます。
obj = slslicer('sldvSliceCruiseControlHarness')
obj = SLSlicer with properties: Configuration: [1x1 SLSlicerAPI.SLSlicerConfig] ActiveConfig: 1 DisplayedConfig: [] StorageOptions: [1x1 struct] AnalysisOptions: [1x1 struct] SliceOptions: [1x1 struct] InlineOptions: [1x1 struct] Contents of active configuration: Name: 'untitled' Description: '' Color: [0 1 1] SignalPropagation: 'upstream' StartingPoint: [1x0 struct] ExclusionPoint: [1x0 struct] Constraint: [1x0 struct] SliceComponent: [1x0 struct] UseTimeWindow: 0 CoverageFile: '' UseDeadLogic: 0 DeadLogicFile: ''
2.モデル スライサーのスライス強調表示モードをアクティブにし、モデルをコンパイルして依存関係の分析を行う準備をします。
activate(obj);
Consider turning on <a href="matlab:helpview(fullfile(docroot, 'simulink/ug/fast-restart-workflow.html#bugm2tp-3'))">Fast Restart</a> before launching Model Slicer for simulation based workflows. <a href="matlab:SlicerConfiguration.DisableFastRestartNotif">Do not show again.</a>
3.operation_mode の Outport ブロックを開始点として追加し、強調表示します。
addStartingPoint(obj,'sldvSliceCruiseControlHarness/operation_mode')
highlight(obj)
開始点より上流でシミュレーション中にアクティブなモデルの領域が強調表示されます。
4.シミュレーションの制限時間枠内 (最大 30 秒) でモデルをシミュレートし、開始点より上流で、対象とする時間枠中にアクティブなモデルの領域のみを強調表示します。
simulate(obj,0,30)
開始点より上流でシミュレーション時間枠中にアクティブなモデルの領域のみが強調表示されます。
5.開始時間を 20 秒に変更することで、シミュレーション時間枠をさらに絞り込めます。
setTimeWindow(obj,20,30)
6.対象領域のみが含まれるスライス モデル sldvSliceCruiseControlHarness_sliced を作成します。
slicedModel = slice(obj,'sldvSliceCruiseControlHarness_sliced') open_system('sldvSliceCruiseControlHarness_sliced')
slicedModel = 'sldvSliceCruiseControlHarness_sliced'
これで、スライス モデル sldvSliceCruiseControlHarness_sliced にはソース モデル sldvSliceCruiseControlHarness の簡略化バージョンが含まれます。スタンドアロンの簡略化モデルには、指定した開始点より上流で、対象とする時間枠中にアクティブなモデルの部分のみが含まれます。
スライス モデルの調査とソース モデルのデバッグ
これで、スタンドアロンの簡略化モデルで予期せぬ動作のデバッグを行った後、ソース モデルに変更を適用できるようになりました。
1.モデルの編集を再度有効にするには、モデル スライサー モードを終了します。
terminate(obj)
2.予期せぬ動作が含まれるスライス モデルの領域に移動します。
open_system('sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled')
このサブシステムの AND Logical Operator ブロックの 2 番目の入力端子に固定の true 定数が付加されています。この true 定数は、このスライス モデルにおいて制限時間枠中は 2 番目の入力端子が常に true であることを示します。そのため、クルーズ コントロール システムは "キャンセル済み" 状態にはなりません。
3.slslicertrace
を使用して、ソース システム内の同等の AND Logical Operator ブロックに移動し、2 番目の入力端子に接続されたブロックを表示します。
h = slslicertrace('SOURCE',... 'sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp1') hilite_system(h)
h = 1.4100e+03
現在の構成では、このサブシステムの OR Logical Operator ブロックは常に true です。OR Logical Operator ブロックを AND Logical Operator ブロックに変更すると、このエラーが修正されます。
4.編集する前に、クルーズ コントロール モデルとテスト ハーネス モデルの新しいコピーを作成します。
save_system('sldvSliceCruiseControl','sldvSliceCruiseControl_fixed') save_system('sldvSliceCruiseControlHarness','sldvSliceCruiseControlHarness_fixed')
5.新しく保存したモデルを参照するには、テスト ハーネスのモデル参照を更新します。
set_param('sldvSliceCruiseControlHarness_fixed/Model',... 'ModelNameDialog','sldvSliceCruiseControl_fixed.slx')
6.エラーのある Logical Operator ブロックのブロック パスを使用してエラーを修正します。
set_param('sldvSliceCruiseControl_fixed/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp2','LogicOp','AND')
7.修正されたモデルでテスト ハーネスのシミュレーションを 45 秒間行い、正しく動作するかを確認します。
sim('sldvSliceCruiseControlHarness_fixed')
これでスコープには、予測される操作モードと実際の操作モードが同じであることが示されます。
クリーン アップ
デモを完了するには、すべてのモデルを保存して閉じ、モデル スライサー構成オブジェクトを削除します。
save_system('sldvSliceCruiseControl_fixed') save_system('sldvSliceCruiseControlHarness_fixed') close_system('sldvSliceCruiseControl_fixed') close_system('sldvSliceCruiseControlHarness_fixed') close_system('sldvSliceCruiseControlHarness_sliced') clear obj