Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Crear e implementar una configuración personalizada de Model Advisor

Para comprobar que un modelo cumple con los estándares y las pautas de modelado de su empresa, puede personalizar Model Advisor. Este ejemplo muestra cómo agregar comprobaciones personalizadas a Model Advisor y eliminar comprobaciones que no necesita. Puede guardar la configuración de comprobación personalizada e implementarla para su grupo de desarrollo. La implementación de una configuración personalizada permite que su grupo de desarrollo revise los modelos utilizando el mismo conjunto de comprobaciones.

Definir comprobaciones personalizadas

Este ejemplo define cuatro tipos de comprobaciones personalizadas:

  • Una comprobación en tiempo de edición que proporciona una medida correctora.

  • Una comprobación que se ejecuta solo en Model Advisor y agrupa los resultados por bloques y subsistemas y proporciona una acción de corrección.

  • Una comprobación que se ejecuta únicamente en Model Advisor y verifica la configuración de los parámetros del modelo.

  • Una comprobación en tiempo de edición que especifica una restricción para una configuración de parámetro de bloque y proporciona una medida correctora.

Los archivos de ejemplo incluyen el archivo sl_customization.m. Este archivo contiene la función sl_customization, con llamadas a funciones que definen las comprobaciones personalizadas. Abra e inspeccione el archivo sl_customization.m.

function sl_customization(cm)
% SL_CUSTOMIZATION - Model Advisor customization demonstration.

% Copyright 2019 The MathWorks, Inc.

% register custom checks 
cm.addModelAdvisorCheckFcn(@defineModelAdvisorChecks);

% -----------------------------
% defines Model Advisor Checks
% -----------------------------
function defineModelAdvisorChecks
defineEditTimeCheck
defineDetailStyleCheck;
defineConfigurationParameterCheck;
defineNewBlockConstraintCheck;

La función sl_customization acepta un objeto administrador de personalización que incluye el método addModelAdvisorCheckFcn para registrar comprobaciones personalizadas. La entrada de este método es un identificador de una función, defineModelAdvisorChecks, que contiene llamadas a las cuatro funciones de definición de comprobación que corresponden a las cuatro comprobaciones personalizadas.

Comprobación en tiempo de edición con corrección

El archivo defineEditTimeCheck.m contiene la función de definición de comprobación defineEditTimeCheck, que verifica si los bloques Inport y Outport tienen ciertos colores según sus tipos de datos de salida. Esta comprobación debe verificar otros bloques editados, pero no es necesario que verifique los bloques afectados en el mismo nivel o en toda la jerarquía del modelo. Esta comprobación proporciona una corrección que actualiza el color de los bloques que no tienen los colores correctos. El nombre de esta comprobación es Check color of Inport and Outport blocks. Esta comprobación se ejecuta en tiempo de edición y en Model Advisor. Abra e inspeccione el archivo defineEditTimeCheck.m.

function defineEditTimeCheck

% Check the background color of Inport and Outport blocks.
rec = ModelAdvisor.Check("advisor.edittimecheck.PortColor");
rec.Title = 'Check color of Inport and Outport blocks';
rec.CallbackHandle = 'MyEditTimeChecks.PortColor'; 
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec,'Demo');

La comprobación en tiempo de edición tiene una definición de clase, PortColor, que se deriva de la clase base ModelAdvisor.EdittimeCheck. Para obtener más información sobre cómo crear este tipo de comprobación, consulte Define Edit-Time Checks to Comply with Conditions That You Specify with the Model Advisor. Cree una carpeta denominada +MyEditTimeChecks y guarde PortColor.m en esta carpeta.

copyfile PortColor.m* +MyEditTimeChecks

Abra e inspeccione el archivo PortColor.m.

