Prototipazione rapida di algoritmi di controllo

Disegnare, implementare e calibrare un sistema di controllo complesso tramite il solo utilizzo di programmazione visuale, senza necessità di scrittura di codice in linguaggi di programmazione come il C o l’assembler. Tutto questo è possibile con i tools open-source Scilab e Scicos e la board FLEX: una scheda basata su dsPIC su cui gira il kernel ERIKA Enterprise.

Negli ultimi anni il ciclo di vita di molti dispositivi embedded si è ridotto notevolmente. In tale scenario sempre più competitivo diventa quindi importante automatizzare il processo di sviluppo del software, per permettere la gestione in modo coordinato delle varie fasi del ciclo di vita del software, a partire dalla specifica funzionale fino ad arrivare al design degli algoritmi di controllo, all’implementazione, al testing ed alla calibrazione del prodotto finito. Le tecniche di avanguardia esplorate negli ultimi anni consentono la realizzazione di flussi di generazione automatica di codice che a partire da modelli “funzionali” che siano in grado di generare automaticamente il codice eseguibile da ospitare sul microcontrollore target. Tali flussi permettono di effettuare in modo semplice la calibrazione dei parametri del sistema senza avere conoscenze dettagliate di linguaggi di programmazione a basso livello quali l’assembler ed il C. L’obiettivo di questo articolo è quello di presentare un flusso completo di sviluppo software per la prototipazione rapida di algoritmi di controllo industriale, basato su strumenti open-source disponibili gratuitamente. In particolare, il flusso descritto in Figura 1 utilizza l’ambiente di analisi matematica Scilab  ed il suo ambiente di simulazione Scicos [2].

Figura .1 Il flusso di fast prototyping con Scilab/Scicos e la scheda FLEX

Figura 1. Il flusso di fast prototyping con Scilab/Scicos e la scheda FLEX

Tramite Scicos, è possibile effettuare la simulazione di sistemi complessi sia tempo continuo che tempo discreto, in modo simile a quello effettuabile su strumenti commerciali quali Matlab/Simulink. Una volta effettuata la simulazione del sistema, è poi possibile procedere alla generazione automatica del codice. Nel caso presentato in questo articolo, il generatore di codice Scicos produce un applicativo ERIKA Enterprise per piattaforma dsPIC che può essere automaticamente programmato all’interno della scheda FLEX. Come ultima fase del processo è possibile infine acquisire delle informazioni sullo stato del sistema tramite interfaccia USB della scheda Flex, per procedere ad una calibrazione, ad un controllo remoto e/o una analisi dei dati spesso denominata “Hardware In the Loop” (HIL).

L’AMBIENTE DI SVILUPPO SCILAB/SCICOS

L’ambiente di lavoro proposto da Scilab è costituito da una console testuale nella quale possono essere effettuati calcoli numerici e simbolici, utilizzando un interprete comandi con caratteristiche simili al linguaggio Basic (vedere Figura 2).

Figura 2. La finestra principale di Scilab, in cui si possono effettuare calcoli complessi e da cui può essere richiamato Scicos tramite il comando “scicos();”

Figura 2. La finestra principale di Scilab, in cui si possono effettuare calcoli complessi e da cui può essere richiamato Scicos tramite il comando “scicos();”

Tra le varie funzionalità messe a disposizione da Scilab, ricordiamo ad esempio funzioni di calcolo simbolico, integrazione e derivazione, calcolo matriciale. Dalla console di Scilab è possibile richiamare Scicos utilizzando il comando “scicos();” (vedere Figura 2). Di fatto l’ambiente di design e simulazione Scicos è implementato anch’esso nel linguaggio interno di Scilab, e pertanto deve essere richiamato come una funzione da riga di comando Scilab. L’ambiente Scicos permette l’inserimento in un design di una serie di “blocchi”.  Ciascun blocco mette a disposizione una funzione più o meno elementare. Come esempi di blocchi classici possiamo citare somme, moltiplicazioni, integrazioni o derivazioni, calcoli su matrici. Sono inoltre disponibili particolari blocchi utilizzati in fase di generazione di codice per interfacciarsi direttamente con le periferiche del dispositivo target considerato (ad esempio, esistono blocchi per PWM, LCD, convertitori A/D, ecc…). I blocchi sono raggruppati in palette; la Figura 3, ad esempio, visualizza la palette dei blocchi utilizzati per generare codice per la scheda FLEX. I blocchi comunicano tra loro tramite delle porte di ingresso o di uscita. Ad esempio, in Figura 3, ciascun blocco ha dei piccoli triangoli neri a destra (output) o a sinistra (input).

