Instrument Virtual Pentru Comunicatia de Date In Protocolul Modbus

APLICAȚIA 1

Instrument virtual pentru comunicația de date

în protocolul modbus

1.1. Introducere

Utilizarea tehnicii de calcul în laboratoarele de metrologie, de automatizări, în controlul unor procese industriale, presupune în primul rând realizarea de sisteme de achiziție de date și transmitere a unor semnale de comandă. În cuprinsul lucrării sunt prezentate etapele de implementare a unei aplicații, prin utilizarea mediului de dezvoltare grafică LabView (figura 1.1), pentru comunicația serială de date în protocolul standard industrial Modbus.

Figura 1.1. Aplicația în faza de proiectare

1.2. Protocolul de comunicație Modbus RTU

Protocolul implementat în cadrul aplicației este Modbus, cu modul de transmisie serială RTU, un protocol asincron, emițătorul și receptorul având propriile semnale de tact.

Comunicația este de tip master-slave. Protocolul de comunicație previne ca dispozitivele ce împart canalul să comunice simultan. Fiecare unitate slave are o adresă unică și răspunde numai la pachetele adresate, fără a putea iniția comunicația de date. Aceste pachete sunt generate de către dispozitivul master care interoghează unitățile slave conectate în rețea, cerându-le să-i transmită date.

Un mesaj este format din mai multe câmpuri, fiecare câmp fiind alcătuit dintr-o succesiune de octeți. În modul RTU un octet este interpretat ca două caractere hexazecimale de 4 biți, ceea ce conduce la o densitate mare de caractere, comparativ cu protocoalele ASCII. Formatul de date este următorul: 1 bit de start, 8 biți de date, primul transmis LSB, 1 bit de stop, fără verificarea parității.

Funcțiile Modbus utilizate în cadrul aplicației sunt următoarele:

Codul funcției descrie acțiunea comandată dispozitivului slave. Fiecare mesaj conține adresa dispozitivului slave, codul funcției și suma de control. Adresele valide pentru dispozitivele slave sunt în domeniul 0…247 zecimal, cu excepția adresei 0 celelalte fiind adrese individuale. Controlul erorilor se face la nivel de cadru de transmisie printr-un cod polinomial CRC (verificare ciclică a redundanței). Suma de control se calculează cu polinomul P(x)=x15+x13+1. Cadrul care conține mesajul trebuie transmis ca un flux continuu, pentru a nu apărea pauze mai lungi de 1,5 intervale de caracter. Sfârșitul mesajului este marcat printr-o pauză de cel puțin 3,5 intervale de caracter.

Mesajul de răspuns al dispozitivului slave la o recepție fără erori a comenzii conține în câmpul de funcție același cod cu cel transmis de către master. Altfel, codul este modificat, la valoarea numerică a codului funcției adăugându-se valoarea în hexazecimal 80H. În răspunsul de excepție urmează un câmp care descrie tipul de eroare:

1 – funcția nu este recunoscută de către slave;

2 – adresele nu sunt prezente;

3 – valorile nu sunt permise;

4 – dispozitivul slave nu poate întreprinde complet acțiunea comandată.

1.3. Programul principal

Arborele de apel pentru aplicație este prezentat în figura 1.2. Modulul principal apelează două subVI-uri, precum și instrumentele standard pentru controlul transmisiei seriale RS232, aflate în sublista Serial a listei Function.

Figura 1.2. Arborele de apel

Aplicația implică o interfață utilizator, panoul frontal PF, care permite configurarea portului serial (figura 1.3), parametrizarea mesajului de tip Modbus, selectarea comenzii, precum și vizualizarea mesajelor transmise și recepționate, a datelor procesate sau erorilor de comunicație.

Figura 1.3. Configurarea portului serial

Codul sursă al instrumentului virtual VI este reprezentat de diagrama bloc DB din figura 1.4. Se observă existența a două structuri de control repetitiv While Loop.

În prima dintre ele se rețin inițializările pentru portul serial, se stabilesc atributele fizice ale obiectelor de interfață și se analizează execuția prelucrărilor solicitate de utilizator. Prin controalele de tip boolean Scrie și Citește, având un comportament mecanic de tip comută înainte de eliberare, se controlează valoarea expresiei de oprire a buclei. La ieșirea din buclă, controlul programului este dat unei alte structuri repetitive While Loop.

Oprirea ciclului de iterații este, de asemenea, condiționată logic. Se execută în acest scop operația ȘI între două valori booleene, determinate de controlul Citire buclă, cu comportament mecanic comută la apăsare, și controlul Citește al cărui terminal este conectat la buclă printr-un tunel de intrare, valoarea logică fiind atribuită simultan atât expresiei de oprire, cât și expresiei selector a unei structuri de tratare opțională. Pentru valoarea Adevărat se execută ciclic instrucțiunile din cadrul structurii While Loop și se numără iterațiile buclei, prin incrementarea valorii numerice a contorului de ciclu.

Figura 1.4. Diagrama bloc generală

1.4. SubVI-ul de verificare ciclică a redundanței CRC

Pentru controlul erorilor la nivel de cadru de transmisie se utilizează metoda de verificare ciclică a redundanței. Atât master-ul, cât și dispozitivele slave, atașează la mesajele transmise un câmp cu o valoare pe 16 biți.

În figura 1.5 se prezintă diagrama bloc DB pentru calculul CRC-ului.

Figura 1.5. DB pentru calcul CRC

CRC 16 se calculează din octeții mesajului, utilizând următoarea metodă:

se inițializează CRC-ul printr-un registru de 16 biți cu valoarea 65535 (16 biți de 1);

pentru primul octet al mesajului:

a) se execută operația logică SAU-EXCLUSIV între octet și valoarea CRC-ului anterior, rezultatul fiind noul CRC;

b) se deplasează rezultatul cu un bit la dreapta (deplasarea cu n biți la dreapta este echivalentă cu împărțirea la 2n) și se extrage bitul cel mai putin semnificativ LSB (restul împărțirii); numai dacă acest bit este 1 se va executa în continuare operația SAU-EXCLUSIV între CRC și un număr prestabilit 40961, obținându-se un CRC intermediar. Se utilizează o structură de selecție Case, expresia selector fiind restul împărțirii. Algoritmul se repetă de opt ori în cadrul unei structuri repetitive While Loop. Prin intermediul registrului de decalare rezultatele sunt furnizate între iterațiile succesive terminalului stâng;

se repetă operația de mai sus și pentru următorii octeți, reluarea instrucțiunilor fiind asigurată de structura repetitivă For. Numărul de ciclări este dat de dimensiunea tabloului conectat la tunelul de intrare de pe chenarul buclei ce permite auto-indexarea. Se observă, de asemenea, prezența perechilor de terminale dispuse pe aceeași orizontală, reprezentând un registru de decalare, valoarea stocată în terminalul drept fiind transferată terminalului stâng la următoarea iterație.

CRC-ul se transmite incepând cu octetul cel mai puțin semnificativ LSB, obținut prin conversia la un întreg fără semn reprezentat pe opt biți. Octetul următor MSB se obține prin deplasarea cu 8 biți la dreapta a valorii CRC-ului reprezentate pe 16 biți.

Receptorul recalculează CRC-ul pentru mesajul recepționat, în prealabil eliminând ultimii doi octeți ce reprezintă CRC-ul transmis. Se compară valoarea calculată cu valoarea transmisă și se semnalează o eroare de transmisie dacă cele două valori sunt diferite.

1.5. SubVI-ul de citire a unui număr de octeți la portul serial

Figura 1.6. DB pentru citirea portului serial

SubVI-ul cu diagrama bloc DB din figura 1.6 are ca parametri de intrare numărul portului de comunicații, implicit COM1, și numărul de octeți ce urmează a fi citiți din zona tampon de recepție. Se utilizează funcția Octeți transferați la portul serial într-o structură de control repetitiv While Loop. Cum oprirea ciclului de iterații este condiționată logic, se execută pentru aceasta operația SAU-EXCLUSIV între două valori booleene, prima fiind determinată de comparația dintre numărul de octeți din zona tampon și valoarea înscrisă în obiectul de interfață Număr octeți, cea de-a doua de comparația între numărul de iterații și o valoare numerică proporțională cu valoarea înscrisă în controlul de interfață Time-out(2s), un alt parametru de intrare al subrutinei, implicit având valoarea 2. Parametrii de ieșire ai subrutinei sunt două indicatoare, unul de tip boolean, care semnalează eroare de time-out, celălalt de tip șir de caractere. Selectorul structurii de tratare opțională Case este conectat la terminalul aferent indicatorului Time-out. Daca valoarea expresiei selector este Fals, la ieșirea din buclă funcția Citirea portului serial transmite șirul de caractere recepționat către terminalul indicatorului Date recepționate. Pentru valoarea Adevărat se transmite direct șirul vid.

1.6. Funcția 16: “writing of N output words”

Mesajele Modbus aferente funcției 16 în modul RTU au următoarea structură:

Mesaj transmis

Mesaj recepționat

Figura 1.7. Eliminarea caracterelor portului serial

Pentru implementarea funcției se utilizează o structură de tip secvențial. Subdiagrama 0 citește portul serial de comunicație (figura 1.7), fiind utilizată atât de funcția de scriere 16, cât și de cea de citire 03, pentru eliminarea caracterelor din zona tampon.

În cadrul subdiagramei 1 din figura 1.8. se construiește mesajul care se va transmite prin intermediul portului serial către dispozitivul slave.

Figura 1.8. Construcția mesajului dispozitivului master

Mesajul transmis diferă de cel al funcției de citire. Pentru aceasta se utilizează o structură de tratare opțională care permite accesul la o singură instrucțiune, conform expresiei selector de tip boolean. Terminalele asociate controalelor de interfață de tip numeric reprezentând parametrii mesajului sunt conectate la terminalele de intrare de tip tunel de pe chenarul structurii Case. Funcția “Construiește tablou” returnează un tablou într-o singură dimensiune cu elemente de tip octet, date de valorile parametrilor de intrare. Pentru valorile reprezentate pe 16 biți octetul cel mai puțin semnificativ LSB se obține prin conversia la un întreg fără semn pe opt biți. Octetul cel mai semnificativ MSB se obține, de asemenea, prin deplasarea cu 8 biți la dreapta a valorii reprezentată pe 16 biți. Se poate remarca faptul că ultimul terminal de intrare este de tip tablou.

Structura repetitivă For furnizează la ieșire printr-un registru de decalare un tablou cu elemente de tip octet. Numărul de iterații este dat de legătura la terminalul N. Funcția “Inițializare tablou” realizează inițializarea registrului de decalare înainte de execuția primei iterații a structurii For. În cadrul structurii For se regăsește funcția de tip “Construiește tablou”, la fiecare ciclu adăugându-se la tablou cele doua elemente de tip octet prezente la tunelele de intrare. Rezultatul este transferat între iterațiile succesive la cele două terminale ale registrului de decalare. După ultima iterație valoarea finală atribuită terminalului din dreapta este furnizată în exterior.

Tabloul ce compune mesajul constituie un parametru de intrare pentru subrutina de calcul a CRC-ului. SubIV-ul atașează la tablou cei doi octeți semnificând CRC-ul și execută conversia tabloului final într-un șir de caractere care este transmis funcției Scrierea portului serial și terminalului indicatorului de interfață de tip șir de caractere Mesaj transmis.

În cadrul subdiagramei 2 din figura 1.9 se citește mesajul de răspuns al dispozitivului slave la comanda de scriere 16. Se va utiliza, de asemenea, o structură de selecție pentru funcțiile Modbus, mesajele fiind diferite și necesitând astfel o prelucrare specifică.

Figura 1.9. Prelucrare mesaj de răspuns. a) codul funcției nemodificat b) codul funcției modificat

Se vor transmite subrutinei de citire a unui număr de octeți la portul serial cei doi parametri de intrare, numărul portului și numărul de octeți așteptați, dat de dimensiunea antetului mesajului de răspuns. Pauzele (timeouts) sunt asigurate de protocolul de comunicație pentru a preveni întârzieri nelimitate cauzate de erorile de date, limitând timpul în care stația emițătoare așteaptă un răspuns. Parametrul de ieșire Time-out al subrutinei constituie o expresie de tip selector pentru o primă structură de tratare opțională. Dacă valoarea sa este Adevărat, se semnalează utilizatorului prin indicatorul de interfață boolean Time-out și se trimite indicatorului Mesaj recepționat un text corespondent. Șirul de caractere recepționat este transmis structurii condiționale printr-un terminal de intrare de tip tunel. După conversia șirului în tablou de octeți, se va extrage al doilea element cu funcția Indexare. Se verifică dacă este identic cu codul de excepție. Pentru prelucrarea informației se introduce o nouă structură Case, inclusă în prima.

Pentru codul funcției nemodificat (figura 1.9.a) de către dispozitivul slave, se va reapela subrutina de citire a unui număr de octeți la portul serial. Dimensiunea mesajului de răspuns pentru funcția 16 este strict de 8 octeți. Valoarea logică a parametrului de ieșire Time-out al subrutinei este transmisă terminalului indicatorului Time-out și selectorului unei structuri de tratare opțională. Șirul de caractere recepționat este conectat la o intrare a funcției Concatenare șiruri, fiind refăcut întregul mesaj de răspuns și transmis printr-un terminal de intrare de tip tunel al structurii de selecție Case funcției Extragere subșir. Se returnează un prim șir de două caractere semnificând CRC-ul mesajului. Celălalt subșir este transmis subrutinei de calcul al CRC-ului, după conversia sa în prealabil la tipul parametrului de intrare al subrutinei, care este un tablou de octeți. CRC-ul calculat și cel transmis sunt comparate, rezultatul fiind de tip boolean. Funcția Selecție trimite indicatorului Mesaj recepționat un text corespondent. Prin intermediul unui nod de proprietate al indicatorului se specifică modul de afișare al textului.

Pentru codul funcției modificat (figura 1.9.b), se va extrage al treilea octet care specifică tipul de eroare. Se compune mesajul de eroare, prin convertirea valorii numerice întregi la șir de cifre zecimale și concatenarea cu o constantă de tip șir de caractere. Se transmite mai departe terminalului indicatorului Mesaj recepționat mesajul aferent erorii de comunicație.

Figura 1.10. a) Transmisie corectă. Primire confirmare.

Figura 1.10. b) Mesaj de excepție

Figura 1.10. c) Eroare CRC

În figura 1.10 sunt prezentate câteva exemple de funcționare: a) pentru transmisia corectă, cu confirmare din partea dispozitivului receptor, b) pentru răspuns de excepție și, respectiv, c) pentru scriere cu eroare de CRC pentru mesajul de răspuns.

1.7. Funcția 03: “reading of N words”

Mesajele aferente funcției 03 în modul RTU au următoarea structură:

Mesaj transmis

Mesaj recepționat

În cadrul subdiagramei 1 din figura 1.11 din structura de tratare secvențială se construiește mesajul care se va transmite dispozitivului slave.

Figura 1.11. Mesajul transmis

Se selectează instrucțiunea aferentă funcției de citire 03 printr-o structură de tratare opțională. Terminalele asociate controalelor de interfață de tip numeric reprezentând parametrii mesajului sunt conectate la terminale de tip tunel de intrare pentru structura Case. Valorile reprezentate pe 16 biți sunt prelucrate corespunzător. Funcția “Construiește tablou” returnează un tablou cu elemente de tip octet.

Tabloul se conectează la un terminal de ieșire de tip tunel al structurii opționale. SubIV-ul de calcul al CRC-ului adaugă la tablou cei doi octeți semnificând CRC-ul și execută conversia tabloului final într-un șir de caractere care este transmis simultan funcției Scrierea portului serial și terminalului indicatorului de tip șir de caractere Mesaj transmis.

Este prezentă și o structură de selecție al cărei parametru este dat de o variabilă locală a controlului de interfață de tip boolean Citire buclă, stabilindu-se intervalul de timp la care se reiau iterațiile structurii de control repetitiv While Loop și modificându-se totodată, printr-o acțiune transparentă utilizatorului, un atribut fizic al controlului respectiv.

În cadrul subdiagramei 2 din figura 1.12 se va citi mesajul de răspuns al dispozitivului slave la comanda de citire 03.

Figura 1.12. Mesaj recepționat. a) Cod funcție identic b) Cod funcție diferit

Pentru început se transmit subrutinei de citire a unui număr de octeți la portul serial parametrii de intrare semnificând numărul portului și numărul de octeți așteptați. Parametrul de ieșire Time-out al subrutinei constituie o expresie de tip selector pentru o primă structură opțională Case. Dacă valoarea sa este Adevărat, se va semnala utilizatorului prin indicatorul de interfață boolean Time-out, operație executată în cadrul structurii Case. Șirul de caractere recepționat este transmis structurii condiționale printr-un terminal de intrare de tip tunel.

În situația în care subrutina furnizează la ieșire șirul de 3 caractere, după conversia acestuia în tablou de octeți, se va extrage al doilea element prin intermediul funcției Indexare. Se verifică dacă este identic cu codul de excepție. Se introduce o noua structură Case, inclusă în prima, pentru a trata cele două situații posibile și se extrage totodată al treilea element.

Pentru codul funcției nemodificat (figura 1.12.a), al treilea octet specifică numărul de octeți transmiși de dispozitivul slave. Este reapelată subrutina de citire a unui număr de octeți la portul serial pentru completarea mesajului. Șirul de caractere recepționat este transmis la o intrare a funcției Concatenare șiruri, fiind astfel reîntregit mesajul de răspuns. Valoarea logică a parametrul de ieșire Time-out al subrutinei este atribuită terminalului indicatorului Time-out și selectorului unei alte structuri de tratare opțională. Valoarea Fals indică o recepție completă a mesajului transmis de dispozitivul slave. Se trece în cadrul noii structuri Case la verificarea CRC-ului. După conversia șirului de caractere recepționat în tablou de octeți se divizează tabloul în două subtablouri cu funcția Împărțire tablou 1D, extrăgându-se octeții reprezentând CRC-ul. Celălalt subtablou se transmite subrutinei de calcul al CRC-ului. Dupa conversia CRC-ului recepționat în șir de caractere, se compară cu șirul reprezentând CRC-ul calculat, rezultatul de tip boolean fiind transmis mai departe printr-un tunel de ieșire selectorului unei structuri de tratare opțională Case. Tabloul de octeți din care s-au eliminat octeții semnificând câmpul de control al mesajului este divizat încă o data în două subtablouri, unul reprezentând antetul mesajului, celălalt octeții reprezentand câmpul de date. Cum datele sunt reprezentate sub forma a doi octeți, este necesară o prelucrare a elementelor subtabloului. Prin intermediul funcției Decimare tablou se obțin două subtablouri distincte la ieșire, unul conținând octeții cei mai putin semnificativi LSB, celălalt octeții cei mai semnificativi MSB. Octeții MSB se deplasează la stânga de 8 ori, prin adunarea cu octeții LSB obținându-se o reprezentare pe 16 biți a datelor. Acestea sunt transmise terminalului indicatorului de interfață de tip tablou Date procesate.

Pentru codul funcției modificat (figura 1.12.b), al treilea octet specifică de această dată tipul de eroare pentru răspunsul de excepție. Selectorului structurii opționale i se atribuie valoarea logică Adevărat, executându-se aceeași instrucțiune ca în cazul apariției erorii de time-out. Se compune mesajul de eroare, prin convertirea valorii numerice întregi la șir de cifre zecimale și concatenarea cu o constantă de tip șir. În funcție de valoarea logică a expresiei selector dată de o variabilă locală asociată indicatorului Time-out, funcția pentru tipul șir de caractere Selectare și adăugare transmite mai departe mesajul aferent erorii de comunicație.

Structura de tratare opțională care are ca expresie selector rezultatul comparării celor două CRC-uri determină modul de afișare al indicatorului de interfață de tip șir de caractere Mesaj recepționat prin intermediul unui nod de proprietate. Dacă expresia selector are valoarea logică Adevărat, șirul de caractere recepționat este afișat în modul hexazecimal. Daca însă valoarea este Fals, se transmite mai departe mesajul corespunzător de eroare.

Figura 1.13. a) Mesaj de răspuns recepționat corect b) Mesaj de eroare (timeout)

Pentru citirea ciclică, într-o altă structură opțională, erorile de comunicație sunt cumulate prin conversia valorii booleene la o valoare numerică cu funcția Conversie din boolean la 0,1 și afișate în indicatorul de interfață numeric Contor buclă. În figura 1.13 sunt prezentate două exemple de funcționare.

1.8. Concluzii

Limbajul grafic LabView se remarcă atât prin posibilitatea realizării unei interfețe grafice deosebit de intuitive, cât mai ales prin rapiditatea programării unei aplicații de achiziție de date cu tehnică de calcul asociată. O caracteristică imediată este metoda vizuală de programare, extrem de prietenoasă. O alta este conceptul de modularizare care stă la baza realizării programelor.

Instrumentul virtual descris poate fi utilizat de sine stătător pentru testarea unei legături seriale de tip RS232/485/422 cu dispozitive inteligente care comunică în protocolul standard Modbus RTU. Având propriile variabile de intrare și ieșire, reprezentate de controalele și indicatoarele din panoul frontal, pasul următor este utilizarea lui ca subrutină în componența unui alt VI. Se impune însă pentru aceasta eliminarea unor structuri repetitive de tip While Loop. În capitolul următor se va prezenta o aplicație de tip industrial, de o complexitate ceva mai ridicată, în structura căreia programul prezentat, cu modificările specificate, va intra ca submodul.

APLICAȚIA 2

SISTEM VIRTUAL DE MĂSURARE ȘI CONTROL LA DISTANȚĂ

2.1. Introducere

