Исправьте модель, чтобы соответствовать условиям, которые вы задаете с помощью Model Advisor

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

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

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

  • View By > Recommended Action ─ Когда проверка нарушена, это представление показывает список элементов модели, которые нарушают проверку. Когда нарушений нет, это представление содержит краткое описание, указывающее, что проверка не была нарушена.

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

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

Когда проверка не проходит, результаты включают гиперссылку на каждый элемент модели, которая нарушает проверку. Используйте эти гиперссылки, чтобы легко найти области в вашей модели или подсистеме. Код для этого примера состоит из 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;
    

Создайте файл Check Definition

Функция определения проверки определяет действия проверки и исправления, которые предпринимает Model Advisor при запуске проверки. В данном примере завершенный файл функции определения проверки 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 метод для вызова функции обратного вызова. The 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.

Создайте функцию Check Callback Definition

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

    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. The 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. Отключите поле Action.

    mdladvObj.setActionEnable(false);

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

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

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

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

  4. В верхней модели щелкните правой кнопкой мыши по Engine Speed блокируйте и выберите Rotate & Flip > Flip Block Name.

  5. Откройте fuel_rate_control подсистема. Щелкните правой кнопкой мыши по validate_sample_time блокируйте и выберите Rotate & Flip > Flip Block Name.

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

  6. На вкладке Modeling выберите Model Advisor. Откроется System Selector ― Model Advisor диалоговое окно. Нажмите OK. Откроется Model Advisor.

  7. На левой панели выберите By Product > Demo > Check whether block names appear below blocks.

    Примечание

    Если папка By Product не отображается в окне Model Advisor, выберите Settings > Preferences > Show By Product Folder

  8. Выберите Run This Check. Проверка Model Advisor не выполняется для измененных блоков.

  9. Проверьте результаты путем выбора одной из View by опций.

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

  10. Следуйте рекомендуемому действию по исправлению нарушающих блоков с помощью одного из следующих методов:

    • Обновляйте каждое нарушение индивидуально, дважды кликнув гиперссылку, чтобы открыть блок. Щелкните правой кнопкой мыши блок и выберите Rotate & Flip > Flip Block Name.

    • Нажмите кнопку Make block names appear below blocks. Model Advisor автоматически устраняет проблемы в модели. Заметьте, что кнопка отключена после устранения нарушений.

  11. Сохраните модель и повторите проверку Model Advisor. Проверка прошла.

См. также

| | |

Похожие темы