exponenta event banner

Исправление модели в соответствии с условиями, заданными консультантом по модели

В этом примере показано, как создать настраиваемую проверку прохождения/отказа Model Advisor с действием исправления. Если модель не содержит нарушения проверки, результаты содержат описание проверки и статус результата. Если модель содержит нарушение проверки, результаты содержат описание проверки, статус результата и рекомендуемое действие для устранения проблемы. В этом примере настраиваемая проверка добавляется в подпапку Model Advisor By Product > Demo.

В этом примере пользовательская проверка определяет блоки, имена которых не отображаются под блоками. Действие исправления заключается в том, чтобы имена блоков отображались под блоками.

В этом примере также показано, как собирать результаты в группы, нарушающие проверку (то есть подробные коллекции результатов), такие как блоки в подсистеме. В помощнике по модели можно просмотреть результаты, выбрав:

  • Просмотр по > Рекомендуемое действие ─ при нарушении проверки в этом представлении отображается список элементов модели, нарушающих проверку. Если нарушения нет, то в этом представлении приводится краткое описание того, что проверка не была нарушена.

  • View By > Subsystem ─ Это представление показывает таблицу элементов модели, которые нарушают проверку, организованную по модели или подсистеме (если применимо).

  • Просмотр по > Блок ─ Этот вид предоставляет список нарушений проверки для каждого блока.

Если проверка не пройдена, результаты включают гиперссылку на каждый элемент модели, который нарушает проверку. Эти гиперссылки позволяют легко находить области в модели или подсистеме. Код для этого примера состоит из sl_customization.m файл и defineDetailStyleCheck.m файл.

Создать sl_customization Файл

  1. В рабочей папке создайте sl_customization.m файл.

  2. Чтобы зарегистрировать пользовательские проверки, создайте sl_customization(cm) функция, как показано здесь. Эта функция принимает один аргумент, объект диспетчера настройки. Объект диспетчера настройки включает в себя addModelAdvisorCheckFcn способ регистрации пользовательской проверки. Входные данные этого метода являются дескриптором функции определения проверки.

    function sl_customization(cm)
    % SL_CUSTOMIZATION - Model Advisor customization demonstration.
    
    % Copyright 2019 The MathWorks, Inc.
    
    % register custom checks 
    cm.addModelAdvisorCheckFcn(@defineDetailStyleCheck);
    
    % -----------------------------
    % defines Model Advisor Checks
    % -----------------------------
    function defineDetailStyleCheck;
    

Создание файла определения проверки

Функция определения проверки определяет действия проверки и исправления, выполняемые менеджером модели при выполнении проверки. В этом примере файл функции определения завершенной проверки defineDetailStyleCheck.m, и он содержит этот код:

function defineDetailStyleCheck

mdladvRoot = ModelAdvisor.Root;

% Create ModelAdvisor.Check object and set properties.
rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
rec.Title = 'Check whether block names appear below blocks';
rec.TitleTips = 'Check position of block names';
rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
% Create ModelAdvisor.Action object for setting fix operation.
myAction = ModelAdvisor.Action;
myAction.Name='Make block names appear below blocks';
myAction.Description='Click the button to place block names below blocks';
rec.setAction(myAction);
myAction.setCallbackFcn(@ActionCB);
mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group.

end

% -----------------------------
% This callback function uses the DetailStyle CallbackStyle type. 
% -----------------------------
function DetailStyleCallback(system, CheckObj)
mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object

% Find all blocks whose name does not appear below blocks
violationBlks = find_system(system, 'Type','block',...
    'NamePlacement','alternate',...
    'ShowName', 'on');
if isempty(violationBlks)
    ElementResults = ModelAdvisor.ResultDetail;
    ElementResults.IsInformer = true;
    ElementResults.Description = 'Identify blocks where the name is not displayed below the block.';
    ElementResults.Status = 'All blocks have names displayed below the block.';
    mdladvObj.setCheckResultStatus(true);
else
    ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail;
    for i=1:numel(ElementResults)
        ElementResults(i).setData(violationBlks{i});
        ElementResults(i).Description = 'Identify blocks where the name is not displayed below the block.';
        ElementResults(i).Status = 'The following blocks have names that do not display below the blocks:';
        ElementResults(i).RecAction =  'Change the location such that the block name is below the block.';
    end
    mdladvObj.setCheckResultStatus(false);
    mdladvObj.setActionEnable(true);
