Meccatronica 2008 – Carlo Alberto Avizzano NOZIONI INTRODUTTIVE ALL’USO DI STATEFLOW Motivazioni Non tutti i problemi dinamici si possono risolvere con rappresentazioni ISO corrispondenti a sistemi lineari. Molto spesso sia i sistemi che i relativi controllori devono venir realizzati tramite sistemi non lineari. Basti pensare al funzionamento di oggetti di uso comune come televisori, frigoriferi, forni a microonde, ventilatori, lavatrici,… L’elemento distintivo di questi sistemi e’ il fatto che il loro funziomento agisce secondo una logica chiara e comprensibile in risposta a situazioni od eventi che si presentano dall’esterno, ad esempio la pressione di pulsanti, il raggiungimento di situazioni a regime, il verificarsi di condizioni di errore… Esistono diversi meccanismi automatici per l’implementazione di questi sistemi. tra questi la categoria piu’ diffusa e’ quella delle macchine a stati finiti. Una macchina a stati finiti e’ un automa, il cui vettore di stato puo’ assumere solo un numero limitato di configurazioni e le cui uscite e funzione di transizione dello stato sono combinazioni non lineari dello stato corrente. Un macchina a stati finiti e’ particolarmente comoda per la sua semplicita’ di implementazione sia tramite meccanismi automatici (es. Stateflow) che mediante procedure manuali di generazione del codice. Esistono diverse metodologie per rappresentare le macchine a stati finiti (Es. Reti di Petri) Noi utilizzeremo quella introdotta in matlab Osservazioni Non seguiremo un approccio formale alla definizione delle proprieta’ di una macchina a stati finiti. Piuttosto un approccio pratico inteso a comprendere come impiegarle per la risoluzione di problemi tipici Vedremo un approccio incrementale introducendo passo per passo le caratteristiche delle componenti di una macchina a stati finiti Quindi approfondiremo alcuni aspetti di modellazione e sintassi impliciti del linguaggio. Definizione del problema Si consideri di dover affrontare lo sviluppo di un sistema di controllo per un cancello automatico. Avremo a nostra disposizione una uscita da controllare (la velocita’ del motore) e 4 differenti intressi (due fotocellule, un comando di apertura e la posizione del cancello) Supporremo a questo livello che tutti I controlli di basso livello per asservire in posizione e velocita’ siano noti (in quanto demandabili alla logica di controllo esterna) e ci concentreremo sul problema di implementare la logica di movimentazione Stateflow Stateflow (SF) e’ una componente integrata dell’ambiente di sviluppo Matlab/Simulink. Stateflow utilizza una notazione particolare di macchina a stati proposta da Harel e basata sul concetto di stati e transizioni. All’ambiente di sviluppo, vi si accede trascinando sugli schemi di simulink il blocco relativo ad una macchina SF. Per regolarne le proprieta’ sara’ quindi necessario effettuare una operazione di doppio click sulla relativa macchina. Come vedremo il simbolismo adottato consentira’ di definire oggetti complessi dalla logica sequenziale, parallela, gerarchica e funzionale, consentendo in questo modo al linguaggio di programmazione grafico la stessa potenzialita’ espressiva di un linguaggio di programmazione funzionale. Ambiente di sviluppo L’ambiente di sviluppo di stateflow, e’ anche esso grafico come quello di simulink. Data la maggior linearita’ del funzionamento vi sono tuttavia molto meno tipologie di blocchi da conoscere Cio’ non rispecchia una minore flessibilita’ di comportamento in quanto ogni blocco risulta poi essere programmabile in maniera indipendente, consentendo in questo modo una “infinita” potenzialita’ espressiva L’ambiente di sviluppo e’ quindi completamente integrato con quello di simulink con il quale puo’ scambiarsi dati e valori delle costanti in tempo reale, durante la simulazione o il controllo di applicazioni embedded Schema semplice Al cuore del funzionamento vi sono due elementi: gli stati e le transizioni L’esempio piu’ semplice che si puo’ fornire e’ quello di una lampadina che puo’ assumere due stadi Acceso e spento. Ad ogni stato e’ possibile associare quindi la transizione che conduce nell’altro stato Elements di un diagramma Gli stati Gli stati sono delle posizioni stabili in cui il sistema persiste fino all’accadere di un nuovo evento esterno. Ogni stato deve essere definito tramine una etichetta univoca per tutta la macchina. La funzione di evoluzione, determinata dalle transizioni puo’ procedere ad eventi, ovvero a condizioni logiche determinate da variabili estern (input) o di stato Condizioni ed operazioni possono essere effettuate su un set arbitrario di variabili che e’ possibile definire come asservite alla macchina a stati tramite un opportuno pannello di controllo. Ogni stato ha tre fasi principali: ingresso (entry), durata (during) ed uscita (exiti). Per ogni fase e’ possibile determinare in simil codice C eventuali riassegnazioni delle variabili interne e/o di uscita Una transizione aggiuntiva (denominata history) determina lo stato di ingresso di una macchina. Gerarchie di stati Gli stati possono essere organizzati in maniera gerarchica • Ad esempio in una automobile lo stato delle spie sul cruscotto puo` dipendere dal macrostato acceso/spento • Per definire l’organizzazione gerarchica degli stati basta una inclusione grafica (nel diagramma) • Ogni macrostato contiene tutti gli stati completamente definiti Quando sono presenti delle gerarchie di stati, in ogni istante il sistema considerera’ attivi lo stato piu’ interno e la gerarchia diretta dello stesso. • Essendo attivi tutti questi stati saranno valutate tutte le rispettive transizioni e le rispettive azioni Esempio di integrazione: Uno stabilizzatore di temperatura per ambienti Implementazione Le transizioni Le transizioni sono dei rami orientati che definiscono le condizioni per cui si puo` verificare una transizione di stato. Ogni transizione viene definita da una sintassi condizionale oppure basata su eventi come segue: • Sintassi: evento[condizione]{azione su condizione;}/ azione su transizione; La sintassi delle transizioni e’ divisa in quattro parti: • Gli eventi che possono essere generati esternamente o sollevati tramite la stessa sintassi; • Le condizioni, simili al codice di un “if” identificano una condizione logica che se vera determina la transizione • Le azioni su condizione vengono eseguite ogni qual volta il test sulla condizione risulta essere vero • Le azioni su transizione vengono invece eseguite ogni volta che il SF decide di effettuare la transizione (puo’ differire in caso di presenza di giunzioni) La transizione di Default Le transizioni di default rimuovono ambiguita` di esecuzione; In una macchina a stati la transizione di default illustra quale stato sara’ il primo ad essere eseguito; Quando posta in uno stato composto una transizione di default indica il sottostato di partenza (se le transizioni arrivano allo stato superiore) Le transizioni su gerarchie Le transizioni i di uno stesso livello che stati di livello gerarchico differente. Quando puntano ad un sottolivello le transizioni attivano simultaneamente piu` stati (quello interno e la sua gerarchia). Quando passano ad un livello piu’ alto esse determinano le condizioni di uscita da tutti gli stati attivi Se si verifica una condizione di transizione da un macrostato verranno valutate le azioni di uscita da tutti i sottostati Le giunzioni storiche Le giunzioni storiche offrono un meccanismo per ricordare quale stato era attivo nel momento di disattivazione di un macrostato e di reimpostarlo in caso di riattivazione In un certo senso esse offrono un meccanismo per “sospendere” le attivita` di valutazione di un macrostato e riprendere alla riattivazione come avviene nel multitasking di processi Disambiguamento E’ opportuno che le transizioni di uscita non siano ambigue • Valide cioe` simultaneamente per le medesime condizioni In tal caso sempre una sola transizione risulta valida In caso di ambiguita` il sistema preferenzia la transizione vincente secondo la regola dell’orologio analogico • Vince l’ora piu’ piccola E’ possibile chiedere al sistema di illustrare la priorita tra le condizioni ambigue Le Giunzioni Le giunzioni somigliano per certi versi agli stati, nel senso che esse possono ospitare transizioni in ingresso ed in uscita: • Una giunzione puo` sia raggruppare che diramare i flussi di controllo A differenza degli stati, tuttavia esse introducono invece il concetto di flusso di controlli ed azioni che devono essere effettuate tutte all’interno di un passo di campionamento (non vi si soggiorna) Le giunzioni possono richiamarsi ricorsivamente. • In questo caso spettera’ alle azioni su condizione garantire una evoluzione tale per cui vi sia uscita • Utili ad e esempio nella realizzazione di un ciclo for Nel caso che un ramo di uscita di uno stato abbia delle giunzioni, esso verra’ selezionato se e solo se esiste una catena di controlli ed operazioni che conduce ad un altro stato • In tal caso tali controlli/operazioni verranno tutti effettuati in un unico passo di valutazione • Le giunzioni trovano pertanto particolare valore rispetto agli stati quando si vuole implementare una procedura che deve essere eseguita “a corpo” e non divisa su diversi istanti di campionamento Decomposizione Il parallelismo tra piu’ operazioni puo’ essere ottenuto ricorrendo alle operazioni di decomposizione (tasto destro del mouse in un determinato livello gerarchico) Quando due stati procedono in parallelo sono rappresentati da un contorno tratteggiato. Anche se paralleli le variabili sono condivise tra tutti gli stati della macchina. Variabili e I/O Come fa lo Stateflow a comunicare verso l’esterno la propria evoluzione e a prendere informazioni dall’esterno. All’interno dei menu’ e’ possibile dichiarare un insieme di variabili che possono essere associati rispettivamente a: • • • • Ingressi prelevati dall’ambiente simulink Uscite da riportare a simulink Variabili interne (locali o globali a qualisiasi livello di gerarchia) Costanti Variabili e I/O La variabile t e’ predefinita ed indica il tempo di simulazione Le variabili interne e di IO possono essere scalari e vettori Explorer Eventi e variabili possono essere definiti all’interno dell’explorer (CTRL+R, ALT+T+E) Gli eventi possono essere sia espliciti (chiamati dalle azioni) oppure impliciti: entra(stato), Cambio(stato), uscita(stato), oppure ancora esterni (come segnali associati ad inputs) Gestione del parallelismo Le macchine a stati possono anche eseguire conti in parallelo tra sottostati (a qualsiasi livello di gerarchia). Tale possibilita’ e` segnalata su uno stesso livello di gerarchia (e di incapsulamento) da un tratteggio sui bordi dello stato Macchine in esecuzione parallela possono andare in competizione sulle risorse!!! Esempi di esecuzione parallela In generale il conflitto di risorse in una esecuzione parallela non dovrebbe essere prodotto; Componenti parallele devono servire a calcolare aspetti complementari di una comune evoluzione dinamica In una automobile molti componenti possono essere parallelizzati: Monitor di benzina Monitor di velocita e statistiche di viaggio Per poi essere riuniti nel sottosistema che stima il consumo medio Esempio (Da Barbarisi) Esempio (Da Barbarisi) Modello Serbatoio A Modello Serbatoio C Esempio (FSM) Esempio (schema)