Main Content

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

Subsystem Semantics Examples

모델을 엽니다.

open('SimulinkSubsystemSemantics.prj');
open_system('sl_subsys_semantics');

Virtual and Nonvirtual Subsystems Overview

Simulink에는 두 가지 클래스의 서브시스템이 있습니다.

  1. 가상 서브시스템은 모델에 그래픽 계층 구조를 제공합니다. 가상 서브시스템은 모델 실행에 영향을 미치지 않습니다. 모델 실행 중에 Simulink 엔진은 모든 가상 서브시스템을 평탄화합니다.

  2. 비가상 서브시스템은 모델에 실행과 그래픽 계층 구조를 제공합니다. 비가상 서브시스템은 아토믹 실행이라고 하는 단일 단위로 실행됩니다. 모든 비가상 서브시스템은 Simulink 캔버스에서 굵은 테두리로 표시됩니다.

Virtual and nonvirtual subsystems

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/Virtual and nonvirtual subsystem overview');  

비가상 서브시스템을 생성하려면 Subsystem 블록을 마우스 오른쪽 버튼으로 클릭하고 블록 파라미터 (Subsystem)를 선택합니다. 블록 파라미터 대화 상자에서 아토믹 단위로 처리를 선택하고 적용을 클릭합니다.

The block parameters dialog box for the Subsystem2 block

가상 서브시스템의 경우 단순한 실행 목록이 생성되지만, 비가상 서브시스템에는 실행 계층 구조가 포함됩니다. 실행 순서를 표시하려면 Simulink 편집기의 디버그 탭에서 정보 오버레이를 선택하고 실행 순서를 클릭하십시오.

Blocks in a virtual and a nonvirtual subsystem display numbers showing the execution order

Simulink 캔버스에 표시되는 실행 순서 기준 블록 목록에는 실행 순서가 표시됩니다.

The execution order block list

실행 순서 기준 블록 목록은 비가상 서브시스템 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 항목을 참조하십시오.

이 예제에서는 Function-Call Subsystem의 유효한 사용과 유효하지 않은 사용을 보여줍니다.

close_system('sl_subsys_overview',0)
open_system('s_Function_call_subsystems')

Function-Call Subsystem examples

중첩 함수 호출

이 모델에서 Chart는 함수 [d1,d2]=f()를 실행하는 함수 호출 개시자입니다. 함수 f는 함수 g를 실행합니다. fg를 호출한 후 Chart는 fg로 계산된 값 d1d2를 사용합니다.

open_system('sl_subsys_fcncall1')

Two function-call subsystems for a nested function-call event

close_system('sl_subsys_fcncall1')

데이터 공유와 함께 중첩 함수 호출

Chart 블록이 [d1,d2]=f() 함수를 실행하면 fg를 실행합니다. f를 호출한 후 Chart는 fg로 계산된 값 d1d2를 사용합니다. 함수 fg는 신호 s를 통해 데이터를 공유합니다 (f/Out2에서 g/In1으로 전달). Simulink에서는 신호 s를 데이터저장소처럼 취급합니다.

open_system ('sl_subsys_fcncall2')

Two function-call subsystems for nested function-call events with output from one subsystem being fed to another

일반적으로 Function-Call Subsystem에 대한 입력은 신호가 공통 함수 호출 개시자로 실행되는 블록에서 나오는 경우를 제외하고 함수 호출 개시자 (Chart)보다 먼저 실행되어야 합니다. 이 예제에서 f()g()의 함수 호출 개시자입니다. 그러나 Chart가 f()의 함수 호출 개시자이기 때문에 Chart가 f()g() 모두의 공통 함수 호출 개시자가 됩니다.

그러한 면에서 아래의 신호 sf()g()가 Chart에서 정의된 주어진 순서대로 읽고 쓰는 데이터저장소로 간주될 수 있습니다.

close_system('sl_subsys_fcncall2')

공통 개시자를 갖는 두 Function-Call Subsystem 간의 데이터 공유