Figura 3. La palette Scicos dedicata alla scheda FLEX

Figura 3. La palette Scicos dedicata alla scheda FLEX

I vari blocchi sono connessi tramite delle linee nere, che connettono ciascuna uscita ad uno o più ingressi di altri blocchi (vedere Figura 5). I blocchi possono essere raggruppati in “superblocchi”, blocchi speciali che permettono di implementare una gerarchia di funzionalità (ad esempio, la Figura 4 contiene un superblocco; premendo con il tasto sinistro del mouse sul superblocco,  appare il suo contenuto, mostrato in Figura 5).

Figura 4. Il “superblocco” Scicos contiene un sottosistema ed è utilizzato per la generazione di codice

Figura 4. Il “superblocco” Scicos contiene un sottosistema ed è utilizzato per la generazione di codice

Figura 5. Sottosistema Scicos con una serie di semplici acquisizioni, controlli ed attuazioni

Figura 5. Sottosistema Scicos con una serie di semplici acquisizioni, controlli ed attuazioni

Tramite Scicos è possibile specificare il comportamento di un generico sistema discreto e sincrono, e per tale motivo molti blocchi (da notare che tutti i blocchi utilizzati per la generazione di codice ricadono in questa classe) hanno un triangolo rosso nella parte alta dell’icona, che viene collegato ad un oggetto orologio tramite una linea rossa (vedere Figura 4 e Figura 5). L’oggetto orologio fornisce il tempo di campionamento del sistema, che di fatto regola l’esecuzione della simulazione e controlla la generazione di codice. Di fatto sia la simulazione che la generazione di codice sono una esecuzione in sequenza dei blocchi collegati ad un orologio.

LA  SIMULAZIONE

È possibile effettuare la simulazione di un sistema disegnato con Scicos. In particolare, tramite opportuni blocchi detti “scope”,  è possibile generare un output grafico delle informazioni ad esso collegate tramite una linea nera. La simulazione di un sistema Scicos è di fatto una evoluzione del sistema discreto ottenuto campionando il sistema agli istanti di campionamento dettati dall’oggetto orologio. Eventuali parti del sistema tempo continue vengono automaticamente integrate e discretizzate da Scicos utilizzando il solver interno. Il solver interno di Scicos permette nella quasi totalità dei casi di convergere alle precisioni numeriche desiderate con i parametri di configurazione di default. Una volta effettuata la simulazione, gli output collegati all’oggetto scope vengono automaticamente visualizzati in apposite  finestre. La Figura 6 mostra ad esempio l’output del demo fornito con Scicos che simula il comportamento di un termostato (la linea verde indica la temperatura della stanza, la nera l’azione on-off del termostato).

Figura 6. Il risultato grafico di una simulazione Scicos

Figura 6. Il risultato grafico di una simulazione Scicos

LA  GENERAZIONE DI CODICE

