Introduzione
L'articolo si pone lo scopo di illustrare un utilizzo originale del tool MATLAB/SIMULINK rivolto ai progettisti di controlli digitali. Lo sviluppo di un sistema di controllo digitale da implementarsi su una piattaforma a microprocessore presenta il problema fondamentale di consentire la produzione di una specifica del software quanto più possibile accurata.
Il problema del "Software Engineering" cioè di una progettazione del codice quanto più possibile standardizzata e guidata da regole e metodologie quanto più possibile precise è sicuramente uno dei temi più caldi nell'ambito delle applicazioni digitali. Nel caso delle applicazioni in tempo reale stretto si fanno inoltre pressanti le esigenze di sistemi di simulazione in grado di permettere di valutare le interazioni tra il software che si sta simulando ed il sistema controllato. Si tratta di un problema non banale e che richiede un'attenta revisione del concetto di simulazione in grado di accogliere all'interno della modellistica sistemi con caratteristiche assai differenti fra loro. Gli autori presentano una loro risposta originale al problema basata su primitive MATLAB in ambiente SIMULINK dettagliando le diverse possibilità implementative della metodologia proposta. Accanto alle argomentazioni metodologiche viene poi presentato un esempio concreto di progettazione di un sistema di controllo sviluppato come applicazione. Si fa notare che l'esempio presentato non è un semplice esercizio accademico ma corrisponde ad un progetto industriale che gli autori hanno seguito da vicino e sviluppato appoggiandosi agli strumenti che verranno descritti nel seguito.
Il contesto e il problema
La fine degli anni '80 ha rappresentato per il mondo della controllistica in generale, e degli azionamenti elettrici in particolare, un momento di grande cambiamento in conseguenza del passaggio dalla tecnologia analogica a quella digitale. La tecnologia digitale ha indubbiamente determinato un salto di qualità sotto molti punti di vista migliorando elementi di grande importanza quali, ad esempio:
- realizzazione di complesse strutture di controllo
- prestazioni dinamiche;
- gestione della diagnostica di sistema;
- interfaccia utente.
Questi vantaggi che possiamo definire "esterni", perchè di interesse soprattutto dell' utente finale, hanno comunque i loro corrispettivi dal punto di vista "interno" cioè della progettazione quali, ad esempio:
- maggiore flessibilità;
- riduzione dei costi hardware (in molti casi).
Si è però nello stesso tempo aperto un nuovo fronte di problematiche relative alla gestione di un prodotto così difficile da ingabbiare in schemi ben definiti quale è il software. Si può dire che anche il mondo elettromeccanico sia venuto a scontrarsi con il cosiddetto problema della "crisi del software", cioè con la consapevolezza della necessità di un maggior rigore nel corso della progettazione e gestione di un prodotto che a prima vista esce da tutti i canoni ingegneristici tipici.
Contemporaneamente si può anche dire che l' introduzione del software ha aperto un complicato discorso di certificazione del processo produttivo dell' impresa. Si può infatti dire che il software non pone alcun problema di riproducibilità ma viceversa grossi problemi di certificazione nella fase di progetto: si sposta quindi l' attenzione dal prodotto finale al processo di realizzazione. I due problemi quindi confluiscono nella necessità di intervenire in maniera sistematica sul processo produttivo del software e in generale sulla progettazione dell' intero sistema come interazione hardware-software per giungere a una procedura di specifica che tenga conto delle esigenze ora illustrate. Tale situazione ha avuto il suo precedente storico nel settore dello sviluppo dei sistemi informativi, e la conseguenza è stata la nascita di una disciplina che si propone proprio come scopo quello di dare un volto ingegneristico al software e che proprio per questo prende il nome di "ingegneria del software" (SE "Software Engineering" d' ora in poi). Va però precisato che l'applicazione di nostro interesse presenta caratteristiche peculiari che fanno sì che le tradizionali metodologie proposte dall' ingegneria del software non siano sufficienti a risolvere il problema: è viceversa necessario concentrarsi sui più recenti studi dedicati proprio alle applicazioni in tempo reale cioè a quelle applicazioni in cui la correttezza del software dipende anche dal tempo di esecuzione delle routine.
In realtà, comunque, si può dire che la nascita del "problema software" non ha fatto altro che acuire delle problematiche che già erano presenti nella progettazione di un azionamento elettrico. Si può infatti dire che il problema fondamentale sia l'interdisciplinarietà che sta alla base della progettazione di questo settore.
Come è anche sottolineato dalla figura 1, infatti, l' azionamento elettrico è il risultato di un insieme di competenze che devono trovare il miglior modo di collaborare per poter giungere a un prodotto veramente affidabile e di qualità.
Si possono infatti individuare le seguenti competenze specifiche:
- progettista di sistema (tipicamente un ingegnere elettrico o elettromeccanico)
- progettista di elettronica di potenza
- progettista meccanico
- progettisti elettronico (microelettronica)
- progettista software.
Un problema fondamentale quindi risulta essere quello di individuare un linguaggio comune per favorire la collaborazioni tra le parti. L' ingegnere elettrico, d' altra parte, si può inserire con diverse responsabilità all' interno del progetto dell' azionamento e in particolare può anche trovarsi nel ruolo di progettista di sistema e quindi ad avere il difficile ruolo di coordinatore. Partendo da queste considerazioni di base si è svolto il cammino di ricerca che verrà illustrato nel seguito del lavoro e che in definitiva si è riproposto di arrivare ad una metodologia basata sull'ambiente MATLAB che permette di integrare specifica software e simulazione di sistema allo scopo di condurre una prima significativa fase di test. Va inoltre sottolineato che proprio nell'ottica di poter verificare passo passo il lavoro di progetto una grossa parte del lavoro è stata dedicata a una attività di modellizzazione del sistema azionamento che consentisse una simulazione affidabile di tutte le sue parti sia elettromeccaniche, sia hardware che software. Si è così arrivati a teorizzare e realizzare un ambiente di simulazione per gli azionamenti elettrici che consente la rapida verifica di prestazioni e quindi il rapido confronto di diverse opportunità realizzative.
La struttura base dell'applicazione
Nell'ambito della problematiche poste si è arrivati a strutturare una proposta di ambiente di lavoro basato su SIMULINK in grado di fornire due risposte fondamentali:
- da un lato garantire la disponibilità di una ricca libreria di strumenti che permettessero al progettista del controllo di comporre la struttura del sistema controllato partendo da
"mattoni elementari" precostituiti
- dall'altro fornire una serie di regole pratiche per arrivare ad un'interfacciamento della specifica software con il sistema controllato simulato in SIMULINK.
Nel seguito della presentazione verranno illlustrate quindi nell'ordine la libreria di strumenti di simulazione da considerarsi come estensione della tipica libreria di SIMULINK, le regole per l'interfacciamento alla simulazione delle routine di controllo in corso di sviluppo ed, un esempio applicativo della metodologia.
MATLAB e la libreria "AZIO" come guida alla progettazione
L'ambiente SIMULINK, interfaccia per sistemi di controllo di MATLAB, mette a disposizione per lo sviluppo di simulazioni un elevato numero di "blocchi" di fondamentale importanza e di utilizzo generale. E' così possibile disporre, come è noto, di blocchi lineari, non lineari, tempo continui o tempo discreti. Per operare in uno specifico settore risulta tuttavia coveniente arricchire il sistema con un insieme di blocchi caratteristici del settore in questione. In questo caso ci si concentra sulla possibilità di simulare azionamenti elettrici. Un primo modo di operare per arricchire la libreria è creare blocchi come composizione di blocchi forniti con il software standard: attraverso l' operazione di Group & Mask: la composizione diventa completamente trasparente per l' utente al quale il nuovo blocco si presenta esattamente come un blocco di libreria standard con una maschera per l' inserimento dei parametri e una di Help.
L' ambiente fornisce poi altri metodi di arricchimento della libreria e cioè:
- MEX file
- MATLAB function scritte nel linguaggio di MATLAB
Allo stato attuale la libreria Azio, composizione dei blocchi sviluppati per lo studio di controlli per azionamenti, è articolata in ulteriori sottolibrerie:
- motori
- carichi meccanici
- convertitori
- trasformate di coordinate
- algoritmi di regolazione fondamentali.
Nell' ambito delle sottolibrerie si possono poi individuare i seguenti blocchi:
- Motori
- motore cc a magneti permanenti
- motore cc a eccitazione indipendente
- motore asincrono
- motore sincrono con eccitazione indipendente
- motore asincrono a doppia stella
- motore sincrono brushless sinusoidale
- motore a riluttanza
- Carichi meccanici
- inerzia pura
- inerzia più coppia resistente proporzionale alla velocità
- inerzia più coppia resistente proporzionale al quadrato della velocità
- Convertitori
- chopper senza limiti in frequenza
- chopper con limite max. sulla frequenza di commutazione
- inverter monofase a due livelli
- inverter monofase a tre livelli
- inverter trifase a due livelli
- inverter trifase a tre livelli
- ponte di Graetz
- Trasformate di coordinate
- Trasformata di Park
- Trasformata di Park inversa
- Algoritmi di regolazione
- PI digitale con saturazione dell' uscita
- Ricostruttore di flusso per macchina asincrona
- Controllo V/Hz
Tale elenco è comunque in continua evoluzione avendo come scopo finale quello di arrivare a coprire il più possibile le varietà di componenti per gli azionamenti.
Si passa ora al dettaglio di come sono stati implementati i vari modelli delle librerie.
- Modelli di motori
Le teoria della dinamica delle macchine elettriche fornisce l'insieme di equazioni differenziali utili per la costruzione del modello di simulazione. Partendo dalla conoscenza di queste equazioni è abbastanza semplice arrivare a costruire una S-function per MATLAB. Si dovranno definire:
- variabili di ingresso
- variabili di uscita
- variabili di stato
- equazioni di stato
- relazioni tra le variabili di stato e le varibili di uscita.
La descrizione può essere agevolmente svolta in linguaggio M o viceversa costruendo una S-function in C da integrare come Mex File.
Seguendo la prima strada si arriva a uno schema SIMULINK quale quello riportato nella figura successiva:
![[FORMULA]](monti_a.gif)
Nel caso in esame poi, cioè modello di un motore asincrono, la descrizione dei legami matematici può essere fatto con un file m quale quello riportato di seguito.
function [sys,x0] = asi(t,x,u,flag,mec,stat,rot,ic)
% input
% u(1) omega s (velocita assi Park f(t) )
% u(2) Vds
% u(3) Vqs
% u(4) Cr (carico meccanico f(t) )
% stati (flussi)
% x(1) Fds
% x(2) Fqs
% x(3) Fdr
% x(4) Fqr
% x(5) omega
% parametri
npoli=mec(1);
J=mec(2);
Rs=stat(1);
Ls=stat(2);
M=stat(3);
Rr=rot(1);
Lr=rot(2);
D=Ls*Lr-M*M;
if abs(flag)==1,
Ids=(Lr*x(1)-M*x(3))/D;
Idr=(-M*x(1)+Ls*x(3))/D;
Iqs=(Lr*x(2)-M*x(4))/D;
Iqr=(-M*x(2)+Ls*x(4))/D;
Ce=(npoli*M/D)*(x(2)*x(3)-x(4)*x(1));
sys(1)=([-Rs*Ids+u(1)*x(2)+u(2)]);
sys(2)=([-Rs*Iqs-u(1)*x(1)+u(3)]);
sys(3)=([-Rr*Idr+(u(1)-x(5))*x(4)]);
sys(4)=([-Rr*Iqr-(u(1)-x(5))*x(3)]);
sys(5)=([(npoli/J)*(Ce-u(4))]);
else if flag==0,
sys=[5;0;4;4;0;0];
x0=ic;
else if flag==3,
sys(1)=(Lr*x(1)-M*x(3))/D;
sys(2)=(Lr*x(2)-M*x(4))/D;
sys(3)=(npoli*M/D)*(x(2)*x(3)-x(4)*x(1));
sys(4)=x(5);
else
sys=[];
end
end
end
- Modelli dei convertitori
La simulazione della parte convertitore costituisce il caso più complesso da considerarsi ancora in istudio per verificare diverse possibilità.
Supponendo di considerare comunque modelli di valvole ideali si arriva a formulare due diverse ipotesi:
- integrare la commutazione delle valvole all'interno del modello della macchina arrivando così a un modello di motore con convertitore già collegato che riceve come ingresso lo stato da attribuire agli interruttori. Si tratta di un approccio interessante, che consente tra l' altro di approfondire le problematiche di modellizzazione delle valvole.
- un modello separato del convertitore che permette di creare un blocco dedicato alla logica di commutazione delle valvole che genera in uscita le tensioni applicate al motore. Si tratta di un modello più semplice del precedente ma anche in generale più rapido come integrazione.
Nel caso della libreria in esame sono state seguite entrambe le filosofie arrivando a diverse soluzioni ciascuna utilizzabile con diversi vantaggi a seconda dell'applicazione.
Nella figura seguente è riportato lo schema SIMULINK di un inverter trifase con pilotaggio del PWM con metodologia a sottoscillazione sinusoidale.
- Modelli della parte meccanica
Per questa porzione di sistema si possono ripetere considerazioni già fatte in parte per i motori. Spesso per la parte meccanica si utilizzano addirittura modelli lineari o linearizzati e quindi si può dire che l'ambiente MATLAB mette a disposizione due diverse soluzioni:
- equazioni di stato come nel caso del motore
- modelli basati su sistemi rappresentati con funzioni di trasferimento in Laplace
- Controllori digitali
Oltre a sfruttare i blocchi standard di SIMULINK basati sulla trasformata Z si possono pensare soluzioni diverse che tengano conto delle non linearità tipiche del software di utilizzo nei controlli reali.
Un semplice esempio può essere utile. Si consideri la seguente routine:
![[FORMULA]](monti_c.gif)
Considerando questo semplice esempio si può facilmente verificare che non esiste una trasformata Z della logica della funzione.Non è quindi possibile dare un modello basato su blocchi standard per questo sistema. Allo scopo è stata sviluppata una logica di interfaccia tra SIMULINK e routine di sviluppo dell'utente per facilitare la specifica di sistemi di controllo digitale.
- La specifica di routine di controllo e AUTOC
Uno dei problemi fondamentali della modellistica è quello di avere modelli il più possibile vicini alla realtà. Nel caso delle routine per il controllo la cosa migliore sarebbe quindi proprio quella di poter utilizzare in simulazione la medesima routine da utilizzarsi poi per il controllo in tempo reale.
L' utilizzo di un linguaggio ad alto livello come il "C" garantisce, entro certi limiti, una buona portabilità del codice e quindi la possibilità di pensare il codice indipendentemente dalla macchina su cui si implementa. Questa constatazione ha fatto nascere l'idea di poter implementare in MATLAB le routine che si pensa poi di portare sul target.
D'altra parte anche il linguaggio m di MATLAB costituisce un interessante esempio di linguaggio ad alto livello utile per documentare le routine di controllo. Si sono studiati quindi due problemi:
- creare una procedura rapida per la compilazione di routine scritte dall'utente
- creare un interfaccia standard per l'esecuzione di queste routine o di analoghe routine scritte in file m in ambiente SIMULINK.
Il tool Autoc permette di acquisire un programma "C" e trasformarlo in un comando MATLAB da utilizzarsi per l' ambiente SIMULINK.
L' ingresso di questo programma è una qualsiasi funzione C che ammette in ingresso un numero qualunque di parametri e che restituisce poi al termine una variabile. Come si vede all' interno di questa categoria rientrano praticamente tutte le routine di controllo tipiche che in base a determinati ingressi producono un' uscita. La limitazione di avere una sola uscita è da considerarsi transitoria e verrà rimossa nella prossima versione del tool al fine di comprendere una famiglia ancor più vasta di routine. Grazie al lavoro finora svolto è possibile quindi seguire il seguente iter nello sviluppo di un nuovo "blocco" per il controllo:
- studiare l' algoritmo in maniera non formale arrivando quindi poi a una codifica puramente matematica
- traduzione dell' algoritmo in linguaggio C
- utilizzo di Autoc per ottenere automaticamente il file di tipo DLL (libreria di link dinamico per Windows) che è già a tutti gli effetti un comando di MATLAB
- realizzazione del blocco da usare in simulazione in ambiente SIMULINK per verificare l' efficacia della routine richiamando il file DLL precedentemente ottenuto. Anche per questa parte del processo si sta lavorando a una procedura di automazione; allo stato attuale esiste una versione prototipale del programma, non ancora completamente testata, e che dovrebbe essere denominata "Mkm". Il concatenamento automatico delle due fasi non comporta alcun problema. Una volta completata questa parte del lavoro si avrà la possibilità di passare direttamente dal file C all' icona in ambiente SIMULINK da utilizzare per la simulazione.
- test della routine con SIMULINK
L' importanza di questo approccio è quella di creare una corrispondenza biunivoca tra blocchi di SIMULINK e software di controllo da utilizzare sul target così da poter contare su una simulazione il più possibile affidabile e una coerenza che può essere definita completa tra la fase di simulazione del controllo, la specifica software e la codifica finale. Si passa quindi al problema dell'interfacciamento della DLL ottenuta con Autoc o di una generica routine scritta in linguaggio M con l'ambiente SIMULINK. Tale analisi verrà svolta attraverso la guida di un semplice esempio.
Il primo passo è chiaramente la scrittura della routine in linguaggio C:
![[FORMULA]](monti_d.gif)
In altre parole questa funzione somma l'ingresso y alla variabile di stato x fino a che non raggiunge il valore di saturazione sat per poi resettare lo stato. La routine viene scritta con un normale editor e memorizzata in un file denominato "proinc.c". Attraverso il programma Autoc si passa alla produzione della DLL "incr.dll". A questo punto si ottiene un nuovo comando per MATLAB denominato incr. E' possibile richiamare la funzione a livello di Command Window e verificare il funzionamento per diversi valori degli ingressi. Il protocollo di chiamata sarà:
[u] = incr[a]
dove a è il vettore degli ingressi e u quello delle uscite. Il vettore degli ingressi sarà così composto:
- x: variabile di stato
- y: ingresso
- sat: valore di saturazione
Nel primo elemento del vettore delle uscite si trova il nuovo valore dello stato. Ora il problema è sviluppare un'interfaccia verso SIMULINK che garantisca che la routine si comporti come ci si aspetta e cioè che venga eseguita una volta ogni tanto con un periodo fissato dall'utente pari al tempo di scheduling che si intende fissare sul sistema target. In definitiva si vogliono modellizzare due aspetti:
- una routine software deve essere chiamata con una precisa frequenza che generalmente è diversa dal passo di integrazione della simulazione
- l'uscita della routine software non diviene immediatamente disponibile ma si deve attendere un tempo pari al tempo di elaborazione del microprocessore target.
Allo scopo di modellizzare questi due aspetti è stata sviluppata un'opportuna interfaccia MATLAB. Si supponga che la routine sia stata eseguita all'istante tk: si deve ora aspettare tk+1 tale che:

dove Tc è il tempo di ciclo della routine.
L'uscita della funzione deve inoltre essere prolungata secondo la relazione qui riportata:

Questa logica è stata integrata in un M file collegato poi a SIMULINK attraverso lo schema riportato nella figura seguente dove si possono anche notare i parametri che l'utente potrà fissare dall'esterno con una tipica maschera SIMULINK. Il blocco di ritardo analogico riportato in uscita serve per poter inserire il tempo di elaborazione come parametro di simulazione da sottoporre a verifica.
Figura 2 -
Figura 3 -
Figura 4 (immagine di 16kb)
Un'altra possibile soluzione, effettivamente adottata in molte situazioni come si vedrà anche nel seguito, prevede di sostituire le retroazioni dirette dell'uscite con l'utilizzo di variabili global.
|