주요 콘텐츠

원치 않는 재귀 동작 해결하기

문제

Stateflow® 차트에 재귀 이벤트 브로드캐스트 또는 재귀 함수 호출이 포함된 경우, 시뮬레이션 속도가 느려질 수 있으며 Simulink 진단 창에 경고가 표시될 수 있습니다.

이런 문제를 해결하려면 차트를 수정하여 다음을 제거하십시오.

  • 무방향 로컬 이벤트 브로드캐스트

  • 자체 트리거되는 이벤트 천이로 인한 조기 반환

  • 함수 호출

가능한 해결 방법

무방향 로컬 이벤트 브로드캐스트 제거 또는 수정하기

이벤트 브로드캐스트가 특정 상태를 가리키도록 방향을 지정하지 않으면 차트는 이벤트를 해당 이벤트를 볼 수 있는 모든 상태로 보내며, 이는 재귀를 발생시킬 수 있습니다. 무방향 이벤트 브로드캐스트의 형식은 다음과 같습니다.

send(event_name)
여기서, event_name은 로컬 이벤트입니다.

향후 릴리스에서 Stateflow는 무방향 로컬 이벤트 브로드캐스트를 더 이상 지원하지 않을 예정입니다. 차트에 무방향 로컬 이벤트 브로드캐스트가 포함된 경우, 브로드캐스트를 제거하거나 브로드캐스트의 방향이 기존 상태 또는 새 상태를 가리키도록 지정하십시오.

이벤트 제거하기

무방향 로컬 이벤트 브로드캐스트가 천이를 트리거하는 경우, 이벤트를 시간 연산자 또는 조건으로 대체할 수 있습니다.

예를 들어 이 차트는 leave 이벤트가 트리거되면 상태 A에서 상태 B로 천이됩니다. 상태 A에서 on 동작은 5 스텝마다 leave 이벤트를 브로드캐스트합니다.

이벤트 재귀를 해결하려면 leave 이벤트와 on 동작을 제거합니다. 천이에 every(5,tick) 연산자를 추가합니다.

이벤트 브로드캐스트의 방향이 기존 상태를 가리키도록 지정하기

상태가 무방향 로컬 이벤트를 브로드캐스트하고 다른 상태 내의 천이나 동작이 이를 수신한다고 가정하겠습니다. 수신하는 상태가 브로드캐스트하는 상태의 후손이 아닌 경우, 이벤트의 방향이 수신하는 상태를 가리키도록 지정할 수 있습니다.

예를 들어, 이 차트에는 3개의 병렬 상태 Motor, Vent, Fan이 있습니다. Vent 상태와 Fan 상태는 동작 모드 간에 천이하기 위해 2개의 이벤트 cooling_oncooling_off를 사용합니다. Motor 상태는 무방향 이벤트 브로드캐스트를 사용하여 이벤트를 트리거합니다.

이벤트 재귀를 해결하려면 이벤트 브로드캐스트의 방향이 VentFan을 가리키도록 지정합니다.

이벤트 브로드캐스트 방향이 새 부모 상태를 가리키도록 지정하기

상태가 무방향 로컬 이벤트를 브로드캐스트하고 2개 이상의 상태 내의 천이 또는 동작이 이를 수신한다고 가정하겠습니다. 수신하는 상태가 브로드캐스트하는 상태의 후손이 아닌 경우, 수신하는 상태를 새 부모 상태 내에 넣고 이벤트 브로드캐스트의 방향이 부모를 가리키도록 지정합니다.

예를 들어, 이 차트에는 3개의 병렬 상태 Motor, Vent, Fan이 있습니다. Vent 상태와 Fan 상태는 동작 모드 간에 천이하기 위해 2개의 이벤트 cooling_oncooling_off를 사용합니다. Motor 상태는 무방향 이벤트 브로드캐스트를 사용하여 이벤트를 트리거합니다.

이벤트 재귀를 해결하려면 Vent 상태와 Fan 상태를 새 부모 상태 Cooling 내에 넣습니다. 이벤트 브로드캐스트 방향이 Cooling을 가리키도록 지정합니다.

내부 천이와 외부 천이를 모두 트리거하는 상태를 재구성하기

무방향 이벤트가 동일한 시간 스텝에서 상태 내의 천이와 상태 외부의 천이를 트리거하는 경우, 두 천이가 서로 다른 상태에서 발생하도록 차트를 재구성합니다.

이 차트를 예로 들면, 상태 A에는 내부 천이와 외부 천이가 모두 있습니다. 두 천이 모두 묵시적 이벤트 tick이 트리거되면 실행되는 every 연산자가 있습니다.

내부 천이가 로컬 이벤트 local을 활성화하면 다음이 수행됩니다.

  1. 차트가 웨이크업 상태가 됩니다.

  2. 차트가 로컬 이벤트를 처리합니다.

  3. 묵시적 이벤트 tick이 트리거됩니다.

  4. 두 천이가 트리거됩니다.

재귀를 해결하려면 다음을 수행합니다.

  1. 내부 천이 로직을 별도의 상태로 옮깁니다.

  2. 원래 상태를 부모 상태 내에 넣습니다.

  3. 이벤트 방향이 부모 상태를 가리키도록 지정합니다.

자체 트리거되는 이벤트 천이를 진출 연결점으로 대체하기

상태가 이벤트를 브로드캐스트하고 그 이벤트를 사용하여 자기 자신이나 다른 상태로 천이를 트리거하면 이벤트 재귀가 발생합니다.

이벤트 재귀를 해결하려면 이벤트를 제거합니다. 그런 다음, 진출 연결점을 추가하고 진출 포트를 원래 대상에 연결합니다. 자세한 내용은 Create Entry and Exit Connections Across State Boundaries 항목을 참조하십시오.

예를 들어, 이 차트에는 부모 상태 A와 자식 상태 BC가 있습니다. B가 하나의 스텝 이상 동안 활성 상태이면 이벤트 returnToSelf를 브로드캐스트하며, 이는 부모 상태가 상태에서 나간 뒤 다시 진입하도록 합니다.

이벤트 재귀를 해결하려면 returnToSelf 이벤트를 제거합니다. C를 진출 연결점으로 대체합니다. 진출 포트에서 A로 천이합니다.

재귀 함수 호출 제거하기

직접적 또는 간접적으로 자기 자신을 호출하는 함수를 만들면 실행했을 때 무한 재귀 루프가 발생할 수 있습니다. 예를 들어, 차트에 함수 fg가 포함된다고 가정하겠습니다. 둘 중 어느 함수라도 자기 자신을 호출하면 재귀가 발생합니다. 이때, fg를 호출하거나 gf를 호출하는 경우에도 재귀가 발생합니다. 재귀 함수 호출을 해결하려면 직접적 또는 간접적으로 자기 자신을 호출하는 함수가 없도록 함수 코드를 다시 작성하십시오.

참고 항목

도움말 항목