Lucrarea descrie o aplicație LabView de tip industrial, de monitorizare, măsurare și comandă la distanță pentru puncte termice. Datele provin de la PLC-uri industriale din componența sistemelor de automatizare și protecție ale unor centrale hidroelectrice dispuse în cascadă. S-au utilizat interfețe electrice și protocoale de comunicație standardizate. Schema generală de legături este prezentată, într-un mod simplificat, în figura 2.1.

Figura 2.1. Schema generală

2.2. Structura hardware

Principala componentă în cadrul subsistemului de măsurare la nivel de hidrocentrală este centrala de protecție termică CPT 60, de fabricație I.C.E. Felix București, realizată cu un controler logic programabil compatibil IBM PC, rulând un nucleu ISaGRAF sub sistemul de operare QNX. Centrala de protecție termică CPT60 este integrabilă într-un sistem de tip SCADA. (Supervisory Control And Data Acquisition), pe lângă funcțiile de măsurare și comandă având posibilitatea de a transmite informații prin intermediul portului serial unui calculator supervizor. PLC-ul are în configurație, în afara unității centrale și a perifericelor pentru stocarea aplicației, 5 module de intrări pentru termorezistență a 12 canale fiecare (în total 60 de puncte de măsură), un modul de ieșiri digitale și un procesor de comunicație în standardul Modbus, cu viteza de transfer selectabilă, adresa slave opțională în intervalul 132, interfețe seriale RS422/485 și RS232, de asemenea selectabile.

O altă componentă la acest nivel este convertorul de interfață de la RS232 la RS422/485, tot de fabricație I.C.E. Felix, care asigură adaptarea, izolarea optică și amplificarea semnalelor.

Arhitectura sistemului la nivel de hidrocentrală este distribuită, din punctul de vedere al amplasării echipamentelor, conectate la o rețea RS422/485. Avantajul unei astfel de structuri este conferit de funcționarea independentă a elementelor din rețea. Sistemele industriale cu comunicație serială sunt cele mai răspândite, fiind recomandate în condițiile unor distanțe considerabile și ale unor debite de date scăzute. Comunicația de date se desfășoară pe o linie în ambele direcții, în modul semi-duplex. Utilizându-se transmisia simetrică față de masă, bazată pe standardul RS485/RS422, se obține o imunitate crescută la nivelul de zgomot ridicat din mediul industrial. Cablul poate atinge o lungime maximă de 1200 m.

O primă configurație hardware a sistemului de măsurare presupune conectarea directă la rețeaua RS422/RS485 a unui calculator portabil.

Comunicația între punctul central, unde există un PC supervizor, și punctele de măsurare îndepărtate se asigură prin intermediul unor modem-uri de tip 3COM USRobotics 56 Kb, cuplate la linii telefonice comutate. Modem-ul este compatibil cu comenzile Hayes. Printr-un software de terminal, modem-ul poate primi comenzi de configurare în format ASCII pe interfața RS232 utilizată pentru transmisia de date. Este necesar să se dezactiveze verificarea erorilor, compresia datelor și controlul fluxului, în plus modem-urile din punctele de măsurare fiind setate să raspundă automat la primul apel.

2.3. Transferul datelor

Protocolul asincron utilizat pentru comunicația de date este Modbus RTU. Dispozitivul master, în situația dată reprezentat de PC-ul supervizor, interoghează PLC-urile conectate în rețea, desemnate drept unități slave. Adresele individuale valide pentru aceste PLC-uri sunt în domeniul 132.

Pe un PLC funcționează o aplicație ISaGRAF care expune către rețeaua de câmp variabilele sale. Acestora li se atribuie adrese ce corespund unor adrese de registru Modbus. Variabilele reprezintă parametrii centralei de control termic (limite, validări canale, compensări de linie). În principiu, programul permite citirea unei zone de înregistrări de date și scrierea unui registru de date în PLC folosind protocolul Modbus. Canalele de intrare ale centralei CPT60 pot fi accesate la adresele (în hexazecimal) 100-13B.

Mesajele Modbus conțin, în principiu, adresa dispozitivului slave, codul funcției și suma de control.

Codul funcției, numărul ce dă tipul mesajului, descrie acțiunea comandată PLC-ului. Funcțiile Modbus utilizate în cadrul aplicației sunt următoarele:

Primele două funcții au fost prezentate pe larg în cuprinsul aplicației anterioare. Un mesaj specific funcției 01 în modul RTU are următoarea structură:

Mesaj transmis

Mesaj recepționat

2.4. Structura software

Arborele de apel pentru pentru aplicație este prezentat în figura 2.2. Modulul principal apelează direct două module încapsulate, subVI-ul de apel și subVI-ul driver de comunicație Modbus RTU, care la rândul lui apelează alte două subVI-uri, precum și instrumentele standard pentru controlul transmisiei seriale RS232, aflate în sublista Serial a listei Function, sau instrumentele necesare controlului fișierelor pe hard-disk din sublista File I/O a listei Function.

În figura 2.3 se prezintă instrumentul virtual care implementează cele trei funcții de comunicație ale protocolului Modbus RTU utilizate în aplicație. Având propriile variabile de intrare și ieșire, reprezentate de controalele și indicatoarele din fereastra panou, subVI-ul este utilizat ca subrutină în componența VI-ului principal, grație conceptului de modularizare care stă la baza realizării programelor în mediul LabView.

Figura 2.2. Arborele de apel al aplicației

Un exemplu de utilizare a subVI-ului de comunicație în Modbus este dat în figura 2.4. Instrumentului virtual i s-a asociat un simbol grafic propriu cu conectori de intrare și ieșire. Pentru fiecare indicator sau control din panoul frontal al VI-ului principal există un terminal asociat în diagrama bloc. Se observă prezența mai multor tipuri de date codificate prin culoare: numere întregi, boolene, grupuri de date de diferite tipuri. Firele de cablare reprezintă fluxul datelor și codifică, de asemenea, prin culoare și stil tipul datelor transmise, scalar sau vectorial.

Pentru subrutina de comunicație, în cadrul aplicației date, terminalele sursă sunt terminale asociate controalelor, constante numerice, sau parametri de ieșire ai unor noduri specifice limbajului G. Funcția predefinită Grupare, din sublista Grupare de date, formează o structură compusă de date din elemente componente care nu aparțin aceluiași tip, aici constante numerice sau structuri de tip tablou. Fiecare element are un număr de ordine care corespunde ordinii de creare. Un vector având ca elemente aceste mulțimi de date este returnat de funcția Construiește tablou din sublista Tablou. Se apelează apoi funcția Subtablou pentru a extrage din vector un anumit element de tip grupare, de la poziția indicată de valoarea transmisă printr-un control meniu derulant. În continuare, se aplică funcția Degrupare care descompune grupul de date în elementele componente, respectând numărul de ordine. S-au transmis astfel simultan subrutinei de comunicație mai mulți parametri, de tipuri diferite, parametri specifici comenzii selectate de către utilizator. Existând valori disponibile pentru toți parametrii de intrare, după prelucrare rezultatele sunt furnizate, de asemenea simultan, terminalelor destinație, corespunzătoare aici indicatoarelor din panoul frontal, de tip boolean sau structură compusă de tip tablou.

Figura 2.3. Instrumentul virtual pentru comunicația în Modbus în faza de proiectare

Figura 2.4. Diagrama bloc. Exemplu de utilizare a subVI-ului

pentru comunicația în Modbus

2.5. Utilizarea programului

Aplicația de monitorizare rulează sub sistemul de operare Microsoft Windows. După lansarea mediului de dezvoltare grafic LabView, produs al firmei National Instruments, se selectează programul și se lansează în execuție cu comanda Run.

Aplicația implică o interfață utilizator, panoul frontal din figura 2.5, care permite accesul la meniul principal, selectarea comenzii, precum și vizualizarea datelor procesate sau erorilor de comunicație.

Figura 2.5. Interfața utilizator

Pentru configurarea portului serial (figura 2.6) sunt disponibile două controale de tip listă circulară, prin care operatorul stabilește portul serial utilizat și viteza de transfer, ceilalți parametri specifici, cum sunt numărul de biți de date, de stop, paritatea, fiind prestabiliți în faza de editare.

Figura 2.6. Configurarea portului serial

Într-un mod similar, se selectează numărul de apel dintr-un meniu derulant (figura 2.7), după care se apasă pe butonul Start apel, configurat cu comportare mecanică “zăvorește la eliberare”, care trece ulterior în stare inactivă. Dacă nu se realizează conexiunea, indicatorul boolean Timeout apel semnalizează aceasta trecând în starea logică complementară, simulând astfel un led de culoare roșie. Concomitent, butonul de apel se reactivează.

Figura 2.7. Cadrul cu controalele pentru comunicația de tip apel

Prin intermediul unui buton radio operatorul comunică programului configurația sistemului hardware, cu conexiune directă sau de tip “dial-up”. Când conexiunea este realizată, indiferent de tipul ei, starea respectivă este indicată printr-un led de culoare verde. Indicatorul are afișat pe suprafața grafică și un cuvânt care evidențiază valoarea logică, ON sau OFF, așa cum se observă în figura 2.8.

Figura 2.8. Meniu derulant pentru comenzi

Doar în acest stadiu operatorul primește acces la comenzile pentru colectarea de date sau pentru configurarea centralei de protecție termică. Programul așteaptă în buclă, prin intermediul unei structuri de control repetitiv While Loop, comanda operatorului. Oprirea ciclului de iterații este însă condiționată logic numai de apăsarea butonului Stop achizitie, acțiune care conduce la întreruperea legăturii de date și la posibilitatea inițierii unei noi conexiuni, în cazul sistemului de tip “dial-up”, reactivându-se pentru aceasta butonul de apel, sau chiar la oprirea rulării programului, pentru situația unei conexiuni directe. Cu indicatorul de conexiune în starea ON, se stabilește PLC-ul ce urmează a fi interogat prin selectarea adresei slave. Comenzile sunt accesibile prin intermediul unui control de tip meniu derulant.

În structurile compuse de tip tablou din figura 2.9, tablouri cu o singură dimensiune dispuse pe verticală, utilizatorul poate introduce valori pentru parametrizarea centralei de protecție termică. Încrierea în registrele de date pentru PLC a acestor valori, numerice sau logice, se execută prin selectarea comenzii corespunzătoare de scriere și apăsarea butonului Trimite comanda, setat cu comportare mecanică “zăvorește la eliberare”.

Procedându-se similar, se execută și procesul de achiziție de date, prin selectarea unei comenzi corespondente de citire. Datele procesate sunt afișate în două indicatoare de tip tablou, cu elemente numerice și, respectiv, booleene.

Afișarea valorilor booleene este realizată sub forma unor lămpi de semnalizare cu două stări, aprins pentru valoarea logică 1 și stins pentru 0 logic. Elementele care nu sunt definite apar punctat.

Prin acționarea comutatorului vertical Preluare date configurare, cu acționare mecanică “comută la apăsare”, în starea ON, valorile recepționate, cu excepția celor de temperatură, sunt transferate automat programului în zona de configurare. Devine astfel posibil ca parametrii unui PLC deja configurat, deci funcțional, să fie, după o eventuală prelucrare specifică, transmiși unui alt PLC, fără a mai fi necesară introducerea manuală a tuturor valorilor, de ordinul sutelor, pentru fiecare controler logic programabil în parte.

Construirea mesajului transmis de tip Modbus, procesarea răspunsului dispozitivului receptor, tratarea erorilor de comunicație, sunt implementate în cadrul diverselor subrutine ale programului care se execută în fundal.

Figura 2.9. Parametrii specifici centralei de protecție termică

Există, de asemenea, posibilitatea salvării datelor de configurare pe hard-disk, în fișiere de setări ale căror nume specifică atât echipamentul, cât și data când a fost efectuată operația de salvare. Cum parametrizarea centralei de protecție termică este permisă și de la consola proprie, pentru operativitate, este recomandat ca operația de salvare a datelor specifice să se execute periodic, în situația unei defecțiuni majore remedierea fiind rapidă, chiar dacă se procedează la înlocuirea unor componente de bază sau a întregului PLC.

Apăsând butonul Scrie fisier, activ doar când led-ul corespunzător operațiilor cu fișiere este de culoare verde, apare fereastra de dialog din figura 2.10. Extensia implicită este “.dat”. Se oferă o denumire standard, precum și o cale de fișier, implicite, dar care se pot modifica în cadrul ferestrei de către operator. Fișierele de date sunt de tip ASCII. S-a optat pentru formatul text deoarece aplicațiile Office recunosc acest tip de documente, permițând editarea lor “off-line”.

Figura 2.10. Caseta de dialog pentru salvarea datelor de configurare

Figura 2.11. Fișier ASCII de configurare

În figura 2.11 un asemenea fișier, de dimensiuni de altfel destul de reduse, circa 1K, este deschis cu programul Notepad, un utilitar existent în Windows.

Prin apăsarea butonului Citeste fisier se afișează fereastra de dialog din figura 2.12. Aceasta permite operatorului căutarea unui fișier de setări ce se dorește a fi utilizat. Se marchează cu mouse-ul și se apasă butonul Open. Programul citește fișierul respectiv și datele de configurare din fișier devin cele curente.

Figura 2.12. Preluarea datelor de configurare din fișiere

Programul de monitorizare (figura 2.13) este destinat achiziției și înregistrării datelor de proces. Operatorul selectează rata de citire (în secunde) și stabilește primul canal pentru care se va face monitorizarea, existând posibilitatea să se urmărească evoluția în timp a temperaturii pentru 10 canale consecutive simultan. Aceste controale numerice digitale sunt în permanență vizibile.

Comutatorul vertical Achizitie temperaturi in bucla, cu comportare mecanică “comută la eliberare”, este trecut în starea ON și se alege comanda de citire a valorilor de temperatură, de altfel singura comandă care testează poziția comutatorului.

Este, de altfel, singurul control activ, prin acționarea lui în starea OFF ieșindu-se din bucla de achiziție, toate celelalte controale booleene din fereastra panou reactivându-se. La declanșarea achiziției de date ciclice o serie de indicatoare devin vizibile.

Este prezentă o diagramă undă de tip domeniu a evoluției temperaturii în timp. Valorile măsurate brute sunt supuse unei prelucrări “on-line”, valorile reale obținându-se din calcul prin scăderea unei valori de offset proprii fiecărui canal de măsură, ce compensează eroarea introdusă de rezistența firelor de legătură între termorezistențe și PLC. Punctele curente sunt afișate în continuarea celor anterioare, la atingerea marginii din dreapta a zonei de vizualizare reprezentarea fiind ștearsă și reîncepută din stânga. Diagrama păstrează punctele reprezentate anterior într-o memorie temporară cu o dimensiune de 1024 de valori, bara de defilare permițând inspectarea variației în timp a procesului. La oprirea procesului de achiziție buffer-ul este golit de date, acțiune transparentă utilizatorului, iar diagrama redevine invizibilă. Reprezentările sunt afișate una sub alta, pe verticală, prin selectarea opțiunii Reprezentări stivuite în faza de programare. În dreapta reprezentărilor grafice sunt afișate în indicatoare numerice digitale atât valorile curente, pe fond negru, cât și valorile maxime recepționate în decursul procesului de colectare a datelor, pe fond roșu, în scop de atenționare.

Valorile curente sunt, de asemenea, transmise terminalului indicatorului numeric de tip termometru, o componentă vizuală sugestivă, de ansamblu, pentru operator. Sunt, de asemenea, vizibile indicatoarele numerice care afișează valoarea contorului de ciclu și, respectiv, a contorului de eroare de comunicație, reinițializate la începutul procesului.

După realizarea compensării soft a erorilor introduse de lungimea firelor de conexiune între termorezistențe și PLC, numai pentru canalele valide valorile reale sunt comparate „on-line” cu limitele prescrise de atenționare și alarmare. Se poate sesiza, totodată, situația de fir întrerupt sau în scurtcircuit. Declanșarea stărilor de alarmare sau atenționare este semnalizată operatorului prin trei indicatoare corespondente de tip boolean, simulând led-uri. De asemenea, în trei indicatoare de tip șir de caractere sunt afișate canalele care au generat evenimentele curente.

Figura 2.13. Monitorizare temperaturi

Într-un mod transparent pentru utilizator, pentru toate cele 60 de canale datele sunt salvate în fișiere de cel mult 1024 de înregistrări (figura 2.14). Fișierele includ în denumirea lor atât echipamentul monitorizat, cât și data și timpul când au fost create, pentru o rapidă identificare. Înregistrările cuprind, pe lângă valorile mărimilor din proces, timpul la care s-a efectuat achiziția și canalele valide care au generat alarme sau semnalizări. La fiecare grup de 1024 de măsuratori, se salvează fișierul curent și se deschide un altul pentru înregistrare, fără nici o intervenție din partea operatorului.

Pentru vizualizarea fișierelor de măsuratori se poate folosi programul de calcul tabelar (spreadsheet) Microsoft Excel, care oferă puternice facilități de prelucrare și afișare.

Figura 2.14. Fișiere de măsurători

2.6. Concluzii

Creșterea productivității, protecția echipamentelor, remedierea rapidă a defecțiunilor, trebuie să constituie preocupări de prim ordin pentru o firmă ce se dorește competitivă. Asemenea aplicații, situate la convergența tehnologiilor de vârf, cum sunt cele de măsurare, de comunicații și informatice, pot conduce la obținerea unei eficiențe ridicate. Timpul foarte scurt de realizare, proiectarea ușoară, toate acestea demonstrează încă o dată potențialul limbajelor grafice, limbaje de generația a 5-a, într-un domeniu ce cunoaște o dezvoltare exponențială.

APLICAȚIA 3

CONTROL ACTIVEX DESTINAT COMUNICATIEI DE DATE

CU UN DISPOZITIV INTELIGENT

3.1. Introducere

ActiveX este numele dat de Microsoft tehnicilor care se bazează pe modelul obiectului component (Component Object Model – COM). Controalele ActiveX pot fi utilizate de către alte aplicații, în pagini WEB, în documente Excel, în aplicații de baze de date create cu Access, în Visual Basic, Visual C++ sau Borland Delphi.

În această aplicație se prezintă un control ActiveX, realizat cu ajutorul mediului integrat de programare Visual Basic 6.0 și destinat comunicației de date cu un dispozitiv electronic inteligent prin intermediul portului serial.

3.2. Contorul CEWE Prometer

Contorul energetic bidirecțional, utilizat pentru calculul și afișarea mărimilor energetice, este de fabricație CEWE, dispunând de o interfață serială RS422 pentru cuplarea la un calculator. Protocolul standardizat de comunicație este IEC1107, având formatul de date: 1 bit de start, 7 biți de date, un bit de stop, paritate impară.

Montajul utilizat este prezentat în figura 3.1. Elementele componente sunt un calculator care dispune de un port serial, convertorul de interfață de la RS232 la RS422, pentru adaptarea și izolarea optică a semnalelor, și contorul de tip Prometer.

Figura 3.1. Schema de legături

3.3. Standardul IEC 1107

Este un standard definit de CEI (Comisia Internațională de Electrotehnică) pentru citirea contorilor, tarifarea și schimbul de date. Protocolul de transmisie a datelor constă în patru moduri de operare alternative.

Comunicația în modul C (figura 3.2), acceptată de contorul CEWE, este bidirecțională și este inițiată prin transmisia unei cereri către dispozitivul de tarifare.

Controlul legăturii de date se realizează prin identificarea caracterelor de control și inițierea acțiunilor potrivite. Codurile sunt definite în lista următoare:

SOH – început de antet (01H) – identifică începutul informațiilor de antet ale unui bloc de date;

STX – început de text (02H) – identifică sfârșitul antetului și începutul zonei de text a mesajului;

ETX – sfârșit de text (03H) – încheie un bloc de date început prin STX sau SOH;

ACK – confirmare (06H) – indică recepționarea corectă a blocului de date anterior;

“R1” – comanda de citire – citirea datelor codate ASCII;

“W1” – comanda de scriere – scrierea datelor codate ASCII;

Identification – codul de identificare;

Z – stabilește rata de transfer (caracterele “0”… “5” pentru 300…9600 baud);

BCC – caracterul de control pe bloc – este transmis imediat după un caracter ETX.

Figura 3.2. Diagrama protocolului de comunicație în modul C

Comanda W1 este urmată de ACK sau NAK. Setul de date pentru comanda de scriere reprezintă un șir de caractere. Adresa este locația de start la care datele sunt înscrise.

Comanda R1 este urmată de STX (D..D) ETX BCC sau de NAK. Pentru comanda de citire, adresa este locația de start de la care datele sunt preluate. Setul de date reprezintă numărul de locații de citit, incluzând locația de start.

3.4. Etapele de proiectare a controlului ActiveX

În mediul de programare Visual Basic, se parcurg următoarele etape:

se lansează un proiect nou pentru controale de tip Active X și se desenează în fereastra UserControl interfața controlului, folosind metodele și controalele grafice din Toolbox;

se adaugă proprietățile, metodele și evenimentele pe care controlul le expune aplicațiilor în care este folosit, apoi se scrie codul care implementează funcționalitatea controlului;

se adaugă un proiect în Visual Basic care oferă o metodă pentru depanarea controlului;

se compilează controlul în fișier OCX.

3.5. Codul sursă al controlului ActiveX

Mesajul de selecție este o cerere de recepție emisă de stația de control, PC-ul în cazul montajului, care anunță contorul Prometer, desemnat drept stație slave, că are ceva de transmis.

Pauzele (timeouts) sunt asigurate de protocolul de comunicație pentru a preveni întârzieri nelimitate cauzate de erorile de date, limitând timpul în care stația emițătoare așteaptă un răspuns.

Caracterul BCC se compară la receptor cu caracterul de control pe bloc calculat de acesta. Toate caracterele, cu excepția caracterului SOH, sunt luate în considerare la efectuarea calcului.

Option Explicit

‘ Constante interne

Const NAK = &H15

Const ACK = &H6

Const SOH = &H1

Const STX = &H2

Const ETX = &H3

‘ Definește evenimentele controlului

Public Event EroareScriere()

