aplicatii de conducere in timp real

Upload: stan-iulian

Post on 12-Jul-2015

137 views

Category:

Documents


1 download

TRANSCRIPT

Structura software a aplicatiilor de conducere in timp realRaport -

Cuprins: 1. Notiunea de timp real; 2. Structuri de aplicatii de timp real; (dependente de arhitectura hardware - sisteme mono si multiprocesor) 3. Sisteme de operare pentru aplicatii software de timp real; 4. Limbaje de programare/dezvoltare si implementare a Apl. Soft. de TR 5. Implementarea unor drivere de achizitie; 6. Implementarea unor sisteme distribuite de conducere. Functiile unui program de monitorizare (SCADA); 7. Implementarea unei aplicatii de conducere la distanta; 33 16 17 21 26 2 4

Bibliografie

37

1

1.

Notiunea de "Timp Real"

Diferenta esentiala dintre o aplicatie oarecare de calcul sau de proiectare si una de timp real este data de modul de utilizare a timpului pentru asigurarea functiilor de control in raport cu timpul in care evolueaza procesul [9], [27]. Un program de conducere implementaza o serie de algoritmi cum sunt cei de identificare, de calcul al comenzii ce depind in mod esencial de alegerea si utilizarea perioadei de esantionare Te in mecanismele sistemului numeric [8]. Nerespectarea cu strictete a valorii perioadei de esantionare duce la reducerea sau chiar anularea performantelor sistemului pe care se implementeaza acesti algoritmi oricat de complex si/sau performant ar fi acesta ! Pentru un program software perioada de esantionare este echivalenta cu lansarea in executie a procedurilor respective la un interval de timp bine precizat si respectarea acestuia indiferent de evenimentele care pot apare. Figura 1.1 prezinta acest aspect:Lansare operatii de achizitie, calcul comanda etc.

Te

2Te

3Te

4Te

5Te

t

Fig. 1.1 Lansarea in executie a operatiilor dependente de perioada de esantionare Te

In general, din punct de vedere cronologic, prima operatie care este declansata este cea de achizitie a datelor din proces, celelalte operatii, printre care se numara si cele de identificare, calcul de comanda etc. fiind dependente de datele furnizate de prima. Un aspect important ce nu trebuie scapat din vedere este timpul necesar executarii operatiilor dintre doua momente de esantionare si care reprezinta timpul total necesar operatiilor de achizitie, identificare, calcul de comanda etc. Acesta trebuie sa fie strict mai mic decat cel al perioadei de esantionare, depasirea sa ducand la nerespectarea conditiilor de functionare in timp real. Din punct de vedere grafic, acest aspect poate fi reprezentat conform figurii 1.2. Daca acest deziderat nu poate fi realizat este necesara o regandire a ansamblului hardware software. Am accentuat acest aspect pentru a scoate in evidenta necesitatea utilizarii unor algoritmi rapizi din punctul de vedere al operatiilor efectuate. Realizarea unui mecanism de lansare a unor operatii la un interval de timp bine determinat depinde in general de sistemul de operare si de mediul de dezvoltare al aplicatiei.

2

Start operatii de achizitie, calcul comanda etc.

Stop operatii de achizitie, calcul comanda etc.

t nTe (n+1)Te

Fig. 1.2 Durata procedurilor lansate la fiecare moment de esantionare comparativ cu cea a perioadei de esantionare

Alegerea unei perioade de esantionare se face in functie de constantele de timp ale procesului fizic si de semnalele achizitionale dun proces, corespunzatoare marimilor fizice urmarile presiuni, temperatura, acceleratii, viteze, pozitii nivel etc.

3

2. Structuri de aplicatii de timp real; (dependente de arhitectura hardware - sisteme mono si multiprocesor)In functie de complexitate sau/si de importanta, aplicatiile de timp real pot fi implementate pe mai multe tipuri de structuri hardware de conducere. Acestea au la baza unul sau mai multe procesoare. Pentru aplicatiile cu multe cicluri repetitive si care nu necesita algoritmi de conducere complicati pot fi utilizate structuri gen automat programabil (AP sau PLC), sau gen microcontroller (embedded). Structurile de acest gen au in general un singur procesor (logica de control). Pentru aplicatiile deosebit de complexe [10], [6] unde sunt necesari algoritmi deosebiti, resurse importante de memorie si de calcul, bazandu-ne pe descompunerea problemei in mai multe subprobleme interdependente se poate alege o structura multiprocesor, intalnita in special, in cazul calculatoarelor de proces. Uneori, daca subproblemele pot fi separate total total independente, din motive de fiabilitate se poate alege o structura compusa din mai multe PLC-uri sau microcontrollere, conectate intre ele intr-o retea. Structura aplicatiilor (software) este strict dependenta de arhitectuta hardware utilizata. Prezentam in continuare cateva din situatiile existente.

Structuri monoprocesor:Automate programabile (AP sau PLC); Un AP sau PLC luceraza intr-o bucla continua (infinita). Pot fi diferentiati 3 pasi impotranti in aceasta bucla. In realitate sunt mai multi de 3 dar ne vom concentra pe acestia [29]. (Ca exemplu pentru alti pasi putem considera verificarea functionarii sistemului in sine, actualizarea counter-ului intern - ceasul de garda si a timpului/datei). Pasul 1 - Verificarea starii intrarilor se verifica fiecare intrare si se determina daca este ON sau OFF iar resltatele sun scrise in memorie. Pasul 2 executie program in functie de valorile intrarilor sun executate instructiunile programului/programelor Pasul 3 actualizarea iesirilor contactele, tensiunile sau curentii iesirilor fizice sunt setate la valorile corespunzatoare celor setate din program Dupa cel de-al treilea pas lucrurile se reiau de la pasul 1. O scanare completa este definita ca timpul necesar parcurgerii celor trei pasi. Figura 2.1 ilustraza schema unui ciclu pe un automat programabil.

