Sincronizzazione degli stati paralleli tramite la trasmissione di eventi
Gli eventi aiutano gli stati paralleli a coordinarsi tra loro, consentendo a uno stato di attivare un'azione in un altro stato. Per sincronizzare gli stati paralleli nello stesso grafico Stateflow®, trasmettere gli eventi direttamente da uno stato all'altro. Per ulteriori informazioni sugli stati paralleli, vedere Modellazione di sottosistemi sincroni tramite l'utilizzo del parallelismo.
Trasmissione di eventi locali
Un evento locale è un oggetto non grafico che può attivare transizioni o azioni nello stato parallelo di un grafico Stateflow. Quando si trasmette un evento a uno stato, l'evento ha effetto sullo stato ricevente e su tutti i gli stati secondari nella gerarchia di quel dato stato. Per trasmettere un evento, utilizzare l'operatore send
:
send(event_name,state_name)
event_name
è il nome dell'evento da trasmettere. state_name
è uno stato attivo durante la trasmissione.
Esempio di trasmissione di eventi
Questo esempio utilizza gli eventi locali come parte della progettazione di un sistema di sicurezza domestica.
Il sistema di sicurezza è composto da un allarme e da tre sensori antiintrusione (un sensore per le finestre, un sensore per le porte e un rilevatore di movimento). Dopo che il sistema rileva un'intrusione, si ha a disposizione un breve lasso di tempo per disattivare l'allarme. In caso contrario, il sistema esegue una chiamata alle forze dell’ordine.
Modellazione dei sottosistemi come stati paralleli
Il grafico Security System modella ogni sottosistema con uno stato parallelo separato. Un segnale di input di attivazione seleziona le modalità On
o Off
dell'allarme, o tra le modalità Active
o Disabled
di ciascun sensore. Quando è attivato, ogni sensore monitora un segnale di input che indica una possibile intrusione.
Sottosistema | Stato | Segnale di attivazione | Segnale di attivazione |
---|---|---|---|
Sensore delle porte | Door | D_mode | Door_sens |
Sensore delle finestre | Win | W_mode | Win_sens |
Rilevatore di movimento | Motion | M_mode | Mot_sens |
Allarme | Alarm | Alarm_active |
Se un sensore rileva un'intrusione mentre il sottosistema di allarme è attivo, il sensore trasmette un evento Alert
con il seguente comando:
send(Alert,Alarm)
Per ridurre l'effetto dei falsi positivi sporadici, il rilevatore di movimento incorpora un progetto di debouncing, in modo che solo un segnale di attivazione positivo prolungato produca un allarme. I sensori di porte e finestre, invece, interpretano un singolo segnale di attivazione positivo come un'intrusione ed emettono un allarme immediato.
Nel sottosistema dell’allarme, l'evento Alert
causa una transizione dal sottosistema Idle
al sottosistema Pending
. Quando questo stato si attiva, un segnale acustico avverte gli abitanti della casa della possibile intrusione. In caso di allarme accidentale, gli abitanti della casa hanno poco tempo a disposizione per disattivare il sistema di sicurezza. Se l'allarme non viene disattivato entro questo dato periodo di tempo, il sistema esegue una chiamata alle forze dell'ordine per chiedere aiuto.
Coordinamento con altri blocchi Simulink
I grafici Stateflow possono utilizzare gli eventi per comunicare con altri blocchi in un modello Simulink®. Ad esempio, nel caso di sf_security
:
Gli eventi di output
Sound
ecall_police
pilotano i blocchi esterni che gestiscono il suono dell’allarme e la chiamata alle forze dell'ordine. I comandi per trasmettere questi eventi si verificano nello statoAlarm.On
:Il comando per
Sound
si verifica come azione di ingresso nello stato secondarioPending
.Il comando per
call_police
si verifica come azione nella transizione tra gli stati secondariPending
eIdle
.
In ogni caso, il comando per emettere l'evento di output corrisponde al nome dell'evento.
L'evento di input
sl_call
controlla la tempistica di debouncing del rilevatore di movimento e il breve lasso di tempo prima della chiamata alle forze dell'ordine. In ogni caso, l'evento si verifica all'interno di una chiamata all'operatore temporaleafter
, che si traduce in una transizione dopo che il grafico riceve l'evento un certo numero di volte.
Eventi di output
Un evento di output si verifica in un grafico Stateflow ma è visibile in blocchi Simulink esterni al grafico. Questo tipo di evento consente a un grafico di notificare ad altri blocchi di un modello gli eventi che si verificano nel grafico.
Ogni evento di output corrisponde a una porta di output sul lato destro del grafico. In base a come è stato configurato, il segnale corrispondente può controllare un sottosistema ad attivazione o un sottosistema a chiamata di funzione. Per configurare un evento di output:
Nella scheda Modeling, sotto Design Data, selezionare Symbols Pane e Property Inspector.
Selezionare l'evento nel riquadro Symbols.
In Property Inspector, impostare il Trigger su una delle seguenti opzioni:
Either
: l'evento di output trasmesso fa sì che il segnale in uscita passi da zero a uno.Function call
: l'evento di output trasmesso causa un evento di chiamata di funzione Simulink.
Nell'esempio sf_security
, gli eventi di output Sound
e call_police
utilizzano gli edge trigger per attivare una coppia di sottosistemi latch nel modello Simulink. Quando ciascun latch rileva un cambiamento di valore nel proprio segnale di input, emette brevemente un valore pari a uno prima di tornare a un output pari a zero.
Eventi di input
Un evento di input si verifica in un blocco Simulink ma è visibile in un grafico Stateflow. Questo tipo di evento consente ad altri blocchi Simulink, compresi altri grafici Stateflow, di comunicare a un grafico specifico gli eventi che si verificano al di fuori di esso.
Un blocco esterno di Simulink invia un evento di input attraverso un segnale collegato alla porta di attivazione nella parte superiore del grafico Stateflow. In base a come è stato configurato, un evento di input deriva da una variazione del valore del segnale o da una chiamata di funzione da parte di un blocco Simulink. Per configurare un evento di input:
Nella scheda Modeling, sotto Design Data, selezionare Symbols Pane e Property Inspector.
Selezionare l'evento nel riquadro Symbols.
In Property Inspector, impostare il Trigger su una delle seguenti opzioni:
Rising
: il grafico si attiva quando il segnale di input passa da zero o da un valore negativo a un valore positivo.Falling
: il grafico si attiva quando il segnale di input passa da un valore positivo a zero o a un valore negativo.Either
: il grafico si attiva quando il segnale di input attraversa lo zero mentre cambia in entrambe le direzioni.Function call
: il grafico viene attivato con una chiamata di funzione da un blocco Simulink.
Nell'esempio sf_security
, un blocco Simulink Function-Call Generator controlla la tempistica del sistema di sicurezza attivando l'evento di input sl_call
attraverso chiamate di funzione periodiche.
Analisi dell'esempio
Il grafico del sistema di sicurezza ha input da diversi blocchi Manual Switch e output verso una coppia di sottosistemi di chiusura che si collegano ai blocchi Display. Durante la simulazione, è possibile:
Attivare i sottosistemi dell’allarme e dei sensori e attivare i rilevamenti di intrusione facendo clic sui blocchi Switch.
Guardare l'animazione del grafico che evidenzia i vari stati attivi del grafico.
Visualizzare i segnali di output nel blocco Scope e nel Simulation Data Inspector (Controllo dei dati di simulazione).
Per regolare le tempistiche della simulazione, fare doppio clic sul blocco Function-Call Generator e, nella finestra di dialogo, modificare il campo Sample time. Ad esempio, supponiamo di impostare il tempo di campionamento su 1 e di avviare la simulazione con tutti i sottosistemi accesi e tutti i sensori disattivati. Durante la simulazione, eseguire le seguenti azioni:
Al tempo t = 250 secondi, si attiva il sensore delle porte. L'allarme inizia a suonare (
Sound
= 1), quindi il sistema di allarme viene disattivato immediatamente. Si spegne il dispositivo di attivazione e si riattiva l'allarme.Al tempo t = 520 secondi, si attiva il sensore delle finestre e l'allarme inizia a suonare (
Sound
= 0). Questa volta l'allarme non viene disattivato. Intorno al tempo t = 600, il sistema di sicurezza esegue una chiamata alle forze dell’ordine (call_police
= 1). I segnaliSound
ecall_police
continuano a passare da zero a uno ogni 80 secondi.Al tempo t = 1400 secondi, l'allarme viene disattivato. I segnali
Sound
ecall_police
cessano di alternarsi.
In Simulation Data Inspector (Controllo dei dati di simulazione) viene visualizzata la risposta dei segnali Sound
e call_police
alle azioni eseguite.