Variant Subsystem을 사용하여 개별 계층 구조에 변형 구현
이 예제에서는 Simulink®에서 Variant Subsystem 블록을 구성하고 사용하는 방법을 보여줍니다. Variant Subsystem 블록은 계층 Variant 블록입니다. 이 블록을 사용하면 시스템 컴포넌트의 여러 구현이나 변형을 모델의 개별 계층 구조에 캡슐화할 수 있습니다. Variant Subsystem 블록 내에 표시되는 컴포넌트의 각 변형을 선택지라고 합니다. 모델 실행 동안 Variant Subsystem 블록 내의 하나의 Variant 선택지만 활성화될 수 있습니다. Subsystem 블록, Model 블록 또는 Create and Use Referenced Subsystems in Models 블록의 조합을 사용하여 Variant Subsystem 블록 내의 선택지를 표현할 수 있습니다.
블록 및 해당 파라미터에 대한 자세한 내용은 Variant Subsystem, Variant Model, Variant Assembly Subsystem 항목을 참조하십시오.
모델 살펴보기
모델
slexVariantSubsystems
를 엽니다. Variant Subsystem 블록Controller
에는 시스템 내 제어기 컴포넌트의 서로 다른 두 구현이 캡슐화되어 있습니다.
Variant Subsystem
Controller
를 엽니다. 두 개의 Subsystem 블록은Controller
컴포넌트의 두 가지 가능한 변형을 표현합니다. 첫 번째 선택지는Linear Controller
이고 두 번째 선택지는Nonlinear Controller
입니다. Variant Subsystem 블록 내에 있는 블록 간에는 둘을 연결하는 선이 그려져 있지 않은 것을 볼 수 있습니다. Simulink는 시뮬레이션 중에 자동으로 활성 Variant를 Variant Subsystem 블록의 Inport 블록과 Outport 블록에 연결하고 비활성 포트를 비활성화합니다.
Controller
블록의 블록 파라미터 대화 상자를 엽니다. Variant 선택지 테이블에 Variant Subsystem의 선택지가 나열되어 있습니다.Controller
블록에 포함된 각 Variant 선택지는 Variant 제어와 연결되어 있습니다. 여기서 Variant 제어는Simulink.VariantExpression
객체VSS_LINEAR_CONTROLLER
및VSS_NONLINEAR_CONTROLLER
입니다. Simulink는 모든 선택지의 Variant 제어를 평가하여 Variant Subsystem의 활성 선택지를 결정합니다. Variant 제어가true
로 평가되면 Simulink는 이 Variant 제어에 대응하는 Variant 선택지를 활성화하고 비활성 선택지를 비활성화합니다. 따라서 각 Variant 선택지마다 Variant 제어가 연결되어 있지만, 하나의 Variant 제어만true
로 평가되어야 합니다. 이렇게 하면 모델 구조를 수정하지 않고도 Variant Subsystem 내의 활성 선택지와 비활성 선택지 사이를 전환할 수 있습니다.
Variant Subsystem 블록 구성하기
이 모델에서 Controller
Variant Subsystem은 두 개의 서브시스템 Linear Controller
와 Nonlinear Controller
가 Variant 선택지로 사전 구성되어 있습니다. 이 모델에 Variant Subsystem 블록을 더 추가하고 블록을 구성하려면 다음 단계를 수행하십시오.
Simulink 라이브러리 브라우저를 사용하거나 빠른 삽입 메뉴에서 블록 이름을 입력하여 모델에 Variant Subsystem 블록을 추가합니다. 이 블록은 Variant 선택지의 컨테이너로 사용됩니다.
Variant Subsystem 블록을 열고 Variant 선택지를 보려면 블록을 더블 클릭한 다음 Simulink® 모델 캔버스 상단의 도구 모음에 있는 "부모로" 버튼을 클릭합니다. 기본적으로 Variant Subsystem 블록은 Variant 선택지를 표현하는 두 개의 Subsystem 블록으로 사전 구성된 템플릿입니다.
Variant Subsystem 블록 내부에, Variant Subsystem 블록으로 들어가는 입력에 맞추어 상응하는 Inport 블록을 추가하고 이 블록에서 나오는 출력에 맞추어 Outport 블록을 추가합니다.
Variant 선택지 블록의 이름을 지정합니다.
참고:
Variant Subsystem 블록 내에는 Inport 블록, Outport 블록, Subsystem 블록, Model 블록, Subsystem Reference 블록만 추가할 수 있습니다. 제어 신호는 데이터 포트를 통해 전달할 수 있습니다.
Variant 선택지의 입력 포트와 출력 포트의 수가 다른 경우 여러 다른 인터페이스를 갖는 Variant 선택지 표현하기 항목을 참조하십시오.
Variant Subsystem 블록을 모델에 추가하면 기본적으로 Variant 활성화 시점 파라미터가
update diagram
으로 설정되고 Variant Subsystem 외부에 조건 전파 파라미터가off
로 설정됩니다.
Variant Subsystem의 Variant 선택지 유형
Subsystem, Simulink 모델, Subsystem Reference를 Variant Subsystem에 Variant 선택지로 추가할 수 있습니다.
Subsystem 블록을 Variant 선택지로 포함하기
Variant Subsystem 블록의 블록 파라미터 대화 상자를 사용하거나 Variant Subsystem 내에서 Simulink 편집기의 작업 모음을 사용하여 Subsystem 블록을 Variant 선택지로 추가할 수 있습니다. Simulink는 포함하는 Variant Subsystem 블록과 동일한 수의 입력 포트와 출력 포트를 갖는 빈 Subsystem 블록을 생성합니다.
a. 블록 파라미터 대화 상자 사용
Variant Subsystem 블록의 블록 파라미터 대화 상자를 엽니다. Variant Subsystem 블록의 배지를 마우스 오른쪽 버튼으로 클릭하고 블록 파라미터 (Subsystem)를 선택합니다.
블록 파라미터 대화 상자의 Variant choices (table of variant systems)에 사용자가 추가한 Variant 선택지가 표시됩니다. 테이블 왼쪽에 있는 버튼을 사용하여 테이블에 요소를 추가하거나 수정할 수 있습니다.
Subsystem 블록을 Variant Subsystem에 새 Variant 선택지로 포함하려면, Variant 선택지 테이블 왼쪽에 있는 "새 서브시스템 Variant 선택지를 만들고 추가" 버튼을 클릭합니다.
새 Subsystem 블록을 열고 Variant 선택지를 표현하는 모델 요소를 추가합니다.
b. 작업 모음 사용
Variant Subsystem 블록을 더블 클릭한 다음 Simulink 모델 캔버스 상단의 도구 모음에 있는 "부모로" 버튼을 클릭합니다.
Variant Subsystem 블록 내의 빈 영역 주위로 선택 상자를 끕니다. 작업 모음에는 블록의 Subsystem 선택지 유형에 따른 서브시스템 삽입 옵션이 표시됩니다.
작업 모음에서 Variant Subsystem 선택지 옵션을 선택하여 Subsystem 블록을 추가합니다.
새 Subsystem 블록을 열고 Variant 선택지를 표현하는 모델 요소를 추가합니다.
참고:
Variant 선택지의 입력 포트와 출력 포트의 수가 다른 경우 여러 다른 인터페이스를 갖는 Variant 선택지 표현하기 항목을 참조하십시오.
Variant Subsystem 블록 내에서 Variant 선택지로 Enabled Subsystem, Triggered Subsystem, Reset Subsystem, Function-Call Subsystem과 같은 조건부 실행 서브시스템을 사용할 수 있습니다. 자세한 내용은 Propagate Variant Conditions to Control Execution of Conditional Subsystems 항목을 참조하십시오.
Variant의 프로토타입을 만들면 Variant Subsystem 블록 내에 입력이나 출력이 없는 빈 Subsystem 블록을 만들 수 있습니다. 빈 서브시스템은 Variant 선택지를 완전히 모델링하지 않고도 해당 서브시스템이 비활성 상태인 상황을 새로 만듭니다.
Simulink 모델을 Variant 선택지로 포함하기
Simulink 모델(Model 블록)을 Variant Subsystem에 새 Variant 선택지로 포함하려면, Variant 선택지 테이블 왼쪽에 있는 "새 모델 Variant 선택지를 만들고 추가" 버튼을 클릭합니다. 그러면 Simulink는 Variant Subsystem 블록에 연결이 맺어지지 않은 Model 블록을 만듭니다.
연결이 맺어지지 않은 Model 블록을 더블 클릭합니다. 모델 이름 상자에 모델 Variant 선택지로 사용할 모델의 이름을 입력하고 확인을 클릭합니다.
참고: 참조된 모델은 이 모델을 포함하는 Variant Subsystem 블록과 동일한 개수의 입력 포트와 출력 포트를 가져야 합니다. 모델의 입력 포트와 출력 포트의 수가 다른 경우 여러 다른 인터페이스를 갖는 Variant 선택지 표현하기 항목을 참조하십시오.
Subsystem Reference를 Variant 선택지로 포함하기
Subsystem Reference를 Variant Subsystem에 새 Variant 선택지로 포함하려면, Simulink 라이브러리 브라우저 또는 빠른 삽입 메뉴를 사용하여 Subsystem Reference 블록을 추가합니다. 그러면 Simulink는 Variant Subsystem 블록에 빈 Subsystem Reference 블록을 만듭니다.
Subsystem Reference 블록을 더블 클릭합니다. 블록 파라미터 대화 상자에서 서브시스템 블록 다이어그램 파일을 지정하고 확인을 클릭합니다.
Variant 제어 모드 선택하기
모델의 각 Variant 선택지를 선택지의 활성 또는 비활성 여부를 결정하는 Variant 제어와 연결해야 합니다. Variant control mode 블록 파라미터를 사용하여 Variant 제어를 지정할 모드를 선택할 수 있습니다. 이 예제에서 Controller
블록의 Variant 제어 모드 파라미터는 expression
으로 설정되어 있습니다. 이 모드에서는 선택지의 Variant 제어를 부울 조건 표현식, Simulink.VariantExpression
객체, 디폴트 Variant 선택지 또는 빈 선택지로 지정할 수 있습니다. Variant 제어 모드의 다양한 유형에 대한 자세한 내용은 Variant Control Modes in Variant Blocks 항목을 참조하십시오.
Variant 제어를 사용하여 Variant 선택지를 활성화하고 선택지 간에 전환하기
이 모델에서는 각 선택지의 Variant 제어가 두 개의 Simulink.VariantExpression
객체 VSS_LINEAR_CONTROLLER
와 VSS_NONLINEAR_CONTROLLER
를 사용하여 정의됩니다. 이 모델에서 사용하는 Simulink.VariantExpression
객체의 정의를 확인하려면 모델 설정 > 모델 속성 > PreLoadFcn 콜백을 클릭하십시오. 모델을 열면 PreLoadFcn
콜백이 실행되고 모델의 기본 작업 공간에 객체를 만듭니다.
Simulink.VariantExpression
객체를 사용하면 해당 표현식이 true
로 평가될 때 특정 Variant 선택지를 활성화하는 부울 조건 표현식을 캡슐화할 수 있습니다. 하나 이상의 Variant 제어 변수를 사용하여 조건 표현식을 빌드할 수 있으며 이 변수는 기본 작업 공간 또는 데이터 사전에서 MATLAB® 변수 또는 Simulink.Parameter
객체로 정의됩니다. 이 예제에서 일반 MATLAB 변수인 VSS_MODE
는 Simulink.VariantExpression
객체의 조건 표현식을 빌드하는 데 사용됩니다.
Simulink.VariantExpression
객체인 VSS_LINEAR_CONTROLLER
와 VSS_NONLINEAR_CONTROLLER
를 Controller
블록의 Variant 선택지와 연결하려면:
블록 파라미터 대화 상자에서, 각 선택지의 Variant 제어 표현식 열에 객체의 이름을 입력합니다.
조건 열에
Simulink.VariantExpression
객체가 표현하는 부울 조건이 자동으로 표시됩니다.
VSS_MODE
가 2
로 설정되어 있으므로 NonLinear Controller
가 기본적으로 활성화됩니다. 활성 선택지를 Linear Controller
로 전환하려면 기본 작업 공간에서 VSS_MODE = 1
로 설정하고 모델을 시뮬레이션하십시오.
디폴트 Variant 선택지 지정: Variant 제어 모드가 expression
으로 설정되면 모델의 디폴트 값으로 최대 하나의 Variant 선택지를 지정할 수 있습니다. Simulink는 시뮬레이션 중에 Variant 제어를 평가하고 하나의 Variant 선택지만 활성 상태임을 확인합니다. True로 평가되는 Variant 제어가 없으면 Simulink는 시뮬레이션과 코드 생성에 default
Variant를 사용합니다. Variant 선택지를 디폴트 값으로 설정하려면 해당 선택지의 Variant 제어 표현식 열에서 (default)
키워드를 선택하십시오.
빈 Variant 선택지 지정: 빈 Variant 선택지를 추가했다면 선택지에 Variant 활성화 조건을 지정하거나 기존 Variant 조건 앞에 %
기호를 추가하여 조건을 주석으로 처리할 수 있습니다. 시뮬레이션 중에 이 Variant 선택지가 활성 상태이면 Simulink는 빈 Variant 선택지를 무시합니다. 그러나 Simulink는 빈 Variant 선택지 내에서 블록 콜백을 계속 실행합니다.
Variant 제어를 정의하는 다른 방법에 관한 자세한 내용은 Use Variant Control Variables in Variant Blocks 항목을 참조하십시오.
Variant 활성화 시점 선택하기
Variant Subsystem 블록에 지정하는 Variant 활성화 시점에 따라 Simulink가 블록에 활성 선택지를 설정하는 시점이 결정됩니다. 또한 이 파라미터는 활성 선택지와 비활성 선택지가 시뮬레이션과 코드 생성 워크플로에 참여하는 방법을 결정합니다.
Controller
블록의 경우 이 파라미터는 update diagram
으로 설정됩니다. 따라서 Simulink는 모델 컴파일 단계가 시작할 때 활성 선택지를 설정하고 비활성 선택지는 제거합니다. 모델을 실행하면 일관성을 위해 활성 선택지만 분석됩니다. 생성된 코드에는 활성 선택지만 포함됩니다. 다른 Variant 활성화 시점에 관한 자세한 내용은 Activate Variant During Different Stages of Simulation and Code Generation Workflow 항목을 참조하십시오.
여러 다른 인터페이스를 갖는 Variant 선택지 표현하기
이 예제에서 두 Variant 선택지 Linear Controller
와 NonLinear Controller
는 Controller
Variant Subsystem과 동일한 개수의 입력 포트와 출력 포트를 가집니다. Variant 선택지를 나타내는 블록은 부모 Variant Subsystem 블록의 입력 포트 및 출력 포트와 개수가 다른 입력 포트 및 출력 포트를 가질 수도 있습니다. Variant Subsystem 블록은 기본 블록의 활성화 상태에 따라 인터페이스를 조정할 수 있습니다. 이를 통해 비슷한 인터페이스를 갖지 않는 컴포넌트 변형을 모델링할 수 있습니다. 이 경우 Variant 선택지는 다음의 조건을 충족해야 합니다.
유연한 인터페이스 허용 파라미터는
'on'
으로 설정되어야 합니다.Variant 선택지에는 Variant Subsystem 컨테이너 블록과 동일한 세트의 인포트가 있거나 컨테이너 블록의 포트의 서브셋이어야 합니다.
Variant 선택지에는 Variant Subsystem 컨테이너 블록과 동일한 세트의 아웃포트가 있거나 컨테이너 블록의 포트의 서브셋이어야 합니다.
Variant Subsystem 컨테이너 블록에 제어 포트가 있는 경우 모든 Variant 선택지의 제어 포트 블록 유형은 Variant Subsystem 블록과 동일해야 합니다. 예를 들어 Enabled Subsystem 블록 및 Function-Call Subsystem 블록을 Variant Subsystem 블록 내에서 선택지로 사용할 수 없습니다. Variant Subsystem 블록의 제어 포트와 이에 대응되는 Variant 선택지의 제어 포트는 이름이 동일해야 합니다. 예를 들어 Variant Subsystem의 제어 포트 이름이
fcn
인 경우 이에 대응되는 모든 Variant 선택지의 제어 포트 이름도fcn
이어야 합니다.
예제는 Adaptive Interface for Variant Subsystems 항목을 참조하십시오.
모델을 시뮬레이션할 때 Variant Subsystem 또는 Variant Assembly Subsystem 블록에 누락되거나 사용하지 않는 포트가 있을 수 있습니다. 이 문제는 Variant Subsystem에 Variant 선택지 중 하나에 있는 포트가 없거나, 반대로 어떤 Variant 선택지에서도 사용하지 않는 포트가 있는 경우 발생할 수 있습니다. 이를 해결하려면
함수를 사용하여 누락된 포트를 추가하고 사용하지 않는 포트를 제거하여 Variant Subsystem 또는 Variant Assembly Subsystem 블록의 인터페이스를 자동으로 조정할 수 있습니다.Simulink.VariantUtils.updateVariantSubsystemPorts
Variant Subsystem에 활성 Variant 없는 제어 허용하기
Variant Subsystem 블록의 활성 Variant 없는 제어 허용 파라미터는 활성 Variant 선택지가 없어도 블록이 시뮬레이션을 허용할지 결정합니다. 이 옵션을 선택한 경우 활성 Variant 선택지가 없다면 Simulink는 Variant Subsystem에 활성 Variant 선택지가 없어도 모델을 시뮬레이션합니다. 이 옵션을 선택 해제한 경우 활성 Variant 선택지가 없으면 Simulink에서 오류가 발생합니다. 이 파라미터는 Variant Subsystem에 (default)
Variant 선택지가 없고 Variant 제어 모드를 expression
으로 설정한 경우에만 사용할 수 있습니다.
Variant Subsystem 외부에 Variant 조건 전파하기
시뮬레이션 도중 Simulink는 Variant 블록에서 연결된 블록으로 Variant 조건을 자동 전파하여 활성 상태로 남아 있는 모델 컴포넌트를 확인합니다. Variant Subsystem의 경우 선택지에 정의된 Variant 조건은 기본적으로 Variant Subsystem 블록 외부로 전파되지 않습니다. 이를 활성화하려면 Variant Subsystem 블록의 Variant Subsystem 외부에 조건 전파 파라미터를 설정하면 됩니다.
Variant Subsystem 외부에 조건 전파 파라미터를 선택하면 Simulink는 기본 블록의 Variant 조건을 Variant Subsystem 컨테이너 블록으로 전파하여 서브시스템이 인터페이스를 기본 블록의 상태로 조정할 수 있도록 합니다. 활성 선택지의 포트에 매핑된 포트는 활성 상태가 됩니다. 비활성 선택지의 포트에 매핑된 포트는 비활성 상태가 됩니다. 이 옵션을 선택하면 Variant Subsystem 외부의 컴포넌트가 Variant Subsystem 블록 내부에 있는 블록의 활성 상태와 비활성 상태를 알 수 있습니다. 자세한 내용은 Propagate Variant Conditions to Define Variant Regions Outside Variant Subsystems 항목을 참조하십시오.
Variant Subsystem 블록으로 변환하기
Simulink 편집기에서 다음 블록을 Variant Subsystem 블록으로 변환할 수 있습니다.
Subsystem 블록
Model 블록
조건부 실행 서브시스템
이렇게 하려면 블록을 마우스 오른쪽 버튼으로 클릭하고 상황별 메뉴에서 서브시스템 및 모델 참조 > 다음으로 변환 > Variant Subsystem을 클릭합니다.
Simulink.VariantUtils.convertToVariantSubsystem
메서드를 사용하여 프로그래밍 방식으로 이들 블록을 Variant Subsystem 블록으로 변환할 수도 있습니다.
Variant Subsystem에 대한 코드 생성하기
코드 생성에 대한 예제는 Generate Code for Variant Subsystem Blocks (Simulink Coder) 항목을 참조하십시오.
참고 항목
Working with Variant Choices | Propagate Variant Conditions to Control Execution of Conditional Subsystems
관련 항목
- Generate Code for Variant Subsystem Blocks (Simulink Coder)