Main Content

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

ModelAdvisor.EdittimeCheck 클래스

네임스페이스: ModelAdvisor

편집 시 검사를 생성하기 위한 추상 기본 클래스

R2022a 이후

설명

ModelAdvisor.EdittimeCheck 추상 기본 클래스에서 클래스를 파생하여 사용자 정의 편집 시 검사를 생성합니다. 사용자 정의 편집 시 검사를 생성하려면 추상 기본 클래스에서 파생되는 MATLAB® 클래스를 생성합니다. 그런 다음 클래스에 대한 핸들을 포함하는 검사 정의 함수를 만들고 sl_customization 함수를 사용하여 사용자 정의 편집 시 검사를 등록합니다.

ModelAdvisor.EdittimeCheck 클래스는 handle 클래스입니다.

클래스 속성

추상적인
true
핸들호환
true

클래스 속성에 대한 자세한 내용은 클래스 특성을 참조하세요.

속성

모두 확장

검사 식별자로, 문자열로 지정됩니다. 정의 확인 기능의 일부로 생성한 ModelAdvisor.Check 클래스를 사용하여 이 속성을 설정합니다. checkID 속성은 검사에 대한 영구 고유 식별자를 지정합니다.

예: "advisor.edittime.inoutnamelength"

속성:

GetAccess
보호됨
SetAccess
보호됨

Model Advisor가 다음 값 중 하나로 지정된 편집 시 검사를 실행하는 방법은 다음과 같습니다.

  • edittimecheck.TraversalTypes.BLKITER — 새로 추가된 블록과 편집한 블록에 대해 검사가 실행됩니다. 이러한 편집에는 블록 이름, 유형 및 매개변수 값에 대한 변경 사항이 포함됩니다.

  • edittimecheck.TraversalTypes.ACTIVEGRAPH — 새로 추가된 블록, 편집한 블록 및 편집했거나 새로 추가한 블록과 동일한 수준의 기타 블록에 대해 검사가 실행됩니다. 검사에서 사용자가 편집 중인 모델의 전체 하위 시스템 또는 수준을 확인해야 하는 경우 이 순회 유형 속성을 지정합니다. 예를 들어, Trigger 블록이 하위 시스템의 최상위 블록인지 확인하기 위해 이 순회 유형을 지정합니다. 왜냐하면 검사에서는 이 결정을 내리기 위해 하위 시스템 내의 다른 블록을 조사해야 하기 때문입니다.

예: eddittimecheck.TraversalTypes.BLKITER

속성:

GetAccess
보호됨
SetAccess
보호됨

메서드

모두 확장

예제

모두 축소

출력 데이터 유형에 따라 Inport 및 Outport 블록에 특정 색상이 있는지 확인하는 사용자 정의 편집 시 검사를 만듭니다.

Model Advisor 점검을 시도하려면 모델을 구하십시오.

openExample('AdvisorCustomizationExample')

Model with edit-time check violations

모델을 작업 폴더에 저장합니다. 모델을 닫습니다.

사용자 정의 편집 시 검사를 등록하려면 sl_customization 함수를 생성하세요. sl_customization 함수는 사용자 정의 관리자 개체라는 하나의 인수를 허용합니다. 사용자 정의 검사를 등록하려면 addModelAdvisorCheckFcn 방법을 사용하십시오. 이 메소드에 대한 입력은 검사 정의 함수에 대한 핸들입니다. 이 예에서는 defineCheck가 검사 정의 기능입니다. sl_customization 함수를 생성하고 작업 폴더에 저장합니다.

function sl_customization(cm)
cm.addModelAdvisorCheckFcn(@defineCheck);

검사 정의 기능을 만듭니다. 함수 내에서 ModelAdvisor.Check 객체를 생성하고 Check ID를 입력 인수로 지정합니다. 그런 다음 ModelAdvisor.Check TitleCallbackHandle 속성을 지정합니다. CallbackHandle 속성은 편집 시 검사를 정의하기 위해 생성하는 클래스의 이름입니다. 이 예에서 MyEditTimeChecks은 패키지 이름이고 PortColor은 클래스 이름입니다. 그런 다음 Model Advisor의 새 폴더에 검사를 게시합니다. 이 예에서 폴더 이름은 DEMO: Edit-time Checks입니다. 이 예에서는 defineCheck 함수를 만들고 여기에 아래 코드를 포함합니다. defineCheck 함수를 작업 폴더에 저장합니다.

