Программно разрешите неожиданное поведение в модели с ножом модели

В этом примере вы оцениваете модель Simulink®, обнаруживаете неожиданное поведение и Нож Модели использования, чтобы программно изолировать и разрешить неожиданное поведение. Когда вы планируете снова использовать свои команды API и расширить их использование к другим моделям, программируемый подход полезен.

Необходимые условия

Будьте знакомы с поведением и целью Ножа Модели и функциональностью API Ножа Модели. Подсветите Функциональные основы Зависимостей, как использовать пользовательский интерфейс Ножа Модели, чтобы исследовать модели. slslicer, slsliceroptions, и slslicertrace страницы ссылки на функцию содержат справку команды API Ножа Модели.

Найдите область модели ответственной за неожиданное поведение

sldvSliceCruiseControlHarness модель тестовой обвязки содержит подсистему контроллера круиза sldvSliceCruiseControl и блок, TestCases, содержа тест для этой подсистемы. Вы сначала симулируете модель, чтобы выполнить тест. Вы затем оцениваете поведение модели, чтобы найти и изолировать области модели, ответственной за неожиданное поведение:

1. Откройте sldvSliceCruiseControlHarness тестовую обвязку для модели круиз-контроля.

open_system('sldvSliceCruiseControlHarness')

Примечание: блок Assertion собирается Остановить симуляцию, когда утверждение перестало работать, когда фактический режим работы различный как ожидаемый режим работы.

Блок TestCases содержит несколько тестовых воздействий для sldvSliceCruiseControl.

2. В TestCases Signal Builder нажимают Run вся кнопка, чтобы запустить все включенные тесты. Вы получаете ошибку во время теста ResumeWO. Блок Assertion остановил симуляцию в 27 секунд, потому что фактический режим работы был различный как ожидаемый режим работы. Нажмите ОК, чтобы закрыть это сообщение об ошибке.

3. В sldvSliceCruiseControlHarness модели дважды кликните блок Assertion, ясный Включают утверждение и нажимают ОК.

set_param('sldvSliceCruiseControlHarness/Assertion','Enabled','off')

4. Установите Active Group блока Signal Builder TestCases к тесту, содержащему ошибку, и запустите симуляцию снова.

signalbuilder('sldvSliceCruiseControlHarness/TestCases', 'ACTIVEGROUP', 12)
sim('sldvSliceCruiseControlHarness')

Блок Scope в модели содержит три сигнала:

  • operation_mode - отображает фактический режим работы подсистемы.

  • expected_mode - отображает ожидаемый режим работы подсистемы, которую обеспечивает тест.

  • проверьте - отображает булево значение, сравнивающее режим работы и ожидаемый режим.

Осциллограф показывает несоизмеримость между ожидаемым режимом работы и фактическим режимом работы, начинающимся во время 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 блок выходного порта как начальную точку и подсветите его.

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. Чтобы позволить редактировать модель снова, отключите режим Model Slicer.

terminate(obj)

2. Перейдите к области нарезанной модели, которая содержит неожиданное поведение.

open_system('sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled')

Блок AND Logical Operator в этой подсистеме имеет усеченную истинную константу, присоединенную к ее второму входному порту. Эта истинная константа указывает, что второй входной порт всегда верен во время ограниченного окна времени для этой нарезанной модели, заставление системы круиз-контроля не войти "отменило" состояние.

3. Перейдите с эквивалентным блоком AND Logical Operator в исходной системе при помощи slslicertrace просмотреть блоки, соединенные со вторым входным портом.

h = slslicertrace('SOURCE',...
 'sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp1')
hilite_system(h)
h =

  615.0006

Блок OR Logical Operator в этой подсистеме всегда верен в текущей настройке. Изменение блока 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. Используйте блок path ошибочного блока 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