exponenta event banner

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

В этом примере выполняется оценка модели Simulink ®, обнаружение неожиданного поведения и программная изоляция и разрешение неожиданного поведения с помощью инструмента «Срезание модели». При планировании повторного использования команд API и расширении их использования на другие модели полезен программный подход.

Предпосылки

Знакомство с поведением и назначением модуля Model Slicer и функциональностью интерфейса API модуля Model Slicer. Подсвечивание функциональных зависимостей (Highlight Functional Dependencies) описывает, как использовать интерфейс пользователя Model Slicer для изучения моделей. slslicer, slsliceroptions, и slslicertrace страницы ссылок на функции содержат справку по командам API-интерфейса Model Slicer.

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

Модель тестовых кабельных трасс sldvSliceCrureControlHarness содержит подсистему круизных контроллеров sldvSliceCrureControl и блок StartCases, содержащий тестовый пример для этой подсистемы. Сначала необходимо смоделировать модель для выполнения тестового случая. Затем можно оценить поведение модели, чтобы найти и изолировать области модели, ответственные за неожиданное поведение.

1. Откройте тестовый жгут sldvSliceCrureControlHarness для модели круиз-контроля.

open_system('sldvSliceCruiseControlHarness')

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

Блок StartCases содержит несколько тестовых входов для sldvSliceCrureControl.

2. Чтобы запустить все включенные тестовые примеры, нажмите кнопку Run all (Запустить все). Ошибка во время теста ResumeWO. Блок утверждения остановил моделирование через 27 секунд, поскольку фактический режим работы не совпадал с ожидаемым. Нажмите кнопку ОК, чтобы закрыть сообщение об ошибке.

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

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

4. Установите в качестве Активной группы блока Test Cases Signal Builder тестовый случай, содержащий ошибку, и снова запустите моделирование.

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

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

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

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

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

Объем показывает несоответствие между ожидаемым режимом работы и фактическим режимом работы, начинающимся в момент времени 27. Теперь, когда известен внешний порт, отображающий неожиданное поведение, и временное окно, содержащее неожиданное поведение, используйте Модель (Model) Срезатель (Slice), чтобы изолировать и проанализировать неожиданное поведение.

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

1. Создание объекта конфигурации Model Slicer для модели с помощью 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 теперь содержит упрощенную версию исходной модели sldvSliceCrureControlHarness. Упрощенная автономная модель содержит только те части модели, которые находятся выше указанной начальной точки и активны в течение интересующего временного окна.

Исследование разрезанной модели и отладка исходной модели

Теперь можно отладить неожиданное поведение в упрощенной автономной модели, а затем применить изменения к исходной модели.

1. Чтобы снова включить редактирование модели, завершите режим среза модели.

terminate(obj)

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

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

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

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

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

  615.0006

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

4. Перед внесением изменений создайте новые копии модели круиз-контроля и модели тестового жгута.

save_system('sldvSliceCruiseControl','sldvSliceCruiseControl_fixed')
save_system('sldvSliceCruiseControlHarness','sldvSliceCruiseControlHarness_fixed')

5. Обновите ссылку на модель в тестовом кабельном жгуте, чтобы обратиться к вновь сохраненной модели.

set_param('sldvSliceCruiseControlHarness_fixed/Model',...
    'ModelNameDialog','sldvSliceCruiseControl_fixed.slx')

6. Для исправления ошибки используйте путь блока логического оператора с ошибками.

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