Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

Variant Subsystem

이 모델에서는 Simulink® Variant Subsystem을 보여줍니다. Variant Subsystem을 사용하면 시뮬레이션 중에 하나의 구현만 활성 상태인 서브시스템을 대상으로 여러 구현을 제공할 수 있습니다. 모델을 수정하지 않고도 활성 구현을 프로그래밍 방식으로 교체하여 다른 구현 중 하나로 대체할 수 있습니다.

Variant Subsystem 개요

Variant Subsystem 블록은 둘 이상의 자식 서브시스템을 포함하며, 포함된 자식 서브시스템 중 하나만 모델 실행 중에 활성 상태에 있습니다. 활성 자식 서브시스템을 활성 Variant라고 합니다. 전역 작업 공간에서 변수의 값을 변경하거나 Variant Subsystem 블록 대화 상자를 사용하여 Variant 선택지를 수동으로 재정의함으로써 Variant Subsystem 블록의 활성 Variant를 프로그래밍 방식으로 전환할 수 있습니다. 활성 Variant는 모델 컴파일 중에 Simulink에 의해 Variant Subsystem의 Inport 및 Outport 블록에 프로그래밍 방식으로 연결됩니다.

Variant 선택지를 프로그래밍 방식으로 제어하기 위해, Variant Subsystem 블록 대화 상자에서 Simulink.Variant 객체가 각 자식 서브시스템에 연결됩니다. Simulink.Variant 객체는 MATLAB® 전역 작업 공간에 만들어집니다. 이들 객체는 표현식인 Condition 속성을 갖습니다. 이 속성은 부울 값으로 평가되며 활성 Variant 자식 서브시스템을 결정하는 데 사용됩니다.

참고: MATLAB® 전역 작업 공간, 모델 작업 공간, 마스크 작업 공간 또는 데이터 사전에서 Variant 제어를 지정할 수 있습니다.

예를 들어, 전역 작업 공간에서 VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');을 정의하면

해당 Variant의 활성화 시점이 생성자 인수 ('VSS_MODE==1')에 의해 정의되는 Simulink.Variant 객체가 만들어집니다. 이제 Variant Subsystem 대화 상자에서 VSS_LINEAR_CONTROLLER를 Variant Subsystem 내의 자식 서브시스템 중 하나에 연결하면 됩니다. 기본 작업 공간에서 다음과 같이 정의하면

VSS_MODE=1

전역 작업 공간에서 VSS_LINEAR_CONTROLLER Variant가 활성화됩니다. 이러한 조건 인수는 스칼라 변수, 열거형, 등식, 부등식, && 및 ~로 구성된 단순 표현식일 수 있습니다. 우선 순위를 나타내기 위해 괄호 ()를 사용할 수 있습니다.

Variant Subsystem 사용하기

이 예제의 모델은 MATLAB 전역 작업 공간에 정의된 다음과 같은 Variant 객체와 Variant 제어 변수를 사용합니다.

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

VSS_NONLINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==2');

VSS_MODE=2;

예제 모델 sldemo_variant_subsystems를 열면 File -> ModelProperties -> Callbacks에 정의된 PreLoadFcn이 실행됩니다. 그러면 전역 작업 공간이 Controller라는 Variant Subsystem 블록의 변수로 채워집니다.

open_system('sldemo_variant_subsystems')

그림 1: 예제 모델 sldemo_variant_subsystems

Controller 서브시스템의 Simulink.Variant 객체 연결을 지정하려면 Controller 서브시스템을 마우스 오른쪽 버튼으로 클릭하고 Subsystem Parameters를 선택하십시오. 이렇게 하면 Controller 서브시스템 블록 대화 상자가 열립니다.

Controller 서브시스템 블록 대화상자는 2개의 잠재적 Variant를 지정합니다. 2개의 Variant는 차례로 전역 작업 공간에 있는 2개의 Simulink.Variant 객체 VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER에 연결됩니다. 이들 객체는 Condition이라는 속성을 갖습니다. 이 속성은 부울로 평가되는 표현식으로, 어느 Variant가 활성 상태인지 결정합니다. 이 조건은 Variant Subsystem 블록 대화 상자에도 나와 있습니다. 이 예제에서 VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER의 조건 속성은 각각 VSS_MODE == 1VSS_MODE == 2입니다. 변수 VSS_MODE는 전역 작업 공간에 있으며, 표준 MATLAB 변수이거나 Simulink.Parameter일 수 있습니다.

연결된 Variant 객체가 없거나 Variant Subsystem 파라미터 대화 상자에서 Variant 객체 앞에 '%'(주석) 문자가 있는 경우 자식 서브시스템은 주석 처리된 것으로 간주되어 모델 실행 중에 사용되지 않습니다.

open_system('sldemo_variant_subsystems/Controller');

그림 2: Controller 서브시스템 블록의 내용