이 모델에서 d1d2는 각각 g()f()를 사용하여 계산됩니다. 차트는 d1d2를 입력으로 사용하고 g()f()를 호출합니다. 함수 fg는 신호 s를 통해 데이터를 공유합니다. 즉, (f/Out1)(g/In1)로 전달됩니다. 모델은 신호 s를 데이터 저장소처럼 취급합니다.

open_system ('sl_subsys_fcncall3')

Two function-call subsystems that use the same function-call event source

일반적으로 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')

Two function-call subsystems that use function-call events from the same enabled subsystem

close_system('sl_subsys_fcncall4')

Merge 블록이 있는 Function-Call Subsystem

이 모델에는 2개의 함수 호출을 실행하는 차트가 포함됩니다. 이 모델은 Merge 블록을 사용하여 여러 신호를 하나의 메모리 위치로 매핑합니다. 신호 f/d1_outg/d1_out은 하나의 메모리 위치로 병합되어 Chart에 d1로 전달됩니다. 신호 f/k_outg/k_out은 하나의 메모리 위치로 병합되어 f/k_in으로 다시 전달됩니다. 신호를 하나의 메모리 위치로 병합하고 Chart에 다시 전달하면 Chart에서 값 계산 방법에 대한 복잡한 의사 결정 작업을 수행할 수 있습니다.

open_system ('sl_subsys_fcncall5')

Function-call subsystems with Merge block

close_system('sl_subsys_fcncall5')

Function-Call Subsystem의 여러 개시자

이 Function-Call Subsystem은 2개의 다른 함수 호출 개시자 Chart1 Chart2로 호출됩니다. Chart1/out1Chart2/d1 간 데이터 연결은 Chart1Chart2보다 먼저 실행되도록 보장합니다. 여러 개의 호출자가 있는 Function-Call Subsystem을 만들 때는 주의해야 합니다.

예를 들어, Chart1Chart2 간 데이터 연결을 제거하는 경우 Chart1 Chart2에 우선 순위를 추가하여 이 블록들에 대한 상대적인 실행 순서를 지정해야 합니다. 그렇게 하지 않으면 실행 순서가 모호해집니다.

하지만 이 상황에서 오류는 표시되지 않으며 그 이유는 특정 경우에는 이 상황이 유효할 수 있기 때문입니다. 예를 들어, f()에서 모든 상태를 제거하고 Chart1/out1Chart2/d1에 연결하는 선을 삭제하면 Chart1Chart2의 실행 순서는 상관없습니다.

open_system ('sl_subsys_fcncall6')

Function-call events from two different sources are set up to execute one function-call subsystem

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')

Function-call subsystems are inside enabled subsystem

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')

Sample time is displayed for function-call subsystems executed periodically

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')

Function-call subsystem using active and inactive function-call events, respectively

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')

Observe function-call subsystem output by delaying and feeding the function-call subsystem output into the stateflow chart that initiates the function-call event

close_system('sl_subsys_fcncall10')

함수 호출 신호의 분기 생성

이 Stateflow 차트는 입력 신호 u가 1일 때의 시간 구간 동안 주기가 1인 주기적 함수 호출 신호를 개시합니다. 모든 함수 호출에 대해 서브시스템은 f , h, g 순서로 실행됩니다. 이 실행 순서는 Function-Call Split 블록에 지정된 순서에 따른 것이며, 점으로 표시된 포트가 가장 먼저 실행됩니다.

이 모델을 R2015b 이전 릴리스로 내보내면 신호 b가 데이터 종속성 위반으로 처리되기 때문에 오류가 발생합니다.

open_system ('sl_subsys_fcncall11')

Function-call subsystems respond to branched function-call signals

이 Stateflow 차트는 입력 신호 u가 1일 때의 시간 구간 동안 주기가 1인 주기적 함수 호출 신호를 개시합니다.

각 함수 호출마다 서브시스템 f1이 서브시스템 g1보다 먼저 실행됩니다. 이 실행 순서는 Function-Call Split 블록에 지정된 순서에 따른 것이며, 점으로 표시된 포트가 가장 먼저 실행됩니다.