end
CheckObj.setResultDetails(ElementResults);
end

% -----------------------------
% This action callback function changes the location of block names. 
% -----------------------------
function result = ActionCB(taskobj)
mdladvObj = taskobj.MAObj;
checkObj = taskobj.Check;
resultDetailObjs = checkObj.ResultDetails;
for i=1:numel(resultDetailObjs)
    % take some action for each of them
    block=Simulink.ID.getHandle(resultDetailObjs(i).Data);
    set_param(block,'NamePlacement','normal');
end

result = ModelAdvisor.Text('Changed the location such that the block name is below the block.');
mdladvObj.setActionEnable(false);
end

Следующие шаги поясняют, как создать завершенный defineDetailStyleCheck.m файл.

  1. Создать ModelAdvisor.Root объект.

    mdladvRoot = ModelAdvisor.Root;
  2. Создать ModelAdvisor.Check и определите уникальный идентификатор проверки. Для этой проверки идентификатор: com.mathworks.sample.detailStyle.

    rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
    
  3. Укажите ModelAdvisor.Check.Title и ModelAdvisor.Check.TitleTips свойства.

    rec.Title = 'Check whether block names appear below blocks';
    rec.TitleTips = 'Check position of block names';
  4. Используйте setCallbackFcn метод вызова функции обратного вызова. setCallbackFcn аргументы метода являются дескриптором функции обратного вызова и ModelAdvisor.Check.CallbackStyle значение свойства. Для этого примера: CallbackStyle значение свойства - DetailStyle. Этот стиль позволяет просматривать результаты по блоку, подсистеме или рекомендуемому действию. Применение этого стиля приводит к форматированию по умолчанию, так что нет необходимости использовать ModelAdvisor.FormatTemplate класс или другие API форматирования Model Advisor для форматирования результатов, отображаемых в Model Advisor.

    rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
  5. Чтобы задать операцию исправления, создайте ModelAdvisor.Action и определить его свойства.

    myAction = ModelAdvisor.Action;
    myAction.setCallbackFcn(@ActionCB);
    myAction.Name='Make block names appear below blocks';
    myAction.Description='Click the button to place block names below blocks';
  6. Используйте setCallback метод для вызова функции обратного вызова действия. Вход в этот метод является дескриптором функции обратного вызова действия.

    myAction.setCallbackFcn(@ActionCB);
    
  7. Используйте setAction способ установки действия для проверки.

    rec.setAction(myAction);
  8. Используйте publish метод, чтобы издать чек папке в папке By Product. В этом примере имя папки - Demo.

    mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group.

Создание функции определения обратного вызова проверки

  1. В defineDetailStyleCheck.m создайте функцию обратного вызова проверки. В этом примере имя функции: DetailStyleCallback. Входами для этой функции являются ModelAdvisor.CheckObject и путь к модели или системе, анализируемой менеджером модели.

    function DetailStyleCallback(system, CheckObj)
  2. Создание Simulink.ModelAdvisor объект, используйте Simulink.ModelAdvisor.getModelAdvisor способ.

    mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object
    
  3. Для идентификации блоков, нарушающих проверку, используйте find_system функция. Для каждого элемента модели эта функция создает ModelAdvisor.ResultDetail объект.

    violationBlks = find_system(system, 'Type','block',...
                               'NamePlacement','alternate',...
                               'ShowName', 'on');
  4. Написать код для случая, когда find_system функция не идентифицирует блоки, имена которых не отображаются под блоком. В этом случае ElementResults является одним экземпляром ModelAdvisor.ResultDetail и предоставляет только информационное содержимое. Метод указывает, что нарушение проверки отсутствует, и отображает Passed в Model Advisor.

    if isempty(violationBlks)
        ElementResults = ModelAdvisor.ResultDetail;
        ElementResults.IsInformer = true;
        ElementResults.Description = 'Identify blocks where the name is not displayed below the block.';
        ElementResults.Status = 'All blocks have names displayed below the block.';
        mdladvObj.setCheckResultStatus(true);  
  5. Написать код для случая, когда find_system функция возвращает список блоков, имена которых не отображаются под блоком (violationBlks). ElementResults включает каждый ModelAdvisor.ResultDetail объект, нарушающий проверку и предоставляющий сообщение о рекомендуемом действии для устранения нарушения проверки.

    Для этого случая setCheckResultStatus метод определяет нарушение проверки и отображает Предупреждение (Warning) или Сбой (Failed) в Model Advisor. Simulink.ModelAdvisor.setActionEnable(true) метод позволяет устранить проблему нарушения проверки из Model Advisor.

    else
        ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail;
        for i=1:numel(ElementResults)
            ElementResults(i).setData(violationBlks{i});
            ElementResults(i).Description = 'Identify blocks where the name is not displayed below the block.';
            ElementResults(i).Status = 'The following blocks have names that do not display below the blocks:';
            ElementResults(i).RecAction =  'Change the location such that the block name is below the block.';
        end
    mdladvObj.setCheckResultStatus(false);  
    mdladvObj.setActionEnable(true);
    end    
  6. Чтобы связать результаты с объектом проверки, используйте setResultDetails способ.

    CheckObj.setResultDetails(ElementResults);
    end

