Vizualizarea proceselor tehnologice


Figura 2.1 - Tipul tabelului de simboluri din Simbol Editor


Iată textul programului în limba STL


ORGANIZARE_BLOCK OB 1

OB1_EV_CLASS. BYTE; // Bits 0-3 = 1 (Eveniment Coming), Bits 4-7 = 1 (Event class 1)







OB1_SCAN_1. BYTE; // 1 (scanare reîncepută la rece 1 a OB 1), 3 (scanarea 2-n a OB 1)

OB1_PRIORITY. BYTE; // 1 (Prioritatea 1 este minimă)

OB1_OB_NUMBR. BYTE; // 1 (Organizare bloc 1, OB1)

OB1_RESERVED_1. BYTE; // Rezervat pentru sistem

OB1_RESERVED_2. BYTE; // Rezervat pentru sistem

OB1_PREV_CYCLE. INT; // Ciclul de timp al scanării anterior OB1 (milisecunde)

OB1_MIN_CYCLE. INT; // Timpul minim al ciclului OB1 (milisecunde)

OB1_MAX_CYCLE. INT; // Timp maxim al ciclului OB1 (milisecunde)

OB1_DATE_TIME. DATE_AND_TIME; // Data și ora OB1 au început

TITLE = INITIALIZARE, FAZA 1


Unitatea organizațională OB100 stabilește valorile inițiale ale intervalelor de timp, se execută o singură dată când controlerul este transferat în modul Run. Programul poate efectua funcții de control al traficului pentru valorile presetate ale fazelor. Pentru a modifica timpul fiecărei faze și pentru a vizualiza lucrul la semafor, am creat un proiect în WinCC. După cum sa menționat mai sus, proiectul nostru include mai multe sarcini, astfel încât după lansarea ferestrei principale de program apare, prezentat în Figura 2.2.



Figura 2.2 - Fereastra de pornire a programului


După apăsarea butonului Start, programul comută într-o fereastră în care puteți alege cu ce controler să lucrați și ce sarcină să rezolvați. Selectând butonul din stânga jos "Controlul luminii de trafic" din fereastra de selecție, intrăm în fereastra în care se efectuează controlul vizualizării și al luminii semaforului, fereastra este prezentată în Figura 2.4. Putem schimba valorile intervalului de timp fie cu ajutorul butoanelor sus / jos, fie în câmpul I / O (vezi Figura 2.5). Cererea de la pietoni poate fi setată fie din WinCC cu ajutorul unui buton, fie printr-un comutator conectat la intrarea I 0.0 a microcontrolerului.



Figura 2.3 - Fereastra de selectare a sarcinii care trebuie rezolvată



Figura 2.4 - Fereastra de control al luminii de trafic



Figura 2.5 - Stabilirea timpului de fazare a semaforului


Pentru a vizualiza lumina de trafic, s-au folosit 11 variabile de proces, prezentate în Tabelul 2.3. Pentru vizualizarea de la primitive geometrice (cerc, pătrat) a fost creat un obiect cu câmpuri definite de utilizator. Ca un câmp nou, a fost adăugat un câmp COLORS. În acest câmp, s-au adăugat proprietățile cercurilor Culoare de fundal (3 proprietăți, câte unul pentru fiecare lumină). O lumină de trafic pentru pietoni a fost creată pe baza unui semafor pentru autoturisme prin îndepărtarea de la obiect a unui cerc pentru lumină galbenă. Pentru proprietățile culorii de fundal prin dialogul dinamic, a fost adăugată dinamică (vezi Figura 2.6)


Tabelul 2.3 Variabile utilizate pentru vizualizarea semaforului

SetTagByte ("segvalue", valoare); // Intoarcere - Tip: BOOL

dacă (formask) SetPropDouble (lpszPictureName, "Obiect personalizat1", proprietate [i], verde);

altfel SetPropDouble (lpszPictureName, "Obiect personalizat1", proprietate [i], gri);