Variant Subsystem 블록 내에 Inport, Outport, Subsystem 블록을 배치할 수 있습니다. 이 예제에서 Linear Controller 서브시스템 블록은 Variant 객체 VSS_LINEAR_CONTROLLER에 연결되어 있고 Nonlinear Controller 서브시스템 블록은 Variant 객체 VSS_NONLINEAR_CONTROLLER에 연결되어 있습니다.

Variant Subsystem 내에서는 신호 연결이 허용되지 않습니다. Simulink는 모델을 시뮬레이션할 때 Inport 및 Outport 블록을 활성 Variant에 프로그래밍 방식으로 연결합니다.

활성 Variant 전환하기

Linear Controller Variant를 사용하여 시뮬레이션하려면

VSS_MODE=1

위와 같이 전역 작업 공간에 정의하고 모델을 시뮬레이션합니다.

open_system('sldemo_variant_subsystems/Controller','parameter');
close_system('sldemo_variant_subsystems/Controller')
VSS_MODE=1; %#ok (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

그림 3: Linear Controller Variant를 사용한 시뮬레이션

Nonlinear Controller를 사용하여 시뮬레이션하려면

VSS_MODE=2

위와 같이 전역 작업 공간에 정의하고 모델을 시뮬레이션합니다.

VSS_MODE=2; % (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

그림 4: Nonlinear Controller Variant를 사용한 시뮬레이션

열거형 및 재사용

sldemo_variant_subsystems_enum 모델은 다음과 같은 Simulink.Variant 기능을 보여줍니다.

1. 열거형: MATLAB 열거형 클래스는 Variant 객체의 조건의 가독성을 개선하는 용도로 사용할 수 있습니다.

2. 재사용: Simulink.Variant 객체는 여러 Variant Subsystem 블록에서 재사용할 수 있습니다.

이 예제에서는 MATLAB 전역 작업 공간에 정의된 다음과 같은 변수를 사용합니다.

VSSE_LINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.LINEAR')

VSSE_NONLINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.NONLINEAR')

VSSE_MODE=sldemo_vss_CONTROLLER_TYPE.LINEAR

VSSE_PROTOTYPE=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PROTOTYPE')

VSSE_PRODUCTION=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PRODUCTION')

VSSE_MODE_BUILD=sldemo_vss_BUILD_TYPE.PRODUCTION

이들 Simulink.Variant 객체에서 열거형 클래스 sldemo_vss_BUILD_TYPE.msldemo_vss_CONTROLLER_TYPE.m을 사용하여 Simulink.Variant 조건 파라미터를 정의합니다. 이렇게 하면 가독성이 개선됩니다.

3개의 필터 Variant Subsystems 블록인 Filter1, Filter2, Filter3은 모두 VSSE_PROTOTYPEVSSE_PRODUCTION Simulink.Variant 객체를 사용합니다.

참고: 열거형 클래스의 이름은 데이터형 이름과 전역 작업 공간 변수 이름 사이에서 고유해야 하며 대소문자를 구분합니다.

예제 모델 sldemo_variant_subsystems_enum을 열면 File -> ModelProperties -> Callbacks에 정의된 PreLoadFcn이 실행됩니다. 그러면 전역 작업 공간이 Variant Subsystem 블록의 변수로 채워집니다.

open_system('sldemo_variant_subsystems_enum')

그림 5: 예제 모델 sldemo_variant_subsystems_enum

열거형을 Variant 제어 변수로 사용하는 코드 생성

열거형을 사용하여 Variant 제어 값으로 사용되는 정수에 의미 있는 이름을 지정할 수 있습니다.

rtwdemo_preprocessor_subsys 모델을 고려하겠습니다.

MATLAB 편집기에서 열거형 값을 의미 있는 이름에 매핑하는 클래스를 정의합니다.

열거형이 올바르게 정의되지 않은 경우 오류가 표시됩니다. 다음은 오류가 발생하는 몇 가지 시나리오입니다.

잘못된 정의 1: 이 경우, Simulink.IntEnumType은 정의되어 있지 않습니다.

잘못된 정의 2: 이 경우, 변수는 초기화되지 않습니다.

다음 예와 같이 Variant 제어 표현식을 입력합니다.

그림 6: 블록 파라미터

전역 작업 공간에서 V 값을 정의합니다. 예를 들면 V=2를 지정합니다. 값은 일반 MATLAB 변수 또는 Simulink.Parameter 객체일 수 있습니다. 그러나 값은 열거형이 될 수 없습니다.

이제 Variant 활성화 시점을 코드 컴파일(code compile)로 설정하여 코드를 생성합니다. 샘플 코드는 아래와 같습니다.

그림 7: 생성된 코드

Simulink.Variant 객체나 Simulink.Parameter 객체, MATLAB 변수를 Variant 제어 변수로 사용하는 방법에 대한 자세한 내용은 Introduction to Variant ControlsApproaches for Specifying Variant Controls 섹션을 참조하십시오.

Variant Subsystem의 코드 생성에 대한 자세한 내용은 Embedded Coder 문서를 참조하십시오.

추가 정보

Variant System Design