Public Event Scriere()

Public Event EroareCitire()

Public Event Citire()

‘ Variabile interne

Private codcontor As String

Private bps As String

Private Mscomm1 As MSComm

‘ procedură eveniment care dimensionează interfața vizibilă a controlului

Private Sub UserControl_resize()

Width = 705

Height = 480

End Sub

‘ PROPRIETĂȚI CE POT FI CONFIGURATE ÎN TIMPUL PROIECTĂRII

‘––Codul de identificare a contorului

Private Sub UserControl_ReadProperties(ProBag As PropertyBag)

codcontor = ProBag.ReadProperty("Cod", "")

End Sub

Private Sub UserControl_WriteProperties(ProBag As PropertyBag)

ProBag.WriteProperty "Cod", codcontor, ""

End Sub

‘ PROPRIETĂȚILE CONTROLULUI CONFIGURATE ÎN TIMPUL RULĂRII

‘–– Portul de comunicație

Public Property Get COM() As Object

Set COM = Mscomm1

End Property

Public Property Let COM(Setare As Object)

Set Mscomm1 = Setare

Mscomm1.Settings = Left(Mscomm1.Settings, 4) + "e,7,1"

Select Case Left(Mscomm1.Settings, 4)

Case "9600"

bps = "5"

Case "4800"

bps = "4"

Case "2400"

bps = "3"

End Select

End Property

‘ –– Codul de identificare a contorului

Public Property Get Cod() As String

Cod = codcontor

End Property

Public Property Let Cod(ByVal Setare As String)

codcontor = Setare

PropertyChanged "Cod"

End Property

‘ METODELE CONTROLULUI PENTRU ACHIZIȚIA DE DATE

‘ funcție generală, care permite preluarea informațiilor din regiștri

Public Function Citeste_registri(adresa As Integer, nrdate As Integer) As String

Dim ad As String

Dim nr As String

ad = Format(adresa, "0000")

nr = Format(nrdate, "0000")

Citeste_registri = Citeste_contor(ad, nr)

End Function

‘ funcție specifică pentru preluarea puterilor active

Public Function Citeste_puteri() As String

Dim ad As String

Dim nr As String

ad = Format(250, "0000")

nr = Format(4, "0000")

Citeste_puteri = Citeste_contor(ad, nr)

End Function

‘ funcție specifică pentru preluarea indecșilor energetici

Public Function Citeste_energii() As String

Dim ad As String

Dim nr As String

ad = Format(101, "0000")

nr = Format(4, "0000")

Citeste_energii = Citeste_contor(ad, nr)

End Function

‘ funcție specifică pentru preluarea tensiunilor

Public Function Citeste_tensiuni() As String

Dim ad As String

Dim nr As String

ad = Format(240, "0000")

nr = Format(3, "0000")

Citeste_tensiuni = Citeste_contor(ad, nr)

End Function

‘ funcție specifică pentru preluarea informației de frecvență

Public Function Citeste_frecventa() As String

Dim ad As String

Dim nr As String

ad = Format(260, "0000")

nr = Format(1, "0000")

Citeste_frecventa = Citeste_contor(ad, nr)

End Function

‘ funcție specifică pentru preluarea factorului de putere

Public Function Citeste_cos() As String

Dim ad As String

Dim nr As String

ad = Format(270, "0000")

nr = Format(2, "0000")

Citeste_cos = Citeste_contor(ad, nr)

End Function

‘ METODELE CONTROLULUI PENTRU COMENZI

‘ funcție generală, care permite înscrierea informațiilor în regiștri

Public Function Scrie_registri(adresa As Integer, nrb As String) As String

Dim ad As String

ad = Format(adresa, "0000")

Scrie_registri = Scrie_contor(ad, nrb)

End Function

‘ funcție specifică pentru transmiterea informației de timp

Public Sub Scrie_timp()

Dim sir As String

Dim timp As String

Dim adresa As String

adresa = "0022"

timp = Format(Time, "hhmmss")

sir = Scrie_contor(adresa, timp)

End Sub

‘ funcție specifică pentru transmiterea datei calendaristice

Public Sub Scrie_data()

Dim sir As String

Dim data As String

Dim adresa As String

adresa = "0021"

data = Format(Date, "yymmdd")

sir = Scrie_contor(adresa, data)

End Sub

‘ funcție specifică pentru transmiterea raportului de transformare de tensiune

Public Sub Scrie_RaportV(nrb As String)

Dim adresa As String

Dim sir As String

adresa = "0890"

sir = Scrie_contor(adresa, nrb)

End Sub

‘ funcție specifică pentru transmiterea raportului de transformare de curent

Public Sub Scrie_RaportI(nrb As String)

Dim adresa As String

Dim sir As String

adresa = "0891"

sir = Scrie_contor(adresa, nrb)

End Sub

‘METODĂ A CONTROLULUI PENTRU INIȚIEREA COMUNICAȚIEI DE DATE

Public Function Init_contor() As Boolean

Dim b As Boolean

b = False

b = InitMesaj(codcontor)

If b = True Then

b = selectMesaj(bps)

End If

Init_contor = b

End Function

‘ FUNCȚII INTERNE

‘ funcții interne utilizate pentru inițierea comunicației

Private Function InitMesaj(codcontor As String) As Boolean

Dim buf(10) As Byte

Dim i As Integer

Dim sir As String

buf(0) = Asc("/")

buf(1) = Asc("?")

buf(2) = Asc("!")

sir = Chr(buf(0))

For i = 1 To 2

sir = sir & Chr(buf(i))

Next i

sir = sir & codcontor & vbCrLf

Mscomm1.Output = sir

Dim timer1

timer1 = Timer

Do While (Timer – timer1) < 1 And Mscomm1.InBufferCount < 14

DoEvents

sir = Mscomm1.Input

If Len(sir) < 14 Or InStr(sir, codcontor) = 0 Then

InitMesaj = False

Else

InitMesaj = True

End If

End Function

Private Function selectMesaj(bps As String) As Boolean

Dim i As Integer

Dim buf(4) As Byte

Dim by As Byte

Dim bx As Byte

Dim sir As String

buf(0) = ACK

buf(1) = Asc("0")

buf(2) = Asc("bps")

buf(3) = Asc("1")

sir = Chr(buf(0))

For i = 1 To 3

sir = sir & Chr(buf(i))

Next i

sir = sir + vbCrLf

Mscomm1.Output = sir

Dim timer1

timer1 = Timer

Do While (Timer – timer1) < 1 And Mscomm1.InBufferCount < 12

DoEvents

If Mscomm1.InBufferCount < 12 Then

selectMesaj = False

Else

selectMesaj = True

End If

sir = Mscomm1.Input

End Function

‘ funcție internă utilizată pentru achiziția de date

Private Function Citeste_contor(ad As String, nr As String) As String

Dim sir As String

Dim buf(16) As Byte

Dim i As Integer

buf(0) = SOH

buf(1) = Asc("R")

buf(2) = Asc("1")

buf(3) = STX

buf(4) = Asc(Mid(ad, 1, 1))

buf(5) = Asc(Mid(ad, 2, 1))

buf(6) = Asc(Mid(ad, 3, 1))

buf(7) = Asc(Mid(ad, 4, 1))

buf(8) = Asc("(")

buf(9) = Asc(Mid(nr, 1, 1))

buf(10) = Asc(Mid(nr, 2, 1))

buf(11) = Asc(Mid(nr, 3, 1))

buf(12) = Asc(Mid(nr, 4, 1))

buf(13) = Asc(")")

buf(14) = ETX

sir = Chr(buf(0))

For i = 1 To 14

sir = sir & Chr(buf(i))

Next i

sir = sir & Calcul_BCC(sir)

Mscomm1.Output = sir

Dim timer1

timer1 = Timer

Do While (Timer – timer1) < 1

DoEvents

sir = Mscomm1.Input

‘declanșare evenimente

If Len(sir) > 3 Then

If Verifica_BCC(sir) = False Then

sir = "BCC"

RaiseEvent EroareCitire

Else

RaiseEvent Citire

End If

Else

If sir = Chr(NAK) Then

sir = "NAK"

RaiseEvent EroareCitire

Else

sir = "Timeout"

RaiseEvent EroareCitire

End If

End If

Citeste_contor = sir

End Function

‘ funcție internă pentru verificarea caracterului de control

Private Function Verifica_BCC(sir As String) As Boolean

Dim by As Byte

Dim i As Integer

by = Asc(Mid(sir, 2, 1))

For i = 3 To (Len(sir) – 1)

by = by Xor Asc(Mid(sir, i, 1))

Next i

If Chr(by) = Mid(sir, Len(sir), 1) Then

Verifica_BCC = True

Else

Verifica_BCC = False

End If

End Function

‘ funcție internă pentru determinarea caracterului de control

Private Function Calcul_BCC(sir As String) As String

Dim by As Byte

Dim i As Integer

by = Asc(Mid(sir, 2, 1))

For i = 3 To Len(sir)

by = by Xor Asc(Mid(sir, i, 1))

Next i

Calcul_BCC = Chr(by)

End Function

‘ funcție internă utilizată pentru comenzi

Private Function Scrie_contor(adresa As String, nrb As String) As String

Dim sir As String

Dim buf(30) As Byte

Dim i As Integer

Dim data As String

Dim lungime As Integer

lungime = Len(nrb)

buf(0) = SOH

buf(1) = Asc("W")

buf(2) = Asc("1")

buf(3) = STX

buf(4) = Asc(Mid(adresa, 1, 1))

buf(5) = Asc(Mid(adresa, 2, 1))

buf(6) = Asc(Mid(adresa, 3, 1))

buf(7) = Asc(Mid(adresa, 4, 1))

buf(8) = Asc("(")

For i = 1 To lungime

buf(8 + i) = Asc(Mid(nrb, i, 1))

Next i

buf(8 + lungime + 1) = Asc(")")

buf(8 + lungime + 2) = ETX

sir = Chr(buf(0))

For i = 1 To (8 + lungime + 2)

sir = sir & Chr(buf(i))

Next i

sir = sir & Calcul_BCC(sir)

Mscomm1.Output = sir

Dim timer1

timer1 = Timer

Do While (Timer – timer1) < 1

DoEvents

Loop

sir = Mscomm1.Input

‘declanșare evenimente

If sir <> "" Then

Select Case Asc(sir)

Case NAK

RaiseEvent EroareScriere

Case ACK

RaiseEvent Scriere

End Select

Else

RaiseEvent EroareScriere

sir = "Timeout"

End If

Scrie_contor = sir

End Function

3.6. Aplicația pentru testarea controlului

3.6.1. Interfața

Singura formă, prezentată în figura 3.3, conține trei cadre, în care sunt grupate funcțional celelalte elemente ale interfeței. Foarte importante sunt controlul de comunicații pentru portul serial și controlul destinat comunicației de date cu un contor CEWE Prometer, control a cărui funcționare se testează.

Cadrul Configuratie comunicatie conține o casetă text, cu eticheta aferentă, în care utilizatorul introduce codul de identificare a contorului, necesar protocolului de comunicație. Cele două liste combinate de tip combo, dispuse sub etichetă, permit operatorului să configureze portul serial.

Cadrul Achizitie date cuprinde un buton de comandă, pentru declanșarea achiziției, și șase casete cu listă, pentru afișarea datelor recepționate, cu etichetele corespunzătoare tipurilor de date.

Al treilea cadru, Comenzi, conține patru butoane de comandă, oferind utilizatorului posibilitatea să seteze anumiți parametri ai contorului Prometer.

Figura 3.3. Interfața aplicației în faza de proiectare

Descrierea interfeței este prezentată în continuare:

Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"

Object = "*\A..\..\..\PROGRA~1\MICROS~2\VB98\Contor.vbp"

Begin VB.Form frmConfig

Caption = "Program de configurare contor CEWE Prometer"

Begin VB.CommandButton cmdInchide

Caption = "Inchide"

End

Begin VB.Frame FraComenzi

Caption = "Comenzi"

Begin VB.CommandButton cmdScriedata

Caption = "Transmite data PC-ului"

End

Begin VB.CommandButton cmdScrieRaportI

Caption = "Raport de transformare I"

End

Begin VB.CommandButton cmdScrieRaportV

Caption = "Raport de transformare V"

End

Begin VB.CommandButton cmdScrietimp

Caption = "Transmite timpul PC-ului"

End

End

Begin VB.Frame FraComunicatie

Caption = "Configurare comunicatie"

Begin MSCommLib.MSComm MSComm1

CommPort = 2

DTREnable = -1 'True

BaudRate = 2400

End

Begin Cewe.Contor Contor1

Visible = 0 'False

End

Begin VB.Label Label8

Caption = "Setati portul serial:"

End

Begin VB.Label Label2

Caption = "Introduceti codul contorului:"

End

Begin VB.ComboBox cboBPS

Text = "2400 bps"

End

Begin VB.ComboBox cboCOM

Text = "Com2"

End

Begin VB.TextBox txtCod

Text = "1114604"

End

End

Begin VB.Frame FraAchizitie

Caption = "Achizitie date"

Begin VB.CommandButton cmdCiteste

Caption = "Citeste date contor"

End

Begin VB.ListBox lstData

End

Begin VB.ListBox lstFactor

End

Begin VB.ListBox lstFrecventa

End

Begin VB.ListBox lstEnergii

End

Begin VB.ListBox lstPuteri

End

Begin VB.ListBox lstCurenti

End

Begin VB.Label lblEnergii

Caption = "Energii"

End

Begin VB.Label lblFrecventa

Caption = "Frecventa"

End

Begin VB.Label lblCos

Caption = "Factor de putere"

End

Begin VB.Label llbData

Caption = "Data si timp"

End

Begin VB.Label lblCurenti

Caption = "Curenti si tensiuni"

End

Begin VB.Label lblPuteri

Caption = "Puteri"

End

End

End

3.6.2. Programul

În subrutina Form_Load, prima care intră în execuție, se inițializează listele combinate de tip combo și portul serial. Metoda AddItem adaugă listei un articol, solicitând o expresie de tip șir. Proprietatea CommPort configurează numărul portului serial, în timp ce proprietatea Settings configurează rata de transfer, ceilalți parametri fiind invariabili.

Attribute VB_Name = "frmConfig"

Option Explicit

Private Sub Form_Load()

cboCOM.AddItem "Com1"

cboCOM.AddItem "Com2"

cboCOM.AddItem "Com3"

cboCOM.AddItem "Com4"

MSComm1.CommPort = Val(Right(cboCOM.Text, 1))

cboBPS.AddItem "2400 bps"

cboBPS.AddItem "4800 bps"

cboBPS.AddItem "9600 bps"

cboBPS.AddItem "19200 bps"

MSComm1.Settings = CStr(Val(cboBPS.Text)) & ",n,8,1"

End Sub

Dacă se execută clic cu mouse-ul pe unul din elementele listelor combinate de tip combo, atunci acel element se va selecta și va fi transferat controlului de port serial.

Private Sub cboCOM_Click()

MSComm1.CommPort = Val(Right(cboCOM.Text, 1))

End Sub

Private Sub cboBPS_Click()

MSComm1.Settings = CStr(Val(cboBPS.Text)) & ",n,8,1"

End Sub

Execuția programului se încheie prin apăsarea butonului de comandă cmdInchide, lansându-se astfel procedura pentru evenimentul Click al butonului.

Private Sub cmdInchide_Click()

Unload Me

End Sub

În subrutina de deschidere a portului serial, se atribuie valoarea True proprietății PortOpen. De asemenea, se configurează prin intermediul proprietăților COM și Cod controlul pentru contor, specificându-se portul serial și codul de identificare al contorului. Interceptarea erorilor este obligatorie, mai ales că se lucrează cu un dispozitiv din afara mediului de programare. La apariția unor erori detectabile în timpul rulării, se execută codul rutinei de tratare a erorilor, afișându-se un mesaj prin intermediul procedurii MsgBox, cum se poate observa în figura 3.4, ce conține descrierea erorii, în situația prezentată portul serial fiind blocat de o altă aplicație.

Function deschide_port() As Boolean

On Error GoTo localhandler

Contor1.COM = MSComm1

Contor1.Cod = txtCod.Text

MSComm1.PortOpen = True

deschide_port = True

Exit Function

localhandler:

MsgBox Error$(Err), vbCritical, "Eroare de comunicatie"

deschide_port = False

Exit Function

End Function

Figura 3.4. Mesaj de eroare la deschiderea portului serial

Codul care urmează conține procedurile pentru înscrierea datelor de configurare în regiștrii contorului Prometer. Pentru aceasta se apelează, extrem de simplu, metodele pentru scriere ale controlului pentru contor. Deschiderea și închiderea portului de comunicație se realizează în afara codului controlului respectiv, în cadrul procedurilor programului de test, oferind flexibilitate programării.

Procedura pentru evenimentul Click al butonului cmdScriedata permite transmiterea datei calendaristice a calculatorului către contor. Se inițiază comunicația de date prin metoda Init _contor, care returnează valoarea booleană True sau False, condiție în cadrul unei structuri de ramificare If…EndIf. Spre exemplu, în situația în care codul de identificare din mesajul de selecție nu este recunoscut de contor, valoarea False returnată determină afișarea unui mesaj de atenționare într-o casetă (figura 3.5). Altfel, este apelată metoda directă de scriere Scrie_data. Există și posibilitatea utilizării metodei generale Scrie_regiștri pentru înscrierea informației în regiștrii contorului, fiind necesară de data aceasta transmiterea argumentelor. Se specifică adresa registrului (21) și data calendaristică, sub forma unui șir de caractere cu formatul "yymmdd".

Private Sub cmdScriedata_Click()

If deschide_port Then

If Contor1.Init_contor Then

Contor1.Scrie_data

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

MSComm1.PortOpen = False

End If

End Sub

Figura 3.5. Mesaj de atenționare la inițierea comunicației de date

Procedura pentru evenimentul Click al butonului cmdScrietimp este similară celei anterioare. Permite transmiterea timpului către contor, prin utilizarea metodei directe sau generale.

Private Sub cmdScrietimp_Click()

Dim sir As String

Dim timp As String

If deschide_port Then

If Contor1.Init_contor Then

'Contor1.Scrie_timp

timp = Format(Time, "hhmmss")

sir = Contor1.Scrie_registri(22, timp)

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

MSComm1.PortOpen = False

End If

End Sub

Procedura pentru evenimentul Click al butonului cmdScrieRaportI permite transmiterea raportului de transformare pentru curent către contor. Sunt imbricate mai multe structuri de ramificare, corespunzător celor două etape, fiecare cu mai mulți pași de implementare.

Prima etapă realizează, după inițierea comunicației, preluarea informației conținute în registrul contorului și afișarea într-o casetă, ca model și valoare prestabilită pentru introducerea datelor de configurare. Pentru achiziția de date se apelează la metoda generală Citește_regiștri, având ca argumente adresa registrului și numărul de octeți, de tip întreg. Mesajul de răspuns al contorului include un bloc de date delimitat de paranteze, necesar a fi prelucrat. Se utilizează pentru aceasta funcțiile speciale pentru șiruri de caractere Instr și Mid. Funcția InputBox afișează rezultatul într-o casetă de dialog, așa cum se vede în figura 3.6, apoi așteaptă ca utilizatorul să introducă noile date, conform modelului, sau să selecteze un buton, returnând conținutul casetei text. Dacă șirul de caractere este de lungime zero, a fost selectat butonul Cancel, sau șirul nu corespunde modelului, se părăsește subrutina, nu înainte însă de a se închide portul serial. Dacă șirul de caractere rezultat are lungime diferită de zero și corespunde modelului, se trece la execuția etapei a doua, de scriere.

Se impune inițierea din nou a comunicației de date, întrucât intervalul de timp în care se afișează fereastra de dialog, nedefinit ca durată, oricum de ordinul secundelor, este interpretat de contor ca o întrerupere a comunicației din partea stației de control. Se utilizează metoda directă Scrie_RaportI , având ca argument șirul de caractere returnat de funcția InputBox.

Figura 3.6. Caseta de dialog pentru introducerea

raportului de transformare pentru curent

Private Sub cmdScrieRaportI_Click()

Dim raspuns As String

Dim valoare As String

Dim ps As Integer

Dim pd As Integer

If deschide_port Then

If Contor1.Init_contor Then

valoare = Contor1.Citeste_registri(891, 1)

ps = InStr(1, valoare, "(")

pd = InStr(1, valoare, ")")

If ps <> 0 And pd <> 0 Then

valoare = Mid(valoare, ps + 1, pd – ps – 1)

raspuns = InputBox$("Introduceti noile valori, dupa model, separate prin virgula", "Raport de transformare de curent", valoare)

If raspuns <> "" And InStr(1, raspuns, ",") <> 0 Then

If Contor1.Init_contor Then

Contor1.Scrie_RaportI (raspuns)

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

End If

Else

MsgBox "Eroare de citire! " & valoare, vbExclamation, "Mesaj program"

End If

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

MSComm1.PortOpen = False

End If

End Sub

Procedura pentru evenimentul Click al butonului cmdScrieRaportV permite transmiterea raportului de transformare pentru tensiune către contor. Are o structură similară cu procedura anterioară. Singura deosebire constă în utilizarea metodei directe de scriere Scrie_RaportV , având ca argument șirul de caractere returnat tot de o funcție InputBox (figura 3.7). Desigur, adresa de memorie a contorului care conține informația utilă și în care se va înscrie noua valoare este diferită.

Private Sub cmdScrieRaportV_Click()

Dim raspuns As String

Dim valoare As String

Dim ps As Integer

Dim pd As Integer

If deschide_port Then

If Contor1.Init_contor Then

valoare = Contor1.citeste_registri(890, 1)

ps = InStr(1, valoare, "(")

pd = InStr(1, valoare, ")")

If ps <> 0 And pd <> 0 Then

valoare = Mid(valoare, ps + 1, pd – ps – 1)