Uno degli aspetti interessanti dell’uso di strumenti come Scilab e Scicos è la possibilità  di generare codice  per un target embedded (come ad esempio può essere fatto per la scheda Flex). L’idea alla base del processo è quella di implementare un sistema di prototipazione rapida che limiti al minimo lo sforzo di scrittura e debugging del codice applicativo una volta che l’algoritmo di controllo è stato verificato per via simulativa. A tale scopo, il generatore di codice fornito con Scicos è stato modificato alla SUPSI di Lugano in modo da renderlo più flessibile e adattabile alla generazione di codice per differenti target sia a livello di CPU che di sistemi operativi. Questo nuovo generatore, rinominato “EmbCodeGen”, richiede come input un superblocco Scicos (vedere Figura 4). A partire dal superblocco, il generatore sequenzializza i blocchi  connessi al blocco orologio, e per ogni blocco genera una funzione C. Tali funzioni vengono poi richiamate in sequenza all’interno di un task di ERIKA Enterprise attivato da un allarme collegato ad un timer  periodico  del  microcontrollore  Microchip dsPIC ospitato sulla scheda Flex. Il generatore di  codice  attualmente  disponibile per Scicos genera applicazioni con un singolo task, in cui la sequenzializzazione dei blocchi è la stessa utilizzata da Scicos durante la simulazione. Questo fatto garantisce, per sistemi a singolo task, la coincidenza tra comportamento simulato ed implementato sul target (in generale, questo non è vero per sistemi con più frequenze che generano più di un task). Il  comportamento  delle  funzioni  generate  per ogni blocco è molto semplice: ciascuna funzione infatti opera su di una struttura dati globale che mantiene i parametri del blocco  particolare, tra cui i dati di ingresso e di uscita di ciascun blocco. La funzione C di fatto non fa altro che scrivere nei dati di output i risultati ottenuti a partire dai dati di input. Successivamente alle chiamate di funzione, i dati di uscita dei blocchi attivati vengono copiati nei dati in ingresso ai blocchi collegati, In alcune situazioni, i dati di input o di output di un blocco  possono non essere utilizzati, come ad esempio rispettivamente per i blocchi di acquisizione A/D  ed  i blocchi  di  uscita  quali i PWM, che di fatto implementano l’ingresso e l’uscita verso un dispositivo di controllo (vedere Figura 3). Occorre comunque notare che il codice generato dai generatori automatici è tipicamente meno efficiente di un codice scritto “a mano” in modo ottimizzato. Nonostante questo, approcci di generazione automatica sono di fatto largamente utilizzati in settori critici, quali i sistemi aerospaziali ed automobilistici. In tali sistemi, la generazione automatica di codice è utilizzata per ridurre al minimo il tempo necessario per testare ed implementare nuove funzionalità applicative, limitando al massimo gli errori di codifica e migliorando l’efficienza del processo di produzione del software.

HARDWARE IN  THE  LOOP

La parte finale del flusso di generazione di codice si conclude con la possibilità di usufruire dei dati ottenuti dal sistema di controllo per permettere di effettuare statistiche ed analisi sui dati acquisiti direttamente sul proprio PC. Anche in questo caso Scicos viene in aiuto, proponendo la disponibilità di speciali blocchi che possono venire utilizzati per ricevere ed inviare informazioni direttamente verso il target. Nel caso della scheda Flex, ad esempio, è possibile connettere la scheda Flex ad un PC tramite la porta USB in dotazione, per permettere tramite appositi blocchi di comunicazione di visualizzare, analizzare e controllare da remoto il comportamento di un sistema di controllo. Tipiche applicazioni di questo sistema sono ad esempio la calibrazione on-site di algoritmi di controllo digitale, il monitoraggio e l’acquisizione dati remota del comportamento di un sistema di controllo, ed il cosiddetto “Hardware In the Loop”, ovvero una implementazione mista degli algoritmi di controllo che possono essere divisi tra il target (la scheda Flex) e l’host (un PC), ad esempio per implementare un controllo veloce di basso livello direttamente sul microcontrollore, lasciando la parte di pianificazione strategica ad algoritmi più lenti e complessi implementati su di un PC. In conclusione, il flusso di generazione di codice mostrato in questo articolo permette, utilizzando strumenti completamente free, di ottenere specifiche complete di un sistema di controllo a dati campionati (vedere Figura 5) lavorando solo utilizzando diagrammi a blocchi Scicos senza necessità di scrivere direttamente codice C.

 

 

Scrivi un commento

Send this to a friend