Зафиксируйте Модель, чтобы Выполнить Условия, которые Вы Задаете С Model Advisor

В этом примере показано, как создать индивидуально настраиваемую передачу/сбой 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;
    

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

Функция определения проверки задает проверку, и зафиксируйте меры, которые принимает 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 возразите и задайте уникальный ID проверки. Для этой проверки ID является 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 и путь к модели или системе, которую анализирует 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. 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. Передачи проверки.

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

| | |

Похожие темы