raspuns = InputBox$("Introduceti noile valori, dupa model, separate prin virgula", "Raport de transformare de tensiune", valoare)

If raspuns <> "" And InStr(1, raspuns, ",") <> 0 Then

If Contor1.Init_contor Then

Contor1.Scrie_RaportV (raspuns)

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

End If

Else

MsgBox "Eroare de citire! " & valoare, vbExclamation, "Mesaj program"

End If

Else

MsgBox "Nu s-a initializat contorul!", vbExclamation, "Mesaj program"

End If

MSComm1.PortOpen = False

End If

End Sub

Figura 3.7. Caseta de dialog pentru introducerea

raportului de transformare pentru tensiune

Figura 3.8. Confirmarea execuției comenzii

Execuția codului controlului pentru contor, la apelarea metodelor de scriere, declanșează procedurile eveniment. Utilizatorul este informat, prin intermediul unei casete de dialog MsgBox, dacă operația de configurare a contorului a reușit. Conform protocolului de comunicație, la final contorul indică recepționarea corectă sau incorectă a blocului de date, confirmând (figura 3.8) sau nu (figura 3.9) execuția comenzii primite.

Private Sub contor1_Scriere()

MsgBox "A inscris valoarea!", vbInformation, "Mesaj contor"

End Sub

Private Sub contor1_EroareScriere()

MsgBox "Eroare scriere!", vbExclamation, "Mesaj contor"

End Sub

Figura 3.9. Mesaj de eroare pentru operația de scriere

Codul următor cuprinde procedurile pentru achiziția datelor din regiștrii contorului Prometer. Sunt testate metodele pentru citire ale controlului pentru contor. Deschiderea și închiderea portului de comunicație se realizează, de asemenea, în afara codului controlului , în cadrul procedurilor programului de test.

Există un singur buton de comandă, care declanșează achiziția datelor. La apăsarea lui de către utilizator se execută procedura pentru evenimentul Click. Mai întâi sunt eliminate toate articolele din listele utilizate pentru afișarea datelor recepționate într-o achiziție anterioară. După deschiderea portului serial și inițierea comunicației, conform protocolului, sunt apelate succesiv metodele directe de achiziție pentru mărimile electrice. Se poate apela însă la fel de bine metoda generală de achiziție de date, cum se procedează dealtfel pentru achiziția informației de timp. Argumentele funcției sunt adresa de început și numarul de locații de memorie solicitate. Șirul de caractere returnat este atribuit unei variabile care devine argument pentru subrutinele de prelucrare și afișare, apelate în mod explicit.

Private Sub cmdCiteste_Click()

Dim sir As String

lstData.Clear

lstCurenti.Clear

lstPuteri.Clear

lstEnergii.Clear

lstFrecventa.Clear

lstFactor.Clear

If deschide_port Then

If Contor1.Init_contor Then

sir = Contor1.citeste_registri(21, 2)

Call Listatimp(sir)

sir = Contor1.Citeste_tensiuni

Call Lista(lstCurenti, sir, 3)

sir = Contor1.Citeste_puteri

’sir = Contor1.citeste_registri(250, 4)

Call Lista(lstPuteri, sir, 4)

sir = Contor1.Citeste_energii

Call Lista(lstEnergii, sir, 4)

sir = Contor1.Citeste_frecventa

Call Lista(lstFrecventa, sir, 1)

sir = Contor1.Citeste_cos

Call Lista(lstFactor, sir, 2)

Else

MsgBox "Nu s-a initializat contorul", vbExclamation, "Mesaj program"

sir = MSComm1.Input

End If

MSComm1.PortOpen = False

End If

End Sub

Execuția codului controlului pentru contor, la apelarea metodelor de citire, declanșează procedurile eveniment. Utilizatorul este informat, prin intermediul unei casete de dialog MsgBox, dacă a fost recepționat corect sau nu blocul de date. Procedurile nu sunt utilizate decât în faza de depanare a aplicației, altfel, o întârziere în achiziția succesivă de date poate fi interpretată de către contor ca o întrerupere a legăturii de date, fiind necesară inițierea din nou a comunicației cu contorul.

Private Sub contor1_Citire()

'MsgBox "A citit valoarea!", vbInformation, "Mesaj contor"

End Sub

Private Sub contor1_EroareCitire()

'MsgBox "Eroare citire!", vbInformation, "Mesaj contor"

End Sub

Procedura de prelucrare și afișare pentru mărimile electrice primește ca argumente caseta cu listă specifică, pentru afișarea datelor recepționate de un anumit tip, un șir de caractere semnificând blocul de date sau un mesaj de excepție, și numărul de mărimi așteptate, delimitate în cadrul blocului de date de paranteze.

Se testează pentru început șirul de caractere dacă nu corespunde unui răspuns de excepție, prin verificarea a trei condiții într-o structură de ramificare cu If…EndIf, recepție incorectă a mesajului sau imposibilitate din partea contorului de a transmite datele solicitate, caracter de control pe bloc diferit, sau depășire a timpului în care se așteaptă un răspuns. Dacă se verifică o condiție, se va afișa mesajul aferent în listă, ca în figura 3.10 .

Altfel, în cadrul unei structuri de ciclare de tip For…Next, se extrag succesiv mărimile, cu funcțiile pentru șiruri de caractere Instr și Mid, din blocul de date și se adaugă listei ca articole de tip șir de caractere. Figura 3.11 ilustrează funcționarea procedurilor de achiziție și prelucrare a datelor.

Private Sub Lista(List As ListBox, bloc As String, nr As Integer)

Dim valoare(10) As String

Dim ps As Integer

Dim pd As Integer

Dim j As Integer

If bloc <> "NAK" And bloc <> "BCC" And bloc <> "Timeout" Then

ps = 1

pd = 1

For j = 0 To (nr – 1)

ps = InStr(ps + 1, bloc, "(")

pd = InStr(pd + 1, bloc, ")")

valoare(j) = Mid$(bloc, ps + 1, pd – ps – 1)

List.AddItem (valoare(j))

Next j

Else

List.AddItem bloc

End If

End Sub

Figura 3.10. Mesaj de excepție (timeout) pentru achiziția de date

Procedura de prelucrare și afișare pentru informația de timp primește un singur argument, de tip șir de caractere, care poate fi mesajul de excepție sau blocul de date. Caseta cu listă utilizată pentru afișare și numărul de marimi așteptate sunt cunoscute.

Subrutina este altfel similară cu cea anterioară, necesitând însă o prelucrare suplimentară a mărimilor extrase din blocul de date pentru afișarea într-un format specific.

Private Sub Listatimp(ByVal marime As String)

Dim valoare(2) As String

Dim ps As Integer

Dim pd As Integer

Dim j As Integer

If marime <> "NAK" And marime <> "BCC" And marime <> "Timeout" Then

ps = 1

pd = 1

ps = InStr(ps + 1, marime, "(")

pd = InStr(pd + 1, marime, ")")

valoare(0) = Format(Mid$(marime, ps + 1, pd – ps – 1), "20##/##/##")

lstData.AddItem (valoare(0))

ps = InStr(ps + 1, marime, "(")

pd = InStr(pd + 1, marime, ")")

valoare(1) = Format(Mid$(marime, ps + 1, pd – ps – 1), "##:##:##")

lstData.AddItem (valoare(1))

Else

LstData.AddItem marime

End If

End Sub

Figura 3.11. Preluarea și afișarea informațiilor de la contor

3.7. Compilarea controlului

Dacă se intenționează utilizarea unui control în Internet se recomandă compilarea în pseudocod, ceea ce conduce la crearea unui fișier de dimensiuni mai mici. Codul nativ este însă mai rapid și recomandat pentru aplicații de mare viteză.

Din momentul compilării, Visual Basic îl înregistrează automat în sistem și-l adaugă în caseta de dialog Components. Pe un alt sistem este însă necesar să se ruleze utilitarul REGOCX32.EXE.

3.8. Concluzii

Programarea orientată pe obiect (OOP-Object Oriented Programming) în Visual Basic permite o mai bună structurare a aplicațiilor, oferind importante facilități pentru lucrul în echipă sau individual. Tehnica ActiveX reprezintă un mecanism prin care obiectele sunt partajate și utilizate în întreaga platformă de lucru. Visual Basic se dovedește un sistem de dezvoltare deosebit de productiv, permițând obținerea de rezultate rapide, cu costuri reduse, în aplicațiile pentru monitorizare de procese și automatizări industriale.

APLICAȚIA 4

SISTEM DE ACHIZIȚIE DE DATE LA DISTANȚĂ

DESTINAT DISPECERILOR ENERGETICI DE HIDROAMENAJARE

4.1. Descriere

Sistemul are rolul de a colecta automat date provenite de la un număr de centrale hidroelectrice dispuse în cascadă. Cunoașterea parametrilor de funcționare pentru hidroagregate și centrale în ansamblu are implicații economice multiple, reprezentând o etapă necesară de modernizare a activității de exploatare. Vizualizarea datelor de către dispecerul de amenajare se realizează individual, pentru câte o hidrocentrală.

Sistemul prezintă un caracter distribuit la nivel de centrală. Schema generală de legături este prezentată în figura 4.1. Avantajul unei astfel de structuri este dat de posibilitatea funcționării independente a echipamentelor. De asemenea, sistemul permite modernizări și dezvoltări ulterioare, atât cantitativ, cât și în privința funcționalității, sau în ceea ce privește conectarea cu sistemul informatic de management. S-au utilizat interfețe și protocoale de comunicație standardizate.

Figura 4.1. Schema de legături

Obiectivele realizate sunt următoarele:

monitorizarea în timp real, pentru o hidrocentrală, a principalelor mărimi electrice (valori de curenți, tensiuni, puteri active și reactive), a nivelelor apei și temperaturilor;

achiziția automată, pentru toate hidrocentrale dispuse în cascadă, la un interval de timp prestabilit, precum și stocarea în baze de date, a nivelelor apei din amonte și aval de centrală și a pierderilor de presiune pe grătare (necesare pentru calculul căderii reale pe grupuri);

achiziția automată și stocarea mărimilor energetice;

achiziția automată și stocarea temperaturilor pentru lagăre, stator generator ș.a.;

afișarea la dispecerat a mărimilor achiziționate sub forma unor tabele și grafice;

calcule de mărimi derivate

emitere de rapoarte standardizate.

4.2. Subsistemul de măsurare la nivel de centrală

La nivel de centrală, sistemul este conceput în jurul unei rețele multipunct RS422/485. Se beneficiază astfel de avantajele comunicației pe interfața serială, ca mijloc de transmitere bidirecțională a datelor între calculator și dispozitivele periferice, în condițiile unor distanțe mari și ale unor debite de date scăzute.

Dispozitivele de măsură sunt dispuse pe distanțe considerabile atât în interiorul centralei, cât și raportat la nivelul întregii amenajări. Celelalte probleme specifice sunt cele generate de mediul industrial, nivelul de zgomot ridicat și interferențele electromagnetice. Prin utilizarea transmisiei balansate, bazate pe standardul RS422/RS485, problemele determinate de potențialele variabile de masă au fost eliminate. De asemenea, frecvențele de eșantionare nu sunt foarte mari. Sunt principalele argumente care au impus această soluție de achiziție și transmisie a datelor.

Principala componentă la acest nivel este convertorul de interfață de la RS232 la RS422/485, prezentat în figura 4.2, de fabricație I.C.E. Felix, ce asigură adaptarea semnalelor.

Figura 4.2. Modul convertor de la RS232 la RS485-RS422

Din rațiuni economice și de dezvoltare treptată a aplicației, pornind de la modulele inteligente I/O existente în centrale, s-a optat pentru transmiterea directă la dispecerat a datelor prin intermediul unui modem cuplat la o linie telefonică sau la o rețea GSM, renunțându-se la un concentrator local de date. Modem-ul este asincron, semi-duplex, compatibil cu comenzile Hayes, cu auto-răspuns. Printr-un software de terminal, pe interfața RS232 utilizată pentru transmisia de date, modem-ul primește comenzi în format ASCII. Registrul S0, care stabilește după câte apeluri se răspunde automat, a fost setat la valoarea 1.

Contorul energetic bidirecțional de tip Prometer (figura 4.3), utilizat pentru calculul și afișarea locală a mărimilor energetice, este de fabricație CEWE, având clasa de precizie 0.5 și dispunând de o interfață serială RS422 pentru cuplarea la un computer sau la un dispozitiv de comunicație. Protocolul standard de comunicație utilizat pentru transferul datelor este IEC 1107.

Figura 4.3. Contor tip Prometer

Instalația de măsurare a nivelului apei și a pierderilor de presiune pe grătare, parametri de bază în exploatarea hidroagregatelor, se bazează pe traductoare de presiune submersibile SGS 601 cu ieșire în curent unificat, conectate la blocuri electronice indicatoare DMP 240, de fabricație Penny & Giles (figura 4.4). Aceste instrumente se pot interfața cu un PC printr-un convertor RS232/RS485, utilizând pentru comunicație un protocol ASCII de proprietar, fără sumă de control, sau Modbus RTU.

Figura 4.4. Indicatorul digital de panou DMP240

Centrala de protecție termică CPT 60, de fabricație I.C.E. Felix, este realizată cu ajutorul unui controler logic programabil compatibil IBM PC (figura 4.5). Centrala de protecție termică CPT 60 poate fi folosită atât ca produs de sine stătător, cât și integrată într-un sistem SCADA. Are în configurație o unitate centrală, periferice pentru stocarea aplicației, o consolă de afișare, tastatură, 5 module de intrări pentru termorezistențe, cu 12 canale fiecare (maxim 60 de puncte de conexiune), un modul de ieșiri numerice cu 24 de canale de ieșire cu relee REED și un procesor de comunicație în standardul Modbus RTU.

Figura 4.5. Centrala de protecție termică CPT 60

4.3. Subsistemul de dispecerizare

În cadrul dispeceratului este dispus un calculator compatibil IBM conectat la rețeaua informatică. Două modem-uri de tip 3COM USRobotics 56 Kb (figura 4.6), cuplate pe linii telefonice de interior, sunt conectate la porturile seriale ale calculatorului. Un prim modem este destinat achiziției datelor la un interval de timp prestabilit, implicit la o oră, aplicația software rulând la modul transparent pentru utilizator. Cel de-al doilea modem este destinat monitorizării în timp real a unei centrale hidroelectrice.

Figura 4.6. Modem de tip 3COM USRobotics 56 Kb

Aplicația software scanează centralele cu frecvența dorită, operația de comutare efectuându-se prin intermediul unei centrale telefonice. S-a optat pentru această soluție economică date fiind debitele de date reduse și ratele de transfer scăzute.

Comunicația între punctul central și punctele de măsurare îndepărtate se poate asigura și prin modem-uri GSM. S-au testat cu succes modem-urile FALCOM A2D-1 și AUDIOTEL din figura 4.7. Pentru a controla modem-ul GSM, există un set avansat de comenzi AT în acord cu GSM ETSI (European Telecommunications Standards Institute) 07.07 și 07.05:

ATS0 Comandă de control al apelului. Parametrul S0 controleaza raspunsul automat la un apel din exterior.

AT+CPIN Comanda este utilizată pentru a trimite PIN-ul modem-ului.

AT+CREG Comanda este utilizată pentru a arăta starea de înregistrare în rețea.

AT&D Acest parametru determină cum răspunde DCE-ul când DTR trece din ON în OFF (utilizat pentru a închide conexiunea)

AT+CBST Comanda este utilizată pentru a selecta viteza de comunicație

AT+ICF Stabilește formatul de date

AT&W Comanda este utilizată pentru a salva parametrii de configurare.

Figura 4.7. Modem-uri GSM de tip FALCOM și AUDIOTEL

Legătura de date este asincronă, semiduplex, de tip multipunct. PC-ul reprezintă stația master, în timp ce dispozitivele electronice inteligente din centralele hidroelectrice, contorii, blocurile indicatoare și centralele de protecție termică, sunt desemnate drept stații slave. PC-ul este directorul de trafic și selectează, prin intermediul unui proces de interogare specific, stația slave care utilizează conexiunea.

4.4. Interfețe seriale pentru transmisii de date

La interfețele RS422/485, fiecare semnal de date folosește o pereche de fire torsadate, având astfel o transmisie simetrică (echilibrată) față de masă, cu imunitate crescută la zgomot, datorită factorului de rejecție a semnalelor de mod comun prezentat de comparatoarele diferențiale. Deși emițătorul și receptorul sunt conectate cu un fir de masă, acesta nu este utilizat pentru a determina nivelele logice. Informația binară este dată în această situație de polaritatea semnalelor. Intrările diferențiale ignoră potențialele diferite de masă ale emițătorului și receptorului. Pentru ambele interfețe cablul poate atinge o lungime de 1200 m, dacă nu se utilizează repetoare.

Totuși, RS422 este proiectat pentru legături punct-la-punct, pentru a extinde practic interfața RS232, deși poate accepta până la zece receptoare și un unic emițător. Impedanța de intrare a receptorului este în acest caz de 4 kΩ. Un terminator de 100 Ω este conectat la capătul liniei pentru o sarcină minimă și pentru a elimina reflexiile.

RS485 permite comunicații multiple cu până la 32 de dispozitive, emițătoare, receptoare, combinații de acestea, la o impedanță de intrare a circuitelor de 12 kΩ.

RS485 există în două variante. La prima versiune, toate dispozitivele sunt conectate la o singură pereche de fire, plus un conductor de masă, la ambele capete ale liniei fiind montați terminatori (figura 4.8).

Figura 4.8. Rețea multipunct RS 485

Comunicația se desfășoară pe o linie în ambele direcții, în modul semi-duplex. Pentru a controla traficul, convertorul RS485 utilizează de regulă semnalele RTS și DTR ale interfeței RS232. Protocolul de comunicație previne ca dispozitivele ce împart canalul să comunice simultan. Cele mai multe sisteme RS485 utilizează arhitectura master/slave, în care fiecare unitate slave are o adresă unică și răspunde numai la pachetele adresate. Aceste pachete sunt generate de către un dispozitiv master care interoghează unitățile slave conectate la rețea, cerându-le să-i transmită date, sau le selectează pentru a recepționa comenzi în continuare. Un mesaj este format din mai multe câmpuri, în timp ce un câmp este alcătuit dintr-o succesiune de octeți. Unul din aceste câmpuri este și cel de adresă. Dispozitivul care are adresa din mesaj va răspunde comenzii master-ului.

În a doua variantă, RS485 admite modul full-duplex pe circuite de 4 fire. Dispozitivele slave transmit pe o a doua linie la care este conectat portul de recepție al dispozitivului unic de tip master, fără a putea comunica între ele.

Deși standardul acceptă viteze de 10 Mbps, acestea sunt limitate de rezistența unei linii foarte lungi, ce poate duce la pierderea semnalului. De asemenea, trebuie luate în calcul capacitatea echivalentă a liniei și pierderile datorate efectului pelicular. De exemplu, o viteză de 9600 bps se atinge pentru un cablu de maximum 40nF, capacitate care trebuie încărcată și descărcată, conducând astfel la scăderea vitezei de transmisie.

Pentru a crește numărul de dispozitive conectate la rețea se introduce un repetor RS485. O altă metodă utilizează dispozitive cu impedanță de intrare de 48 kΩ, de 4 ori mai mare față de cea din standard, ce permite conectarea a 128 de dispozitive în același timp.

4.5. Protocoale pentru legături de date

Protocoalele conțin un set de reguli care definesc interacțiunea dintre două echipamente. Secvența de caractere din care se construiesc mesajele, caracterele speciale și cele tipăribile, procedurile de tratare a erorilor definesc protocolul de comunicație. Protocoalele la care nu se transmite și informația de sincronizare de la emițător la receptor, receptorul având propriul semnal de tact, sunt cunoscute ca protocoale asincrone, folosind cel mai adesea un set de caractere ASCII sau hexazecimale pentru comenzi.

Protocolul pentru transmiterea datelor acceptat de contorul CEWE Prometer a fost descris pe larg în cuprinsul aplicației anterioare.

Protocolul de comunicație al centralei de protecție termică CPT60 este Modbus, cu modul de transmisie serială RTU, prezentat în detaliu în cadrul primei aplicații.

4.5.1. Protocolul de comunicație ASCII pentru

indicatoarele DMP240

Comanda trimisă către instrument are următoarea structură:

;001 RA 2 1<CR><LF>

unde:

; caracterul de start;

001 adresa (poate lua valori de la 000 la 247);

RA comanda de citire a unei locații de memorie; alte comenzi sunt: SA, de scriere într-o locație analogică, SL si RL, comenzi similare, dar pentru mărimi logice;

2 adresa de date (conține valoarea afișată local în cazul de față);

1 pentru comenzile de citire reprezintă numărul de parametri consecutivi furnizați de instrument; pentru comenzile de scriere reprezintă valoarea (ON/OFF pentru logice).

Harta de alocare a memoriei este descrisă detaliat în ghidul de instalare al instrumentului. Se pot face multe alte setări de la distanță, cum ar fi modificarea parametrilor comunicației seriale, modului de afișare, filtrarea mărimii de intrare, fixarea limitelor de alarmare, condiționări complexe de semnal, implementarea unor funcții matematice etc.

Pentru dificultăți de comunicare se trimite comanda de resetare a instrumentului:

;XXX SL 155 ON<CR><LF>

4.6. Structura software

Aplicația software este un pachet de programe care permite gestionarea interfețelor de comunicație, afișarea parametrilor reali de funcționare, cu realizarea unei bănci de date. Arhitectura este flexibilă, permițând extinderi ulterioare.

Este o aplicație orientată pe obiect, condusă de evenimente, intuitivă, construită pentru platforma Windows, un mediu de operare multitasking cu certe perspective. Sunt afișate mai multe ecrane cu care utilizatorul interacționează pentru a controla evoluția programului.

