В этом примере вы оцениваете модель Simulink®, обнаруживаете неожиданное поведение и Нож Модели использования, чтобы программно изолировать и разрешить неожиданное поведение. Когда вы планируете снова использовать свои команды API и расширить их использование к другим моделям, программируемый подход полезен.
Будьте знакомы с поведением и целью Образцового Ножа и функциональностью Образцового API Ножа. Подсветите Функциональные основы Зависимостей, как использовать Образцовый пользовательский интерфейс Ножа, чтобы исследовать модели. slslicer
, slsliceroptions
и страницы ссылки на функцию slslicertrace
содержат Образцовую справку команды API Ножа.
Модель тестовой обвязки sldvSliceCruiseControlHarness
содержит подсистему контроллера круиза sldvSliceCruiseControl
и блок, TestCases
, содержа тест для этой подсистемы. Вы сначала моделируете модель, чтобы выполнить тест. Вы затем оцениваете поведение модели, чтобы найти и изолировать области модели, ответственной за неожиданное поведение:
Откройте тестовую обвязку sldvSliceCruiseControlHarness
для модели круиз-контроля.
open_system('sldvSliceCruiseControlHarness')
Блок Assertion установлен в Stop simulation when assertion fails, когда фактический режим работы не является тем же самым как ожидаемым режимом работы.
Блок TestCases содержит несколько тестовых воздействий для sldvSliceCruiseControl.
В TestCases Signal Builder нажимают кнопку Run all, чтобы запустить все включенные тесты. Вы получаете ошибку во время теста ResumeWO.
Блок Assertion остановил симуляцию в 27 секунд, потому что фактический режим работы не был тем же самым как ожидаемым режимом работы. Нажмите OK, чтобы закрыть это сообщение об ошибке.
В sldvSliceCruiseControlHarness модели дважды кликните блок Assertion, очистите Enable assertion и нажмите OK.
set_param('sldvSliceCruiseControlHarness/Assertion','Enabled','off')
Установите Active Group блока Signal Builder TestCases
к тесту, содержащему ошибку, и запустите симуляцию снова.
signalbuilder('sldvSliceCruiseControlHarness/TestCases', 'ACTIVEGROUP', 12) sim('sldvSliceCruiseControlHarness')
Блок Scope в модели содержит три сигнала:
operation_mode
– отображает фактический режим работы подсистемы.
expected_mode
– отображает ожидаемый режим работы подсистемы, которую обеспечивает тест.
verify
– отображает булево значение, сравнивающее режим работы и ожидаемый режим.
Осциллограф показывает несоизмеримость между ожидаемым режимом работы и фактическим режимом работы, начинающимся во время 27
. Теперь, когда вы знаете, что выходной порт, отображающий неожиданное поведение и окно времени, содержащее неожиданное поведение, использует Образцовый Нож, чтобы изолировать и анализировать неожиданное поведение.
Создайте Образцовый объект настройки Ножа для модели с помощью 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: ''
Активируйте режим выделения среза Образцового Ножа, чтобы скомпилировать модель и подготовить его к анализу зависимостей.
activate(obj)
Добавьте блок выходного порта operation_mode
как отправную точку и подсветите его.
addStartingPoint(obj,'sldvSliceCruiseControlHarness/operation_mode')
highlight(obj)
Область модели в восходящем направлении отправной точки и активный во время симуляции подсвечена.
Моделируйте модель в ограниченном окне времени симуляции (максимальные 30 секунд), чтобы подсветить только область модели в восходящем направлении отправной точки и активный во время окна времени интереса.
simulate(obj,0,30)
Можно далее сузить окно времени симуляции путем изменения времени начала на 20 секунд.
setTimeWindow(obj,20,30)
Создайте нарезанную модель sldvSliceCruiseControlHarness_sliced
, содержащую только сферу интересов.
slicedModel = slice(obj,'sldvSliceCruiseControlHarness_sliced') open_system('sldvSliceCruiseControlHarness_sliced')
Нарезанная модель sldvSliceCruiseControlHarness_sliced
теперь содержит упрощенную версию исходной модели sldvSliceCruiseControlHarness
. Упрощенная автономная модель содержит только те части модели, которые являются восходящими из заданной отправной точки и активными во время окна времени интереса.
Можно теперь отладить неожиданное поведение в упрощенной автономной модели и затем применить изменения в исходной модели.
Чтобы позволить редактировать модель снова, отключите режим Model Slicer.
terminate(obj)
Перейдите к области нарезанной модели, которая содержит неожиданное поведение.
open_system('sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled')
Блок AND
Logical Operator в этой подсистеме имеет усеченный true
, постоянный присоединенный к его второму входному порту. Этот постоянный true
указывает, что вторым входным портом является всегда true
во время ограниченного окна времени для этой нарезанной модели, заставление системы круиз-контроля не войти "отменило" состояние.
Перейдите к эквивалентному блоку AND
Logical Operator в исходной системе при помощи slslicertrace
, чтобы просмотреть блоки, соединенные со вторым входным портом.
h = slslicertrace('SOURCE',... 'sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp1') hilite_system(h)
Блоком OR
Logical Operator в этой подсистеме всегда является true
в текущей настройке. Изменение блока OR
Logical Operator к блоку AND
Logical Operator исправляет эту ошибку.
Прежде, чем сделать редактирования, создайте новые копии модели круиз-контроля и модели тестовой обвязки.
save_system('sldvSliceCruiseControl','sldvSliceCruiseControl_fixed') save_system('sldvSliceCruiseControlHarness','sldvSliceCruiseControlHarness_fixed')
Обновите модель - ссылку в тестовой обвязке, чтобы обратиться к недавно сохраненной модели.
set_param('sldvSliceCruiseControlHarness_fixed/Model',... 'ModelNameDialog','sldvSliceCruiseControl_fixed.slx')
Используйте блок path ошибочного блока Logical Operator, чтобы зафиксировать ошибку.
set_param('sldvSliceCruiseControl_fixed/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp2',.. 'LogicOp','AND')
Моделируйте тестовую обвязку в течение 45 секунд с фиксированной моделью, чтобы подтвердить исправленное поведение.
sim('sldvSliceCruiseControlHarness_fixed')
ans = Simulink.SimulationOutput: tout: [4501x1 double] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
Осциллограф теперь показывает, что ожидаемый режим работы совпадает с фактическим режимом работы.
Чтобы завершить демонстрацию, сохраните и закройте все модели и удалите Образцовый объект настройки Ножа.
save_system('sldvSliceCruiseControl_fixed') save_system('sldvSliceCruiseControlHarness_fixed') close_system('sldvSliceCruiseControl_fixed') close_system('sldvSliceCruiseControlHarness_fixed') close_system('sldvSliceCruiseControlHarness_sliced') clear obj
slslicer
| slsliceroptions
| slslicertrace