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

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

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

Ознакомьтесь с поведением и назначением Model Slicer и функциональностью Model Slicer API. Подсветите Functional Dependencies в общих чертах, как использовать пользовательский интерфейс Model Slicer для исследования моделей. The slslicer, slsliceroptions, и slslicertrace функция страниц с описанием содержать справку по команде Model Slicer API.

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

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

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

open_system('sldvSliceCruiseControlHarness')

Примечание. Блок Assertion имеет значение Stop simulation, когда assertion прекращает работать, когда фактический режим работы не совпадает с ожидаемым режимом работы.

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

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

3. В модели sldvSliceCruiseControlHarness дважды щелкните блок Assertion, снимите флажок Enable assertion и нажмите OK.

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

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

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

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

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

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

  • verify - отображает логическое значение, сравнивая операцию и ожидаемый режим.

Возможности показывают расхождение между ожидаемой операцией и фактическим режимом работы, начиная с момента 27. Теперь, когда вы знаете порт вывода, отображающий неожиданное поведение, и временное окно, содержащее неожиданное поведение, используйте Model Slicer, чтобы изолировать и проанализировать неожиданное поведение.

Изолируйте область модели, ответственную за неожиданное поведение

1. Создайте объект строения Model Slicer для модели используя slslicer. В Командном окне отображаются свойства среза для этого строения Model Slicer.

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

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

terminate(obj)

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

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

Блок И Логического Оператора в этой подсистеме имеет усеченную истинную константу, присоединенную к его второму входному порту. Эта истинная константа указывает, что второй входной порт всегда верен в течение ограниченного временного окна для этой нарезанной модели, что заставляет систему круиз-контроля не входить в состояние «отменил».

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

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

  615.0006

Блок ИЛИ Логического Оператора в этой подсистеме всегда true в текущем строении. Изменение блока ИЛИ Логического Оператора на блок И Логического Оператора устраняет эту ошибку.

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')

Теперь возможности показывают, что ожидаемый режим работы аналогичен фактическому режиму работы.

Очистка

Чтобы завершить демонстрацию, сохраните и закройте все модели и удалите объект строения Model Slicer.

save_system('sldvSliceCruiseControl_fixed')
save_system('sldvSliceCruiseControlHarness_fixed')
close_system('sldvSliceCruiseControl_fixed')
close_system('sldvSliceCruiseControlHarness_fixed')
close_system('sldvSliceCruiseControlHarness_sliced')
clear obj
Для просмотра документации необходимо авторизоваться на сайте