시간 논리를 사용하여 차트 실행 제어하기
시간 논리는 시간의 측면에서 차트 실행을 제어합니다. 상태 동작과 천이에서는 다음 두 가지 유형의 시간 논리를 사용할 수 있습니다.
이벤트 기반 시간 논리는 반복 이벤트를 추적합니다. 명시적 이벤트 또는 묵시적 이벤트를 기준 이벤트로 사용할 수 있습니다.
절대시간 시간 논리는 상태가 활성화된 이후에 경과한 시간을 추적합니다. 절대시간 시간 논리 연산자의 시간 설정은 Stateflow® 차트의 유형에 따라 달라집니다.
Simulink® 모델의 차트는 시뮬레이션 시간의 관점에서 절대시간 시간 논리를 정의합니다.
MATLAB®의 독립 실행형 차트는 절대시간 시간 논리를 1밀리초의 정밀도로 제한되는 wall-clock 시간의 관점에서 정의합니다.
시간 논리 연산자
시간 논리에 따라 Stateflow 차트의 동작을 정의하려면 이 표에 나열된 연산자를 사용하십시오. 이러한 연산자는 다음과 같은 경우에 나타날 수 있습니다.
상태
on
동작상태에서 시작된 천이 경로의 동작
각 시간 논리 연산자에는 동작이 표시되거나 천이 경로가 시작되는 상태인 관련 상태가 있습니다. 관련 상태가 다시 활성화될 때마다 Stateflow 차트는 각 연산자가 사용하는 카운터를 재설정합니다.
연산자 | 구문 | 설명 | 예 |
---|---|---|---|
after |
| 관련 상태가 활성화된 후 이벤트 E 가 최소 n 번 이상 발생한 경우 true 를 반환합니다. 그 외에는 연산자가 false 를 반환합니다. | 상태가 활성화된 후
|
상태가 활성화된 후 after(5,E) | |||
| 관련 상태가 활성화된 후 차트가 최소 Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트 | 상태가 활성화된 후 차트가 적어도 일곱 번째로 웨이크업 상태가 될 때 관련 상태에서 천이되지만, 변수 after(7,tick)[temp > 98.6] | |
| 관련 상태가 활성화된 후 최소 Simulink 모델의 차트에서는 시간을 초( MATLAB의 독립 실행형 차트에서는 시간을 초( | 최소 12.3초 동안 관련 상태가 활성화되어 있을 때 시작하여 차트가 웨이크업 상태가 될 때마다
| |
at |
| 관련 상태가 활성화된 후 이벤트 E 가 정확히 n 번 발생한 경우 true 를 반환합니다. 그 외에는 연산자가 false 를 반환합니다. | 상태가 활성화된 후 차트가 이벤트
|
상태가 활성화된 후 차트가 이벤트 at(5,E) | |||
| 관련 상태가 활성화된 후 차트가 정확히 Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트 | 상태가 활성화된 후 차트가 일곱 번째로 웨이크업 상태가 될 때 관련 상태에서 천이되지만, 변수 at(7,tick)[temp > 98.6] | |
| 관련 상태가 활성화된 후 정확히
| 상태가 정확히 12.3초 동안 활성화되어 있었던 경우
| |
before |
| 관련 상태가 활성화된 이후 이벤트 시간 논리 연산자 | 상태가 활성화된 후 차트가 이벤트
|
이벤트 before(5,E) | |||
| 관련 상태가 활성화된 이후 차트가 Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트 시간 논리 연산자 | 변수 before(7,tick)[temp > 98.6] | |
| 관련 상태가 활성화된 이후 시간을 초( 시간 논리 연산자 | 12.3초 미만 동안 관련 상태가 활성화되어 있었던 경우에 한하여, 차트가 웨이크업 상태가 될 때마다
| |
every |
| 관련 상태가 활성화된 이후 이벤트 | 상태가 활성화된 후 차트가 이벤트
|
상태가 활성화된 후 차트가 이벤트 every(5,E) | |||
| 관련 상태가 활성화된 이후 차트가 Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트 | 변수 every(7,tick)[temp > 98.6] | |
| 관련 상태가 활성화된 이후
| 상태가 활성화되는 12.3초마다
| |
temporalCount |
| 관련 상태가 활성화된 이후 이벤트
| 차트가 이벤트
|
temporalCount(tick) | 관련 상태가 활성화된 이후 차트가 웨이크업 상태가 된 횟수를 반환합니다. Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트
| 입력 데이터 en,du: M(temporalCount(tick)+1) = u; | |
| 관련 상태가 활성화된 이후 경과한 시간 길이를 반환합니다. 시간을 초( | 상태가 활성화된 이후 경과한 시간(단위: 밀리초)을 저장합니다. en,du: y = temporalCount(msec); | |
elapsed |
| 관련 상태가 활성화된 이후 경과한 시간 길이를 반환합니다.
| 상태가 활성화된 이후의 경과한 시간(초)을 저장합니다. en,du: y = elapsed(sec); |
et | elapsed(sec) 를 실행하는 또 다른 방법입니다. | 차트가 이벤트 E{disp(et);} | |
count |
| 조건식 Stateflow 차트는 조건식 Simulink 모델의 차트에서 | 변수 [count(x>=2) > 5] |
변수 en,du: y = count(x>5); | |||
duration |
| 조건식 시간을 초( Stateflow 차트는 조건식 시간 논리 연산자 | 변수 [duration(x>=0) > 0.1] |
변수 en,du: y = duration(x>5,msec); |
따옴표를 사용하여 키워드 'tick'
, 'sec'
, 'msec'
, 'usec'
를 묶을 수 있습니다. 예를 들어, after(5,'tick')
은 after(5,tick)
과 같습니다.
참고
시간 논리 연산자 after
, at
, before
, every
는 임계값 n
과 정수형 내부 카운터를 비교합니다. n
이 2의 정수 거듭제곱이 아닌 기울기나 0이 아닌 편향으로 정의된 고정소수점 숫자인 경우, 비교 시 반올림으로 인해 예상치 못한 결과를 얻을 수 있습니다. 자세한 내용은 Relational Operations for Fixed-Point Data 항목을 참조하십시오.
시간 논리 예제
시간 지연 정의하기
이 예제는 연속시간 차트에서 두 개의 절대시간 지연을 정의하는 방법을 보여줍니다.
차트의 실행은 다음 단계를 따릅니다.
차트가 웨이크업 상태가 되면 상태
Input
이 먼저 활성화됩니다.5.33밀리초의 시뮬레이션 시간 후에
Input
에서Output
으로의 천이가 발생합니다.상태
Input
이 비활성화되고 상태Output
이 활성화됩니다.10.5밀리초의 시뮬레이션 시간 후에
Output
에서Input
으로의 천이가 발생합니다.상태
Output
이 비활성화되고 상태Input
이 활성화됩니다.
시뮬레이션이 끝날 때까지 2~5단계를 반복합니다.
차트에 이산 샘플 시간이 있는 경우, 차트의 모든 동작은 이 샘플 시간의 정수 배수에서 발생합니다. 예를 들어, Simulink® 솔버에서 0.1초 크기의 고정 스텝을 사용하는 경우, 상태 Input
에서 상태 Output
으로의 첫 번째 천이는 t = 0.1초에서 발생합니다. 이 동작은 솔버가 정확히 t = 5.33밀리초에 차트를 웨이크업 상태로 만들지 않기 때문에 발생합니다. 대신, 솔버는 0.1초의 정수 배수(예: t = 0.0 및 0.1초)에 차트를 활성화합니다.
경과 시간 감지하기
이 예제에서 Step (Simulink) 블록은 Stateflow 차트에 단위 계단 입력을 제공합니다.
차트는 입력 u
가 1이 되는 시점을 확인합니다.
t = 2초 이전에 입력이 1이면
Start
에서Fast
로의 천이가 발생합니다.t = 2초와 t = 5초 사이에 입력이 1이면
Start
에서Medium
으로의 천이가 발생합니다.t = 5초 이후에 입력이 1이면
Start
에서Slow
로의 천이가 발생합니다.
활성화된 서브시스템에서 절대시간 시간 논리 사용하기
조건부 실행 서브시스템에 있는 차트에서 절대시간 시간 논리를 사용할 수 있습니다. 서브시스템이 비활성화되면 차트가 비활성 상태가 되고 차트가 슬립 상태인 동안 시간 논리 연산자가 일시 중지됩니다. 연산자는 서브시스템이 다시 활성화되고 차트가 웨이크업 상태가 될 때까지 시뮬레이션 시간을 계속 계산하지 않습니다.
이 모델에는 활성화할 때의 상태 파라미터가 held
로 설정된 활성화된 서브시스템이 있습니다.
서브시스템에는 after
연산자를 사용하여 천이를 트리거하는 차트가 포함되어 있습니다.
Signal Editor (Simulink) 블록은 다음 특성이 있는 입력 신호를 제공합니다.
신호는 t = 0에 서브시스템을 활성화합니다.
신호는 t = 2에 서브시스템을 비활성화합니다.
신호는 t = 6에 서브시스템을 다시 활성화합니다.
아래 그래프는 차트에서 경과한 총 시간을 보여줍니다. 입력 신호가 시간 t = 0에 서브시스템을 활성화하면 상태 A
가 활성화됩니다. 시스템이 활성화되어 있는 동안에는 경과 시간이 증가합니다. 서브시스템이 t = 2에 비활성화되면 차트가 슬립 상태가 되고 경과 시간이 더 이상 증가하지 않습니다. 2 < t < 6 중에는 시스템이 비활성화되어 있으므로 경과 시간이 2초로 고정되어 유지됩니다. 차트가 t = 6에 웨이크업 상태가 되면 경과 시간이 다시 증가하기 시작합니다.
상태 A
에서 상태 B
로의 천이는 시뮬레이션 시간이 아니라 상태 A
가 활성 상태인 동안 경과한 시간에 따라 결정됩니다. 그러므로 상태 A
에서의 경과 시간이 5초가 되는 t = 9에 천이가 발생합니다. 천이가 발생하면 출력값 y
가 0에서 1로 변경됩니다.
이 모델 동작은 Enable 블록 파라미터 활성화할 때의 상태를 held
로 설정한 서브시스템에만 적용됩니다. 파라미터를 reset
으로 설정하면 서브시스템이 다시 활성화될 때 차트가 완전히 재초기화됩니다. 디폴트 천이가 실행되고 모든 시간 논리 카운터가 0으로 재설정됩니다.
천이에서 이벤트 기반 시간 논리의 표기법
Simulink 모델의 Stateflow 차트에서 연산자 after
, at
, before
는 천이에서 이벤트 기반 시간 논리를 표현하기 위한 두 가지 다른 표기법을 지원합니다.
트리거 표기법은 시간 논리 연산자에 대한 기준 이벤트에 따라서만 달라지는 천이를 정의합니다. 트리거 표기법이 따르는 구문은 다음과 같습니다.
여기서 각각은 다음과 같습니다.temporalLogicOperator(n,E)[C]
temporalLogicOperator
는 부울 시간 논리 연산자입니다.n
은 연산자의 발생 횟수입니다.E
는 연산자의 기준 이벤트입니다.C
는 선택적 조건식입니다.
트리거 표기법을 사용하는 경우, 차트가 기준 이벤트
E
의 브로드캐스트를 처리할 때만 천이가 발생할 수 있습니다.조건부 표기법은 기준 이벤트와 비기준 이벤트에 따라 달라지는 천이를 정의합니다. 조건부 표기법이 따르는 구문은 다음과 같습니다.
여기서 각각은 다음과 같습니다.F[temporalLogicOperator(n,E) && C]
temporalLogicOperator
는 부울 시간 논리 연산자입니다.n
은 연산자의 발생 횟수입니다.E
는 연산자의 기준 이벤트입니다.F
는 선택적 비기준 이벤트입니다.C
는 선택적 조건식입니다.
조건부 표기법을 비기준 이벤트
F
와 함께 사용하는 경우, 차트가F
의 브로드캐스트를 처리할 때만 천이가 발생할 수 있습니다. 비기준 이벤트를 생략하면 차트가 명시적 이벤트나 묵시적 이벤트를 처리할 때 천이가 발생할 수 있습니다.MATLAB의 독립 실행형 차트에서는 시간 논리 연산자에 대한 조건부 표기법이 지원되지 않습니다.
예를 들어 이 천이 레이블은 트리거 표기법을 사용하여, 상태가 활성화된 후 E
의 다섯 번째 브로드캐스트부터 시작해 차트가 기준 이벤트 E
의 브로드캐스트를 처리하는 순간 관련 상태로부터 천이됨을 나타냅니다.
after(5,E)
반면 이 천이 레이블은 조건부 표기법을 사용하여, 차트가 E
의 브로드캐스트를 처리하고 있지 않는 경우에도 기준 이벤트 E
의 브로드캐스트가 적어도 5회 이상일 동안 상태가 활성화되어 있었다면 관련 상태로부터 천이됨을 나타냅니다.
[after(5,E)]
참고
연산자 every
는 트리거 표기법과 조건부 표기법을 지원합니다. 하지만 이 연산자에서는 두 표기법이 모두 동일합니다. 천이 레이블 every(5,E)
와 [every(5,E)]
는 상태가 활성화된 후 차트가 기준 이벤트 E
의 k번째 브로드캐스트를 처리할 때 관련 상태로부터 천이됨을 나타내며, 여기서 k는 5의 배수입니다.
시간 논리 모범 사례
소스 상태가 없는 천이 경로에 시간 논리 사용하지 않기
시간 논리 연산자의 값은 관련 상태가 활성화된 시점에 따라 달라집니다. 모든 시간 논리 연산자가 고유한 관련 상태를 갖도록 하려면 다음 연산자만 사용하십시오.
상태
on
동작상태에서 시작된 천이 경로의 동작
디폴트 천이나 그래픽 함수의 천이는 상태에서 시작하지 않으므로 이러한 천이에는 시간 논리 연산자를 사용하지 마십시오.
Simulink 모델의 차트에서 tick
대신 절대시간 시간 논리 사용하기
Simulink 모델의 차트에서, 절대시간 시간 논리를 사용하는 지연 표현식의 값은 모델의 샘플 시간과 의미론적으로 독립적입니다. 반면, 묵시적 이벤트 tick
을 기반으로 하는 시간 논리를 사용하는 지연 표현식은 Simulink 솔버가 사용하는 스텝 크기에 의존합니다.
또한 입력 이벤트가 있는 차트에는 절대시간 시간 논리가 지원됩니다. Simulink 모델의 Stateflow 차트에 입력 이벤트가 있는 경우 묵시적 이벤트 tick
은 지원되지 않습니다.
Simulink 모델의 차트에서 절대시간 시간 논리에 at
사용하지 않기
Simulink 모델의 차트에서 at
을 절대시간 시간 논리 연산자로 사용하는 것은 지원되지 않습니다. 대신, after
연산자를 사용하십시오. 예를 들어, 표현식 at(5.33,sec)
를 사용하여 시간 지연을 정의한다고 가정하겠습니다.
런타임 오류를 방지하려면 천이 레이블을 after(5.33,sec)
로 변경하십시오.
큰 파라미터 값의 예기치 않은 결과
Stateflow 절대시간 시간 논리 조건(예: after(x,sec)
)은 다음과 같은 조건이 있는 상태에 진입한 후 기대했던 시간에 true
로 평가되지 않을 수 있습니다.
차트에 주기적인 이산 샘플 시간이 있습니다.
차트 논리로 인해 상태가
2147418
단위의 시간보다 큰 시간 동안 활성 상태로 유지됩니다. 시간 단위은 해당 상태에서 사용하는 모든 시간 논리 표현식에서 가장 작은 시간 단위를 뜻합니다. 예를 들어, 상태에 두 개의 나가는 천이가 있고 하나는after(x,sec)
를 사용하고 다른 하나는after(x,msec)
를 사용하는 경우, 시간 단위는msec (milliseconds)
입니다.
일반적으로 상태의 시간 길이가 2147418
단위의 시간보다 큰 경우 예기치 않은 결과가 발생합니다. 하지만 이는 차트의 샘플 시간에 따라 달라질 수 있습니다.
Simulink 모델의 차트에서 절대시간 시간 논리에 every
사용하지 않기
Simulink 모델의 차트에서 every
를 절대시간 시간 논리 연산자로 사용하는 것은 지원되지 않습니다. 대신, after
연산자와 함께 외부 자가 루프 천이를 사용하십시오. 예를 들어, 차트 실행 중에 2.5초마다 활성 상태에 대한 상태 메시지를 출력한다고 가정하겠습니다.
런타임 오류를 방지하려면 상태 동작을 외부 자가 루프 천이로 바꾸십시오.
차트가 각 자가 루프 천이 이전의 상태 설정을 기억하도록 상태에 이력 연결점을 추가하십시오. 자세한 내용은 이력 연결점을 사용하여 이전 하위 상태 활동 재개하기 항목을 참조하십시오.
MATLAB의 독립 실행형 차트에서 소스가 여러 개 있는 천이 경로에 시간 논리 사용하지 않기
MATLAB의 독립 실행형 차트는 소스 상태가 두 개 이상인 천이 경로에서 시간 논리 연산자의 사용을 지원하지 않습니다. 예를 들어, 다음 독립 실행형 차트에서는 시간 논리 표현식 after(10,sec)
가 두 개 이상의 소스 상태가 있는 천이 경로를 트리거하므로 런타임 오류가 발생합니다.
이 문제를 해결하려면 각각 소스 상태 하나를 가지고 있는 개별 천이 경로에 시간 논리 표현식을 사용하십시오.
MATLAB의 독립 실행형 차트에 있는 천이 경로에서 절대시간 시간 논리와 조건을 혼합하지 않기
MATLAB의 독립 실행형 차트에서 연산자 after
, at
, every
는 차트를 웨이크업 상태로 만드는 묵시적 이벤트를 생성하는 MATLAB timer
객체를 생성합니다. 이러한 연산자를 동일한 천이 경로에 있는 조건과 결합하면 의도하지 않은 동작이 발생할 수 있습니다.
timer
가 차트를 웨이크업 상태로 만들 때 천이 경로의 조건이 false이면 차트는 활성 상태의during
동작과on
동작을 수행합니다.차트는 연산자
after
와at
에 연결된timer
객체를 재설정하지 않습니다. 천이 경로의 조건이 나중에 true가 되면 다른 명시적 이벤트나 묵시적 이벤트가 차트를 웨이크업 상태로 만들 때까지 천이가 발생하지 않습니다.
예를 들어, 이 차트에서, 상태 A
에서 상태 B
로의 천이 경로는 절대시간 시간 논리 트리거 after(1,sec)
와 조건 [guard]
를 결합합니다. 상태 A
에서 상태 C
로의 천이에는 절대시간 시간 논리 트리거 after(5,sec)
가 있습니다. 각 천이는 묵시적 이벤트를 생성하는 timer
객체와 연결되어 있습니다. 처음에 지역 변수 guard
는 false
입니다.
차트를 실행하면 상태 A
가 활성화됩니다. 차트가 entry
동작을 수행하고 메시지 Hello!
를 표시합니다. 1초 후, A
에서 B
로의 천이와 연결된 timer
가 차트를 웨이크업 상태로 만듭니다. 천이가 유효하지 않으므로, 차트는 상태 A
에서 during
동작을 실행하고 Hello!
메시지를 두 번째로 표시합니다.
2초 후 차트에 입력 이벤트 E
가 수신된다고 가정하겠습니다. 차트는 상태 A
에서 on
동작을 실행하고 guard
의 값을 true
로 변경합니다. 차트는 연산자 after
에 연결된 timer
를 재설정하지 않으므로, 다른 이벤트가 차트를 웨이크업 상태로 만들 때까지 A
에서 B
로의 천이는 발생하지 않습니다.
5초 후, A
에서 C
로의 천이와 연결된 timer
가 차트를 웨이크업 상태로 만듭니다. A
에서 B
로의 천이가 유효하고 실행 순서가 더 높으므로, 차트는 상태 C
로의 천이를 발생시키지 않으며 따라서 메시지 Farewell!
을 표시하지 않습니다. 대신, 상태 B
가 활성화되고 차트는 메시지 Good bye!
를 표시합니다.
더 효율적인 코드 생성을 위해 이산 샘플 시간을 사용하는 차트 사용하기
트리거되거나 활성화된 서브시스템 내에 있지 않은 이산 차트에 대해 생성된 코드는 Simulink에서 제공하는 시간 대신 정수 카운터를 사용하여 시간을 추적합니다. 이 동작은 오버헤드와 메모리 측면에서 보다 효율적인 코드 생성을 가능하게 하며, SIL(Software-in-the-Loop) 시뮬레이션 모드와 PIL(Processor-in-the-Loop) 시뮬레이션 모드에서 이 코드를 사용할 수 있도록 지원합니다. 자세한 내용은 SIL and PIL Simulations (Embedded Coder) 항목을 참조하십시오.
참고 항목
after
| at
| before
| every
| temporalCount
| elapsed
| count
| duration
| timer
| Signal Editor (Simulink) | Step (Simulink)