Simulink 서브시스템 의미 체계
이 예제 세트는 다양한 Simulink® 서브시스템 유형과 이러한 서브시스템을 시뮬레이션할 때 사용되는 의미 체계를 보여줍니다. 각 예제는 모델과 모델 실행 방법의 세부 사항에 대한 설명을 제공합니다.
서브시스템 유형에 대한 예제가 제공됩니다.
가상 서브시스템 및 비가상 서브시스템
Function-Call Subsystem
Triggered Subsystem
Enabled Subsystem
Enabled and Triggered Subsystem
If Action Subsystem 및 Switch Case Action Subsystem
While Iterator Subsystem
For Each Subsystem
For Iterator Subsystem
모델을 엽니다.
open('SimulinkSubsystemSemantics.prj'); open_system('sl_subsys_semantics');
Virtual and Nonvirtual Subsystems Overview
Simulink에는 두 가지 클래스의 서브시스템이 있습니다.
가상 서브시스템은 모델에 그래픽 계층 구조를 제공합니다. 가상 서브시스템은 모델 실행에 영향을 미치지 않습니다. 모델 실행 중에 Simulink 엔진은 모든 가상 서브시스템을 평탄화합니다.
비가상 서브시스템은 모델에 실행과 그래픽 계층 구조를 제공합니다. 비가상 서브시스템은 아토믹 실행이라고 하는 단일 단위로 실행됩니다. 모든 비가상 서브시스템은 Simulink 캔버스에서 굵은 테두리로 표시됩니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/Virtual and nonvirtual subsystem overview');
비가상 서브시스템을 생성하려면 Subsystem 블록을 마우스 오른쪽 버튼으로 클릭하고 블록 파라미터 (Subsystem)를 선택합니다. 블록 파라미터 대화 상자에서 아토믹 단위로 처리를 선택하고 적용을 클릭합니다.
가상 서브시스템의 경우 단순한 실행 목록이 생성되지만, 비가상 서브시스템에는 실행 계층 구조가 포함됩니다. 실행 순서를 표시하려면 Simulink 편집기의 디버그 탭에서 정보 오버레이를 선택하고 실행 순서를 클릭하십시오.
Simulink 캔버스에 표시되는 실행 순서 기준 블록 목록에는 실행 순서가 표시됩니다.
실행 순서 기준 블록 목록은 비가상 서브시스템 Subsystem2
가 단일 단위로 실행됨을 보여줍니다.
비가상 서브시스템에서는 실행 계층 구조 내에 대수 루프가 생성됩니다. 다이어그램을 업데이트하면 대수 루프에 대한 경고가 표시됩니다.
set_param(gcs,'SimulationCommand','Update')
Warning: Model 'sl_subsys_overview' contains 1 algebraic loops.
Function-Call Subsystem
Function-Call Subsystem 블록에는 제어 포트가 함수 호출 이벤트를 수신할 때마다 실행되는 조건부 실행 서브시스템이 포함되어 있습니다. Function-Call Subsystem은 Simulink 블록을 사용하여 호출 가능한 함수를 구현합니다. Stateflow® Chart (Stateflow), Function-Call Generator 블록, MATLAB Function 블록, S-Function 블록 또는 Hit Crossing 블록은 함수 호출 이벤트를 제공할 수 있습니다.
자세한 내용은 Function-Call Subsystem 항목을 참조하십시오.
이 예제에서는 Function-Call Subsystem의 유효한 사용과 유효하지 않은 사용을 보여줍니다.
close_system('sl_subsys_overview',0) open_system('s_Function_call_subsystems')
중첩 함수 호출
이 모델에서 Chart는 함수 [d1,d2]=f()
를 실행하는 함수 호출 개시자입니다. 함수 f
는 함수 g
를 실행합니다. f
와 g
를 호출한 후 Chart는 f
와 g
로 계산된 값 d1
과 d2
를 사용합니다.
open_system('sl_subsys_fcncall1')
close_system('sl_subsys_fcncall1')
데이터 공유와 함께 중첩 함수 호출
Chart 블록이 [d1,d2]=f()
함수를 실행하면 f
가 g
를 실행합니다. f
를 호출한 후 Chart는 f
와 g
로 계산된 값 d1
과 d2
를 사용합니다. 함수 f
와 g
는 신호 s
를 통해 데이터를 공유합니다 (f/Out2에서 g/In1으로 전달). Simulink에서는 신호 s
를 데이터저장소처럼 취급합니다.
open_system ('sl_subsys_fcncall2')
일반적으로 Function-Call Subsystem에 대한 입력은 신호가 공통 함수 호출 개시자로 실행되는 블록에서 나오는 경우를 제외하고 함수 호출 개시자 (Chart)보다 먼저 실행되어야 합니다. 이 예제에서 f()
는 g()
의 함수 호출 개시자입니다. 그러나 Chart가 f()
의 함수 호출 개시자이기 때문에 Chart가 f()
와 g()
모두의 공통 함수 호출 개시자가 됩니다.
그러한 면에서 아래의 신호 s
는 f()
와 g()
가 Chart에서 정의된 주어진 순서대로 읽고 쓰는 데이터저장소로 간주될 수 있습니다.
close_system('sl_subsys_fcncall2')
공통 개시자를 갖는 두 Function-Call Subsystem 간의 데이터 공유
이 모델에서 d1
과 d2
는 각각 g()
와 f()
를 사용하여 계산됩니다. 차트는 d1
과 d2
를 입력으로 사용하고 g()
와 f()
를 호출합니다. 함수 f
와 g
는 신호 s
를 통해 데이터를 공유합니다. 즉, (f/Out1)
은 (g/In1)
로 전달됩니다. 모델은 신호 s
를 데이터 저장소처럼 취급합니다.
open_system ('sl_subsys_fcncall3')
일반적으로 Function-Call Subsystem에 대한 입력은 신호가 공통 함수 호출 개시자로 실행되는 블록에서 나오는 경우를 제외하고 함수 호출 개시자 (Chart)보다 먼저 실행되어야 합니다. 이 예제에서 Chart는 f()
와 g()
의 공통 함수 호출 개시자입니다. 따라서 신호 s
는 데이터 저장소로 간주될 수 있습니다.
close_system('sl_subsys_fcncall3')
데이터 공유를 사용한 함수 호출 개시자를 포함하는 Enabled Subsystem
이 Enabled Subsystem에는 함수 f()
와 g()
를 호출하는 Stateflow 차트가 포함됩니다. 모델 sl_subsys_fcncall4
내의 Enabled Subsystem은 f()
와 g()
의 공통 함수 호출 개시자이므로 소프트웨어는 신호 s
를 데이터저장소로 취급합니다.
open_system ('sl_subsys_fcncall4')
close_system('sl_subsys_fcncall4')
Merge 블록이 있는 Function-Call Subsystem
이 모델에는 2개의 함수 호출을 실행하는 차트가 포함됩니다. 이 모델은 Merge 블록을 사용하여 여러 신호를 하나의 메모리 위치로 매핑합니다. 신호 f/d1_out
과 g/d1_out
은 하나의 메모리 위치로 병합되어 Chart에 d1
로 전달됩니다. 신호 f/k_out
과 g/k_out
은 하나의 메모리 위치로 병합되어 f/k_in
으로 다시 전달됩니다. 신호를 하나의 메모리 위치로 병합하고 Chart에 다시 전달하면 Chart에서 값 계산 방법에 대한 복잡한 의사 결정 작업을 수행할 수 있습니다.
open_system ('sl_subsys_fcncall5')
close_system('sl_subsys_fcncall5')
Function-Call Subsystem의 여러 개시자
이 Function-Call Subsystem은 2개의 다른 함수 호출 개시자 Chart1
과 Chart2
로 호출됩니다. Chart1/out1
과 Chart2/d1
간 데이터 연결은 Chart1
이 Chart2
보다 먼저 실행되도록 보장합니다. 여러 개의 호출자가 있는 Function-Call Subsystem을 만들 때는 주의해야 합니다.
예를 들어, Chart1
과 Chart2
간 데이터 연결을 제거하는 경우 Chart1
과 Chart2
에 우선 순위를 추가하여 이 블록들에 대한 상대적인 실행 순서를 지정해야 합니다. 그렇게 하지 않으면 실행 순서가 모호해집니다.
하지만 이 상황에서 오류는 표시되지 않으며 그 이유는 특정 경우에는 이 상황이 유효할 수 있기 때문입니다. 예를 들어, f()
에서 모든 상태를 제거하고 Chart1/out1
을 Chart2/d1
에 연결하는 선을 삭제하면 Chart1
과 Chart2
의 실행 순서는 상관없습니다.
open_system ('sl_subsys_fcncall6')
close_system('sl_subsys_fcncall6')
재설정 동작을 지정하는 Function-Call Subsystem이 포함된 Enabled Subsystem
이 Enabled Subsystem에는 2개의 Function-Call Subsystem이 있습니다. 왼쪽 Function-Call Subsystem은 활성화된 경우 상태 값을 유지하고 비활성화된 경우 출력값을 유지하도록 구성됩니다. 오른쪽 Function-Call Subsystem은 활성화된 경우 상태 값을 재설정하고 비활성화된 경우 출력값을 재설정하도록 구성됩니다.
open_system ('sl_subsys_fcncall7')
close_system('sl_subsys_fcncall7')
Function-Call Subsystem이 주기적 실행을 지정함
이 Stateflow 차트는 모델에서 Function-Call Subsystem의 실행 순서를 스케줄링합니다. 그러나 Function-Call Subsystem들은 매 시간 스텝마다 정확히 한 번 실행됩니다. 함수 호출은 조건부 실행을 지정하지 않고, 대신 서브시스템에 대한 상대적인 실행 순서를 제어합니다. 이 설정은 데이터저장소에서 읽고 쓰는 올바른 순서를 보장하기 위해 데이터저장소를 사용하여 서브시스템 간에 데이터를 전송할 때 유용할 수 있습니다. Function-Call Subsystem은 무조건 실행되도록 설계되었으므로 서브시스템에 있는 Trigger 블록의 샘플 시간 파라미터를 사용하여 주기적인 샘플 시간을 갖도록 지정해야 합니다. 그 결과로, Simulink 엔진은 시뮬레이션 중에 주기적인 Function-Call Subsystem이 시간 스텝당 정확히 한 번 실행되는지 검증합니다.
또한 코드가 생성될 때 Function-Call Subsystem 내부의 경과 시간은 Function-Call Subsystem의 기본 설정처럼 타이머에서 관리 및 계산이 되지 않고 리터럴 값(지정된 상수 샘플 시간)으로 표현됩니다. 따라서 생성된 코드가 훨씬 더 효율적입니다.
서브시스템의 샘플 시간을 보려면 Simulink 편집기의 디버그 탭에서 정보 오버레이를 선택하고 색을 클릭하십시오.
open_system ('sl_subsys_fcncall8')
Function-Call Subsystem의 샘플 시간 색은 녹청색이 아닌 빨간색으로 표시되므로, 이는 트리거된 샘플 시간이 아닌 주기적인 샘플 시간임을 나타냅니다. 함수 호출 연결이 서로 바뀌면 서브시스템의 Data Store Read 블록과 Data Store Write 블록 간에 상호 작용이 바뀌어 결과가 하나의 시간 스텝만큼 지연됩니다.
close_system('sl_subsys_fcncall8')
함수 호출 개시자가 활성 및 비활성 이벤트를 실행함
이 Stateflow 차트는 이벤트 activate
가 상태 ON
에 바인딩되도록 지정합니다. 상태 ON
이 활성으로 천이되면 해당 이벤트로 인해 시작된 Function-Call Subsystem Integrate
가 활성화됩니다. 또한 상태가 비활성으로 천이되면 해당 이벤트로 시작된 Function-Call Subsystem이 비활성화됩니다. Function-Call Subsystem이 활성화 시 상태를 재설정하고 비활성화 시 출력을 재설정하도록 구성된 경우 이러한 작업이 실행됩니다. 이 예제에서 서브시스템은 활성화 시 상태를 재설정하고 비활성화 시 출력을 재설정합니다.
open_system ('sl_subsys_fcncall9')
close_system('sl_subsys_fcncall9')
Function-Call Subsystem의 출력 해석
1) 함수 호출의 반환 값은 Function-Call Subsystem의 출력에서 해당 함수 호출 개시자로 가는 연결입니다. 예를 들어, 아래의 Stateflow 차트 Chart1
은 함수 d1=f1()
을 실행하는 함수 호출 개시자입니다. f1
을 호출한 후 차트는 같은 시간 스텝 내에서 f1
에서 계산된 반환 값 d1
을 사용합니다.
2) 두 번째 예제에서는 Unit Delay 블록의 실행이 Chart2
에 의해 트리거되지 않습니다. 따라서 Chart2
를 실행하는 동안 신호 d2
는 Unit Delay가 호출된 이전 시간 스텝 때의 값을 유지합니다.
open_system ('sl_subsys_fcncall10')
close_system('sl_subsys_fcncall10')
함수 호출 신호의 분기 생성
이 Stateflow 차트는 입력 신호 u
가 1일 때의 시간 구간 동안 주기가 1인 주기적 함수 호출 신호를 개시합니다. 모든 함수 호출에 대해 서브시스템은 f
, h
, g
순서로 실행됩니다. 이 실행 순서는 Function-Call Split 블록에 지정된 순서에 따른 것이며, 점으로 표시된 포트가 가장 먼저 실행됩니다.
이 모델을 R2015b 이전 릴리스로 내보내면 신호 b
가 데이터 종속성 위반으로 처리되기 때문에 오류가 발생합니다.
open_system ('sl_subsys_fcncall11')
이 Stateflow 차트는 입력 신호 u
가 1일 때의 시간 구간 동안 주기가 1인 주기적 함수 호출 신호를 개시합니다.
각 함수 호출마다 서브시스템 f1
이 서브시스템 g1
보다 먼저 실행됩니다. 이 실행 순서는 Function-Call Split 블록에 지정된 순서에 따른 것이며, 점으로 표시된 포트가 가장 먼저 실행됩니다.
이 모델을 R2015b 이전 릴리스로 내보내면 오류가 발생합니다. 서브시스템 f1
의 Inport 블록에 대해 Function-Call Subsystem 출력의 피드백 신호에 대한 입력 래치 파라미터 선택을 해제하면 신호 b
가 데이터 종속성 위반으로 처리되기 때문입니다.
close_system('sl_subsys_fcncall11')
부적절한 Function-Call Subsystem
이 목록에는 부적절한 Function-Call Subsystem이 나와 있습니다. 고치는 방법은 해당 모델 서브시스템에 설명되어 있습니다.
open_system('s_Function_call_subsystems')
모호한 실행 순서 오류
함수 호출 개시자로 구동되는 블록과 관련된 데이터 종속성 위반
두 Function-Call Subsystem 간의 블록과 관련된 데이터 종속성 위반
수정된 함수 호출 출력의 피드백으로 인한 모호한 실행 순서 오류
두 서브시스템 간 수정된 함수 호출 출력의 피드백으로 인한 모호한 실행 순서 오류
Merge 블록과 Stateflow 차트와 관련된 데이터 종속성 위반
Atomic Subsystem과 Gain 블록과 관련된 데이터 종속성 위반
Function-Call Subsystem 사이클로 인한 데이터 종속성 위반
간접 데이터 종속성 위반
중첩된 데이터 종속성 위반
Function-Call Subsystem이 주기적 실행을 잘못 지정함
Function-Call Subsystem 입력이 호출된 컨텍스트 내에서 계산됨
분기된 함수 호출 신호와 Function-Call Subsystem을 연결하는 블록과 관련된 데이터 종속성 위반
close_system('s_Function_call_subsystems',0)
If Action Subsystem 및 Switch Case Action Subsystem
If Action Subsystem은 논리 조건이 true일 때 각 시간 스텝에서 실행됩니다. Switch Case Action Subsystem은 신호가 지정된 여러 값 중 하나일 때 실행됩니다.
자세한 내용은 If Action Subsystem 및 Switch Case Action Subsystem 항목을 참조하십시오.
다음 예제에서는 If Action Subsystem과 Switch Case Action Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics') open_system('sl_subsys_semantics/If Action and Switch Case Action subsystems')
close_system('sl_subsys_semantics/If Action and Switch Case Action subsystems')
Triggered Subsystem
Triggered Subsystem을 사용하면 소프트웨어 트리거, 하드웨어 트리거 또는 이 두 개를 함께 구현할 수 있습니다. Simulink 라이브러리 브라우저에서 Triggered Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 Trigger 블록을 배치하여 이 서브시스템을 만들 수 있습니다.
자세한 내용은 Triggered Subsystem 항목을 참조하십시오.
이 예제에서는 Triggered Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/Triggered subsystems')
소프트웨어 트리거는 다음 코드에 정의되어 있습니다.
if (trigger_signal_edge_detected) {
out(t) = f(in(t));
}
하드웨어 트리거는 다음 코드에 정의되어 있습니다.
if (trigger_signal_edge_detected) {
out(t) = f(in(t-h)); // h == last step size
}
Triggered Subsystem의 각 입력 포트는 입력을 래치해야 하는지의 여부를 설정합니다. 래치된 입력은 해당 입력 포트에 대한 하드웨어 트리거 의미 체계를 제공합니다. 래치된 입력 포트는 기호 <L>
로 표시됩니다.
close_system('sl_subsys_semantics/Triggered subsystems')
Enabled Subsystem
Enabled Subsystem을 사용하면 활성화 신호가 0보다 큰 경우에만 실행되는 조건부 실행 서브시스템을 만들 수 있습니다. Enabled Subsystem을 사용하면 출력 신호의 초기값과 서브시스템이 활성화될 때마다 상태를 재설정할지의 여부를 제어할 수 있습니다.
Simulink 라이브러리 브라우저에서 Enabled Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 Enable 블록을 배치하여 이 서브시스템을 만들 수 있습니다.
자세한 내용은 Enabled Subsystem 항목을 참조하십시오.
다음 예제에서는 Enabled Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/Enabled subsystems')
close_system('sl_subsys_semantics/Enabled subsystems')
Enabled and Triggered Subsystem
아래의 서브시스템은 상태와 아웃포트 재설정 옵션을 보여줍니다. Enabled and Triggered Subsystem은 활성화 조건과 트리거 조건 둘다 발생했을 때 실행됩니다.
Simulink 라이브러리 브라우저에서 Enabled and Triggered Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 Enable 블록과 Trigger 블록을 배치하여 이 서브시스템을 만들 수 있습니다.
자세한 내용은 Enabled and Triggered Subsystem 항목을 참조하십시오.
이 예제에서는 Enabled and Triggered Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics') open_system('sl_subsys_enabtrig1.slx')
close_system('sl_subsys_enabtrig1.slx')
Resettable Subsystem
Resettable Subsystem을 사용하면 재설정 신호를 기반으로 서브시스템 내 블록 상태를 재설정할 수 있습니다. Simulink 라이브러리 브라우저에서 Resettable Subsystem 블록을 추가할 수 있습니다.
자세한 내용은 Resettable Subsystem 항목을 참조하십시오.
이 예제에서는 Resettable Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics') open_system('sl_subsys_semantics/Resettable subsystems')
close_system('sl_subsys_semantics/Resettable subsystems')
For Each Subsystem
For Each Subsystem은 입력 신호의 개별 요소나 부분배열 또는 마스크 파라미터 배열에 대한 실행을 시뮬레이션 시간 스텝 동안 반복합니다. Simulink 라이브러리 브라우저에서 For Each Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 For Each 블록을 배치하여 이 블록을 만들 수 있습니다. For Each Subsystem은 입력 신호의 각 개별 요소 또는 부분배열에 알고리즘을 반복해서 적용합니다. For Each Subsystem은 서브시스템이 처리하는 각 요소 또는 부분배열에 대해 블록 상태를 별도로 유지합니다.
자세한 내용은 For Each Subsystem 항목을 참조하십시오.
이 예제에서는 For Each Subsystem의 사용 방법을 보여줍니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/For Each subsystems')
close_system('sl_subsys_semantics/For Each subsystems')
While Iterator Subsystem
While Iterator Subsystem은 시뮬레이션 시간 스텝 동안 논리 조건이 true
이면 실행을 반복합니다. Simulink 라이브러리 브라우저에서 While Iterator Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 While Iterator 블록을 배치하여 이 서브시스템을 만들 수 있습니다. While Iterator Subsystem은 각 모델 시간 스텝에서 여러 번 반복을 실행합니다. 반복 횟수는 While Iterator 조건에 의해 결정됩니다.
While Iterator Subsystem은 주어진 시간 스텝에서 임의의 반복 횟수만큼 실행될 수 있다는 점에서 Function-Call Subsystem과 유사합니다.
While Iterator Subsystem은 Stateflow 차트와 같은 별개의 개시자가 포함되어 있지 않다는 점에서 Function-Call Subsystem과 다릅니다. 또한 While Iterator Subsystem은 While Iterator 블록에서 선택적으로 생성된 현재 반복 횟수에 액세스할 수 있습니다.
자세한 내용은 While Iterator Subsystem 항목을 참조하십시오.
이 예제에서는 While Iterator Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/While Iterator subsystems')
close_system('sl_subsys_semantics/While Iterator subsystems')
For Iterator Subsystem
For Iterator Subsystem은 시뮬레이션 시간 스텝 동안 지정된 반복 횟수만큼 실행을 반복합니다. Simulink 라이브러리 브라우저에서 For Iterator Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 For Iterator 블록을 배치하여 이 서브시스템을 만들 수 있습니다. For Iterator Subsystem은 각 모델 시간 스텝에서 고정된 횟수만큼 반복을 실행합니다. 반복 횟수는 For Subsystem에 대한 외부 입력이거나 For Iterator 블록에서 내부적으로 지정될 수 있습니다.
For Iterator Subsystem은 지정된 시간 스텝 동안의 반복 횟수가 고정되어 있다는 점을 제외하면 While Iterator Subsystem과 매우 비슷합니다.
자세한 내용은 For Iterator Subsystem 항목을 참조하십시오.
다음 예제에서는 For Iterator Subsystem을 사용하는 방법을 보여줍니다.
open_system('sl_subsys_semantics'); open_system('sl_subsys_semantics/For Iterator subsystems')
close_system('sl_subsys_semantics/For Iterator subsystems')