classdef PortColor < ModelAdvisor.EdittimeCheck
    % Check that ports conform to software design standards for background color.
    %
    %   Background Color                Data Types
    %   orange                          Boolean
    %   green                           all floating-point
    %   cyan                            all integers
    %   Light Blue                      Enumerations and Bus Objects
    %   white                           auto
    %


    methods
        function obj=PortColor(checkId)
            obj=obj@ModelAdvisor.EdittimeCheck(checkId);
            obj.traversalType = edittimecheck.TraversalTypes.BLKITER;                       
        end
        
        function violation = blockDiscovered(obj, blk)
            violation = [];  
            if strcmp(get_param(blk,'BlockType'),'Inport') || strcmp(get_param(blk,'BlockType'),'Outport')
                
                dataType = get_param(blk,'OutDataTypeStr');
                currentBgColor = get_param(blk,'BackgroundColor');
                
                if strcmp(dataType,'boolean')
                        if ~strcmp(currentBgColor, 'orange')
                            % Create a violation object using the ModelAdvisor.ResultDetail class.
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with Boolean outputs should be orange.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'warn';
                        end
                elseif any(strcmp({'single','double'},dataType))
                        if ~strcmp(currentBgColor, 'green')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with floating-point outputs should be green.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'warn';
                        end
                elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                        if ~strcmp(currentBgColor, 'cyan')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with integer outputs should be cyan.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'warn';
                        end
                elseif contains(dataType,'Bus:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with bus outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'warn';
                    end
                 elseif contains(dataType,'Enum:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with enumeration outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'warn';
                    end
                elseif contains(dataType, 'auto')
                    if ~strcmp(currentBgColor, 'white')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with auto outputs should be white.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'warn';
                    end                    
                end
            end  
        end
        
        function violation = finishedTraversal(obj)            
            violation = [];
        end
        
        function success = fix(obj, violation)
            success = true;
            dataType = get_param(violation.Data,'OutDataTypeStr');
            if strcmp(dataType,'boolean')
                set_param(violation.Data,'BackgroundColor','orange');
            elseif any(strcmp({'single','double'},dataType))
                set_param(violation.Data,'BackgroundColor','green');
            elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                set_param(violation.Data,'BackgroundColor','cyan');
            elseif contains(dataType,'Bus:')  || contains(dataType,'Enum:')
                set_param(violation.Data,'BackgroundColor','lightBlue');
            elseif contains(dataType,'auto')
                set_param(violation.Data,'BackgroundColor','white');
            end
        end
    end
end

Comprobaciones de Model Advisor con corrección

El archivo defineDetailStyleCheck.m contiene la función de definición de comprobación defineDetailStyleCheck, que enumera los bloques cuyos nombres no aparecen debajo de los bloques. Esta comprobación proporciona una corrección que mueve los nombres debajo de los bloques. El nombre de esta comprobación es Check whether block names appear below blocks. Este estilo de creación de comprobación solo se ejecutan en Model Advisor. Abra e inspeccione el archivo 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.setCallbackFcn(@ActionCB);
myAction.Name='Make block names appear below blocks';
myAction.Description='Click the button to place block names below blocks';
rec.setAction(myAction);
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.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
    
   for i=1:numel(violationBlks)
        ElementResults(1,i) = ModelAdvisor.ResultDetail;
    end 
    for i=1:numel(ElementResults)
        ModelAdvisor.ResultDetail.setData(ElementResults(i), 'SID',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.';
        ElementResults(i).ViolationType = 'warn'|'info'|'fail';    
    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

Esta comprobación utiliza el tipo setCallbackFcn de DetailStyle, que produce un formato predeterminado, de modo que no es necesario utilizar ModelAdvisor.FormatTemplate ni otras API de formato de Model Advisor para formatear los resultados que aparecen en Model Advisor. Para obtener más información sobre cómo crear este tipo de función de definición de comprobación, consulte Fix a Model to Comply with Conditions that You Specify with the Model Advisor.

Comprobación de la configuración de parámetros de modelo

El archivo defineConfigurationParameterCheck.m contiene la función de definición de comprobación defineConfigurationParameterCheck, que identifica las configuraciones de los parámetros de modelo que podrían afectar la generación de código compatible con MISRA C:2012. El nombre de esta comprobación es Check model configuration parameters.

Esta comprobación requiere un archivo de datos XML de soporte que debe estar en la ruta de MATLAB y contener los parámetros de configuración del modelo que desea comprobar. Para este ejemplo, ese archivo es configurationParameterDataFile.xml. . Para obtener más información sobre cómo crear este tipo de comprobación, consulte Create Model Advisor Check for Model Configuration Parameters.

Abra e inspeccione el archivo defineConfigurationParameterCheck.m .

function defineConfigurationParameterCheck

% Create ModelAdvisor.Check object and set properties.
rec = ModelAdvisor.Check('com.mathworks.sample.configurationParameter');
rec.Title = 'Check model configuration parameters';
rec.setCallbackFcn(@(system)(Advisor.authoring.CustomCheck.checkCallback...
    (system)), 'None', 'StyleOne');
rec.TitleTips = 'Identify configuration parameters that might impact MISRA C:2012 compliant code generation.';

% --- data file input parameters
rec.setInputParametersLayoutGrid([1 1]);
inputParam1 = ModelAdvisor.InputParameter;
inputParam1.Name = 'Data File';
inputParam1.Value = 'configurationParameterDataFile.xml';
inputParam1.Type = 'String';
inputParam1.Description = 'Name or full path of XML data file.';
inputParam1.setRowSpan([1 1]);
inputParam1.setColSpan([1 1]);
rec.setInputParameters({inputParam1});

% -- set fix operation
act = ModelAdvisor.Action;
act.setCallbackFcn(@(task)(Advisor.authoring.CustomCheck.actionCallback...
    (task)));
act.Name = 'Modify Settings';
act.Description = 'Modify model configuration settings.';
rec.setAction(act);

% publish check into Demo folder.
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec, 'Demo'); 

end

Comprobación de restricción de parámetros de bloque

El archivo defineNewBlockConstraintCheck.m contiene la función de definición de comprobación defineNewBlockConstraintCheck, que identifica los bloques Logical Operator que no tienen una forma rectangular. El nombre de esta comprobación es Check icon shape of Logical Operator blocks.

Una comprobación de restricción de parámetros de bloque admite la comprobación en tiempo de edición. Para obtener más información sobre este tipo de comprobación, consulte Define Model Advisor Checks for Supported and Unsupported Blocks and Parameters.

Abra e inspeccione el archivo defineNewBlockConstraintChec k .m .

function defineNewBlockConstraintCheck

rec = Advisor.authoring.createBlockConstraintCheck('com.mathworks.sample.blockConstraint',...
    'Constraints',@createBlockConstraints); % constraint creation is part of block constraint check definition
rec.Title = 'Check icon shape of Logical Operator blocks';
rec.TitleTips = 'Checks icon shape of Logical Operator blocks. Icon shape of Logical Operator should be rectangular.';

% Publish check into Demo folder.
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec, 'Demo'); 

end

function constraints = createBlockConstraints()

% Create block constraints.
c1 = Advisor.authoring.PositiveBlockParameterConstraint;
c1.ID = 'ID_c1';
c1.BlockType = 'Logic';
c1.ParameterName = 'IconShape';
c1.SupportedParameterValues = {'rectangular'};
c1.ValueOperator = 'eq';

constraints = {c1};

end

La función createBlockConstraints define la restricción de bloque c1. La función Advisor.authoring.createBlockConstraintCheck tiene un argumento de nombre-valor 'Constraints' que llama a la función de creación de restricciones createBlockConstraints.

Ver comprobaciones personalizadas en Model Advisor

Para confirmar que sus comprobaciones personalizadas están disponibles, abra Model Advisor.

1. Para que sus comprobaciones personalizadas sean visibles en Model Advisor, debe actualizar el caché de información de comprobaciones de Model Advisor. En la línea de comandos MATLAB, ingrese:

Advisor.Manager.refresh_customizations();

2. Abra el modelo de ejemplo.

open_system('AdvisorCustomizationExample.slx');

3. En la pestaña Modeling, abra Model Advisor. También puede abrir Model Advisor ingresando este comando en la línea de comandos MATLAB:

modeladvisor('AdvisorCustomizationExample.slx');
Updating Model Advisor cache...
Model Advisor cache updated. For new customizations, to update the cache, use the Advisor.Manager.refresh_customizations method.

4. Expande la carpeta By Product > Demo. En las funciones de definición de comprobaciones, el comando publish agrega comprobaciones a la carpeta By Product > Demo.

customModelAdvisor.png

Especificar e implementar una configuración personalizada de Model Advisor

Para especificar qué comprobaciones incluir en Model Advisor y qué comprobaciones utilizar durante la comprobación en tiempo de edición, utilice Model Advisor Configuration Editor.

1. Para abrir Configuration Editor, en Model Advisor, haga clic en Open > Open Configuration Editor.

2. Para agregar o eliminar comprobaciones y carpetas, seleccione una de las opciones en la sección Edit de Model Advisor Configuration Editor.

3. Para guardar una configuración, seleccione Save. Se abre una ventana que solicita que guarde la configuración como un archivo JSON. Para este ejemplo, no es necesario guardar la configuración, porque el archivo demoConfiguration.json contiene las cuatro comprobaciones personalizadas para este ejemplo.

4. Cierre el modelo y Model Advisor Configuration Editor.

bdclose;

Asociar una configuración de comprobación personalizada con un modelo y corregir problemas de comprobación

Para solucionar problemas de comprobación, primero asocie la configuración con un modelo. Luego, puede solucionar problemas en tiempo de edición en Model Advisor.

1. Abra el modelo de ejemplo.

open_system('AdvisorCustomizationExample.slx');

2. Asocie la configuración personalizada, demoConfiguration.json, con el modelo. Cuando se asocia una configuración personalizada con un modelo, el modelo utiliza la misma configuración de comprobación cada vez que abre un modelo. Haga clic en la pestaña Modeling y seleccione Model Advisor > Edit-Time Checks. En el cuadro de diálogo Configuration Parameters, especifique la ruta al archivo de configuración para el parámetro del archivo de configuración de Model Advisor. Alternativamente, ingrese este comando en la línea de comandos:

ModelAdvisor.setModelConfiguration('AdvisorCustomizationExample', 'demoConfiguration.json');

3. Active la comprobación en tiempo de edición haciendo clic en la pestaña Modeling y seleccionando Model Advisor > Edit-Time Checks. Se abre el cuadro de diálogo Configuration Parameters. Seleccione el parámetro Edit-Time Checks. Alternativamente, puede ingresar este comando en la línea de comandos:

edittime.setAdvisorChecking('AdvisorCustomizationExample','on');

En el nivel superior del modelo, los dos bloques Inport tienen un tipo de datos de salida de int32. Los bloques producen advertencias en tiempo de edición porque deberían ser de color cian. El bloque Outport no genera una advertencia porque tiene un tipo de datos auto y es blanco.

modelHighlight.png

4. Para cada bloque Inport, haga clic en la ventana Edit-time warning. Luego haga clic en Fix. El color de los bloques cambia a cian y la advertencia desaparece.

5. El bloque Logical Operator genera una advertencia porque debería tener una forma rectangular. Haga clic en la ventana de advertencia de tiempo de edición y luego haga clic en Fix. El formato del bloque Logical Operator cambia a un rectángulo y la advertencia desaparece.

6. Ahora que ha solucionado las advertencias de comprobación en tiempo de edición, abra Model Advisor para solucionar otros problemas.

modeladvisor('AdvisorCustomizationExample.slx');
Model Advisor is removing the existing report.

7. Model Advisor contiene las cuatro comprobaciones en la configuración personalizada. Haga clic en Run Checks. Las dos comprobaciones realizadas en tiempo de edición se han superado. Las otras dos comprobaciones generan advertencias.

modelCheckStatus.png

8. Haga clic en la comprobación Check whether block names appear below blocks. Para aplicar una corrección y resolver las advertencias, en el panel derecho, haga clic en Fix.

9. Haga clic en la comprobación Check model configuration parameters. Para aplicar una solución y resolver las advertencias, haga clic en Fix.

10. Vuelva a ejecutar las comprobaciones. Ahora se superan.

11. Cierre el modelo y Model Advisor.

bdclose;

12. Elimine los archivos del directorio de trabajo. Actualice la caché de información de comprobación de Model Advisor ingresando este comando:

Advisor.Manager.refresh_customizations

Ejecutar programáticamente una configuración personalizada de Model Advisor y ver los resultados

Puede ejecutar una configuración de Model Advisor programáticamente y luego abrir los resultados en Model Advisor.

1. Llame a la función ModelAdvisor.run.

SysResultObjArray = ModelAdvisor.run({'AdvisorCustomizationExample'},...
'Configuration','demoConfiguration.json');

2. Vea los resultados en Model Advisor:

viewReport(SysResultObjArray{1},'MA')

3. Haga clic en Continue en el cuadro de diálogo. Ahora puede aplicar correcciones y resolver advertencias.

4. Cierre el modelo y Model Advisor.

bdclose;

5. Elimine los archivos del directorio de trabajo. Actualice la caché de información de comprobación de Model Advisor ingresando este comando:

Advisor.Manager.refresh_customizations

Consulte también

|

Temas