Создание функции определения обратного вызова действия

  1. В defineDetailStyleCheck.m создайте функцию обратного вызова действия. В этом примере имя функции: sampleActionCB. Входными данными для этой функции являются ModelAdvisor.Task объект.

    function result = ActionCB(taskobj)
  2. Создать дескрипторы для Simulink.ModelAdvisor и ModelAdvisor.Check объекты.

    mdladvObj = taskobj.MAObj;
    checkObj = taskobj.Check;
  3. Создание массива ModelAdvisor.ResultDetail объекты для хранения информации для блоков, нарушающих проверку.

    resultDetailObjs = checkObj.ResultDetails;
  4. «Код записи, который изменяет расположение имени блока на» ниже блока «».

    for i=1:numel(resultDetailObjs)
        % take some action for each of them
        block=Simulink.ID.getHandle(resultDetailObjs(i).Data);
        set_param(block,'NamePlacement','normal');
    end
    result = ModelAdvisor.Text('Changed the location such that the block name is below the block.');
  5. Отключить поле Действие.

    mdladvObj.setActionEnable(false);

Запустить проверку

  1. Сохранить sl_customization.m и defineDetailStyleCheck.m файлы.

  2. В окне команд MATLAB введите:

    Advisor.Manager.refresh_customizations
  3. В окне MATLAB откройте sldemo_fuelsys модель.

  4. В верхней модели щелкните правой кнопкой мыши значок Engine Speed и выберите «Повернуть и развернуть» > «Развернуть имя блока».

  5. Откройте окно fuel_rate_control подсистема. Щелкните правой кнопкой мыши validate_sample_time и выберите «Повернуть и развернуть» > «Развернуть имя блока».

    Вернуться к верхней модели и сохранить как example_sldemo_fuelsys.

  6. На вкладке Моделирование (Modeling) выберите Помощник по модели (Model Advisor). Откроется диалоговое окно Выбор системы (System Selector) ― Помощник по модели (Model Advisor). Нажмите кнопку OK. Откроется окно Model Advisor.

  7. На левой панели выберите По продукту > Демонстрация > Проверить, отображаются ли имена блоков под блоками.

    Примечание

    Если папка По продукту (By Product) не отображается в окне Мастер модели (Model Advisor), выберите Настройки (Settings) > Настройки (Preferences) > Показать по папке продукта (Show By Product Folder).

  8. Выберите Выполнить эту проверку. Проверка измененных блоков в Model Advisor завершается неуспешно.

  9. Просмотрите результаты, выбрав один из параметров Вид по (View by).

    Отчет содержит рекомендуемые действия для каждой проверки. Можно щелкнуть путь гиперссылки, чтобы открыть нарушающий блок в редакторе модели. Например:

  10. Выполните рекомендуемое действие для фиксации нарушающих блоков одним из следующих способов:

    • Обновите каждое нарушение по отдельности, дважды щелкнув гиперссылку, чтобы открыть блок. Щелкните правой кнопкой мыши блок и выберите «Повернуть и развернуть» > «Развернуть имя блока».

    • Нажмите кнопку «Создать имена блоков, отображаемые под блоками». Помощник по модели автоматически устраняет проблемы в модели. Обратите внимание, что кнопка затемняется после устранения нарушений.

  11. Сохраните модель и снова запустите проверку помощника по модели. Чек проходит.

См. также

| | |

Связанные темы