function defineCheck
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: Edit-time Checks');

ModelAdvisor.EdittimeCheck 추상 기본 클래스에서 파생되는 클래스를 만듭니다. 이 예에서는 PortColor.m라는 클래스 파일을 만듭니다. 아래 코드를 PortColor.m 파일에 복사하세요. 그런 다음 +MyEditTimeChecks이라는 폴더를 만들고 해당 폴더에 PortColor.m 파일을 저장합니다. 클래스는 패키지 이름과 동일한 이름을 가진 폴더에 있어야 합니다.

PortColor 클래스는 세 가지 메서드를 정의합니다. PortColor, blockDiscovered, fix. PortColor 메서드는 CheckIdTraversalType 속성을 설정합니다. 이 검사는 새로 추가 및 편집된 블록을 검사해야 하지만 편집되거나 새로 추가된 블록과 동일한 하위 시스템 또는 모델에서 영향을 받는 블록을 검사할 필요가 없기 때문에 edittimecheck.TraversalTypes.BLKITER의 순회 유형을 갖습니다. blockDiscovered 방법에는 Inport 및 Outport 블록의 색상을 확인하는 알고리즘이 포함되어 있습니다. fix 방법은 올바른 색상이 없는 블록을 업데이트합니다.

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
        % Set the Check ID and traversal type.
        function obj=PortColor(checkId)
            obj=obj@ModelAdvisor.EdittimeCheck(checkId);
            obj.traversalType = edittimecheck.TraversalTypes.BLKITER;                       
        end
        % Specify the edit-time check algorithm using the blockDiscovered method.
        function violation = blockDiscovered(obj, blk)
            violation = []; 
            % To check when this check gets called, insert a breakpoint here. 
            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 = 'Warning';
                        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 = 'Warning';
                        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 = 'Warning';
                        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 = 'Warning';
                    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 = 'Warning';
                    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 = 'Warning';
                    end                    
                end
            end  
        end
        
              
        % Optionally, provide a fix  for the violation object.
        function success = fix(obj, violation)
            success = false;
            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
            success = true;
        end
    end
end

Model Advisor를 새로 고쳐 경로에 대한 새로운 검사로 캐시를 업데이트합니다.

Advisor.Manager.refresh_customizations

AdvisorCustomizationExample 모델을 엽니다.

모델링 탭을 클릭하고 Model Advisor > Configuration Editor를 선택하거나 명령 프롬프트에 다음 명령을 입력하여 Model Advisor 구성 편집기를 엽니다.

Simulink.ModelAdvisor.openConfigUI;

사용자 정의 편집 시 검사로 구성된 사용자 정의 구성을 만듭니다. 구성을 my_config.json로 저장합니다. Model Advisor 구성 편집기를 닫습니다. 사용자 정의 구성을 my_config.json 파일로 설정합니다.

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

모델링 탭을 클릭하고 Model Advisor > Edit-Time Checks를 선택하여 편집 시 검사를 활성화합니다. 구성 매개변수 대화 상자가 열리고 편집 시 검사 매개변수를 선택합니다. 또는 명령 프롬프트에 다음 명령을 입력할 수 있습니다.

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

편집 시간 경고를 보려면 노란색으로 강조 표시된 블록을 클릭하세요.

모델의 최상위 수준에서 두 개의 Inport 블록은 int32의 출력 데이터 유형을 갖습니다. 청록색이어야 하기 때문에 편집 시 경고가 표시됩니다. Outport 블록은 자동 데이터 유형이 있고 흰색이므로 위반을 생성하지 않습니다.

편집 시간 경고를 수정하려면 편집 시 검사 경고 창에서 수정를 클릭하세요.

버전 내역

R2022a에 개발됨