Programele au fost dezvoltate cu produsul vizual Microsoft Visual Basic, un sistem de dezvoltare performant, cu Microsoft Excel, beneficiindu-se astfel de puterea de calcul a acestui produs, și Microsoft Access, pentru stocarea datelor. Visual Basic este un limbaj de nivel înalt ce constituie o cale rapidă și facilă de a crea aplicații pentru sistemul de operare Windows.

4.6.1. Interfața aplicației

În continuare, se prezintă câteva dintre ecranele (figurile 4.10-4.22) sistemului informatic de măsurare și monitorizare la distanță:

Figura 4.10. Sistem automat de măsurare

Figura 4.11. Procesul de colectare automată a datelor

Figura 4.12. Sistem de monitorizare și prezentare date achiziționate

Figura 4.13. Fereastra de configurare a sistemului

Figura 4.14. Vizualizarea datelor colectate de la nivelmetre

Figura 4.15. Fereastra de vizualizare a datelor colectate de la contori

Figura 4.16. Fereastra de vizualizare a datelor

colectate de la controlul termic

Figura 4.17. Ferestrele de apel și achiziție de date de la contori

Figura 4.18. Fereastra de monitorizare directă a unei centrale hidroelectrice

Figura 4.19. Fereastra de apelare directă și achiziție de date de la nivelmetre

Figura 4.20. Apelare directă și achiziție de date de la controlul termic

Figura 4.21. Prelucrare automată a datelor în Excel pentru nivelmetre

Figura 4.22. Prelucrare automată a datelor în Excel pentru contori

4.6.2. Codul sursă

În cele ce urmează este prezentată o procedură semnificativă din componența programului. ANEXA 1 cuprinde codul sursă pentru achiziția și prelucrarea datelor de la echipamentele de măsurare a nivelului.

Controlul erorilor pentru protocolul Modbus RTU se face la nivel de cadru de transmisie printr-un cod polinomial CRC (verificare ciclică a redundanței). Algoritmul de calcul a fost prezentat pe larg anterior. Implementarea în Visual Basic a acestui algoritm se realizează prin procedura următoare:

Dim crc1, crc2

Sub calculeazacrc(mesaj)

Dim crc, car, bit

crc = 65535

For car = 1 To Len (mesaj)

crc = crc Xor Asc (Mid$ (mesaj, char, 1))

For bit = 1 To 8

If (crc And 1) <> 0 Then

crc = (crc \ 2)

crc = (crc Xor 40961)

Else

crc = (crc \ 2)

End If

Next bit

Next car

crc = (crc And 65535)

crc2 = (crc \ 256)

crc1 = (crc – (crc2 * 256))

End Sub

4.7. Concluzii și perspective

Avantajele sistemului automat de măsurare prezentat sunt multiple. Gestiunea energiei electrice poate contribui la o eficiență economică ridicată, astfel încât investițiile, altfel limitate, date fiind concepția și realizarea graduală, se pot recupera rapid.

În ceea ce privește dezvoltarea viitoare a sistemului, se pot realiza:

– completarea sistemului cu aplicații pentru urmărirea debitelor deversate;

– dezvoltarea unor programe de prelucrare specifice (interpolări de date);

– dispunerea unei plăci multiport la dispecer și a unui concentrator local de date la nivel de centrală.

Soluția prezentată nu este decât o etapă în realizarea unui sistem informatic industrial eficient și modern.

APLICAȚIA 5

SISTEM DE MONITORIZARE CU ARHITECTURĂ CLIENT-SERVER

PENTRU AMENAJARE HIDROENERGETICĂ

5.1. Introducere

Într-o amenajare hidroenergetică, punctele de măsurare sunt amplasate grupat, dar la distanță mare de locul în care se amplasează centrul de comandă de la dispecer. Acest fapt impune concentrarea locală a datelor pentru mărimile măsurate în același perimetru. Un astfel de sistem are inevitabil o structură ierarhică.

Această structură permite funcționarea independentă a diferitelor ansambluri funcționale, la nivelul superior fiind transmise doar datele strict necesare.

O arhitectură care adaugă la nivelul centralelor hidroelectrice o stație industrială, cum se poate observa în figura 5.1, decuplează informațional stația centrală de la dispecerul de hidroamenajare de informația la nivelul camerei de comandă din centrala hidroelectrică. Acest lucru permite preluarea la nivelul hidrocentralelor a unor cantități de date referitoare la funcționarea acestora, date necesare personalului de supraveghere din centrale și care nu mai trebuie transmise la nivel de dispecer. Informațiile disponibile la fiecare nivel de conducere sunt strict cele necesare procesului de decizie specific.

Vizualizarea datelor de către dispecerul de hidroamenajare se va realiza în mod obișnuit la nivel de cascadă, dar și la nivel de centrală, în situații care impun aceasta.

Figura 5.1. Schema de legături

5.2. Structura hardware

5.2.1. Subsistemul de măsurare la nivel de centrală

Sistemul este realizat în jurul unei rețele multipunct RS 485/422 la care sunt conectate dispozitivele inteligente I/O existente în centrale: centrale de control termic CPT60, de fabricație I.C.E. Felix, contori Prometer (CEWE) și blocuri electronice indicatoare DMP 240, de la Penny & Giles.

Calculatorul din camera de comandă prezentat în figura 5.2 înglobează funcțiile următoare:

consolă operator (HMI – Human Machine Interface); asigură funcțiile de monitorizare și alarmare;

server de aplicații: prelucrarea datelor, baze de date istorice, configurarea rețelei de câmp;

server-ul de comunicație, asigurând schimbul de date cu centrul de control;

server-ul de proces, utilizat pentru achiziția de date de la dispozitivele de câmp.

Transmiterea la nivelul dispecer a datelor se realizează prin intermediul unui modem cuplat la o linie telefonică sau la o rețea GSM.

Figura 5.2. Server achiziție și comunicație

5.2.2 Subsistemul de dispecerizare

Prin intermediul unei plăci seriale multiport, a modem-urilor cuplate la linii telefonice închiriate sau comutate, aplicația ce rulează pe stația centrală colectează simultan informații în timp real de la toate centralele din componența amenajării hidroenergetice.

Comunicația între punctul de dispecer și centralele din subordine se poate asigura și prin modem-uri GSM. Pentru reducerea costurilor, transferul bazelor de date proprii centralelor, care conțin datele preluate la intervale orare, se face doar la cerere.

5.3. Structura software

Este o arhitectură deschisă de tip client-server. Avantajele structurii client-server sunt, printre altele, integritatea datelor și vizualizarea datelor în timp real.

Programele au fost dezvoltate în Microsoft Visual Basic. Sunt aplicații software orientate pe obiect, conduse de evenimente, ce rulează pe platforma Windows 2000, un mediu de operare multitasking.

5.3.1 Aplicația de centrală

5.3.1.1 Modulul de proces

Programul conține driverele pentru comunicarea cu echipamentele locale utilizând diferite protocoale standard sau “de facto”, MODBUS RTU, IEC 1170, ASCII, protocoale specifice automatelor programabile și echipamentelor RTU existente în instalație. Schimbul de date între IED-uri (dispozitive electronice inteligente) și calculator este realizat prin procedura master/slave. Calculatorul controlează traficul de date prin interogarea secvențială a IED-urilor (polling). În acest caz, calculatorul este master-ul care inițiază transferul de mesaje, în timp ce IED-urile sunt stațiile slave care pot transmite doar când sunt interogate. Pentru verificarea erorilor de transmisie se utilizează mai multe metode: verificarea la nivel de caracter, verificarea la nivel de cadru de transmisie (verificarea longitudinală a redundanței LRC, verificarea ciclică a redundanței CRC). Calculatorul asigură și funcția de sincronizare a contorilor.

Mărimile monitorizate sunt mărimi ce condiționează starea de ansamblu a instalațiilor:

puterea activă P, puterea reactivă Q pe grupuri;

P, Q pe LEA de racord;

tensiunile pe barele centralei;

curentul și tensiunea din statoarele generatoarelor;

temperaturile pentru lagăre (lagăr turbină, lagăr axial, lagăr radial), ulei ungere, apă de răcire, înfășurări generator, fier stator, aer de răcire la intrarea și ieșirea din răcitoare;

nivel apă amonte și aval, înfundări de grătare.

Operatorul este informat în permanență cu privire la starea sistemului de măsurare, eventuale defecte ale echipamentelor de achiziție și transmisie de date.

5.3.1.2 Modulul de aplicații

Funcția de prelucrare a datelor constă în efectuarea unor calcule în timp real, operații aritmetice, operații logice, calcule de mărimi derivate, cu datele preluate de la IED-uri. Se determină prin calcul mărimile:

căderea pe centrală și pe grupuri;

debitul turbinat;

factorul de putere.

Prelucrarea datelor analogice include eliminarea erorilor și verificarea plauzabilității. Valorile de temperatură corespunzătoare canalelor valide de măsurare (luate în considerare pentru funcția de protecție) se compară on line cu limitele prestabilite de semnalizare și alarmare, achiziționate concomitent de la echipamentul de control, iar dacă una dintre limite a fost depășită se generează o alarmă, punându-se în evidență pe ecran prin modificarea stilului de afișare a mărimii.

La intervale de timp definite de utilizator, de regulă orare, se realizează actualizarea și completarea bazelor de date istorice. Baza de date, de tip Microsoft Access, este depozitarul central pentru informații. Se stochează astfel orar date privind:

energiile active și reactive pe grupuri și pe linii;

temperaturile și evenimentele curente pentru canalele de măsurare;

nivelele apei în amonte și aval de centrală;

pierderile de presiune pe grătare.

Se înregistrează, de asemenea, în timp real evenimentele centralei de control termic (depășirile de limite admise) și pornirile și opririle de grup, cu atașarea unei informații de timp (figura 5.6).

În exploatare, este importantă urmărirea tendințelor de variație ale mărimilor. Pe baza acestor analize se pot depista și unele probleme de administrare sau erori de operare. Din acest motiv se impune și existența unui istoric (figura 5.7) care conține toate comenzile date de operator.

5.3.1.3 Interfața de operare

Afișarea datelor, prin indicatoare de tip numeric, și a elementelor de comandă, butoane, comutatoare, împreună cu programele ce deservesc aceste funcții, asigură interfața de operare. Aplicația oferă un ecran principal (figura 5.3), cu o imagine de ansamblu, cât mai completă, asupra sistemului hidroenergetic, a evenimentelor din proces.

Pentru centralele de control termic se poate face, la cererea utilizatorului, o prezentare cantitativă, pentru a permite detalierea informațiilor: denumirile canalelor de măsurare, valori de temperatură, situația curentă a validării canalelor, semnalizări, alarme (figura 5.4).

5.3.1.4. Modulul de comunicație

Pentru schimbul de date cu centrul dispecer se stabilește o conexiune de tip client-server. Controlul Winsock, furnizat de Visual Basic, permite gestiunea unui flux de date cu ajutorul protocolului TCP. Pe calculatorul din camera de comandă a centralei rulează două aplicații server, pentru transmiterea datelor în timp real (figura 5.5) și, respectiv, interogarea bazei de date proprii centralei.

Anterior stabilirii conexiunii client-server, este necesară, pentru liniile telefonice în comutație, stabilirea unei legături de tip dial-up între calculatoare, calculatorul din centrală fiind configurat ca server dial-in.

Figura 5.3. Ecranul principal al aplicației din centrală

Figura 5.4. Ecran pentru monitorizarea temperaturilor

Figura 5.5. Server pentru transmiterea datelor în timp real

Figura 5.6. Ecran de evenimente pentru centralele de control termic

Figura 5.7. Istoric al comenzilor operatorului

5.3.2 Aplicația de dispecer

Vizualizarea datelor de către dispecerul de hidroamenajare se realizează la nivel de cascadă (figura 5.8). Fiecărei centrale hidroelectrice îi corespunde un control Winsock, configurat drept client. Un timer asociat, după stabilirea legăturii de tip dial-up, inițiază conexiunea client-server și apelează periodic metodele controlului pentru transferul datelor și subrutinele de prelucrare, afișare și salvare. Informațiile la nivelul dispecerului sunt doar cele necesare procesului de decizie. Datele recepționate, stocate într-o bază de date de timp real și afișate în indicatoare de tip numeric, sunt următoarele:

puterea activă P, puterea reactivă Q pe grupuri;

P, Q pe LEA de racord;

nivel apă amonte și aval;

pierderi de presiune pe grătar.

Dacă este necesar, operatorul poate înlocui manual o valoare numerică. Cât timp valoarea este introdusă manual, ea nu va fi va fi schimbată cu valori recepționate din câmp. Această valoare este stocată de asemenea într-o bază de date și utilizată în calculele, executate în timp real, pentru mărimi derivate, pentru care nu există traductoare sau reprezintă indicatori de sinteză:

căderea pe centrală și pe grupuri;

debitul turbinat pe grupuri și pe centrală;

puterea activă totală produsă pe centrală.

Pentru determinarea debitului turbinat, în funcție de puterea activă și de căderea pe grup, se introduce într-o fereastră de configurare randamentul grupului, determinat practic sau specificat de proiectant.

Datele sunt reînnoite periodic pentru ca operatorul să fie sigur că datele de pe ecran sunt relevante pentru proces.

Transferul bazelor de date din centrale, care conțin înregistrări la intervale orare, se face la cerere (figura 5.8). Fereastra pentru transfer conține, de asemenea, un control Winsock configurat în mod flexibil, în timpul execuției programului, drept client pentru un server specificat. Pentru a se reduce debitul de date, nu se transferă toată baza de date. Interogarea bazei de date proprii centralei, operație executată de aplicația server, folosește ca parametru data calendaristică pentru care se dorește completarea bazei de date corespondente de la dispecer. Se furnizează, de asemenea, informația de sincronizare a ceasurilor interne ale calculatoarelor din centrale. Sistemul oferă posibilitatea depistării defecțiunilor din rețea și localizării exacte a acestora. Se generează reprezentări grafice (figura 5.9) și rapoarte (figura 5.10) bazate pe datele stocate în baza de date.

Figura 5.8. Ecranul aplicației de dispecer

Figure 5.9. Reprezentări grafice

Figure 5.10. Raport energetic

5.4. Prezentarea controlului Winsock

Pentru a realiza transferul direct al datelor între cele calculatoare se utilizează un control ActiveX, care oferă acces la nivelul de jos către protocolul de rețea TCP.

Protocolul TCP/IP (Transmission Control Protocol/Internet Protocol) este limbajul comun utilizat de cea mai mare parte a calculatoarelor pentru a comunica. De fapt, TCP/IP este o specificație care definește o serie de protocoale utilizate pentru a standardiza modul în care calculatoarele schimbă informații unele cu altele. TCP/IP asigură comunicații în rețele care utilizează diverse arhitecturi hardware și sisteme de operare diferite. Protocoalele TCP/IP sunt aranjate într-o serie de nivele, cunoscute ca stivă de protocol. Fiecare nivel are propria sa funcționalitate.

Winsock este un standard care este menținut de Microsoft. Acest standard este în primul rând un set de proceduri care descriu comunicațiile către și de la stiva TCP/IP. Aceste rutine sunt rezidente într-o librărie de legătură dinamică DLL care rulează sub Windows. Winsock, prescurtare de la Windows Sockets, este utilizat pentru a crea aplicații client-server.

Winsock este deasupra stivei de protocol TCP/IP. TCP/IP este un protocol de comunicație standardizat care definește metodele pentru împachetarea datelor în comunicația dintre dispozitivele de calcul pe rețele eterogene. TCP/IP este standardul pentru transmisia datelor peste rețele, inclusiv Internetul. TCP stabilește o conexiune pentru transmisia de date, iar IP definește metodele pentru transmiterea pachetelor de date.

Un port este o locație de memorie specială utilizată când două calculatoare comunică prin TCP/IP. Ambele calculatoare folosesc același port pentru a schimba date.

Winsock permite crearea aplicațiilor de tip client și server folosind același control. Această funcționalitate duală permite specificarea, prin configurarea proprietăților, a tipului aplicației.

5.4.1. Proprietățile controlului Winsock

Bytes Received – Indică în octeți datele prezente în memoria tampon de recepție. Această proprietate nu este disponibilă decât în timpul execuției aplicației și nu este modificabilă. Valoarea returnată este un număr întreg.

LocalHostName – Returnează numele calculatorului local. Proprietatea nu este disponibilă decât în timpul execuției aplicației și nu este disponibilă în faza de proiectare. Valoarea returnată este un șir de caractere.

LocalIP – Returnează adresa IP a calculatorului. Această proprietate nu este disponibilă decât în timpul execuției aplicației și nu este modificabilă. Valoarea returnată este un șir de caractere.

LocalPort – Returnează sau setează numărul portului local. Proprietatea este disponibilă și modificabilă atât în timpul execuției aplicației cât și în faza de proiectare. Valoarea returnată este un număr întreg. Proprietatea este utilizată pentru a configura controlul Winsock al aplicației server. Trebuie evitate numerele de port deja utilizate (80 pentru HTTP, 20, 21 pentru FTP, etc.)

Protocol – Returnează sau setează protocolul utilizat. Se poate alege între modurile TCP și UDP. Este proprietatea care trebuie să fie configurată identic pentru cele două aplicații. Cele două controale Winsock trebuie să comunice unul cu celălalt în același protocol, utilizând același limbaj.

Modul TCP permite stabilirea și menținerea unei conexiuni la un server de date. Pentru aplicația client sunt necesare numele server-ului sau adresa IP și portul la care se conectează. Se utilizează apoi metoda Connect pentru conectare. Pentru aplicația server, trebuie cunoscut portul la care aplicația se conectează. Se face apoi apel la metoda Listen pentru a afla dacă aplicația client caută să se conecteze la server. Dacă este cazul evenimentul ConnectionRequest este activat și, pentru ca legătura între aplicațiile client și server să fie menținută, se face apel la metoda Accept. Apoi se face apel la metodele SendData și GetData pentru a trimite și a recepționa datele.

RemoteHost – Returnează sau specifică numele server-ului de la distanță. Este o proprietate utilizată pentru a configura aplicația client. Această proprietate este disponibilă și modificabilă în timpul execuției aplicației și proiectării ei. Valoarea returnată este un șir de caractere și poate fi specificată ca o adresă IP sau ca un nume DNS, ambele ale calculatorului pe care se execută aplicația server.

RemotePort – Returnează sau setează numărul portului distant. Este o proprietate utilizată pentru a configura aplicația client. Această proprietate este disponibilă și modificabilă în timpul execuției aplicației și al proiectării ei. Valoarea returnată este un număr întreg. Portul de comunicație trebuie să fie identic cu cel utilizat de server.

State – Returnează starea conexiunii. Diferitele stări posibile ale proprietății sunt prezentate în Tabelul 5.1:

Tabelul 5.1.

5.4.2. Metodele controlului Winsock

Accept – Prin această metodă server-ul indică aplicației client că cererea sa de conexiune a fost acceptată. Dar înainte trebuie ca proprietatea State a controlului să fie configurată ca sckListening. Această metodă nu este utilizată decât în timpul evenimentului ConnectionRequest.

Close – Metoda pune capăt conexiunii TCP între aplicațiile client și server.

GetData – O metodă comună care permite recuperarea datelor stocate în memoria tampon.

O metodă similară este PeekData, datele nefiind șterse din memoria tampon.

Listen – Este o metodă utilizată în aplicația server. Permite server-ului să fie în ascultare pentru cererile TCP provenind de la aplicația client.

SendData – Este utilizată pentru transmiterea datelor fie către aplicația client, fie către server.

Connect – Permite conectarea la calculatorul distant. Trebuie să fie urmată de argumentele

RemoteHost și RemotePort, separate prin virgulă.

5.4.3. Evenimentele controlului Winsock

Close – Acest eveniment se declanșează atunci când calculatorul distant închide conexiunea.

Connect – Se declanșează când calculatorul distant a reușit să stabilească legătura.

ConnectionRequest – Se declanșează când server-ul primește o cerere de conexiune provenind de la

aplicația client. În codul asociat acestui eveniment se tratează acceptarea sau refuzul conexiunii.

DataArrival – Se declanșează când aplicația primește date. Trebuie asociat cu metodele GetData sau PeekData.

SendComplete – Se declanșează când transmiterea datelor se termină.

SendProgress – Se declanșează când datele sunt în curs de transmitere.

În ANEXA 2 se prezintă modul de utilizare a controlului Winsock într-un mediu client-server.

5.5. Concluzii

Arhitectura aplicației este distribuită. Asigurarea cerinței ca sistemul să fie deschis și aliniat la tendințele tehnologice s-a obținut prin respectarea standardelor internaționale. Arhitectura ține cont de distribuția și de interfețele de comunicație ale echipamentelor.

Fiecare echipament dotat cu microprocesor asigură prelucrarea primară a datelor și execuția unor funcții specifice. Se obține astfel o fiabilitate crescută, un trafic redus de date între echipamente și o mai slabă încărcare a serverelor.

Prin introducerea în schemă a unui concentrator local de date, se obține un sistem de monitorizare ierarhizat pe două niveluri, conducând astfel la descentralizarea funcțiilor aplicației.

Echipamentele de la nivel de centrală funcționează în mod independent în absența conexiunii cu nivelul superior. Monitorizarea în timp real, realizată continuu la nivelul camerei de comandă, permite introducerea unor funcții suplimentare, precum cea de alarmare. Anumite puncte de monitorizare constituie practic puncte “virtuale”, pentru care nu există conexiuni fizice.

Serviciul de sistem de achiziție de date implică existența unui serviciu de comunicație, la fel de reprezentativ. La centrale se acumulează informațiile care se transmit spre punctul dispecer. Colaborarea între punctul de dispecer și centrale se face printr-un dialog permanent, prin intermediul căruia informațiile se transmit în dublu sens. Winsock se dovedește a fi un control robust, ideal pentru comunicațiile între calculatoare, ce ajută la crearea unor aplicații extrem de flexibile.

ANEXA I

Codul sursă pentru achiziția și prelucrarea datelor de la nivelmetre

Funcționarea codului sursă prezentat în continuare poate fi urmărită în figurile 4.13, 4.14, 4.19 și, parțial, 4.17.

Figura I.1 Fereastra de achiziție

Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"

Object = "{FAEEE763-117E-101B-8933-08002B2F4F5A}#1.1#0"; "DBLIST32.OCX"

Begin VB.Form manualform

Caption = "Achizitie manuala nivele"

StartUpPosition = 1 'CenterOwner

Begin VB.Data Data4

BOFAction = 1 'BOF

Caption = "Data4"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

EOFAction = 2 'Add New

ReadOnly = 0 'False

RecordsetType = 2 'Snapshot

RecordSource = "Centrala"

End

Begin MSDBCtls.DBCombo DBCombo1

DataField = "nume"

DataSource = "Data4"

ListField = "nume"

Text = "DBCombo1"

End

Begin VB.Frame Frame1

Caption = "CHE Strejesti"

Begin VB.Timer Timer1

Enabled = 0 'False

Interval = 1000

End

Begin VB.CommandButton Inchide

Caption = "Inchide"

End

Begin VB.CommandButton Achizitie

Caption = "Achizitie"

End

Begin MSCommLib.MSComm MSComm1

DTREnable = -1 'True

Handshaking = 1

RTSEnable = -1 'True

EOFEnable = -1 'True

End

Begin VB.Data modem

Caption = "modem"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = 0 'False

RecordsetType = 1 'Dynaset

RecordSource = "modem"

End

Begin VB.Data Comunicatie

Caption = "comunicatie"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = 0 'False

RecordsetType = 1 'Dynaset

RecordSource = "comunicatie"

End

Begin VB.Data Data1

Caption = "date"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = 0 'False

RecordsetType = 1 'Dynaset

RecordSource = "Colectare"

End

Begin VB.TextBox Text2

DataField = "nivel aval"

DataSource = "Data1"

Index = 1

End

Begin VB.TextBox Text2

DataField = "nivel amonte"

DataSource = "Data1"

Index = 0

End

Begin VB.TextBox Text1

DataField = "timp"

DataSource = "Data1"

Text = "Text1"

End

Begin VB.TextBox Text2

DataField = "infundare gratar 4"

DataSource = "Data1"

Index = 5

End

Begin VB.TextBox Text2

DataField = "infundare gratar 3"

DataSource = "Data1"

Index = 4

End

Begin VB.TextBox Text2

DataField = "infundare gratar 2"

DataSource = "Data1"

Index = 3

End

Begin VB.TextBox Text2

DataField = "infundare gratar 1"

DataSource = "Data1"

Index = 2

End

Begin VB.TextBox Text10

DataField = "nume"

DataSource = "Data1"

Text = "Text10"

Visible = 0 'False

End

Begin VB.Data Data2

Caption = "Data2"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = 0 'False

RecordsetType = 1 'Dynaset

RecordSource = "Centrala"

Visible = 0 'False

End

Begin VB.CheckBox Check1

DataField = "infundare gratar4"

DataSource = "Data2"

Index = 5

End

Begin VB.CheckBox Check1

DataField = "infundare gratar3"

DataSource = "Data2"

Index = 4

End

Begin VB.CheckBox Check1

DataField = "infundare gratar2"

DataSource = "Data2"

Index = 3

End

Begin VB.CheckBox Check1

DataField = "infundare gratar 1"

DataSource = "Data2"

Index = 2

End

Begin VB.CheckBox Check1

DataField = "nivel aval"

DataSource = "Data2"

Index = 1

End

Begin VB.CheckBox Check1

DataField = "nivel amonte"

DataSource = "Data2"

Index = 0

End

Begin VB.TextBox Text4

DataField = "numar"

DataSource = "Data2"

End

Begin VB.Label Label11

Caption = "infundare gratar HA4"

End

Begin VB.Label Label10

Caption = "infundare gratar HA3 "

End

Begin VB.Label Label5

Caption = "infundare gratar HA2"

End

Begin VB.Label Label3

Caption = "infundare gratar HA1"

End

Begin VB.Label Label2

Caption = "data"

End

Begin VB.Label Label1

Caption = "nivel amonte"

End

Begin VB.Label Label4

Caption = "nivel aval"

End

End

End

Attribute VB_Name = "manualform"

Dim eroarecom As Boolean

Dim depasire As Boolean

Dim valoare As String

Private Sub DBCombo1_Change()

'criteriu = "nume= '" & DBCombo1 & "'"

Data1.RecordSource = " SELECT * FROM Colectare WHERE nume= '" & DBCombo1 & "' ORDER BY timp ASC "

Data1.Refresh

If Text1.Text <> "" Then

Data1.Recordset.MoveLast

End If

Data2.RecordSource = " SELECT * FROM Centrala WHERE nume= '" & DBCombo1 & "' "

Data2.Refresh

End Sub

Private Sub Text10_Change()

Frame1.Caption = Text10.Text

End Sub

Private Sub Achizitie_Click()

Dim disponibil As Boolean

Dim i As Integer

Dim j As Integer

eroarecom = False

disponibil = False

conect = False

nrtel = Text4.Text

For j = 0 To 5

If Check1(j).Value = 1 Then

disponibil = True

End If

Next j

If disponibil = True Then

Call deschideport

If eroarecom = False Then

Load apelform

apelform.Show vbModal

If conect = True Then

Data1.Recordset.AddNew

Text10.Text = DBCombo1.BoundText

Text1.Text = Now

For i = 0 To 5

If Check1(i).Value = 1 Then

proach (i + 1)

Else

valoare = "*"

salveaza (i + 1)

End If

Next i

Data1.Recordset.Update

Data1.Recordset.MoveLast

End If

MSComm1.PortOpen = False

End If

Else

MsgBox "Aparatele nu sunt disponibile !", vbExclamation, " "

End If

End Sub

Sub deschideport()

On Error GoTo LocalHandler

MSComm1.CommPort = Right$(Comunicatie.Recordset.Fields(0), 1)

MSComm1.Settings = Comunicatie.Recordset.Fields(1) + "," + Left$(Comunicatie.Recordset.Fields(2), 1) + ",8," + Comunicatie.Recordset.Fields(3)

MSComm1.PortOpen = True

Exit Sub

LocalHandler:

MsgBox Error$(Err), vbCritical, "Eroare de comunicatie"

eroarecom = True

Exit Sub

End Sub

Sub proach(X As Integer)

Dim sir As String

depasire = False

Timer1.Enabled = True

sir = ";00" + Trim$(Str$(X)) + " RA2 1" + vbCrLf

MSComm1.Output = sir

Do

Dummy = DoEvents()

Loop Until MSComm1.InBufferCount >= 9 Or depasire = True

Timer1.Enabled = False

If depasire = False Then

valoare = CStr(Val(MSComm1.Input))

Else

valoare = "?"

End If

MSComm1.InBufferCount = 0

salveaza (X)

End Sub

Sub salveaza(X As Integer)

Text2(X – 1).Text = valoare

End Sub

Private Sub Timer1_Timer()

depasire = True

End Sub

Private Sub Inchide_Click()

Unload manualform

End Sub

Figura I.2. Fereastra de apel.

Begin VB.Form apelform

Caption = "APEL"

StartUpPosition = 1 'CenterOwner

Begin VB.Timer Timer1

Enabled = 0 'False

Interval = 1000

End

Begin VB.CommandButton Command1

Caption = "Renunta"

End

Begin VB.Label Label2

Caption = "timp ramas"

End

Begin VB.Label Label1

Caption = "Formeaza numarul"

End

End

Attribute VB_Name = "apelform"

Dim i As Integer

Dim timr As Integer

Dim ti As Integer

Private Sub Command1_Click()

Timer1.Enabled = False

Unload apelform

End Sub

Private Sub Form_Load()

modemdep = False

i = 0

ti = Val(manualform.modem.Recordset.Fields(4))

Command1.Caption = "Renunta"

Timer1.Enabled = True

manualform.MSComm1.InBufferCount = 0

Label1.Caption = "Formeaza numarul " + nrtel

manualform.MSComm1.Output = manualform.modem.Recordset.Fields(0) + nrtel +Chr$(13)

End Sub

Private Sub Timer1_Timer()

i = i + 1

timr = ti – i

Label2.Caption = "timp ramas: " + CStr(timr) + " sec."

If InStr(LCase$(manualform.MSComm1.Input), "connect " + manualform.Comunicatie.Recordset.Fields(1)) <> 0 Then

Label1.Caption = " legatura stabilita"

Label2.Caption = "conectare " + manualform.Comunicatie.Recordset.Fields(1) +"bps"

Command1.Caption = "OK"

conect = True

Timer1.Enabled = False

Else

If timr = 0 Then

Timer1.Enabled = False

MsgBox "Nu s-au conectat modem-urile", vbExclamation, "Atentie"

Unload apelform

End If

End If

End Sub

Figura I.3. Ferastra de vizualizare a bazei de date.

Begin VB.Form dateform

Caption = "Date"

StartUpPosition = 1 'CenterOwner

Begin MSDBGrid.DBGrid DBGrid1

End

Begin VB.CommandButton Command3

Caption = "Grafica"

End

Begin VB.CommandButton Command2

Caption = "Cauta"

End

Begin VB.CommandButton Command1

Caption = "Inchide"

End

Begin GraphLib.Graph Graph1

Enabled = 0 'False

GraphStyle = 1

GraphTitle = "Nivel amonte"

GraphType = 8

LabelEvery = 2

LineStats = 11

NumPoints = 125

NumSets = 40

YAxisPos = 1

YAxisStyle = 2

ColorData = 0

ExtraData = 0

ExtraData[] = 0

GraphData = 40

GraphData[] = 125

GraphData[0,0] = 0 …

GraphData[39,124]= 0

XPosData = 0

XPosData[] = 0

End

Begin VB.TextBox Text1

Text = "Text1"

End

Begin VB.Data Centrala

Caption = "Centrala"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = 0 'False

RecordsetType = 1 'Dynaset

RecordSource = "Centrala"

End

Begin MSDBCtls.DBCombo DBCombo1

DataField = "nume"

DataSource = "Centrala"

ListField = "nume"

End

Begin VB.Data date

Caption = "date"

Connect = "Access"

DatabaseName = "Nivele.mdb"

DefaultType = 2 'UseODBC

ReadOnly = -1 'True

RecordsetType = 1 'Dynaset

RecordSource = ""

End

End

Attribute VB_Name = "dateform"

Private Sub Command1_Click()

Unload dateform

End Sub

Private Sub Command2_Click()

Dim t As Boolean

Graph1.Visible = False

MousePointer = 11

dateform.Height = 3795

t = IIf(Len(Text1.Text) = 10, True, False)

If t = True Then

date.RecordSource = " SELECT * FROM Colectare WHERE nume= '" &

DBCombo1 & "' and Left(timp,10)='" & Text1.Text & " ' ORDER BY timp DESC "

date.Refresh

Else

MsgBox "Introduceti data corect!", vbExclamation, "Atentie"

End If

MousePointer = 0

Command3.Enabled = True

End Sub

Private Sub Command3_Click()

On Error Resume Next

Dim min As Double

Dim max As Double

Dim poz As Integer

Dim valori As String

Dim date1 As Recordset

X = Graph1.Width

Graph1.Width = 0

Set dbIn = OpenDatabase("Nivele.mdb")

Set date1 = dbIn.OpenRecordset(" SELECT * FROM Colectare WHERE nume= '" & DBCombo1 & "' and Left(timp,10)='" & Text1.Text & " ' ", dbOpenSnapshot)

icolcount = date1.Fields.Count

date1.MoveLast

irowcount = date1.RecordCount

Graph1.NumPoints = irowcount

Graph1.NumSets = icolcount – 6

date1.MoveFirst

min = Val(valori)

max = Val(valori)

For i1 = 2 To Graph1.NumSets

Graph1.ThisSet = i1

For i2 = 1 To Graph1.NumPoints

If i2 = 1 Then

poz = InStr(1, date1.Fields(2), ",")

valori = Mid$(date1.Fields(2), 1, poz – 1) & "." & Mid$(date1.Fields(2), poz + 1, 3)

min = Val(valori)

max = Val(valori)

Graph1.ThisPoint = 1

Graph1.GraphData = Val(valori)

Else

date1.MoveNext

poz = InStr(1, date1.Fields(2), ",")

valori = Mid$(date1.Fields(2), 1, poz – 1) & "." & Mid$(date1.Fields(2), poz + 1, 2)

Graph1.ThisPoint = i2

Graph1.GraphData = Val(valori)

If min > Val(valori) And Val(valori) > 50 Then

min = Val(valori)

End If

If max < Val(valori) Then

max = Val(valori)

End If

End If

Next i2

Graph1.YAxisMin = min

Graph1.YAxisMax = max

Next i1

Graph1.Width = X

date1.MoveFirst

Command3.Enabled = False

dateform.Height = 5885

Graph1.Visible = True

End Sub

Private Sub form_load()

Text1.Text = Left(Format$(Now), 10)

Command3.Enabled = False

dateform.Height = 3795

Graph1.Visible = False

End Sub

ANEXA II

Aplicație client-server

În această aplicație se prezintă modul de utilizare a controlului Winsock într-un mediu client-server. Se creează două aplicații separate, dintre care una este server și cealaltă client. Clientul trimite o cerere către server și server-ul, care este conectat la o bază de date, regăsește informația cerută de către client din baza de date și o trimite la client.

II.1. Server

’interfața

Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"

Begin VB.Form Server

Caption = "Transfer baza de date"

Begin VB.Timer Timer1

Interval = 60000

End

Begin VB.TextBox Txtdata

End

Begin VB.Frame frame

Caption = "Trimite date…"

Visible = 0 'False

Begin MSComctlLib.ProgressBar Progres

End

Begin VB.Label StareTransfer

End

End

Begin MSWinsockLib.Winsock winsock1

LocalPort = 1000

End

Begin VB.TextBox txtLocalIP

End

Begin VB.TextBox txtTipDate

End

Begin VB.Label Label4

Caption = "Starea conexiunii"

End

Begin VB.Label Label1

Caption = " Local IP"

End

Begin VB.Label Label3

Caption = "Date transferate"

End

Begin VB.Label Stare

End

End

‘codul sursă

Attribute VB_Name = "server"

Option Explicit

Dim timp

Dim PoateTransmite As Boolean

Private Sub Form_Load()

txtLocalIP.Text = winsock1.LocalIP

’server-ul trebuie să fie în ascultare

With winsock1

.Close

.Listen

End With

Stare.Caption = "IN ASCULTARE"

End Sub

Private Sub winsock1_ConnectionRequest(ByVal requestID As Long)

‘testează prezența unei conexiuni deja deschise, dacă da, închide

If winsock1.State <> sckClosed Then

winsock1.Close

End If

‘acceptă conexiunea

winsock1.Accept requestID

Stare.Caption = "GATA SA TRIMITA DATE"

timp = Timer

End Sub

Private Sub winsock1_DataArrival(ByVal bytesTotal As Long)

Dim Daterec As String

’server-ul recuperează datele trimise de client

winsock1.GetData Daterec

’determină tipul de date care trebuie transmise

If Mid(Daterec, 1, 2) = "C_" Then

Call Transmite_Contori(Daterec)

End If

If Mid(Daterec, 1, 2) = "N_" Then

Call Transmite_Nivele(Daterec)

End If

' "A_" inseamnă că se acceptă transferul de către client

If Daterec = "A_" Then

PoateTransmite = True

End If

End Sub

Private Sub Transmite_Contori(Daterec As String)

Dim date1 As Recordset

Dim dbin As Database

Dim sir As String

Dim i, j, col, ro As Integer

'interogare bază de date

Set dbin = OpenDatabase("CHE\CHE.mdb")

Set date1 = dbin.OpenRecordset(" SELECT * FROM Masurare WHERE (datevalue(timp)= '" & DateValue(Mid(Daterec, 3)) & " ') ORDER BY timp ASC ")

If date1.RecordCount <> 0 Then ' Sunt date de transmis

StareTransfer.Caption = "Initializeaza transferul datelor…"

col = date1.Fields.Count

date1.MoveLast

ro = date1.RecordCount

date1.MoveFirst

sir = ""

For i = 1 To ro

For j = 1 To col

sir = sir & date1.Fields(j – 1) & " " & vbCrLf

Next j

date1.MoveNext

Next i

date1.Close

txtTipDate = "contori"

Txtdata = Now

Progres.max = Len(sir)

Progres.Value = 0

PoateTransmite = False

'transmite clientului informații despre indecșii energetici

winsock1.SendData "I_" & Len(sir) & "_" & "contori"

'Suspendă programul până ce răspunde clientul

Do Until PoateTransmite Or DoEvents = 0

DoEvents

Loop

frame.Visible = True

StareTransfer.Caption = "Transmis 0 bytes (0%)"

'transmite indecșii energetici

winsock1.SendData sir

Else 'Nu sunt date de transmis. Informează clientul

date1.Close

winsock1.SendData "I_" & 0 & "_" & "f"

End If

End Sub

Private Sub Transmite_Nivele(Daterec As String)

Dim date1 As Recordset

Dim dbin As Database

Dim sir As String

Dim i, j, col, ro As Integer

'interogare bază de date

Set dbin = OpenDatabase("CHE\CHE.mdb")

Set date1 = dbin.OpenRecordset(" SELECT * FROM Colectare WHERE (datevalue(timp)= '" & DateValue(Mid(Daterec, 3)) & " ') ORDER BY timp ASC ")

If date1.RecordCount <> 0 Then 'Sunt date de transmis

StareTransfer.Caption = "Initializeaza transferul datelor…"

col = date1.Fields.Count

date1.MoveLast

ro = date1.RecordCount

date1.MoveFirst

sir = ""

For i = 1 To ro

For j = 1 To col

sir = sir & date1.Fields(j – 1) & " " & vbCrLf

Next j

date1.MoveNext

Next i

date1.Close

txtTipDate = "nivelmetre"

Txtdata = Now

Progres.max = Len(sir)

Progres.Value = 0

PoateTransmite = False

'transmite clientului informații despre nivele

winsock1.SendData "I_" & Len(sir) & "_" & "Nivele"

'Suspendă programul până ce răspunde clientul

Do Until PoateTransmite = True Or DoEvents = 0

DoEvents

Loop

frame.Visible = True

StareTransfer.Caption = "Transmis 0 bytes (0%)"

'transmite nivelele

winsock1.SendData sir

Else 'Nu sunt date de transmis. Informează clientul

date1.Close

winsock1.SendData "I_" & 0 & "_" & "n"

End If

End Sub

Private Sub winsock1_SendProgress(ByVal Datetr As Long, ByVal bytesRemaining As Long)

Dim SirTr As Long

If PoateTransmite = True Then

‘starea transferului

SirTr = Val(Mid(StareTransfer.Caption, 5, InStr(6, StareTransfer.Caption, "b")))

SirTr = SirTr + Datetr

Progres.Value = SirTr

StareTransfer.Caption = SirTr & " octeti (" & Format((SirTr * 100) / (SirTr + bytesRemaining), "00") & "%) "

Progres.Refresh

StareTransfer.Refresh

End If

End Sub

Private Sub winsock1_SendComplete()

If PoateTransmite = True Then

'StareTransfer.Caption = "Transfer complet"

PoateTransmite = False

End If

frame.Visible = False

End Sub

Private Sub winsock1_Close()

’server-ul trece în ascultare

winsock1.Close

winsock1.Listen

Stare.Caption = "IN ASCULTARE"

End Sub

Private Sub Timer1_Timer()

'watchdog software

If winsock1.State = sckConnected Then

If (Timer – timp) > 180 Then

With winsock1

.Close

.Listen

End With

Stare.Caption = "IN ASCULTARE"

End If

End If

End Sub

Private Sub Form_Unload(Cancel As Integer)

winsock1.Close

End Sub

II.2. Client

’Interfața

Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"

Begin VB.Form transfer

Caption = "Transfer baza de date"

Begin VB.CommandButton Nivelmetru

Caption = "Nivele"

End

Begin VB.TextBox Text1

End

Begin VB.ComboBox Combo1

End

Begin VB.CommandButton Inchide

Caption = "Inchide"

End

Begin VB.CommandButton Contor

Caption = "Indecsi"

End

Begin VB.Frame frame

Caption = "Frame1"

Begin MSComctlLib.ProgressBar Progres

End

Begin VB.Label StareTransfer

End

End

Begin MSWinsockLib.Winsock winsock

RemotePort = 1000

End

Begin VB.CommandButton Deconecteaza

Caption = "Deconecteaza"

End

Begin VB.CommandButton Conecteaza

Caption = "Conecteaza"

End

Begin VB.Line Line1

End

Begin VB.Label Label4

Caption = "Starea conexiunii"

End

Begin VB.Label Label3

Caption = "Data"

End

Begin VB.Label Label2

Caption = "Centrala"

End

Begin VB.Label Stare

End

End

‘codul sursă

Attribute VB_Name = "transfer"

Option Explicit

Dim SirRec as String

Dim RemoteIP As String

Dim Data as Date

Dim FormatData As Boolean

Private Sub Form_Load()

Text1.Text = DateValue(Now)

Data = DateValue(Text1.Text)

FormatData = True

Contor.Enabled = False

Nivelmetru.Enabled = False

Stare.Caption = "inactiva"

Combo1.AddItem "Strejesti"

Combo1.AddItem "Arcesti"

Combo1.AddItem "Slatina"

Combo1.AddItem "Ipotesti"

Combo1.AddItem "Draganesti"

Combo1.AddItem "Frunzaru"

Combo1.AddItem "Rusanesti"

Combo1.AddItem "Izbiceni"

Combo1.ListIndex = 0

End Sub

Private Sub Combo1_Click()

‘închide o conexiune activă, dacă există

winsock.Close

Contor.Enabled = False

Nivelmetru.Enabled = False

Stare.Caption = "deconectat"

‘se selectează un server

Select Case Combo1.ListIndex

Case 0

RemoteIP = "192.168.233.122"

Case 1

RemoteIP = "192.168.233.124"

Case 2

RemoteIP = "192.168.233.126"

Case 3

RemoteIP = "192.168.233.128"

Case 4

RemoteIP = "192.168.233.130"

Case 5

RemoteIP = "192.168.233.132"

Case 6

RemoteIP = "192.168.233.134"

Case 7

RemoteIP = "192.168.233.136"

Case Else

End Select

End Sub

Private Sub Text1_LostFocus()

On Error GoTo MSg

Data = DateValue(Text1.Text)

FormatData = True

Exit Sub

MSg:

Text1.Text = Data

FormatData = False

End Sub

Private Sub Conecteaza_Click()

On Error GoTo ErrorHandler

‘transmite o cerere de conexiune server-ului selectat

With winsock

.Close

.RemoteHost = RemoteIP

.Connect

End With

Stare.Caption = "in curs de conectare"

Exit Sub

ErrorHandler:

MsgBox "Nu s-a conectat", vbInformation

End Sub

Private Sub Winsock_Connect()

Contor.Enabled = True

Nivelmetru.Enabled = True

Stare.Caption = "conectat – asteapta date"

End Sub

Private Sub Contor_Click()

‘verifică starea conexiunii

If winsock.State = sckConnected Then

‘verifică formatul pentru data calendaristică

If FormatData = True Then

‘specifică server-ului ce date solicită

winsock.SendData "C_" & Text1.Text

Else

MsgBox "Introduceti data corect, dupa model!", vbExclamation, "Atentie"

FormatData = True

End If

Else

Call Deconecteaza_Click

MsgBox "Conexiune intrerupta"

End If

End Sub

Private Sub Nivelmetru_Click()

‘verifică starea conexiunii

If winsock.State = sckConnected Then

‘verifică formatul pentru data calendaristică

If FormatData = True Then

‘specifică server-ului ce date solicită

winsock.SendData "N_" & Text1.Text

Else

MsgBox "Introduceti data corect, dupa model!", vbExclamation, "Atentie"

FormatData = True

End If

Else

Call Deconecteaza_Click

MsgBox "Conexiune intrerupta"

End If

End Sub

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)

On Error GoTo ErrorHandler

Dim DateRec As String

winsock.GetData DateRec

Static NumeSir As String

Static DimensiuneSir As Long

‘verifica dacă a recepționat date sau informații despre ele

If Left(DateRec, 2) = "I_" Then

‘recepționează informații

DimensiuneSir = Val(Mid(DateRec, 3, 3 + InStr(4, DateRec, "_")))

NumeSir = Mid(DateRec, InStr(4, DateRec, "_") + 1)

‘verifică dacă sunt date de recepționat

If DimensiuneSir > 0 Then

frame.Caption = "Primeste date…"

StareTransfer.Caption = "0 bytes (0%)"

Progres.Max = DimensiuneSir

Progres.Value = 0

frame.Visible = True

SirRec = ""

‘confirmă server-ului că poate transmite datele

winsock.SendData "A_"

Else

MsgBox "Nu sunt date de transferat!", vbInformation, "Mesaj centrala"

End If

Else

‘ recepționează date

SirRec = SirRec & DateRec

‘starea transferului

StareTransfer.Caption = Len(SirRec) & " octeti (" & Format((Len(SirRec) * 100) / DimensiuneSir, "00") & "%)"

Progres.Value = Len(SirRec)

Progres.Refresh

StareTransfer.Refresh

‘verifică dacă a recepționat toate datele

If Len(SirRec) = DimensiuneSir Then

If NumeSir = "contori" Then

‘apelează funcția de completare a bazei de date cu indecși energetici

Call Scrie_Contori

Else

‘apelează funcția de completare a bazei de date cu nivele

Call Scrie_Nivelmetre

End If

frame.Visible = False

End If

DoEvents

End If

Exit Sub

ErrorHandler: MsgBox "eroare generala"

End Sub

Private Sub Scrie_Contori()

Dim dbin As Database

Dim date1 As Recordset

Dim rand As String

Dim j As Integer

Dim col As Integer

Dim ro As Integer

Dim i As Integer

On Error GoTo ErrorHandler

‘interoghează baza de date proprie

Set dbin = OpenDatabase(Combo1 & "\CHE.mdb")

Set date1 = dbin.OpenRecordset(" SELECT * FROM Masurare WHERE (datevalue(timp)= '" & DateValue(Text1.Text) & " ') ")

'Sterge datele curente, dacă există

If date1.RecordCount <> 0 Then

MsgBox "Sterge datele curente pentru indecsi!", vbInformation, ""

date1.MoveLast

ro = date1.RecordCount

date1.MoveFirst

For i = 1 To ro

date1.Delete

date1.MoveNext

Next i

End If

col = 18

MsgBox "Adauga noile date pentru indecsi!", vbInformation, ""

Dim ps As Integer

Dim pd As Integer

pd = -1

Do While pd < (Len(SirRec) – 1)

DoEvents

date1.AddNew

For j = 1 To col

ps = pd + 2

pd = InStr(ps, SirRec, vbCrLf)

date1.Fields(j – 1) = Mid(SirRec, ps, pd – ps)

Next j

date1.Update

Loop

date1.Close

Exit Sub

ErrorHandler: MsgBox "eroare contori"

date1.Close

End Sub

Private Sub Scrie_Nivelmetre()

Dim dbin As Database

Dim date1 As Recordset

Dim rand As String

Dim j As Integer

Dim col As Integer

Dim ro As Integer

Dim i As Integer

On Error GoTo ErrorHandler

‘interoghează baza de date proprie

Set dbin = OpenDatabase(Combo1 & "\CHE.mdb")

Set date1 = dbin.OpenRecordset(" SELECT * FROM Colectare WHERE (datevalue(timp)= '" & DateValue(Text1.Text) & " ') ")

'Sterge datele curente, dacă există

If date1.RecordCount <> 0 Then

MsgBox "Sterge datele curente pentru nivele!", vbInformation, ""

date1.MoveLast

ro = date1.RecordCount

date1.MoveFirst

For i = 1 To ro

date1.Delete

date1.MoveNext

Next i

End If

col = 8

MsgBox "Adauga noile date pentru nivele!", vbInformation, ""

Dim ps As Integer

Dim pd As Integer

pd = -1

Do While pd < (Len(SirRec) – 1)

DoEvents

date1.AddNew

For j = 1 To col

ps = pd + 2

pd = InStr(ps, SirRec, vbCrLf)

date1.Fields(j – 1) = Mid(SirRec, ps, pd – ps)

Next j

date1.Update

Loop

date1.Close

Exit Sub

ErrorHandler: MsgBox "eroare nivele"

date1.Close

End Sub

Private Sub Deconecteaza_Click()

winsock.Close 'se pune capăt conexiunii cu serverul

Contor.Enabled = False

Nivelmetru.Enabled = False

Stare.Caption = "deconectat"

End Sub

Private Sub Winsock_Close()

'MsgBox "Eveniment. Calculatorul de la distanta a inchis conexiunea.", vbInformation

winsock.Close

Contor.Enabled = False

Nivelmetru.Enabled = False

Stare.Caption = "deconectat"

End Sub

Private Sub Inchide_Click()

Unload Me

End Sub

Private Sub Form_Unload(Cancel As Integer)

winsock.Close

End Sub

ANEXA III

Dispozitiv cu microcontroler

Avantajele specifice unei scheme cu microcontroler în componență sunt conferite atât de simplitatea montajului, cât mai ales de versatilitatea lui. În aplicație se prezintă elemente de proiectare pentru un circuit experimental, a cărui componentă de bază este PIC 16F84, un microcontroler pe 8 biți cu memorie program de tip Flash, aparținând familiei de mijloc a microcontrolerelor firmei Microchip Technology. Cu ușoare adaptări, schemei i se poate da o destinație, în automatizări legate de deplasări sau de controlul presiunii (presostat), nivelului, temperaturii ș.a.

Arhitectura microcontrolerului

PIC16F84 este un microcontroler construit pe o arhitectura RISC avansată, ceea ce este de natură să-i confere caracteristici performante:

set redus de instrucțiuni – 35, cu o lungime a instrucțiunii de 14 biți, executată într-un singur ciclu ;

13 pini I/O cu control individual, configurați ca două porturi, 5 alocați primului port, următorii 8 celui de-al doilea;

68 octeți RAM de date;

64 octeți EEPROM de date, folosiți pentru stocare de date sau pentru valori de calibrare;

15 registre cu funcții speciale;

1K x 14 memorie program, însemnând 1024 locații de 14 biți;

1 temporizator / numărător cu predivizor programabil;

patru tipuri de întreruperi;

frecvența ceasului de 10 MHz;

stivă hardware pe 8 nivele;

watchdog timer;

programare serială In-circuit;

protecția codului.

Setul de instrucțiuni se împarte în trei mari grupe funcționale: operații cu registre orientate pe bit, pe octet și operații de control.

Există 4 tipuri diferite de întreruperi:

– întrerupere externă pe pinul 6, RB0;

– schimbarea stării unuia din pinii 1013, RB47;

– depășire a registrului TMR0;

– scrierea completă a EEPROM-ului.

Pentru a aloca întreruperi, sau pentru a verifica sursa lor, procesorul utilizează registrul INTCON (0Bh).

Întreruperile pot fi activate sau dezactivate cu ajutorul bitului INTCON<7>, GIE (Global Interrupt Enable). La apariția unei întreruperi, numărătorul de adrese este încărcat cu valoarea 0004h, valoarea anterioară fiind salvată în stivă. Se recomandă salvarea contextului, a registrelor mai importante, cum ar fi acumulatorul W și cel de stare STATUS în locații temporare pe perioada deservirii întreruperii. Dacă bitul este zero, nici o întrerupere nu poate să apară, în timpul servirii unei întreruperi bitul fiind șters cu scopul de a nu permite noi întreruperi. Instrucțiunea RETFIE, de ieșire din rutina de tratare a întreruperii, setează bitul GIE, reactivând întreruperile.

Fiecare întrerupere individuală își are propriul său bit în registrul INTCON pentru validare / invalidare :

– INTE (INTCON<4>) pentru întreruperea externă;

– RBIE (INTCON<3>) pentru întreruperea la schimbarea stării pe PORTB;

– EEIE (INTCON<6>) pentru întreruperea la terminarea înscrierii în EEPROM;

– T0IE (INTCON<5>) pentru întreruperea TMR0.

Când apare o întrerupere, anumiți biți, denumiți și fanioane, sunt setați, astfel încât se poate determina sursa întreruperii:

– INTF (INTCON<1>);

– RBIF (INTCON<0>);

– T0IF (INTCON<2>);

– EEIF(EECON1<4>).

Biții fanion sunt șterși din software.

Când modul temporizator este selectat prin ștergerea bitului OPTION_REG<5>, T0CS, registrul TMR0 este incrementat la fiecare ciclu de instrucțiune, însemnând la 400 ns pentru un oscilator de 10 MHz. Valoarea din TMR0 reprezintă timpul în pași de 400 ns. Întreruperea este generată de depășirea produsă în registrul TMR0, în exemplul dat la circa 100 microsecunde. Ca predivizor (prescaler) pentru temporizator este prevăzut un numărător de 8 biți. Biții OPTION_REG<3:0>, PSA, PS2, PS1, PS0, determină alocarea predivizorului și rata de divizare: 1:2…1:256.

Numărătorul este selectat prin setarea bitului T0CS. Numărătorul este incrementat pe pinul TA4/T0CK1, frontul fiind stabilit din bitul OPTION_REG<4>, T0SE.

Funcționarea schemei

În schema din figura III.1 circuitele integrate SM230 sunt senzori de poziție, având încorporate un traductor magnetic de tip Hall și un trigger Schmitt ce elimină regimul tranzitoriu de comutare. Ieșirile integratelor, de tip tranzistor cu colector în gol, sunt basculate când în proximitatea circuitelor se află magnetul permanent, sensibilitatea magnetică fiind pentru acest tip de integrate cuprinsă în intervalul 10mT…50mT.

Stabilizatorul LM7805 asigură o tensiune de 5 volți, filtrată de cei doi condensatori de 100nF. Circuitul oscilatorului, compus din quartz-ul de 4 MHz și condensatorii de 33pF, determină rularea programului înscris în C.

Semnalul de 0 logic, primit pe pinul de intrare RB7 al C-lui de la senzorul conectat, determină programul să treacă în 1 logic pinul de ieșire RA1. Prin intermediul unui tranzistor de medie putere BD 135(9), este excitată bobina unui releu, al cărui contact normal deschis va putea fi înseriat într-o schemă de acționare. C-ul începe concomitent o temporizare internă.

La funcționarea normală, dezexcitarea bobinei releului se realizează prin transmiterea unui semnal de 0 logic de către senzorul magnetic conectat la intrarea RB6 a microcontrolerului, care la rândul lui trece pinul RA1 în 0. Simultan se oprește temporizarea.

În cazul în care semnalul de la senzor întârzie un timp, peste valoarea temporizării stabilită intern, C-ul comută releul prin trecerea pinului RA1 în 0 logic. Pentru semnalizarea stării este prevăzut în schemă un LED, aprins de C prin trecerea pinului de ieșire RA0 în 1.

Schema este în acest moment blocată. Pentru reinitializare se acționează asupra butonului de RESET de pe pinul MCLR. Indiferent de poziția senzorilor se comandă releul.

Programul

Rutina principală setează condițiile inițiale de lucru. Se configurează pinii 6 și 7 ai portului B ca linii de intrare și cei ai portului A de ieșire, se comută în 1 pinul RA1, după care se activează întreruperile prin setarea biților de control GIE, T0IE și RBIE în registrul INTCON și se intră într-o buclă de așteptare. Bitul T0CS din registrul OPTION_REG de selecție a sursei de tact pentru TMR0 primește valoarea 0 pentru a urmări tactul ciclului instrucțiune. Bitul PSA din OPTION se resetează pentru a se asigna prescalerul la TMR0, biții PS2-PS0 selectând o rată de divizare de 1:8.

Întreruperea se declanșează la schimbarea stării pinilor RB6 și RB7 și la depășirea timer-ului TMR0, numărătorul de adrese PC fiind încărcat cu valoarea 0004h.

În mod tipic, la începutul rutinei de întrerupere se salvează, restaurându-se la sfârșit, regiștrii W și STATUS. Registrele definite SALW și SALVSTATUS vor servi ca locații temporare de stocare a valorilor regiștrilor W și STATUS. Bitul GIE este șters pentru a inhiba orice altă întrerupere până la tratarea celei curente, instrucțiunea RETFIE setând ulterior la loc fanionul. Se verifică mai întâi tipul întreruperii.

TMR0 se incrementează automat. O depășire în registrul TMR0, la fiecare 256×8 microsecunde, setează fanionul T0IF din registrul INTCON. Trebuie avut în vedere ca resetarea acestuia să se facă prin soft. Registrul SEC este decrementat la fiecare apelare a subrutinei până ce fanionul Z din STATUS este setat, la aproximativ o secundă, moment în care se incrementează registrul NRSEC. Când NRSEC ajunge la valoarea dorită, 45 în exemplul dat, semnificând 45 de secunde, C-ul comută pinii RA1 în 0 și RA0 în 1 logic.

Schimbarea pe intrările RB6 și RB7 setează fanionul RBIF. Rutina verifică mai întâi ce pin a generat întreruperea și tratează numai situația în care întreruperea s-a produs la trecerea din 1 în 0 logic. Fișierul hexa care se introduce în memoria program a procesorului este următorul:

:0200000049288D

:080008008C008C0E030E8D002C

:100010000B1D252801300F028F000F08003C013016

:10002000031D0301003C031923280E08013E8E0026

:100030000E082D3C0130031D0301003C0319232849

:10004000851005148B120B1145280301061B013086

:10005000003C0130031D0301003C031933288510C7

:100060000B108B1245280301861B0130003C013028

:10007000031D0301003C03194528851405100B10CE

:1000800000308E001E308F008B160D0E83000C0E7C

:10009000090000308E001E308F008B138316033052

:1000A0008100C030860000308500831285148B17D4

:1000B0008B158B160130003C0319602800005A286C

:02400E00FA3F77

:00000001FF

Fișierul hexa a fost obținut după editarea programului sursă în limbaj de asamblare în mediul de dezvoltare MPLAB și asamblarea acestuia cu MPASM. Listing-ul programului este prezentat în continuare:

LIST P=16F84

INCLUDE “p16f84.inc"

salvw equ 0x0c

salvstatus equ 0x0d

nrsec equ 0x0e

sec equ 0x0f

ORG 0

goto start

ORG 4

movwf salvw

swapf salvw, F

swapf STATUS, W

movwf salvstatus

btfss INTCON, 2

goto presmax

movlw D'1'

subwf sec, W

movwf sec

movf sec, W

sublw D'0'

movlw 1

btfss STATUS, Z

clrw

sublw 0

btfsc STATUS, Z

goto temp

movf nrsec, W

addlw D'1'

movwf nrsec

movf nrsec, W

sublw D'45

movlw 1

btfss STATUS, Z

clrw

sublw 0

btfsc STATUS, Z

goto temp

bcf PORTA, 1

bsf PORTA, 0

bcf INTCON, T0IE

temp

bcf INTCON, T0IF

goto iesint

presmax

clrw

btfsc PORTB, D'6'

movlw D'1'

sublw D'0'

movlw 1

btfss STATUS, Z

clrw

sublw 0

btfsc STATUS, Z

goto presmin

bcf PORTA, 1

bcf INTCON, RBIF

bcf INTCON, T0IE

goto iesint

presmin

clrw

btfsc PORTB, D'7'

movlw D'1'

sublw D'0'

movlw 1

btfss STATUS, Z

clrw

sublw 0

btfsc STATUS, Z

goto iesint

bsf PORTA, 1

bcf PORTA, 0

bcf INTCON, RBIF

movlw D'0'

movwf nrsec

movlw D'30'

movwf sec

bsf INTCON, T0IE

iesint

swapf salvstatus,W

movwf STATUS

swapf salvw, W

retfie

start

movlw D'0'

movwf nrsec

movlw D'30'

movwf sec

bcf INTCON, GIE

bsf STATUS, RP0

movlw D'3'

movwf OPTION_REG

movlw D'192'

movwf TRISB

movlw D'0'

movwf TRISA

bcf STATUS, RP0

bsf PORTA, 1

bcf PORTA, 0

bsf INTCON, GIE

bsf INTCON, RBIE

bsf INTCON, T0IE

bucla

movlw D'1'

sublw 0

btfsc STATUS, Z

goto sfarsit

nop

goto bucla

sfarsit

END

Concluzii

Flexibilitatea unui asemenea dispozitiv cu microcontroler este evidentă, în raport cu dispozitivele realizate în logică cablată. Funcționarea poate fi autonomă. Conectarea la un PLC, pentru a da informații privind numărul de acționări sau starea curentă, se realizează prin intermediul unui modul de intrări numerice sau în impulsuri al PLC-ului. În mod similar, PLC-ul poate transmite comenzi numerice, de tipul pornit-oprit. Pentru o conexiune serială, dificilă de implementat, se preferă utilizarea unor microcontrolere performante, cu funcții înglobate de interfață serială, conversie analog-numerică, capacități sporite de prelucrare.

Figura III.1. Schema electrică

ANEXA IV

Modul de achiziție de date cuplat pe interfața serie RS232

Prezentare generală

În cuprinsul lucrării se vor prezenta câteva metode utilizate în proiectarea în logică hardware (cablată) a unui modul destinat achiziiei de date n laboratoare, modul ce poate fi conectat la un calculator prin intermediul portului de comunicaie serial, cu accent pe dezvoltarea interfeței cu PC-ul. Un sistem computerizat realizat cu astfel de module permite prelevarea, la momente de timp date, a valorilor semnalelor analogice, vizualizarea i nregistrarea evoluiei temporale a mrimilor. Prin intermediul sistemului de procesare se pot efectua diverse prelucrri numerice, precum determinarea unor mrimi de sintez, filtrare, controlul ncadrrii în limite. Sistemele de achiziie cuplate pe magistrala de comunicaie de tip serial prezint avantajul amplasrii lor n imediata apropiere a procesului a crui mrime fizic, transformat n mrime electric de ctre traductor, se msoar. Semnalele numerice, avnd o sensibilitate redus fa de perturbaii, constituie suportul ideal pentru informaie n comunicaia la distan.

Interfea RS-232

Comunicaia bidirecional pe interfaa serie de tipul RS-232 se face pe trei fire, transmisie, recepie i firul de mas. Este utilizat modul de transmisie a datelor asincron. Caracterul este ncadrat de semnale de start i stop. Un bit de start de nivel 0 precede ntotdeauna caracterul, anunnd receptorul c urmtorii 8 bii constituie un octet de date. Caracterul este urmat de unul sau doi biți de stop. Înaintea bitului de stop poate fi utilizat bitul de paritate. Datele sunt transmise pe linie, biii succedndu-se n serie. Receptorul și emitorul au propriul ceas. O mrire a cuvntului de date poate duce la desincronizri i la erori de transmisie, n timp ce reducerea nu este recomandat ntruct afecteaz rata de transfer. Viteza de comunicaie este standardizat.

Structura SAD

Este un sistem de achiziie de date cu multiplexarea semnalelor analogice de intrare, avnd structura de principiu din figura IV.1, ce cuprinde un ansamblu CEM-CAN la intrrile cruia se conecteaz succesiv semnalele de intrare prin multiplexare n timp.

Figura IV.1. Structura de principiu a unui SAD cu multiplexarea semnalelor de intrare

MUX – multiplexor cu rol de selecie a unei mrimi de intrare ce va fi convertit la un moment dat.

AP – amplificator cu ctig programabil, selectabil software, cu rol de a amplifica semnalul, astfel nct s fie utilizat ct mai bine rezoluia convertorului.

CEM – circuit de eantionare-memorare cu rol de a converti semnalul n semnal eantionat.

CAN – convertor analog-numeric ce permite obinerea unei descrieri numerice pentru valoarea mrimii fizice.

Interfaa – structura de comunicare cu portul serial i de programare i control a achiziiei.

Circuitul care sincronizeaz comenzile se bazeaz pe un generator de interval de timp precis i stabil, realizat cu cristal de quartz. Comparativ cu structurile de sisteme de achiziie cu multiplexarea ieirilor CEM sau CAN, acest tip de SAD este mai puin rapid, procesele de eantionare și conversie desfurndu-se succesiv pentru semnalele de intrare, afectnd astfel frecvena de achiziie. Complexitatea structurii scade ns ca numr de componente utilizate.

Principalele caracteristici ale modulului prezentat sunt urmtoarele:

8 intrri single-ended multiplexate;

domeniu de intrare unipolar i bipolar (010 , +/-5 , 05 , 02 V);

amplificare programabil (1, 2, 5);

conversie A/D pe 12 bii;

selecie canal sau conversie n inel;

rat de transfer n 4 trepte selectabile soft: 38400, 19200, 9600, 4800 baud;

eantionare intern sau extern;

4 bii ieire.

Circuitul de multiplexare

Multiplexorul este de tip cu intrri single-ended, sau de tip asimetric, pentru toate intrrile existnd o born comun, referina electronicii din placa de achiziie. Numrul canalului este controlat prin trei linii de adres i una de validare. Un nivel 1 logic pe intrarea INHIBIT aduce toate canalele n starea OFF (blocat), indiferent de starea liniilor de adres. Circuitul integrat MMC 4051 este un multiplexor/demultiplexor analogic cu opt canale realizat n tehnic CMOS, ce admite mrimi de intrare bipolare de pn la 20V vrf-la-vrf. Rezistena unui canal n conducie este de 125 , puin dependent de mrimea analogic, n vreme ce rezistena n starea OFF este mare, curentul rezidual fiind de + 100pA.

Amplificatorul cu câștig programabil

Este un circuit de condiionare a semnalului ce permite obinerea mai multor domenii de msurare prin programarea corespunztoare a amplificrii, avnd drept rezultat mrirea gamei dinamice a semnalului de intrare. Alte operaii eventuale de condiionare, cum sunt filtrarea, atenuarea, conversia curent-tensiune, separarea galvanic, care realizeaz adaptarea ntre traductor i circuitele de conversie analog-numeric, se efectueaz de-a lungul lanului de msurare pn la intrarea n plac. Tensiunea de intrare pentru convertorul analog-numeric este n gama 0…10V. Dac la intrarea unui CAN cu N=12 bii și domeniu de 10V, deci cu LSB=10V/212=2,44mV (bitul cu semnificaie minim), se aplic o tensiune de maximum 2V, rezoluia scade corespunztor de la 2,44mV / 10V= 0.025% la 2,44mV / 2V = 0.12%, rezoluie specific unui convertor de numai 10 bii. Amplificatorul diferenial este realizat cu un integrat LF356 i un demultiplexor MMC 4052 diferenial cu patru canale pentru programarea ctigului. Rapoartele de amplificare sunt, n ordine, 1, 1, 2 i 5, tensiunea de ieire Ue variind n intervalul 010V pentru domeniile de intrare corespunztoare de 010V, +/-5V, 05V, 02V.

Circuitul de eșantionare și memorare

Circuitul de eantionare i memorare permite memorarea tensiunii de intrare pn la terminarea procesului de prelucrare. Ieirea CEM se conecteaz la intrarea CAN. S-a utilizat un circuit S/H integrat monolitic de tip LF198. Pentru comanda de eantionare circuitul funcionează ca repetor. La primirea comenzii de memorare, n intervalul corespunztor efecturii unei conversii analog-numerice, comutatorul intern se deschide i tensiunea pe condensator rmne constant.

Convertorul analog-numeric

Convertorul analog-numeric realizeaz conversia semnalelor analogice n semnale numerice. Circuitul n tehnic CMOS ADC 912 este un CAN cu aproximaii succesive care se poate conecta att la sisteme de prelucrare numeric de 16 bii ct i de 8 bii. Structura intern cuprinde un CNA de 12 bii, un registru de aproximaii succesive i un comparator. Metoda utilizeaz un convertor numeric-analogic a crui ieire se compar cu semnalul de msurat. Prin ncercri succesive pentru fiecare bit se stabilete la intrarea convertorului N/A codul care genereaz un semnal egal cu cel msurat. Rezultatul conversiei se obine n registrul de aproximri succesive. Erorile de aproximare se mai numesc erori de cuantizare i au valorile cuprinse n intervalul + 0,5 LSB, unde LSB se definete ca valorea tensiunii de intrare care produce dou tranziii succesive ale secvenei de ieire. Pentru tensiunea de referin de -5V, tensiunea de intrare variaz ntre 0V i 10V, astfel c 1 LSB este de 2,44mV. Este prevzut o intrare separat pentru masa semnalelor numerice fa de cea a semnalului analogic.

Conectnd un cristal de quartz de 1MHz ntre intrrile CLK IN i CLK OUT se poate obine un timp de conversie de 12 s. Cnd semnalul de selecie /CS i linia HBEN sunt la nivel 0 logic, frontul de activare a semnalului /RD din ciclul de intrare, la momentul de timp t1 din figura IV.2, declaneaz procesul de conversie. Linia /BUSY (stare conversie) este meninut la nivel logic 0 n timpul conversiei. Magistrala este acum ncrcat cu biii rezultatului conversiei precedente. La sfritul procesului, momentul de timp t3, /BUSY trece n 1 logic i ct timp /RD este n stare activ, pn la momentul t4, rezultatul conversiei este ncrcat pe magistrala de ieire. La momentul t5 se declaneaz un nou proces de conversie. n intervalul t3t4 datele sunt preluate n buffer-ul de transmisie (memoria local) de pe placa de achiziie. Pentru fiecare conversie se transmit pe linie 2 octei. Pn la momentul t7 se impune ca datele s fie transferate integral la calculator. Rata de achiziie este astfel limitat de viteza de comunicaie.

Figura IV.2. Diagrame de timp corespunzătoare funcționării

convertorului conectat într-un sistem cu magistrala de date pe 16 biți

Pentru un semnal unipolar la tensiune zero corespunde ieire numeric zero. Valoarea maxim a ieirii numerice este 4095 pentru 12 bii. Ieirea n cod binar deplasat, specific unui CAN bipolar, se obine prin introducerea unui decalaj la intrare de -FSR/2, unde FSR este intervalul de variaie a semnalului de intrare. Codul binar este astfel decalat nct s se suprapun peste gama bipolar de semnal, n cazul aplicaiei date + 5V. n aceast convenie codul binar 000..0 este capul de scal negativ, 111..1 este capul de scal pozitiv, iar codul 100..0 corespunde cu semnalul de intrare zero.

Masa analogic i cea digital de pe plac se conecteaz ntr-un singur punct ntre pinii corespunztori ai integratului, aceasta pentru a se evita calea comun pentru cele dou tipuri de semnale, ceea ce ar putea afecta rezoluia.

Interfața cu PC-ul

Se compune din trei blocuri distincte, dup cum urmeaz.

Convertorul serie – paralel

Circuitul MAX 232 este un convertor de nivel de semnale TTL-MOS n nivel RS-232. Blocul de conversie propriu-zis are structura din figura IV.3, formele de und care ilustreaz funcionarea sa fiind prezentate n figura IV.4.

Figura IV.3. Blocul de conversie serie-paralel

n repaus linia serial este pe nivel logic 1. La interfaa serie, transmisia se face cu bitul cel mai puin semnificativ imediat dup bitul de start. La recepia unui cuvnt se detecteaz frontul bitului de start cu un bistabil de control. Circuitul integrat MMC4013 conine doi bistabili de tip D cu intrri i ieiri separate. Transferul informatiei logice prezente la intrarea DATA se face la tranziia pozitiv a impulsului de clock. Bistabilul comand numrtorul Johnson decadic MMC 4017 din schem.

Registrul serial de 8 bii este realizat cu un circuit MMC 4015 care const din dou registre identice de 4 bii, aici nseriate, cu intrare serie i ieiri de tip paralel. Nivelul logic prezent pe intrarea DATA este transferat n primul etaj i apoi deplasat succesiv pe frecvena ceasului. La primul impuls de ceas este ncrcat n registru bitul de start. Pe urmtoarele fronturi pozitive de ceas se ncarc n registrul serie cei opt bii ai cuvntului transmis serial. Al 9-lea impuls de ceas nscrie coninutul din registrul serie n registrul paralel de date. Circuitul integrat MMC 4508 conine dou latch-uri de 4 bii. Cu intrarea STROBE n 1 logic, datele de pe intrri apar la ieirile corespunztoare. La trecerea semnalului n 0, datele vor fi memorate n latch. Impulsul reseteaz bistabilul de control i numrtorul, pregtind schema pentru recepia urmtorului caracter.

Figura IV.4. Forme de undă pentru un bloc de recepție

Convertorul paralel-serie

Este compus din dou blocuri funcionale. Transmisia se face asincron, pentru fiecare octet se transmite un bit de start, opt bii de date și doi bii de stop. Dintre cei 12 bii de date obinui n urma conversiei, se transmit cu primul octet cei mai puin semnificativi 8 bii, iar cu al doilea octet urmtorii patru. Programul va efectua conversia datelor recepionate de calculator prin operaii la nivel de bit.

a)

b)

c)

Figura IV.5. a – Schema de formare a bitului de start

b – formele de undă c – organigrama

La sfritul conversiei A/D se genereaz pe frontul semnalului de stare /BUSY al convertorului ADC 912 primul bit de start. Schema de ntrziere din figura IV.5-a este conceput cu doi bistabili JK. Evoluia sistemului n spaiul strilor este descris prin organigrama din figura IV.5-c. Un numr de N stri pot fi codificate cu un numr de n biți, respectiv de n bistabili, unde:

2 n-1 < N < 2 n .

Pentru trei stri, în cazul de fa, s-au utilizat doi bistabili de tip JK, numr care satisface condiia de mai sus.

Se observ c tranziiile dintr-o stare în alta sunt condiionate de ctre o variabil de intrare. Functia de excitaie secundar se obine prin superpoziia mai multor funcii elementare,

,

unde 0 este funcia tranziiilor necondiionate de variabile de intrare, iar este funcia condiionat de variabila x. Funcia corespunde tranziiilor pentru care x=1. Pentru sintetizarea funciilor de excitaie secundar pentru fiecare CBB se alctuiesc diagramele Veitch-Karnaugh.

Pentru primul bistabil, corespunztor lui Q0 din fiecare stare, diagramele Veitch-Karnaugh sunt urmtoarele:

Lund variabila x egala cu zero se obine 0. Pentru determinarea funciei se consider x=1. Se aplic procedeele de minimizare a funciilor.

x=1

Funciile de excitaie secundar corespunztoare primului bistabil (se adopt notaiile J0 i K0) vor fi:

Pentru al doilea bistabil, corespunztor lui Q1 din fiecare stare, diagramele Veitch-Karnaugh sunt urmtoarele:

Pentru determinarea funciei se consider =1. Se aplic procedeele de minimizare a funciilor.

Funciile de excitaie secundar corespunztoare celui de-al doilea bistabil (se adopt notaiile J1 i K1) vor fi:

Figura IV.6. Convertorul paralel-serie

Convertorul paralel-serie propriu-zis din figura IV.6 este realizat cu circuitul MMC 4021, care este un registru de deplasare static de opt bii, avnd intrare sincron serie, intrare asincron paralel, ieire serie i intrare de control paralel/serie. Intrarea datelor serie se face sincron cu tranziia pozitiv a semnalului de tact. Simultan cu bitul de start se ncarc paralel n registrele de deplasare codul digital de 12 bii, intrrile de control P/ fiind stabilite n 1 logic. Semnalul de control trece dup o semiperioad de ceas n 0 logic i datele sunt deplasate sincron pe frontul semnalului de tact n registrul serie i concomitent ctre ieire printr-o poart SI. Transmisia fiecrui octet se face cu bitul cel mai puin semnificativ dup bitul de start. Al doilea bit de start se obine prin legarea unei intrri paralele la mas imediat dup realizarea biilor de stop ai primului octet prin aceeai metod, cu meniunea c legarea se face n cazul din urm la tensiunea de alimentare VCC. Biii de stop pentru cel de-al doilea octet, precum i meninerea liniei seriale n repaus pe nivel logic 1, se obin prin legarea intrrii serie a registrului la tensiunea VCC. Frecvena de comunicaie cu calculatorul este de cel mult 38400 baud.

Blocul logic de comandă și control

Sistemul de achiziie prezentat permite un control soft. Conversia se declaneaz prin transmisia de la calculator a unui cuvnt de cod. Totodat se transmit informaii cum sunt: ctigul amplificatorului, canalul pe care se face conversia, modul de lucru, prin baleierea canalelor sau cu selecia intrrii. Blocul logic din figura IV.7 decodific datele primite de la calculator.

Figura IV.7. Schema electrică a blocului logic

Instruciunile de comand sunt:

scriere n portul de ieiri numerice i selectare vitez de comunicaie;

II.1 conversie n inel pentru 8 canale;

II.2 selecie intrare i declanare conversie;

II.3 comand de stop;

II.4 conversie n inel cu eantionare extern;

II.5 conversie pe un canal cu eantionare extern.

I. Portul de ieiri numerice care transmite comenzi în exteriorul plcii are la baz un element de nmagazinare a informaiei, un circuit de tip latch MMC 4508, prezentat anterior. n absena comenzii de ncrcare acesta i menine neschimbat starea ieirilor, indiferent de variaia mrimilor de la intrare. Cuvntul de comand este urmtorul:

Cei doi bii mai puin semnificativi execut selecia portului prin activarea intrrii de STROBE. Semi-octetul B4B7 conine informaia ce se dorete a fi transmis n exterior.

Concomitent este stabilit viteza de comunicaie i, implicit, rata de conversie.

Semnalele de diferite frecvene pentru comanda interfeei sunt obinute de la oscilatorul pilot, cu cristal de quartz i trigger Schmitt, din figura IV.8.

Integratul MMC 4040 conine un numrtor binar asincron de 12 bii. Circuitul este practic un divizor de frecven. Ieirile sunt conectate la un multiplexor diferenial MMC 4052. Biii B2 i B3 din comanda de scriere, a cror valoare se memoreaz ntr-un latch pn la o nou comand de acest tip, selecteaz una dintre cele 4 perechi de canale, deschiznd comutatoarele analogice corespondente.

Figura IV.8. Schema de formare a ratelor de conversie și transfer

ntre dou comenzi de conversie transmise CAN-ului este necesar ca datele s fie transferate integral la calculator. Rata de achiziie este strict limitat de viteza de comunicaie, pentru a nu se pierde informaia. Sunt selectabile soft diferite frecvene de eantionare, corespunztoare ratelor de transfer alese.

II. Cuvntul de comand pentru declanarea achiziiei are forma:

II.1 Cuvntul pentru comanda de conversie n inel este urmtorul:

Selecia canalelor este realizat cu un numrtor binar. Acesta este un circuit MMC 4516 ce conine 4 bistabile de tip D, conectate ca un numrtor. Pentru intrarea UP/DOWN n 1 logic, numrtorul numr nainte dac intrarea CARRY IN este n nivel logic 0. Dup fiecare conversie se incrementeaz adresa multiplexorului, terminalul /BUSY al convertorului fiind conectat pe intrarea de tact a numrtorului.

II.2 Cuvntul de comand pentru selecie intrare i conversie este:

Intrarea CARRY IN este stabilit n 1 logic, blocnd numrtorul. Coninutul numrtorului este presetat n numrul binar transmis n cuvntul de comand pentru selecia canalului, numr aflat pe intrrile sale de tip paralel, printr-un nivel logic 1 pe intrarea PRESET ENABLE. Achiziia are loc pe un singur canal cu o frecvenă de eantionare stabilit intern.

II.3 Cuvntul de stop pentru conversia cu eantionare intern este:

Bitul cel mai puin semnificativ, aflat n 0 logic, oprete achiziia prin aducerea n starea OFF a canalelor multiplexorului i deselectarea convertorului A/D. Coninutul numrtorului este presetat n zero. Deblocarea schemei se face printr-o comand de achiziie.

II.4 Cuvntul de comand pentru achiziie n inel cu eantionare extern este:

Comenzile de acest tip se succed cu o frecven stabilit prin program, eventual prin folosirea ntreruperilor INT 08H i INT 1CH. Intrrile CARRY IN i PRESET ENABLE sunt fixate n 0 logic. Selecia canalelor este efectuat cu acelai numrtor binar. La fiecare conversie se incrementeaz adresa multiplexorului. Dup numrarea a opt conversii, intrarea de SET a bistabilului de control de tip D trece n 1. Ieirile bistabilului reseteaz numrtorul i opresc achiziia prin aducerea n starea blocat a canalelor multiplexorului i deselectarea convertorului A/D, intrrile /CS i /RD trecnd pe nivelul logic 1. O nou comand de achiziie, cu bitul cel mai puin semnificativ n 1, deblocheaz schema. Se impune o resetare prealabil a latch-ului din convertor, la bistabil transferul informaiei avnd loc pe frontul pozitiv al impulsului de ceas.

II.5. Cuvntul de comand pentru selecie intrare i conversie cu eantionare extern este:

n aceast din urm situaie, comenzile de achiziie se succed de asemenea cu o frecven stabilit extern, prin soft.

Intrrile CARRY IN i PRESET ENABLE sunt fixate n 1 logic. Coninutul numrtorului este presetat n numrul binar transmis pentru selecia canalului n cuvntul de comand, numr prezent pe intrrile sale de tip paralel. Dup efectuarea primei conversii, frontul pozitiv al semnalului de stare /BUSY conectat la intrarea de tact a unui bistabil de tip D transmite la ieire informaia logic prezent la intrarea DATA. Semnalul de 1 logic este transmis prin intermediul bistabilului pe o intrare de tip paralel a numrtorului i, mai departe, printr-un circuit ȘI pe intrarea de SET a bistabilului de control, care blocheaz achiziia de date ntr-un mod similar cu situaia de mai sus, resetnd totodat numrtorul i cellalt bistabil din schem.

Programarea

La un calculator IBM PC exist un sistem de comunicaie serial construit n jurul unui circuit Intel 8250 sau altele compatibile, 16450 i 16550. BIOS-ul conine pn la patru adrese de baz pentru porturile seriale. n mod obinuit se lucreaz pe al doilea port serial COM 2, avnd registrele cu adrese n zona 2f8h-2ffh, dup cum urmeaz:

Controlul asupra anumitor registre se face prin intermediul bitului 8 din registrul de control linie. Dac este poziionat n 1 atunci porturile 2f8 i 2f9 formeaz o valoare pe 16 bii care seteaz pentru pentru aplicaia dat viteza de comunicaie astfel:

Registrele TX i RX conin cuvntul transmis, respectiv recepionat.

Registrul de control linie comand funcionarea portului serial:

Starea portului serial este dat de registrul de stare linie. Recepia unui caracter este semnalat prin setarea n 1 a primului bit. Cnd transmisia este permis, al 6-lea bit este de asemenea poziionat n 1 logic.

Metoda de programare prin interogare (polling) se utilizeaz pentru semnale lent variabile, ceea ce presupune frecvene reduse de eantionare. Se transmite un cuvnt de comand pentru conversie i se ateapt recepia a dou caractere de 8 bii, datele fiind prelucrate dup preluare.

Metoda de programare bazat pe ntreruperi permite prelucrarea concomitent cu achiziia datelor. Pentru o setare pe nivel logic 1 a bitului cel mai puin semnificativ din registrul de activare a ntreruperilor, este permis ntreruperea n caz de date recepionate disponibile. Registrul de identificare a ntreruperilor se citete pentru a se afla cauzele ntreruperilor, al treilea bit fiind poziionat n 1 logic atunci cnd exist date recepionate disponibile. Reset-ul se face prin citirea portului 2f8h. Pentru activarea ntreruperii cnd buffer-ul de transmisie este gol se poziioneaz n 1 bitul al doilea din registrul de permitere a ntreruperilor. COM 2 poate fora ntreruperea hard IRQ3 (vector INT 0BH). Subrutina care permite preluarea de date la apariia ntreruperii IRQ3 se apeleaz dintr-un program, care poate fi rezident n memorie, ce redirecteaz adresa de tratare a ntreruperii.

Concluzii

Deși realizat n logic imprimată, cu circuite standard, funcionarea acestui modul, prezentat în ansamblu în figura IV.9., n conexiune cu un PC i confer o flexibilitate deosebit. Pe parcursul lucrării au fost evidențiate principiile care stau la baza funcionrii i utilizrii componentelor unui sistem de achiziie. Dar, aa cum circuitul integrat ADC 192 sau circuitul S/H LF 198 nlocuiesc scheme complexe proiectate cu integrate uzuale, tot astfel blocurile de comunicaie serial pot fi nlocuite, pentru simplificarea schemei de ansamblu, cu circuite specializate. Mai mult, exist convertoare cu ieire serial compatibil ce nglobeaz și amplificatorul de urmrire-memorare. Pasul urmtor n conceperea unui sistem de achiziie este cel reprezentat de utilizarea unui circuit integrat pe scar larg, care poate fi un microprocesor, microcontroler sau procesor numeric de semnal, ce ofer independen, preluarea funciei de comand, a funciei de interfa, cu implementarea unui protocol standard de comunicație, capaciti sporite de prelucrare, reducerea numrului de componente.

Similar Posts