Programul pentru microcontroler, scris în limba STL, este angajat pur și simplu prin transferarea byte-urilor din zona de memorie internă la ieșirile digitale. Iată textul programului


ORGANIZARE_BLOCK OB 1

OB1_EV_CLASS. BYTE; // Bits 0-3 = 1 (Eveniment Coming), Bits 4-7 = 1 (Event class 1)

OB1_SCAN_1. BYTE; // 1 (scanare reîncepută la rece 1 a OB 1), 3 (scanarea 2-n a OB 1)

OB1_PRIORITY. BYTE; // 1 (Prioritatea 1 este minimă)

OB1_OB_NUMBR. BYTE; // 1 (Organizare bloc 1, OB1)

OB1_RESERVED_1. BYTE; // Rezervat pentru sistem

OB1_RESERVED_2. BYTE; // Rezervat pentru sistem

OB1_PREV_CYCLE. INT; // Ciclul de timp al scanării anterior OB1 (milisecunde)

OB1_MIN_CYCLE. INT; // Timpul minim al ciclului OB1 (milisecunde)

OB1_MAX_CYCLE. INT; // Timp maxim al ciclului OB1 (milisecunde)

OB1_DATE_TIME. DATE_AND_TIME; // Data și ora OB1 au început


2.3 Controlul umplerii rezervorului








Standul care simulează rezervorul include:

  1. rezervorul însuși;

  2. controlul analogic al obturatorului de lichid (control soft

0-10);

  1. controlul digital al obturatorului de lichid (deschis / închis);

  2. senzor de nivel de umplere a rezervorului (semnal de ieșire 0-10V, care corespunde cu 0-100%);

  3. două intrări digitale de control pentru deschiderea clapetelor de scurgere;

  4. Senzorul pentru viteza de curgere a lichidului din rezervor (0-10V, care corespunde

0-100%).


Fereastra programului de gestionare a tancurilor arată ca în figura 2.10. Partea superioară a ferestrei este partea de control, partea inferioară fiind vizualizarea stării de lucruri în rezervor. Principiul de funcționare este următorul: în partea superioară a ferestrei se reglează tensiunea cu care se deschide clapeta de alimentare cu lichid, iar sarcina poate fi efectuată fie cu cursorul, fie cu intrarea digitală în câmpul I / O.



Figura 2.10 Fereastra programului de control al nivelului


Pentru a schimba proprietatea Connection Driver Driver (Procesare driver de proces) a obiectului Slider, este alocată următoarea C-share

anula OnPropertyChanged (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, valoare lungă)

SetTagWord ("Analogvalve", neuval); // Return-Type: BOOL

SetPropDouble (lpszPictureName, "I / O Field3", "OutputValue", valoare / 10,0); // Return-Type: BOOL


O valoare de + 10V corespunde unei valori de 27520, dar deoarece Slider manipulează procentele, împărțind cu 10 randamente 275,2. În acest caz, pasul cu care se poate schimba valoarea tensiunii este 0,1V. Prin urmare, în al doilea rând al codului, noua valoare este înmulțită cu 275,2, luând în considerare scalarea și reprezentarea numerelor în DAC-ul microcontrolerului.

Pentru a afișa cu exactitate tensiunea aplicată declanșatorului și pentru a permite o intrare manuală precisă, este furnizat câmpul I / O. Pentru a conecta valorile de intrare la câmpul I / O cu glisorul element și invers pentru câmpul I / O, se creează o acțiune C pentru a modifica proprietatea Valoare de intrare. Iată textul acțiunii C

void OnPropertyChanged (caracter * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, char * valoare)

val = GetTagDouble ("temp1"); // Return-Type: dublu

SetPropWord (lpszPictureName, "Slider Object1", "Process", outval); // Return-Type: BOOL


