3.3 Simulink e Stateflow
3.3.1 Sintassi di Simulink/Stateflow
Sia SIMULINK che STATEFLOW sono linguaggi grafici. La sintassi grafica di SI-MULINK è molto intuitiva (e questo è anche il motivo per cui questo linguaggio è
così popolare). Un sistema in SIMULINK è descritto come un sezione di blocchi che calcolano il valore delle loro output come funzioni dei loro input. I blocchi comuni-cano attraverso connettori che sono attaccati alle loro porte. Un sottosistema può essere definito come l’interconnessione di blocchi primitivi o di altri sottosistemi e specificando le sue porte di input e di output primarie. Una volta definiti, i sottosi-stemi possono essere utilizzati per specificare altri sottosisottosi-stemi in modo gerarchico. SIMULINK ha una ricca libreria di componenti primitivi che possono essere usati per descrivere un sistema. La libreria è composta da sei serie di blocchi fondamentali:
• Continuo : blocchi per l’elaborazione di segnali continui come i blocchi Deri-vativi e Integratori;operatori di tempo continuo più complessi, come i blocchi State-Space (spazio degli stati) che possono essere usati per modellare sistemi dinamici descritti da equazioni di stato; blocchi Zero-Poli che possono essere utilizzati per descrivere le funzioni di trasferimento nel dominio s.
• Discreto : blocchi per l’elaborazione di segnali discreti; molti di questi bloc-chi sono le descrizioni delle funzioni di trasferimento nel dominio z ; Zero-Poli Discreti, State-Space Discreti e Integratore a Tempo-Discreto sono esempi di blocchi che possono essere istanziati e parametrizzati in un modello SIMU-LINK. I blocchi discreti hanno un Parametro di Campionamento Temporale che specifica la frequenza di esecuzione periodica. Questa libreria include an-che l’Unità di Tempo e il Mantenimento dell’Ordine Zero, an-che sono importanti “blocchi di interfaccia” nella modellazione di sistemi multifrequenza con SIMU-LINK. In particolare, blocchi di Unità di Ritardo devono essere inseriti quando si passa da un blocco a bassa frequenza ad un blocco ad alta frequenza e un blocco di Mantenimento dell’Ordine Zero è necessario nell’altro caso[45, 125]. • Operazioni matematiche : libreria generale di blocchi che rappresentano le ope-razioni matematiche come Somma, Dot, Prodotto e Abs (valore assoluto). • Sink: “consumatori di segnale” che possono essere utilizzati per visualizzare e memorizzare i risultati del calcolo o per definire i confini della gerarchia. Ci sono diversi tipi di blocchi di visualizzazione per la generazione di grafici in tempo di esecuzione. È possibile memorizzare i risultati della simulazione nello spazio di lavoro MATLAB per la post-elaborazione. Le porte di uscita sono tipi speciali di Sink .
• Sorgenti: vari generatori di segnali che possono essere utilizzati come impulsi per banchi prova; le porte di input sono un tipo speciale di Sorgente.
• Discontinuità: trasformazioni non lineari di segnali come Saturazione e Quan-tizzazione; il blocco Hit Crossing è molto utile per la modellazione di sistemi ibridi: questo blocco ha un parametro di soglia e genera un evento di output quando la soglia è stata raggiunta.
La sintassi di SIMULINK supporta la definizione di sottosistemi che possono essere istanziati in un modello SIMULINK che consente ai progettisti di utilizzare la gerarchia nell’organizzazione dei loro progetti. Un modello STATEFLOW può essere istanziato come blocco all’interno di un modello SIMULINK. La sintassi di STATEFLOW è simile a quello dei Diagrammi di Stato. Un modello STATEFLOW è un insieme di stati collegati da archi. Uno stato è rappresentato da un rettangolo arrotondato. Uno stato può essere raffinato in un diagramma di STATEFLOW, quindi creando una macchina a stati gerarchici. Un modello STATEFLOW può avere porte dei dati di input/output e porte degli eventi di input/output. Sia i dati che gli eventi possono essere definiti come locali per il modello STATEFLOW o esterni, cioè, provenienti dal modello genitore SIMULINK, nel qual caso dati ed eventi sono comunicati attraverso le porte.
Ogni arco o transizione ha un’etichetta con la seguente sintassi: evento[condizione]condizione_azione/transizione_azione
Le transizioni possono unire direttamente gli stati o possono essere unite insieme usando giunzioni connettive necessarie per realizzare transizioni composite che simu-lano if... then... else e costrutti di loop. Ogni segmento di una transizione composita è chiamato un segmento di transizione. Una transizione viene “tentata” ogni volta che l’evento è abilitato e la condizione è vera. In quel caso, l’azione condizionale è eseguita. Se la transizione si collega direttamente ad uno stato di destinazione, allora il controllo viene passato allo stato sorgente che esegue la sua azione di uscita (vedi sotto), quindi la transizione esegue la sua azione di transizione, ed infine il cambiamento di stato ha luogo rendendo lo stato di destinazione attivo. D’altra par-te, se la transizione termina in una giunzione connettiva, il sistema controlla se uno qualsiasi dei segmenti di transizione in uscita è abilitato, e ulteriori tentativi per rag-giungere uno stato di destinazione. Se non è possibile trovare un percorso attraverso i segmenti di transizione per raggiungere uno stato di destinazione, allora lo stato di origine rimane attivo e nessun cambiamentodi stato ha luogo. Si noti, tuttavia, che, nel processo, alcuni delle azioni condizionali potrebbero essere state eseguite. Questo è essenziale per simulare il comportamento di certi costrutti di controllo di flusso oltre le transizioni, e allo stesso tempo distinguere le azioni da intraprendere ad un cambiamento di stato.
Uno stato ha un’etichetta con la seguente sintassi: nome/
entry: azione di entrata during: azione “durante” exit: azione di uscita
on_event_name: azione sull’evento
Il nome dell’identificatore indica il nome dello stato; l’azione di entrata viene eseguita all’entrata nello stato; l’azione “durante” viene eseguita ogni volta che il modello viene valutato e lo stato non può essere lasciato; l’azione di uscita viene eseguita quando lo stato viene lasciato; infine, viene eseguita l’azione sull’evento ogni volta che l’evento specificato è abilitato.