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

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

Предпосылки

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

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

sldvSliceCruiseControlHarness модель тестовой обвязки содержит подсистему контроллера круиза sldvSliceCruiseContro*l и блок, *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)

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 =

  670.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