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 자식 서브시스템을 결정하는 데 사용됩니다. 예를 들어, 기본 작업 공간에서 다음과 같이 정의하면

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 블록의 변수로 채워집니다.

그림 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 객체 앞에 '%'(주석) 문자가 있는 경우 자식 서브시스템은 주석 처리된 것으로 간주되어 모델 실행 중에 사용되지 않습니다.

그림 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

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

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

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

VSS_MODE=2

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

그림 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 블록의 변수로 채워집니다.

그림 5: 예제 모델 sldemo_variant_subsystems_enum

코드 생성

Simulink® Coder™를 사용하여 Variant Subsystem 블록을 포함하는 모델에서 코드를 생성할 수 있습니다. 기본적으로, 생성된 코드에는 활성 Variant만 포함되어 있습니다. 또는 Embedded Coder™를 사용할 경우 모든 Variant에 대해 C 전처리기 조건문(#if, #elif, #endif)으로 보호되는 코드를 생성할 수 있습니다.

전처리기 조건문을 생성하려는 경우에는 Variant Subsystem 블록의 자식 서브시스템 내에 배치할 수 있는 블록의 유형이 제한됩니다. 코드 생성 과정에서, Variant Subsystem 내의 각 Outport 블록의 입력에 하나의 Merge 블록이 배치되고 Variant Subsystem 내의 자식 서브시스템에 연결됩니다. 따라서 Merge 블록에 적용된 제한 사항이 Variant Subsystem 블록의 내용에도 적용됩니다. 제한 사항 검사는 코드를 생성할 때만 수행됩니다. 이에 더해, Variant Subsystem 블록의 자식 서브시스템은 Atomic Subsystem이어야 합니다. Atomic Subsystem은 서브시스템 파라미터 대화 상자의 아토믹 단위로 처리 파라미터를 선택하여 생성할 수 있습니다.

전처리기 조건문의 코드 생성은 다음과 같은 경우에 활성화됩니다.

  1. 구성 파라미터 대화 상자의 코드 생성 창에서 Embedded Coder 타깃을 선택한 경우.

  2. Variant Subsystem 블록 파라미터 대화 상자에서 Variant 조건을 재정의하고 다음 Variant를 사용합니다가 선택되지 않은 경우.

전처리기 조건문의 코드 생성이 활성화되었을 때는 생성된 코드가 C 전처리기 조건문으로 보호되는 Variant Subsystem 블록의 모든 자식 서브시스템을 포함합니다. 이 경우 활성 Variant의 선택은 생성된 코드의 컴파일 시점까지 지연됩니다. C 매크로로 인코딩된 하나의 Variant 객체만 true(즉, 활성 상태)로 평가되어야 합니다.

또한, 위의 VSS_MODEVSSE_MODE와 같은 Variant 제어 변수는 생성된 코드에서 Variant 제어 변수에 대한 #define의 관리 방식을 지정하는 Simulink.Parameter 객체여야 합니다. sldemo_variant_subsystems의 경우 기본 작업 공간에서 VSS_MODE double형을 지울 수 있습니다. Model Explorer -> Simulink Root -> Base Workspace를 사용하여 이름이 VSS_MODE인 새 Simulink.Parameter를 추가하십시오. 파라미터 1 또는 2로 지정하고, 데이터형int32로 지정하고, 스토리지 클래스ImportedDefine으로 지정하고, 사용자 지정 특성 헤더 파일sldemo_variant_subsystems_vdef.h로 지정하십시오. 이렇게 하면 현재 작업 디렉터리에서 다음과 같은 헤더를 만들 수 있습니다.

/* File: sldemo_variant_subsystems_vdef.h */
#ifndef SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define VSS_MODE 1
#endif

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

참고 항목

| |

관련 항목

외부 웹 사이트