이 모델을 R2015b 이전 릴리스로 내보내면 오류가 발생합니다. 서브시스템 f1의 Inport 블록에 대해 Function-Call Subsystem 출력의 피드백 신호에 대한 입력 래치 파라미터 선택을 해제하면 신호 b가 데이터 종속성 위반으로 처리되기 때문입니다.

Function-call subsystems for branched function-call signals

close_system('sl_subsys_fcncall11')

부적절한 Function-Call Subsystem

이 목록에는 부적절한 Function-Call Subsystem이 나와 있습니다. 고치는 방법은 해당 모델 서브시스템에 설명되어 있습니다.

open_system('s_Function_call_subsystems')
  1. 모호한 실행 순서 오류

  2. 함수 호출 개시자로 구동되는 블록과 관련된 데이터 종속성 위반

  3. 두 Function-Call Subsystem 간의 블록과 관련된 데이터 종속성 위반

  4. 수정된 함수 호출 출력의 피드백으로 인한 모호한 실행 순서 오류

  5. 두 서브시스템 간 수정된 함수 호출 출력의 피드백으로 인한 모호한 실행 순서 오류

  6. Merge 블록과 Stateflow 차트와 관련된 데이터 종속성 위반

  7. Atomic Subsystem과 Gain 블록과 관련된 데이터 종속성 위반

  8. Function-Call Subsystem 사이클로 인한 데이터 종속성 위반

  9. 간접 데이터 종속성 위반

  10. 중첩된 데이터 종속성 위반

  11. Function-Call Subsystem이 주기적 실행을 잘못 지정함

  12. Function-Call Subsystem 입력이 호출된 컨텍스트 내에서 계산됨

  13. 분기된 함수 호출 신호와 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 SubsystemSwitch 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')

If and Switch Case Action Subsystems examples

close_system('sl_subsys_semantics/If Action and Switch Case Action subsystems')

Triggered Subsystem

Triggered Subsystem을 사용하면 소프트웨어 트리거, 하드웨어 트리거 또는 이 두 개를 함께 구현할 수 있습니다. Simulink 라이브러리 브라우저에서 Triggered Subsystem 블록을 추가할 수 있습니다. 또는 Subsystem 블록 내부에 Trigger 블록을 배치하여 이 서브시스템을 만들 수 있습니다.

Triggered Subsystems

자세한 내용은 Triggered Subsystem 항목을 참조하십시오.

이 예제에서는 Triggered Subsystem을 사용하는 방법을 보여줍니다.

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/Triggered subsystems')

Triggered Subsystem examples

소프트웨어 트리거는 다음 코드에 정의되어 있습니다.

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 항목을 참조하십시오.

다음 예제에서는 Enabled Subsystem을 사용하는 방법을 보여줍니다.

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/Enabled subsystems')      

Enabled Subsystem examples

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')  

Enabled and Triggered Subsystems

close_system('sl_subsys_enabtrig1.slx')        

Resettable Subsystem

Resettable Subsystem을 사용하면 재설정 신호를 기반으로 서브시스템 내 블록 상태를 재설정할 수 있습니다. Simulink 라이브러리 브라우저에서 Resettable Subsystem 블록을 추가할 수 있습니다.

Resettable Subsystem

자세한 내용은 Resettable Subsystem 항목을 참조하십시오.

이 예제에서는 Resettable Subsystem을 사용하는 방법을 보여줍니다.

open_system('sl_subsys_semantics')
open_system('sl_subsys_semantics/Resettable subsystems')

Resettable Subsystem examples

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 항목을 참조하십시오.

이 예제에서는 For Each Subsystem의 사용 방법을 보여줍니다.

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/For Each subsystems')

For Each Subsystem examples

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 항목을 참조하십시오.

이 예제에서는 While Iterator Subsystem을 사용하는 방법을 보여줍니다.

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/While Iterator subsystems')

While Iterator Subsystem example

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 항목을 참조하십시오.

다음 예제에서는 For Iterator Subsystem을 사용하는 방법을 보여줍니다.

open_system('sl_subsys_semantics');
open_system('sl_subsys_semantics/For Iterator subsystems')   

For Iterator Subsystem Example

close_system('sl_subsys_semantics/For Iterator subsystems')

참고 항목

관련 항목