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

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

Предпосылки

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

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

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

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

    open_system('sldvSliceCruiseControlHarness')

    Примечание

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

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

  2. В TestCases Signal Builder нажимают кнопку Run all, чтобы запустить все включенные тесты. Вы получаете ошибку во время теста ResumeWO.

    Блок Assertion остановил симуляцию в 27 секунд, потому что фактический режим работы не был тем же самым как ожидаемым режимом работы. Нажмите OK, чтобы закрыть это сообщение об ошибке.

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

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

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

Нарезанная модель sldvSliceCruiseControlHarness_sliced теперь содержит упрощенную версию исходной модели sldvSliceCruiseControlHarness. Упрощенная автономная модель содержит только те части модели, которые являются восходящими из заданной начальной точки и активными во время окна времени интереса.

Исследуйте нарезанную модель и отладьте исходную модель

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

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

    terminate(obj)

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

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

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

  3. Перейдите к эквивалентному 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 исправляет эту ошибку.

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

Смотрите также

| |

Похожие темы