Fig. 2.1 Desfasurarea unuei aplicatii pe un AP sau PLC

4

Calculatoare de proces; Principiile construirii si implementarii unor programe cu functionare in timp real Implementarea unui program cu functionare in timp real se bazeaza, in marea majoritatea situatiilor, pe doua elemente functionale: un mecanism de lansarea unor operatii ciclice la un inreval bine determinat de timp (perioada de esantionare) si o bucla program infinita. Lansarea unor operatii ciclice Vom reveni la modul de realizare a unui mecanism de lansare a unor operatii la un interval de timp bine determinat si ne vom referi in special la metoda de realizare bazata pe intreruperi [8]. Aceasta abordare este preferata deoarece acesta este mai generala. Situatia este intalnita in cazul in care sistemul de operare lipseste sau este o versiune de MSDos. Daca in acest caz se poate realiza o aplicatie, trecerea la un echipament cu sistem de operare si de dezvoltare in care aceste facilitati sunt deja oferite nu poate fi decat o simplificare. Sintetic, intreruperile sunt semnale ce sunt trimise procesorului sau sistemului central, la aparitia unor evenimente hardware sau software si care, determina in functie de prioritatea acordata, suspendarea actiunilor curente ale procesorului sistemului si lansarea in executie a unor functii specifice denumite functii de tratare a intreruperii. Cea mai buna exemplificare de intrerupere pentru sistemele de tip PC sunt intreruperile de ceas (0x1C h) (0x08 h) ce apar la fiecare 55 de milisecunde. Aceaste fac parte din clasa intreruperilor rezervate utilizatorului si pot fi folosite cu usurinta la realizarea unui mecanism de lansare ciclica a unor operatii. In stadiul initial functia de tratere nu executa nimic fiind compusa dintr-o singura instructiune (scrisa in limbaj de asamblare) de tip iret. Realizarea mecanismul de lansare ciclica presupune pentru inceput scrierea unei noi proceduri de tratare a intreruperii, care in limbajul C standard de forma urmatoare: void interrupt new_intr(void) { contor++; } Elementul central al acestei functii simple este constituit de variabila contor care este incrementata la fiecare aparitie a intreruperii. In realizarea clasica a unui program, anterior instalarii noii functii de tratare a intreruperii se salveaza continutul vechiului vector de intrerupere conform urmatoarei secvente, scrisa tot in limbajul C: #define INTR 0x08 // declararea unui pointer catre un vector de intrerupere void interrupt(*old_intr)(void); // declararea noului vector de intrerupere

5