Acest C-share citește eticheta asociată câmpului I / O, înmulțește această valoare cu 10, deoarece obiectul cursorului manipulează procentele și scrie valoarea rezultată proprietății Process a obiectului cursorului. Astfel, după umplerea câmpului I / O și apăsarea butonului Enter, tensiunea de ieșire a DAC este setată la valoarea corespunzătoare, iar glisorul glisantului este, de asemenea, poziționat corespunzător.

Pentru a controla intrările digitale ale deschiderii / închiderii flapper-ului și deschiderii / închiderii clapetelor de evacuare, există 3 butoane. Apăsând aceste butoane, se apelează următoarele acțiuni C.

nule OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)

scurt supape int, masca;

mască = 1; // Bitul 1-st reprezintă supapa de intrare digitală

supape = GetTagByte ("controlvalves"); // Return-Type: BYTE

SetPropChar (lpszPictureName, "Text Static8", "Text", "Închidere"); // Return-Type: BOOL

SetPropChar (lpszPictureName, "Text Static8", "Text", "Deschis"); // Return-Type: BOOL

SetTagByte ("valori de comandă", supape); // Return-Type: BOOL

nule OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)

scurt supape int, masca;

mască = 2; // Bitul 1-st reprezintă supapa de intrare digitală

supape = GetTagByte ("controlvalves"); // Return-Type: BYTE

SetPropChar (lpszPictureName, "Text Static8", "Text", "Închidere"); // Return-Type: BOOL

SetPropChar (lpszPictureName, "Static Text8", "Text", "Deschis"); // Return-Type: BOOL

SetTagByte ("valori de comandă", supape); // Return-Type: BOOL

nule OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)

scurt supape int, masca;

mască = 4; // 3 biți reprezintă supapa de intrare digitală

supape = GetTagByte ("controlvalves"); // Return-Type: BYTE

SetPropChar (lpszPictureName, "Text Static8", "Text", "Închidere"); // Return-Type: BOOL

SetPropChar (lpszPictureName, "Static Text8", "Text", "Deschis"); // Return-Type: BOOL

SetTagByte ("valori de comandă", supape); // Return-Type: BOOL


Cele trei acțiuni listate funcționează după cum urmează. Proiectul a creat un controlvalves tehnologice tag-ul, care este asociat cu memorie octet al microcontrolerului 18 (MB 18). Pentru controlul de deschidere / clapetele de închidere sunt utilizate primele trei biți al acestui octet, bitul 0th - pentru a deschide / închide robinetul de alimentare cu lichid, 1 bit - deschide robinetul închis, de scurgere mai întâi, a 2-bit - pentru a deschide / închide a doua supapă de evacuare. C-acțiune apăsând butonul citește curent controlvalves valoare tag-ul, apoi măști valoarea primită, deplasări în poziția 0th și verifică 1 sau 0.

Dacă 1, atunci clapeta până la acest punct a fost deschisă și trebuie închisă prin operație (multiplicare logică), bitul necesar este setat la zero.

Dacă este 0, clapeta în momentul respectiv a fost închisă și trebuie deschisă, cu ajutorul lui | (adăugare logică) bitul necesar este setat la unu.

Pentru a monitoriza nivelul de umplere al rezervorului și deschiderea clapetelor de scurgere în cazul umplerii la nivelul cerut, se aplică o acțiune globală C. Acțiunea globală C diferă de cea locală prin faptul că nu este legată

la orice obiect al formularului, acțiunea globală este legată numai de schimbarea oricărei etichete (sau doar cu unul dintre ciclurile standard) și este efectuată atunci când această etichetă este modificată. Aici este textul cotei C care controlează deschiderea / închiderea clapetelor de scurgere.


int gscAction (void)

scurtă int preflevel, curlevper, contr;

currentlevel = GetTagSword ("fill_level"); // în format brut, adică 10V = 27520

preflevel = GetTagByte ("preffilllevel"); // în procente

curlevper = (curentul / 27520) * 100; // nivelul curent în procente







Articole similare

Trimiteți-le prietenilor: