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.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Instrument Virtual Pentru Comunicatia de Date In Protocolul Modbus (ID: 121787)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