void interrupt new_intr (void) { contor++; } void main() { // salvarea vechiului vector de intrerupere old_intr =getvect( INTR); // instalarea noului vector de intrerupere setvect( INTR, new_intr); } In cazul unui echipament in care sistemul de operare impreuna cu mediul de dezvoltare sunt mai evoluate lucrurile se desfasoara similar si mult mai intuitiv. Spre exemplificare vom prezenta sectiuni dintr-un program de conducere dezvoltat in mediul LabWindows/CVI al firmei National Instruments [30] ce are sistem de operare Windows (NT, XP sau 2000). Ideea de baza consta in instalarea unui eveniment ce apare intr-un mod asemanator unei intreruperi si a unei functii ce va fi apelate pentru tratarea evenimentului. Atat evenimentul cat si functia sunt instalate intr-un mod explicit si usor de inteles. . // declararea prototipului functiei de tratare a evenimentului int GetData( int panel, int control, int event, void *callbackData, int eventData1, int eventData2); . main() { char x; handle = LoadPanel (0, "ad_mm_30.uir", BI); //instalarea interfetei grafice DisplayPanel (handle); . // setarea perioadei de aparitie al evenimentului SetIdleEventRate (100); // instalarea functiei de // tratare al evenimentului InstallMainCallback (GetData,(void *)&x , 1); RunUserInterface(); } // end main // declararea functiei de tratare a evenimentului int GetData(int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { .

6

if(event==EVENT_IDLE) { // procedurile ciclice } } Functia descrisa anterior pentru tratarea evenimentului poate fi apelata si cu alte evenimente, de aceea pentru a face distinctia intre acestea si cel periodic (EVENT_IDLE) care ne intereseaza, trebuie facut un test corespunzator ( if( event == EVENT_IDLE ) ). Nu voi insista mult asupra acestor aspecte deoarece ele tin mai mult de particularitatile mediului de dezvoltare LabWindows/CVI. Implementarea programului principal Am vazut pana acum modalitatea de realizare si instalare a unei functii care este apelata la un interval de timp bine determinat. Aceasta nu este suficienta pentru realizarea unui program de conducere in timp real. Ceea ce lipseste este programul principal. Filozofia de constructie a acestuia este de a realiza si/sau lansa o bucla infinita din care iesirea se face la aparitia unui eveniment special sau la inchiderea aplicatiei. Figura 2.2 expliciteaza in mod grafic aceasta constructie:Intrare in bucla infinita

Operatiuni ciclice bucla infinita a programului

Conditie de iesire din bucla DA

NU

Iesire din bucla infinita Fig. 2.2 Bucla infinita a programului principal

7

Pentru un program scris in C standard (Turbo C 2.0) bucla infinita este implemenata utilizand structurile de tip do-while sau while astfel: char c; void main() { do{ c='1'; if(kbhit()) c=getch(); }while(c!='q'); Dupa intrarea in structura do-while (care implementeaza bucla infinita) iesirea nu se poate realiza decat prin apasarea tastei q (quit). In interiorul buclei se testeaza daca s-a apasat cumva o tasta si daca da, se citeste valoarea acesteia. Fara acest test iesirea din program nu mai este posibila decat prin resetarea aplicatiei. In cazul unei aplicatii realizate in Lab Windows/CVI lansarea interfetei utilizator realizata prin apelarea functiei RunUserInterface() duce la intrarea automata intr-o bucla infinita din care se poate iesi doar prin incheiderea aplicatiei prin apelul functiei QuitUserInterface(0). Programul principal luat ca atare nu poate asigura facilitatile de timp real necesare. Principala cauza este timpul de executie al procedurilor ciclice (achizitie, calcul de comanda etc.) care este de foarte multe ori variabil si puternic dependent de structura hardware a sistemului. Prin combinarea facilitatilor oferite de intreruperi si a celor de bucla infinita se poate realiza un program care sa raspunda cerintelor. Legatura intre cele doua este realizata in modul urmator: in bucla infinita a programului principal este testata valoarea contorului incrementat in functia de tratare a intreruperii. In momentul in care valoarea acestuia devine egala sau mai mare decat o valoarea stabilita, se reseteaza contorul si se lanseaza in executie operatiile ciclice. De exemplu, pentru un program ce ruleaza in sistemul de operare MSDos, utilizand intreruperea de ceas 0x1C H, daca se doreste o perioada de esantionare de o secunda, valoarea contorului va fi resetata atunci cand valoarea acestuia este mai mare sau egala cu 18 (18 x 55 ms = 1 s). Secventa de cod corespunzatoare testarii si resetarii contorului poate fi urmatoare: if(contor>=18) { contor=0; // lansare si executie operatii ciclice

8

} Garantia ca perioada de esantionarea este respectata fara a exista pericolul modificarii in functie de complexitatea calculelor procedurilor ciclice este data de faptul ca functia de tratare a intreruperii are o prioritate mai mare decat programul principal. Pentru un program scris in Lab Windows/CVI testarea si respective resetarea contorului pentru aceeasi perioada de 1 secunda se realizeaza astfel: int GetData(int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { if(event==EVENT_IDLE) { // incrementare contorTe contorTe=contorTe+0.1; // bucla de reglare if(contorTe>=Te) { // resetarea contorului contorTe=0.0; } } } Concentrand toate aspectele prezentate, forma generala a unui program de conducere bazat pe intreruperi scris in pseudo-cod este urmatoarea: // parte declarativa main() { //operatii de initializare init(); // salvare vechi vecror de intrerupere si instalare vector nou old_intr =getvect( INTR); setvect( INTR, new_intr); // intrare in bucla infinita do { // tratare evenimente datorate apasarii unor taste etc. // test contor if(contor>=18) { // resetare contor

9

contor = 0; // lansare proceduri ciclice achizitie(); comanda(); // afisare grafica afisare(); } // end test contor }while (conditie_de_iesire) //operatiuni de dupa iesirea din bucla infinita // restaurarea vechiului vector de intrerupere setvect( INTR, old_intr); } // end main() Transformarea acestui exemplu intr-un program real este foarte rapida si facila. Arhitecturile hardware recomandate pentru utilizarea programelor descrise pot fi de tipul urmator: PC (eventual industrial) + placa/placi de achizitie; sisteme numerice dezvoltate in jurul unor procesoare de tip microcontroller (de exemplu familia 80xC552, INTEL XA3). Prima structura este adecvata in special, aplicatiilor de laborator, cu un numar redus de parametrii, iar a doua atat pentru aplicatiile de laborator, dar mai ales pentru cele industriale, unde numarul parametrilor nu depaseste 100.

Microcontrollere (& embedded systems) Elementele prezentate pentru dezvoltarea aplicatiilor de timp real pentru sistemele de tip calculator de proces sunt valabile si pentru sistemele cu microcontrollere (embedded systems). Nu le vom mai relua.

Structuri multiprocesor:Calculator de proces; Si pentru acest tip de stuctura sunt valabile mecanismele prezentate mai inainte (cele pentru calculator de peroces). Suplimentar si an mod imperativ, pentru structurile multiprocesor [23], [324], [25] sunt necesare mecanisme specifice aplicatiilor multithread. Aplicatiile de tipmultithread sunt utilizabile si pe structuri monoprocesor sau in cazurile in care numarul de tascuri este mai mare decat nimarul de procesoare, insa rularea in paralel a thread-urilor este doar o iluzie (fog. 2.4), aceasta fiind reala doar in cazul multiprocesor. Vom detalia in continuare cateva din aceste aspecte.

10

Aplicatii multi thread. Introducere Comparativ cu programarea secventiala unde se intalnesc urmatoarele caracteristici: Nu se impun restrictii asupra timpului, resurselor etc. Programul functioneaza ca un filtru (fig. 2.3); Evolutia depinde doar de datele de intrate;

Date de intrare

Program secventialFigura 2.3: Schema de evolutie a unui program secvential

Date de iesire

Aplicatiile multithread se caracterizeaza prin executia in paralel a doua sau mai multe fire de executie (thread-uri) [9]. Acestea pot fi independente insa, in majoritatea situatiilor, comunicand intre ele date. Programare multi tasking (multi-thread)

Figura 2.4: Schema de evolutie a unui program multi task-ing (a) Efect macroscopic-dorit si obtinut pe o structura multiplocesor cu un nr. suficient de procesoare, (b) divizarea timpului procesorului (procesoarelor)

11

Elemente de baza Stari ale task-urilor Removed suspendat este prezent pe disc, gata sa fie incarcat in RAM; Waiting in asteptare este in asteptarea unor evenimente externe (transfer de date I/O, introducere de date de la tastatura, intrerupere externa) sau interne (un anumit semnal de la alt task); Ready gata- task-ul poate fi executat in orice moment in care procesorul este liber; Running in executie tascul curent ce este executat de procesor;

Figura 2.5: Starile si tranzitiile unui task

1.

Tranzitiile sau operatiile posibile sunt urmatoarele: Din removed in ready procesul este incarcat de pe disc in memoria RAM, cu realocarea tuturor adreselor relative si atribuirea zonei de lucru (cod, date, heap, stiva);

Figura 2.6: Zona de lucru a unui task (program)

12

2. 3. 4.

5.

6.

din ready in running task-ul este selectat de planificator sa ruleze si este atribuit procesorului controlul asupra acestuia; din running in ready - inversarea situatiei 2 cand se face comutarea pentru ca un alt task mai prioritar in acel moment, sa aiba posibilitatea de a fi rulat; din running in waiting task-ul intra intr-o stare de asteptare fie a unui eveniment axtern, fie a unei operatii de I/O mai lenta, sau pentru a astepta o anumita perioada de timp, conform unei instructiuni specifice; din waiting in ready cand evenimentul asteptat s-a produs sau cand perioada de timp (de asteptare) a expirat, task-ul nu este imediat executat dar este pos in starea de ready. Planificatorul va determina mai tarziu cand procesul poate fi executat; din ready in removed cand apare o instructiune de tip end; sistemul de operare poate elimina task-ul din memoria centrala. Alte elemente utlizate: Semafoare, Liste, Cozi, Buffere, Cutii postale etc [9]. Semafoare: Sunt variabile intregi ce pot avea doar valoarea 0 sau 1 (sau o alta valoare pozitiva). Au o anumita stare initiala. Semafoarele care iau doar valorile 0 si 1 se mai numesc si semafoare binare. Au fost propuse de Dijkstra (1968) ca proncipiu de baza al sincronizarii. Buffere (eventual circulare): Elemente deosebit de importante (si elegante) utilizate in general pentru schimbul de date intre doua sau mai multe task-ri. Sunt de fapt niste zone finite de memorie. Aplicatii utilizand aceste elemente se gasesc in special in zona comunicatilor unde vitezele de transmitere pot fi variabile. Le sunt asociate notiunile de task producator si task consumator.

Figura 2.7: Schema unui buffer circular

13

Cutii postale (mailboxes): Este o lata modalitate de a realiza schimbul de date si sincronizarea a doua sau mai multe procese. Sunt structuri de date orientate spre mesaje ce pot fi depozitate si ridicate.

Figura 2.8: Schema unei cutii postale

Programarea multi-thread Un program multi-thread este un program in care sunt executate in acelasi timp mai mult de un thread. Un program single-thread are doar un singur thread, denumit si thread proncipal (main thread). Sistemul de operare creaza thread-ul principal atunci cand utilizatorul comanda respectivului sistem de operare inceperea executiei unui program oarecare (de ex. prin efectuarea unui dublu clik pe o iconita). In mod impicit, sistemul de operare cauta functia main sau WinMain, dupa care incepe executia efectiva a acesteia. In programarea multi-thread programul (in sine) comanda sistemului de operare sa creeze thread-uri suplimentare fata de main. Aceste thread-uri suplimentare se mai denumesc si thread-uri secundare. Diferenta majora intre thred-urile secundare si cel principal (main) este momentul in care acestea isi incep actiunea. Utilizatorul specifica momentul in care un thred secundar isi incepe actiunea, spre deosebire de thred-ul principal ce ce isi incepe actiunea, intotdeauna cu functia main. Intr-o aplicatie muti-thred sistemul de operare permite fiecarui thread executia sectiuni proprii de cod, dupa care este comutat cu alt thread. Perioda de timp pe care sistemul de operare o aloca unui anumit thread se numeste (time-slice) sectiune de timp. Operatia sistemului de operare de oprire a unui thred si de activare a altuia se numeste comutare de thred-uri thred-switch. In mod uzual, un sitem de operare ofera posibilitatea comutarii thred-rilor foarte rapid ceea ce da senzatia executiei concurente a mai multor thread-uri in acelasi timp. Argumente pentru alegerea unei solutii multi-thread Pot fi formulate patru argumente majore pentru alegerea unei solutii multi-thread in constructia unui program cu functionare in timp real.

14

A: Cel mai intalnit motiv de separare a unei aplicatii in mai multe task-uri este acela in care timpul de executie al unor anumite operatii este o conditie critica a bunei functionari a intregii aplicatii. De exemplu: Un program ce realizeaza achizitia unor date si are si o interfata utilizator, este un bun motiv de a fi organizat astfel (multi-thread). In acest program, achizitia datelor este un task in care timplul este o resursa critica si poate fi influentat in mod negativ de actiunile asupra interfetei utilizator. Utilizarea unei solutii ce se bazeaza pe un singur thread, in general executa: operatie de extragere (call to pull) a datelor din buffer-ul placii sau dispozitivului de achizitie, afiseaza grafic datele pe interfata utilizator, proceseaza evenimetele ce permit modificarea parametrilor interfetei utilizator.

Daca utilizatorul doreste sa efectueze mai multe operatii asupra interfetei utilizator (de exemplu sa modifice pozitia cursorului pe graficul in care sunt afisate datele), thread-ul continua sa proceseze evenimentele ce tin de interfata si nu va permite citirea datelor din buffer-ul de achizitie ceea ce va duce la depasirea acestuia si in mod curent la poerderea unor date. Utilizarea unei abordari multi-thread presupune plasarea operatiunilor de achizitie in thread-ul secundar si a celor de afisare in interfata utilitor in cel principal. In acest mod daca utilizatorul efectueaza operatii asupra interfetei sistemul de operare face comutarea thred-rilor (de la cel principal la cel secundar) pentru a permite realizarea operatiilor de achizitie. B: Al doilea motiv intalnit ce indica alegere a unei structuri multi-thread, este existenta unor aplicatii in care se doreste realizarea simultana a unor operatii lente de intrare/iesire. De exemplu: O aplicatie foloseste o procedura (un instrument) pentru testarea unor circuite de pe o placa. Utilizand varianta cu un singur thread se executa: pe un port (serial de exemplu) este trimisa trimisa o secventa de initializare a placii respective, se asteapta sfarsitul operatiilor de initializare, in final, se realizeaza operatiile de masura ale rezultatelor. Aplicatia este foarte sensibila la timpii de asteptare si este foarte particulara, avand nevoie de dese reconfigurari. Utilizand o mult mai corecta abordare multi-thread, in thread-ul secundar se va face initializarea instrumentului de test.

15

In acest mod in thread-ul principal se va astepta incheierea initializarii placii respective si se vor citi rezultatele testelor. Rezulta astfel, executarea in paralel a operatiilor lente de intrare/iesire si scaderea timpului total de asteptare/functionare.

C: Al treilea motiv de a construi un program in varianta multi-thread este acela de a mari performantele acestuia in cazul in care dispunem de o arhitectura harhware multiprocesor. Fiecare procesor al structurii poate executa un thread. Astfel, spre deosebire de arhitecturile cu un singur procesor unde se creaza doar impresia unei executii multithread, aici totul este corect si cu adevarat in paralel. De exemplu Un program mai complex executa achizitia unor date, afisarea acestora in cadrul unei interfete, scrierea unor fisiere istoric si o analiza conform unor algoritmi complexi, poate beneficia din plin de o astfel de arhitectura. Scrierea datelor pe disc si analizasi afisarea acestora impun in mod special threaduri separate, executate pe procesoare separate. D: Ultimul din cele patru motive, este inalnit in situatiile in care se doreste testarea unui anumit task in paralel (simultan) pentru situatii diferite.

16

3. Sisteme de operare pentru aplicatii software de timp realRolul unui sistem de operare este de a gestiona resursele hardware (memorie, porturi, periferice etc.) ale sistemului de conducere si de a oferi functii de acces catre aceste resurse pentru programele care ruleaza. Sistemele de operare cele mai cunoscute din domeniul acestor aplicatii sunt Windows (>NT), MSDos, Linux, QNX. Sunt dese situatiile in care sistemul de operare lipseste, programul executabil al aplicatiei (intr-o forma adecvata de exemplu binara) realizand in mod direct gestionarea resurselor hardware. Gestionarea directa a resurselor duce la o crestere a vitezei aplicatiei dar si a efortului depus la dezvoltarea aplicatiei deoarece cu cat partea harware este mai complexa cu atat mai multe sunt driverele necesare a fi scrise. In plus, scrierea unui astfel de driver necesita cunostinte deosebite si amanuntite legate de structura dispozitivului tinta. Este bine de realizat un compromis pentru rezolvarea acestei probleme, existenta unui sistem de operare usurand mult lucrurile. In general sistemele hardware complexe cum sunt calculatoarele industriale au un astfel de sistem de operare.

17

4. Limbaje de programare/dezvoltare si implementare a ASTR; (Apl. Soft. De TR)Pe piata mondiala exista in acest moment trei variante principale de dezvoltate a aplicatiilor de timp real: Limbaje de uz general utilizand cod program (ASM, C++, Java, LabWindowsCVI Real Time) [30], [31], . Limbaje de uz general utilizand elemente grafice (LabView Real Time) Limbaje dedicate automatelor programabile (Function Blok Diagram (FBD), Grafcet, Structured Cod) [20], [29], [33], [34. In continuare vom prezenta implementarea unui filtru numeric in limbajele de uz general (C, C++, Java), precum si pentru Structured Text, Function Block Diagram, Sequential Function Chart, Horner Ledder Diagram si IEC Ledder Diagram pentru un automat programabil Horner [21], [22].Forma filtrului vazut ca un sistem discret de ordinul II [10] este :

H m ( q 1 ) =

bm 0 + bm1q 1 + bm 2 q 2 am 0 + am1q 1 + am 2 q 2

Exemplificare pentru limbajele de uz general (C, C++, Java etc.)rdk=-am1*rdk_1-am2*rdk_2+bm1*rk_1+bm2*rk_2; rdk_2=rdk_1; rdk_1=rdk; rk_2=rk_1; rk_1=rk;

Exemplificare pentru atomatele programabile (AP):Strucured Text :

18

Function Block Diagram:

Sequential Function Chart:

19

Horner Ledder:

Se observa ca varianta structured text se aseamana forte mult cu varianta din limbajele generale de programare.

20

5. Implementarea unor drivere de achizitie;Construirea sau adaptarea unui driver de achizitie pentru citirea/scrierea unei marimi analogice sau digitale AI, AO, DI, DO este unul din primii pasi facuti in dezvoltarea unui sistem de achizitie si control. Un driver reprezinta un program sau o o procedura prin care este controlata o marime sau un dispozitiv. Structura acestuia este puternic dependenta de arhitectura hardware. Importanta utilizarii unui driver bine construit se reflecta in primul rand in viteza de achizitie si acuratetea datelor sistemului. O abordare generala a constructiei acestora nu poate fi data datorita multitudinii de structuri hardware existente. In cele ce urmeaza ne vom referi strict la constructia unor drivere pentru placile de achizitie si microcontrollere. Ideea ce sta la baza dezvoltarii unui driver o reprezinta faptul ca registrii corespunzatori controlului dispozitivului respectiv, sunt vazuti ca niste porturi ce pot fi citite sau scrise [35]. Aceste porturi au un numar limitat si incep de la o anumita adesa de baza. Ca orice locatie de memorie registrii au o lungimea de 8 biti (sau 16 biti) iar operatiile de baza utilizate pentru scrierea acestora sunt de tip inp(inport) si outp(outport). Figura urmatoare (figura 5.1) exemplifica pozitionarea a 16 (0x0F h) registri in memorie incepand cu adresa de baza 0x200 h.

Adresa de inceput denumita si Baza = 0x200 h

Reg. Baza+0 Reg. Baza+1 Reg. Baza+2 Zona porturilor sau registrilor de control a dispozitivului respectiv

Reg. Baza+F

Fig. 5.1 Dispunerea registrilor de control ai unui dispozitiv de intrare/iesire

In general, registrii pot avea functii diferite pentru citire si pentru scriere. Manualul de utilizare ce insoteste dispozitivul specifica functiile si adresa acestor registri. Pentru exemplificare prezentam in tabelul urmator adresele si functiile celor 16 registri de control ai placii de achizitie PCL 812 produsa de firma Advantec. Placa are 16 intrari analogice (AI), 2 AO, 16 DI, 16 DO, amplificare programabila a gamei de intrare a semnalului analogic.

21

Adresa Baza + 0 Baza + 1 Baza + 2 Baza + 3 Baza + 4 Baza + 5 Baza + 6 Baza + 7 Baza + 8 Baza + 9 Baza + A Baza + B Baza + C Baza + D Baza + E Baza + F

Functie la citire Contor 0 8253 Contor 1 Contor 2 neutilizat A/D octet low A/D octet high DI octet low DI octet high neutilizat neutilizat neutilizat neutilizat neutilizat neutilizat neutilizat neutilizat Contor 0 Contor 1 Contor 2

Functie la scriere

Registru de control 8253 D/A 1 octet low D/A 1 octet high D/A 2 octet low D/A 2 octet high interupere placa neutilizat Selectie canal multiplexor Cuvant de control placa Decl. soft a conv. A/D DO octet low DO octet high neutilizat

Tab.5.2 Functiile porturilor placii de achizitie PCL 812

Am spus mai inainte ca arhitectura hardware a dispozitivului controlat determina modul de constructie software a driverului. Vom evidentia aceste aspecte pentru canalele de citire/scriere marimi analogice si digitale. Structura unei cai de achizitie a marimilor analogice se compune in general din: multiplexor ce are rolul de a selecta canalul de intrare dorit. Cele mai intalnite variante sunt 32:1, 16:1, 8:1 etc. Numarul bitilor de control pentru selectarea canalului dorit este dependent de numarul acestora, astfel ca pentru 32 de canale este nevoie de 5 biti (25 = 32), pentru 16 canale 4 biti etc. amplificator utilizat pentru adaptarea valorii semnalului la gama de lucru a convertorului analog-numeric (CAN). Utilizarea unui amplificator programabil permite ca lantul de achizitie sa accepte game diferite decat cea a CAN. Valorile intalnite ale gamelor de masura sunt 0-10 V, 0-5 V, 0-2.5 V pentru tensiune si 4-20 mA, 2-10 mA pentru curent. In general fata de gama de lucru a CAN celelalte valori reprezinta diviziuni ale acesteia, astfel ca valorile de amplificare sunt 1, 2, 4 etc. convertorul analog-numeric ce include si elementul de esantionare si retinere. In functie de numarul de biti pe care se face conversia (8, 10, 16, 32) depinde numarul de registri rezervati in care este depus rezultatul conversiei. Incheierea operatiei de conversie este in general, semnalizata prin pozitionarea pe 1 a unui bit rezervat DRDY (Data ReaAY).

22

Fara a impune neapaparat ordinea, iata pe scurt principalii pasi facuti in achizitia unui canal analogic: selectie mod de functionare al dispozitivului respectiv: intreruperi, interogare, DMA; setarea amplificarii canalului de achizitie; alegerea canalului achizitionat; declansarea operatiei de conversie; asteptare a incheierii operatiei de conversie analog numerice; citirea rezultatelor din registrii corespunzatori; normarea datelor din gama CAN 0 2n-1 (n nr. de biti pe care se face conversia) in unitati ingineresti. Vom exemplifica cele de mai sus pentru aceeasi placa de achizitie (PCL 812 PG) dotata cu 16 AI, amplificare programabila si convertor analog numeric pe 12 biti. Datorita faptului ca registrii placii sunt pe 8 biti, rezulatul conversiei (pe 12 biti) este depus in 2 registrii in modul urmator: cei mai putin semnificativi 8 biti (b7-b0) sunt depusi in registrul 4 (Baza + 4) iar cei mai semnificatifi 4 biti (b11-b8) in primele 4 pozitii ale registrului 5 (Baza + 5) conform figurii urmatoare:Registrul Baza + 5b11 b10 b9 b8

Partea ce mai semnificativa a conversiei

Registrul Baza + 4

b7

b6

b5

b4

b3

b2

b1

b0

Partea ce mai putin semnificativa a conversiei Fig. 5.3 Pozitionare rezultatului unei conversii analog numerice pentru placa de achizitie PCL 812 PG

Pentru driverul de schizitie a unei intrari analogice in care adresa de baza a placii de achizitie este 0x220 h sectiunea de cod corespunzatoare, scrisa in C este: // definirea unor constante ce corespund adreselor // registrilor utilizati #define ADL 0x224 #define ADH 0x225 #define AMP 0x229 #define MPX 0x22A #define MOD 0x22B #define TRG 0x22C

23

// functia de achizitie a unei intrari analogice // are ca parametru numarul canalului citit int ai(int canal) { unsigned char h,l; // setare a modului de lucru al placii outp(MOD,0x01); // setarea amplificarii outp(AMP,0x02); // selectarea canalului citit outp(MPX,canal); // pauza pentru stabilizarea oscilatiilor delay(1); // declansarea operatiei de achizitie outp(TRG,0x00); // testare a sfarsitului de conversie /* do{ h=inp(ADH); }while((h&0x10)==0x10); */ delay(1); // preluarea rezultatului conversiei partea H x 256 + L h=inp(ADH)&0x0F; l=inp(ADL); return(256*h+l); } Pentru partea de scriere a unei iesiri analogice lucrurile sunt in general similare, cu diferenta ca sensul de parcurgere este inversat. Lantul de prelucrare poate contine convertorul numeric-analogic (CNA), amplificarorul si multiplexorul. In unele cazuri anumite componente pot lipsi sau pot fi inlocuite cu altele: astfel pentru aceeasi placa de achizitie (PCL 812 PG) ce are doua iesiri analogice, amplificatorul lipseste iar multiplexorul este inlocuit cu un al doilea convertor numericanalogic, fiind preferata varianta cu doua CAN celei cu nu CAN si multiplexor. Aceasta solutie aduce o imbunatatire a vitezei de lucru. Pentru structura maximala a lantului de prelucrare principalii pasi facuti in scrierea unui canal analogic de iesire (AO) sunt: denormarea datelor din gama unitatilor ingineresti in gama CNA 0 2n-1 (n nr. de biti din care se face conversia); separarea partilor High si Low ale datelor de convertit; scrierea registrilor corespunzatori cu valorile dorite; setarea amplificarii canalului de achizitie; alegerea canalului achizitionat; Driver-ul de scriere a unei iesiri analogice din sectiunea de cod urmatoare, este scris in C, iar adresa de baza a placii de achizitie este 0x220 h:

24

// definirea unor constante ce corespund adreselor // registrilor utilizati #define DAL0x224 #define DAH0x225 // functia de scriere a iesirii analogice 0 // are ca parametru valoarea ce trebuie scrisa void ao0(int val) { unsigned char h,l; // separarea partii High de partea Low h=(unsigned char)(val/256); l=(unsigned char)(val%256); // scrierea registrilor corespunzatori partilor Low si High outp(DAL,l); outp(DAH,h); } In cazul in care echipamentul pentru care se dezvolta driverele este un sistem de tip microcontroller lucrurile sunt foarte asemanatoare. Pentru intrarile si iesirile numerice lucrurile stau mult mai simplu, operatiile respective fiind simple operatii de citire/scriere a unor valori in registri corespunzatori. Daca se doreste accesul doar la anumiti biti este utilizata inca o operatie suplimentara de mascare. Aceasta este efectuata ulterior citirii, respectiv anterior scrierii registrului respectiv. In general, orice firma producatoare de echipamente care se respecta ofera in pachetul ce contine dispozitivul achizitionat si un set de drivere si programe de test. In unele situatii pentru traductoate mai evoluate, driverele de achizitie sunt inlocuite cu drivere de comunicatie intr-un anumit protocol TCP/IP, Modbus etc [29], [30]. Aceste traductoare contin un echipament numeric (microcontroller) care face achizitia utilizand la nivel local utilizand un driver de tipul celor prezentate anterior.

25

6. Implementarea unor sisteme distribuite de conducere; Functiile unui program de monitorizare (SCADA);SCADA reprezinta acronimul pentru Supervisory Control And Data Acquisition. In linii mari, termenul se refera la ansamblul sistemelor de achizitie, supervizare si control distribuite in cadrul unei vaste intinderi geografice sau spatiale si utlizate pentru conducerea unor instalatii sau procese fizice de mari dimensiuni. Exemple clasice de utilizare pot fi date din zonele sistemelor de distributie a apei, energiei electrice si termice, de prelucrarea a petrolului rafinarii etc. Strategia de programare prezentata in sectiunile anterioare este foarte utila in dezvoltarea unor aplicatii de complexitate mica si medie pentru un numar mic de parametrii reglati si monitorizati. Pentru procesele industriale cu un numar mare de parametrii (>100, >1000) este necesara o structura hardware si software diferita. In general, functiile de baza al unui sistem de monitorizare si control pentru o aplicatie industriala complexa sunt urmatoarele: achizitia semnalelor de la traductoare si trimiterea comenzilor catre elementele de executie; reglare numerica a diferitilor parametrii; afisarea valorilor instantanee ale diferitilor parametrii grupati in unul sau mai multe sinoptice; alarmare la depasirea valorilor limita admise pentru fiecare parametru; inregistrarea evolutiei in timp a valorilor parametrilor; asigurarea facilitatilor de functionare in retea a sistemului; asigurarea sigurantei sistemului prin back-up-ul resurselor si structurilor critice; oprimizarea functionarii procesului.

Fig. 6.1 Exemplu de sistem SCADA simplu

26

Din punctul de vedere hardware exista foarte multe variante de realizare a unei astfel de structuri. Pe piata echipamentelor de automatizare exista o serie de firme cunoscute sau mai putin cunoscute ce ofera o multitudine de solutii in acest domeniu Siemens, ABB, Rockwell, Omron, National Instruments etc [33], [34], [30]. Exemple de sisteme SCADA mai simple sau mai complexe sunt prezentate in figurile 6.1 si 6.2:

Fig. 6.2 Exemplu de sistem SCADA complex

Componenta software a sistemului este in general, organizata pe doua niveluri: nivelul de achizitie si reglare implementat pe microcontrolere/AP si nivelul consolelor operator. Vom detalia pentru cele doua niveluri cateva aspecte ale functiilor si constructiei acestora: Software pentru nivelul de achizitie si control (microcontrolere/AP) Adaptarea unui microsistem inteligent de achizitie la cerintele specifice aplicatiei de control si monitorizare se realizeaza printr-un software specializat care este conceput pentru a realiza urmatoarele operatii: achizitia continua a semnalelor de la toate canalele de masura cu o rata de esantionare suficient de ridicata pentru a permite preluarea corecta si a zgomotelor care insotesc semnalul util pentru a evita fenomenul de pliere (aliasing) a spectrului zgomotului peste cel al semnalului util; calibrarea software a informatiei achizitionate pentru compensarea erorilor sistematice introduse de circuitele din sistemul de interfata analogica (offset-uri, erori de scala);

27

filtrarea numerica a semnalelor achizitionate in scopul eliminarii zgomotelor utilizind filtre de tip trece-jos de ordin superior (in forma discretizata); realizarea calculelor de corectie asupra informatiei masurate de la traductoarele la care sint necesare astfel de corectii; inregistrarea informatiilor de la fiecare canal de achizitie intr-o baza de date locala pentru a evita pierderea de informatie la nivelul sistemului dispecer in cazul opririi accidentale a acestuia; calculul unor marimi statistice (valorii medii, de virf, contorizare in vederea totalizarii consumurilor); comunicarea prin intermediul interfetei seriale cu sistemul dispecer adica asigurarea transmiterii la cerere a oricarei informatii din cele masurate, inregistrate sau calculate; Se remarca faptul ca o serie din functiile enumerate mai sus sint prezente si in cadrul sistemului de conducere numerica (achizitia, calibrarea, filtrarea numerica, comunicatia) dar exista si o serie de functii noi specifice doar sistemului de monitorizare (calculul marimilor statistice si inregistrarea evolutiilor parametrilor). Software pentru nivelul superior (consolele operador) Programul de baza al sistemului este conceput intr-un mediu de dezvoltare evoluat (Lab Windows/CVI [31], Borland C++ Builder, Visual C++ etc.) sau intr-un limbaj specific echipamentului utilizat (Simatic de la Siemens [34], RS View de la Rockwell [17], [18], [19] etc.). Acesta trebuie sa ofere utilizatorului implementarea unor functii de baza ca si orice alt limbaj de programare, precum si alte functii speciale ce implementeaza diverse protocoale de comunicatie, elemente de afisare grafica etc. Functiile propuse pentru sistem sunt urmatoarele: comunicatie cu sistemele microcontroller/AP realizand centralizarea datelor achizitionate; aducerea datelor la un format stabilit si stocarea lor in baza de date; setarea valorilor alarmelor pentru valori medii si instantanee; determinarea situatiilor de alarma conform setarilor facute si stocarea acestora in baza de date; vizualizarea valorilor instantanee, valorilor medii si a istoricelor; semnalizarea situatiilor in care se constata probleme in functionarea sistemelor de tip microcontroller; refacerea bazelor de date in cazul in care functionarea sistemului de gestiune a fost intrerupta. Detaliem in continuare aceste functii: Comunicatia cu microcontroller-ele Comunicatia se bazeaza pe interogarea echipamentelor aflate in camp sau in dulapurile speciale. Protocolul utilizat de programul de la nivelul PC-ului este de tipul comunicatiei seriale RS232/485, TCP/IP, FildBus, ModBus [17] etc. Programul are implementate functiile specifice acestui protocol.

28

Aducerea datelor la reprezentarea standard si stocarea lor Este necesara aducerea datelor la un format care sa permita utilizarea lor cat mai usoara pentru rezolvarea necesitatilor utilizatorului. Trebuie specificat faptul ca formatul utilizat in comunicatie, din motive de optimizare, nu coincide cu formatul utilizat in PC in general si cu cel din baza de date, in special. In interiorul programului datele sunt reprezentate ca float sau double in functie de dimensiunea si precizia acestora. Operatie de normare se face conform formulei clasice:

vUI =

vcom vcom _ min vcom _ max vcom _ min

(vUI _ max vUI _ min ) + vUI _ min

unde termenul UI unitati ingineresti se refera la domeniul folosit pentru reprezentarea datelor pe consola, iar com comunicatie respectiv, la domeniul folosit pentru transmiterea datelor. In general, domeniile de pe consola sunt cele reale (bari, m3/h, atm etc.) iar cele pentru transmitere sunt alese astfel incat pachetul de date sa aiba o dimensiune cat mai mica, pe de o parte, dar nici sa nu se piarda din precizia datelor. Stocarea datelor Stocarea datelor se face in fisiere si/sau in baze de date in care, pe langa valorile respectivilor parametrilor sunt trecute data, ora si locul din care provin. Vizualizarea fisierelor poate fi facuta si cu alte produse software, de exemplu cu cele din cadrul pachetului Microsoft Office (Microsoft Excel). Din punctul de vedere al mecanismului de stocare al datelor (istorice) exista doua abordari: stocarea acestora la intervale egale de timp la fiecare perioada de esantionare sau, doar atunci cand valoarea acestora se modifica cu cel putin o valoare de prag fata de valoarea anterioara. Prima varianta este mare consumatoare de spatiu de memorie, uneori inutil deoarece se intalnesc situatii in care, pe un anumit interval de timp valoarea parametrului respectiv este constanta, insa ofera avantajul realizarii istoricelor fara nici o alta prelucrare. Cea de-a doua varianta nu consuma spatiu de memorie inutil, insa necesita calcule speciale (de tip extrapolare) la realizarea istoricelor pe intervale specificate. Un exemplu de astfel de fisier istoric este urmatorul: 3 PR_244 17:31:03 03-21-2001 4.949 barr 1 FR_244 17:31:08 03-21-2001 0.953 m3/h 2 PR_201 17:31:09 03-21-2001 7.486 barr 22 TE_274 17:31:31 03-21-2001 64.523 gr.C 3 PR_244 17:31:46 03-21-2001 6.509 barr 28 TI_274 17:31:50 03-21-2001 331.375 gr.C

29

Coloanele respective reprezinta codul numeric al parametrului, numele acestuia, amprenta de timp, valoarea respectiva si unitatea de masura. Setarea si inregistrarea valorilor alarmelor Programul trebuie sa permite ca intr-o fereastra speciala sa poata fi fixate valorile de alarmare pentru un parametru dorit conform domeniului real de lucru utilizat. Depasirea in timpul functionarii a unei limite de acest tip, duce la deschiderea unei ferestre speciale pentru atentionarea personalului de supraveghere. In acelasi timp, in baza de date este inscrisa aceasta situatie pentru a permite realizarea ulterioara a unui raport privind functionarea sistemului. Setarea alarmelor se face de catre utilizator. Sesizarea situatiilor de depasire se face din punctul de vedere al programului, cu ajutorul unor structuri de tip if-then-else: // depasire de limite if((marime[i].val>marime[i].alarma_max)||(marime[i].val