Sistemele de Comanda cu Modularea In Latime a Impulsurilor – Pwm Pentru Convertoarele Statice de Putere cu Frecvență Variabilă
1. GENERALITĂȚI
În ultimul timp, sistemele de comandă cu modularea în lățime a impulsurilor – PWM pentru convertoarele statice de putere cu frecvență variabilă au devenit din ce în ce mai folosite în domeniul acționărilor reglabile, înregistrând o rată de creștere anuală de 1314%, în raport cu numai 34% pentru acționările de curent continuu.
Comanda mașinilor electrice de c.a. cu ajutorul convertoarelor statice de putere cu frecvență variabilă presupune utilizarea unor dispozitive semiconductoare de putere cu posibilitate de blocare pe poartă.
O mare parte a mașinilor electrice utilizează ca sursă de energie rețelele electrice ce impun tensiunea nominală pentru dispozitivele semiconductoare de putere:
500/600 V pentru rețele monofazate de 220/240 V;
1000/1200 V pentru rețele trifazate de 380/415 V;
1600 V pentru rețele de 560 V.
Pentru aplicații sunt necesare dispozitive semiconductoare de putere rapide, ceea ce înseamnă :
comutarea cu puteri reduse (de la câțiva kHz până la 25 kHz în funcție de puterea mașinii);
eliberarea unor impulsuri de curent pe o durată foarte scurtă ( s);
timpul mort să fie cît mai mic posibil (< 1 s).
De asemenea sunt necesare protecții la scurtcircuit, supratensiuni și supratemperaturi; nu trebuie uitat nici aspectul financiar costurile de producție să fie cît mai mici.
Din punct de vedere practic, un dispozitiv semiconductor de tensiune în stare blocată poate să țină la borne o tensiune ce depinde de rezistivitatea siliciului din zona centrală și de grosimea acestuia. În funcție de tensiunea de utilizare, rezistivitatea siliciului și grosimea zonei centrale se modifică corespunzător.
Progresele tehnologice în domeniul dispozitivelor semiconductoare de putere, cum ar fi tranzistorul IGBT sau tiristorul MCT au determinat dezvoltarea întreruptoarelor statice de mare putere având timpi de comutație foarte mici. Această evoluție a deschis un domeniu larg aplicativ tehnicilor de modulație în lățime a impulsurilor în reglarea tensiunii la ieșirea convertoarelor.
TENDINȚE ACTUALE
În ultimul timp a crescut interesul dezvoltării modulatoarelor în lățime a impulsurilor (PWM) având la bază microprocesoare. Dintre multitudinea de metode, cum ar fi : metode analogice/digitale dedicate, metode digitale dedicate și metode de implementare cu microprocesoare, ultimele prezintă mai multe avantaje. Un modulator având un microprocesor dedicat, dacă este proiectat judicios, poate aduce simplificări considerabile ale hardware-ului cu îmbunătățiri semnificative ale performanței și a fiabilității. Acționările moderne de curent alternativ având strategii de comandă PWM sunt într-o continuă căutare a îmbunătățirii performanței și fiabilității reducând costurile conversiei de putere și controlului. Dacă controlul este implementat cu un
microprocesor, atunci modulatorul, care constituie o verigă de legătură între controller și invertor, poate fi integrat hardware și software în același microprocesor. Dacă modulatorul este folosit ca un bloc separat există posibilitatea de a proiecta un modul hardware universal care poate fi adaptat tranzistoarelor sau tiristoarelor modificând doar partea de software.
Într-un modulator hardware convențional, formele de undă PWM sunt generate comparând semnalul sinusoidal de referință cu semnalul triunghiular purtător prin procesul de eșantionare naturală. Când regiunea lineară PWM este depășită în zona de tranziție, formele de undă de la ieșire sunt distorsionate datorită introducerii armonicilor de joasă frecvență. În plus, invertorul este neliniar din imposibilitatea generării unor impulsuri oricât de înguste . La modulatorul pe bază de microprocesor, forma de undă poate fi sintetizată precis în regiunea (zona) de tranziție controlând armonicile și saltul tensiunii iar problemele de neliniaritate pot fi ușor corectate. Oricum, generarea precisă în timp real a formelor de undă folosind PWM, în funcție de cerințele schemei de reglaj, rămâne o provocare datorită performanței critice în timp cerute de microprocesor.
2. TEHNICI DE MODULARE PWM
2.1 CARCTERISTICI ALE TEHNICILOR PWM
Dintre dezavantajele modulației în lățime a impulsurilor se pot evidenția:
atenuarea componentei fundamentale dorite a formei de undă PWM;
creșterea puternică (drastică) a frecvențelor de comutație – asta înseamnă un stres mai mare în comutație a dispozitivelor semiconductoare ceea ce duce la îmbătrînirea acestor dispozitive semiconductoare;
generarea unor armonici de frecvență înaltă.
De când a devenit evident că avantajele PWM cântăresc mai greu decît dezavantajele acestora, au fost făcute eforturi de cercetare considerabile pentru a minimiza dezavantajele PWM menționate anterior. Drept urmare au fost propuse câteva tehnici PWM care se referă la îmbunătățirea utilizării sursei armonicilor de intrare ieșire generate. Avantajele acestor tehnici PWM îmbunătățite față de tehnica PWM Sinusoidală au fost obținute cu “prețul” generării armonicii corespunzătoare tensiunii dintre a treia fază și nul. Oricum, în condiții de echilibru și de funcționare cu nulul desfăcut, cea de-a treia armonică a curentului nu poate exista și, de aceea, armonicile de ordinul trei ale tensiunii sunt neutralizate.
Munca anterioară legată de aceste tehnici îmbunătățite s-au concentrat pe spectrul de ieșire al convertorului, neglijând alte criterii importante cum ar fi: spectrul de intrare, factorul de distorsionare pe intrare/ieșire, frecvențele de comutație și considerațiile privind implementarea hardware. În continuare, un alt scop al muncii anterioare a fost aplicațiile invertorului neglijând alte domenii la fel de importante, cum ar fi: dispozitivele de cc, sursele de alimentare redresate și variatoarele de frecvență de tip redresor-invertor. În consecință, alegerea tehnicii PWM care este cea mai bună pentru majoritatea aplicațiilor este însoțită de incertitudine, ceea ce poate conduce la un rezultat nu tocmai optim.
Aplicațiile luate în seamă includ:
Invertoare de tensiune și curent pentru
motoare de curent alternativ cu viteză variabilă;
surse de putere neîntreruptibile (UPS-uri);
redresoare pentru
motoare de curent continuu;
surse de alimentare
variatoare de frecvență de tip redresor-invertor cu performanțe ridicate.
2.2 ALTE TEHNICI PWM ÎMBUNĂTĂȚITE
O altă categorie de tehnici PWM îmbunătățite sunt așa numitele tehnici PWM programate. Aceste tehnici oferă o mai bună utilizare a tensiunii și a frecvențelor joase de comutație când sunt folosite cu invertoare alimentate de la surse independente de tensiune sau
curent reglabile. Când aceste tehnici sunt folosite cu invertoare de frecvență variabilă sau tensiune variabilă și o magistrală de curent continuu constant, au anumite dezavantaje, printre care:
este necesar un hardware de control destul de sofisticat pentru a stoca și accesa numărul mare (necesar) de modele de comutare;
pentru motoarele de curent continuu (la frecvențe de lucru coborâte), numărul punctelor de comutare devine prea mare pentru a putea fi evaluat analitic, chiar și cu computere de tip mainframe;
când trebuie eliminat un număr mare de armonici, modelul de comutare respectiv nu poate fi reprodus întocmai de către invertor datorită întârzierilor asociate comutării invertorului și dispozitivelor de bază ale acestora.
O altă tehnică îmbunătățită derivată din modulația PWM Sinusoidală este injecția armonicii a 3-a. Rezultatul este o formă de undă “turtită” (figura 1), care permite supramodularea. La tehnica PWM Sinusoidală nu se putea crește peste o anumită limită tensiunea de la ieșirea invertorului. Injectând armonica a 3-a se îmbunătățesc performanțele invertorului cu 15%, obținându-se la ieșire o tensiune cu 15% mai mare decât în cazul modulației PWM Sinusoidale.
Expresia analitică a formei de undă de referință este:
y = 1,15sin(t) + 0.19sin(3t)
3. PRINCIPIUL MODULAȚIEI PWM SINUSOIDALE
În continuare se va prezenta principiul modulației PWM Sinusoidale pentru un braț de punte dintr-un invertor trifazat. Alimentarea invertorului se face de la un redresor, baterie de acumulatori sau un chopper. De regulă, invertorul este alimentat de la un redresor. Această configurație se numește Convertor static de frecvență cu circuit intermediar de cc.
În figura 1a este prezentată configurația invertorului trifazat de tensiune. Principiul de funcționare al invertorului este independent de tipul dispozitivelor semiconductoare de putere folosite.
Figura 1. Invertorul trifazat de tensiune în punte (a)
și circuitul echivalent folosind întreruptoare ideale (b).
Sistemele de comandă bazate pe principiul modulației în lățime a impulsurilor au fost introduse în aplicațiile cu invertoare datorită avantajelor oferite :
posibilitatea reglării atât a frecvenței cît și a amplitudinii tensiunii la ieșire prin comanda invertorului;
armonicele de ordin mic sunt eliminate din forma de undă a tensiunii de ieșire a invertorului.
Forma de undă care poate fi obținută la ieșirea unui invertor se bazează pe modificarea impulsurilor de comandă după o lege sinusoidală. În cazul invertorului trifazat de tensiune în punte comandat pe principiul PWM Sinusoidală secvența de comandă pentru tranzistoare se obține în mod similar pentru fiecare braț în parte. În continuare va fi descris principiul modulației PWM Sinusoidale (semnalul de referință este sinusoidal; dacă semnalul de referința este dreptunghiular atunci modulația se numește PWM Dreptunghiulară) pentru un braț al invertorului folosindu-se trei semnale sinusoidale de referință defazate cu 2/3 între ele și un singur semnal purtător (figura 2).
Secvența de comandă pentru tranzistoare se obține în urma comparării unui semnal de referință (Uref) cu un semnal triunghiular purtător (Up). Punctele de intersecție sunt folosite la impunerea momentelor de comutație pentru dispozitivele semiconductoare comandabile ale invertorului. Frecvență de comutație pentru dispozitivele semiconductoare din cadrul invertorului este stabilită de frecvența semnalului purtător și, în general, este păstrată constantă. Frecvența semnalului de referință (fs) impune frecvența fundamentalei tensiunii la ieșirea invertorului. Semnalul de referință (Uref) este folosit la modularea duratei de conducție (tc).
Forma de undă a tensiunii de ieșire nu este sinusoidală și conține armonici de tensiune superioare armonicei fundamentale. Fiecărei armonici de tensiune îi corespunde o armonică de curent.
Principalele mărimi ale modulației PWM Sinusoidale sunt:
gradul de modulare, definit astfel:
unde:
reprezintă valoarea de vârf a semnalului de referință sinusoidal
reprezintă valoarea de vârf a semnalului purtător care este păstrată constantă
indicele de modulare, definit astfel:
4. PRINCIPIUL METODEI
SPACE VECTOR PWM (SVPWM)
SVPWM este o strategie de control pentru invertoare trifazice care se bazează pe vectori de tensiune spațiali.
Toate tehnicile de modulare cu eșantionare uniformă a lățimii de puls, valabile pentru convertoare electronice de putere, utilizează, direct sau indirect, transformarea liniară a unei funcții modulatoare date în rapoarte de comandă ale semnalelor de comutație ale convertorului. Raportul de comandă da,i al fazei A la comutarea semnalului a în al i-lea interval de comutație se poate exprima cu relația:
(1)
unde:
F funcția modulatoare;
M indice de modulare;
i unghiul de mijloc al intervalului.
Funcția modulatoare nu trebuie să fie neapărat sinusoidală, însă trebuie să fie cuprinsă în intervalul [-1,1]. Atunci, timpul de conducție raportat la perioada de eșantionare (perioada semnalului purtător) poate fi variat între 0 și 1, permițând un control complet al mărimii tensiunii invertorului. Evident relația (1) se poate aplica și celorlalte faze ale invertorului, înlocuind i cu i -120 pentru faza B și i -240 pentru faza C.
Strategia clasică SVPWM, este foarte populară în prezent datorită simplității saulară în prezent datorită simplității sale și caracteristicilor bune de funcționare, constă în generarea unei anumite succesiuni de stări ale invertorului.
În esență, modulatorul reprezintă un numărător în inel. Duratele stărilor individuale sunt determinate prin formule simple, ușor de implementat într-un microprocesor. Planul complex al vectorilor de tensiune spațiali ai invertorului este împărțit în șase sectoare de 60 (0 – 60, 60 – 120 etc.) care corespund unor subcicluri cu lungimea de 60 ale ciclului tensiunii de ieșire a invertorului. În continuare, fiecare subciclu este împărțit în N intervale de comutație egale. Cele trei stări ale invertorului, X, Y și Z, sunt suprapuse peste fiecare interval de comutație. O stare dată a invertorului, S, este definită de valorile, a, b și c ale semnalelor de comutație corespunzătoare fazelor A, B și C astfel: S = (abc)2. De exemplu, în cazul a = 1, b = 0 și c = 1 se spune că invertorul este în starea 5, de vreme ce 1012 = 510. Rapoartele de comandă, dX,i, dY,i și dZ,i, corespunzătoare stărilor individuale din al i-lea interval de comutație se calculează cu relațiile:
dX,i = Msin(60 – i) (2)
dY,i = Msin(i) (3)
dZ,i = 1 – dX,i – dY,i (4)
în care i este unghiul de mijloc al celui de-al i-lea interval de comutație, măsurat de la începutul subciclului, când X = 4, 6, 2, 3, 1, 5, respectiv Y = 6, 2, 3, 1, 5, 4 în subciclurile 1 – 6.
Starea Z se produce când toate cele trei ieșiri ale invertorului sunt legate la aceeași sursă de alimentare de c.c., fie la borna negativă (Z = 0) fie la cea pozitivă (Z = 7).
5. INVERTORUL TRIFAZAT DE TENSIUNE
CU MODULAȚIE PWM
În cadrul acționărilor de curent alternativ, convertoarele statice de putere sunt denumite convertoare statice cu frecvență variabilă (VFC).
Cea mai răspândită topologie este cea din figura 1. Această schemă este alcătuită din Redresor – Circuit intermediar de c.c. – Invertor trifazat de tensiune cu PWM și poartă denumirea de convertor static de frecvență indirect sau cu circuit intermediar de c.c.
În ultimul timp a crescut domeniului de aplicabilitate al invertoarelor trifazate de tensiune comandate pe principiul PWM și în special al celor cu tranzistoare IGBT. În lucrarea de față a fost realizat un program pe calculator care simulează funcționarea unui asemenea invertor.
Figura 2. Circuitul echivalent folosind întreruptoare ideale.
Cu k1 k6 s-au notat grupările tranzistor-diodă de regim liber în montaj antiparalel. Aceste întreruptoare sunt bidirecționale în curent și unidirecționale în tensiune. Fiecare dintre tranzistoare permite conducția curentului de la colector spre emitor, iar diodele de regim liber montate în antiparalel permit conducția curentului în sens invers. Aceste diode caracteristice invertoarelor de tensiune furnizează o cale pentru curentul de sarcină de a circula invers. Astfel se poate recupera dinspre invertor spre sursa de c.c. energia înmagazinată în inductivitatea circuitului de sarcină.
Funcționarea invertorului trifazat de tensiune în punte este asemănătoare cu cea a invertorului monofazat de tensiune. În cazul invertorului monofazat, fiecare dispozitiv semiconductor este comandat ON și respectiv OFF pentru intervale egale cu 180. Ieșirea este conectată pentru câte o jumătate de perioadă la borna pozitivă și respectiv negativă a sursei de c.c.
În cazul invertorului trifazat comandat PWM, comanda ON și respectiv OFF a dispozitivelor semiconductoare nu se mai face pentru intervale fixe. Intervalele de conducție și respectiv de blocare ale dispozitivelor semiconductoare sunt calculate, în funcție de tensiunea dorită a se obține la ieșire, folosind tehnica PWM. Dacă pulsurile de comandă sunt înguste, atunci valoarea medie a tensiunii de la ieșire va fi mică; în schimb, dacă lățimea pulsurilor de comandă este mare, atunci valoarea medie a tensiunii de la ieșire va fi mare.
Fie trei funcții de comandă, Fa, Fb și Fc, corespunzătoare celor trei brațe ale invertorului notate cu a, b și c (figura 3). Aceste funcții pot lua doar valorile 0 sau 1 în funcție de celula elementară de comutație care este comandată. Dacă sunt comandate tranzistoarele T1, T3 și T5, atunci funcțiile de comandă iau valoarea 1, iar dacă sunt comandate tranzistoarele T2, T4 și T6, atunci funcțiile de comandă iau valoarea 0. Având trei brațe și două valori pentru funcțiile de comandă pentru fiecare braț rezultă 23 = 8 combinații posibile. În algoritmul de calcul prezentat și implementat nu s-au luat în calcul variantele 000 și 111 (în aceste două situații valoarea tensiunii de ieșire este zero).
De exemplu, dacă Fa = 1, Fb = 0 și Fc = 1, folosind relațiile (1), (2) și (3) deduse în capitolul 5.3, se obțin următoarele tensiuni de fază la ieșirea invertorului :
Astfel, tensiunile de fază generate de invertor nu au o variație continuă ci în trepte egale cu respectiv din tensiunea continuă de alimentare (UDC). După cum se observă în figura 1 din capitolul 9 variațiile în trepte ale tensiunilor de fază generate “urmăresc” variațiile tensiunilor de referință.
Considerând numai două brațe ale invertorului trifazat (invertor monofazat – figura 4.) avem următoarele patru situații:
k2 și k4 ON, k1 și k3 OFF (00)
k2 și k3 ON, k1 și k4 OFF (01)
k1 și k4 ON, k2 și k3 OFF (10)
k1 și k3 ON, k2 și k4 OFF (11)
Pentru combinația 00 și 11:
UAB = 0;
IAB = 0.
Pentru combinația 01:
UA = – UDC/2; UB = UDC/2; UAB = UA – UB = – UDC
IAB are sensul de la B la A (IAB < 0).
Pentru combinația 10:
UA = UDC/2; UB = – UDC/2; UAB = UA – UB = UDC
IAB are sensul de la A la B (IAB > 0).
Alimentând cu aceste tensiuni în pulsuri o sarcină RL se obțin curenții de linie corespunzători.
Ecuațiile pentru această configurație sunt:
(1)
La implementarea ecuațiilor invertorului pe calculator în programul de simulare s-au folosit ecuațiile (1). La fiecare pas de calcul se calculau cuantele , , , iar cu aceste valori se incrementau curenții respectivi de linie (vezi capitolul 7).
Tensiunile de linie calculate în funcție de tensiunile de fază prezintă, de asemenea, tot o variație în trepte.
Uab = Ua – Ub
Ubc = Ub – Uc
Uca = Uc – Ua
Întreruptoarele de putere folosite în practică în cadrul invertoarelor nu sunt perfecte, existând întotdeauna un interval de timp între trimiterea comenzii și realizarea sa. În consecință, pentru evitarea unui scurtcircuit în cadrul unui braț al punții (așa numita conducție în cross), se introduce o întârziere între comanda de blocare a unui întreruptor și comanda de amorsare a altui întreruptor. Acest timp intervine direct în fenomenul de comutație și este numit timp mort (td).
Considerând doar un braț al punții (brațul ce conține k1 și k2 – figura 4.), influența timpului mort se manifestă în felul următor (situațiile în care întreruptoarele k1 și k2 sunt ambele blocate sau amorsate nu prezintă interes din punct de vedere practic):
În figura 5 sunt prezentate impulsurile de comandă a întreruptoarelor în cazul ideal (a, b și c) și cazul real (d și e) precum și modul de variație a tensiunii de pol UA în funcție de sensul curentului de sarcină IA și de timpul mort (f și g). Dacă întreruptoarele k1 și k2 sunt comandate
OFF pe un interval, atunci tensiunea de pol UA depinde (pe intervalul respectiv) de sensul curentului de sarcină.
Din comparația formei de undă ideale (fără timp mort) a tensiunii de pol UA și celei reale (cu timp mort) rezultă:
UA = (UA)ideal – (UA)real (2)
Pe durata unei perioade de comutație, UA depinde de frecvența de comutație fp (dată de semnalul purtător), de UDC, de timpul mort td și de semnul curentului:
pentru (3)
Similar, din comparația formei de undă ideale (fără timp mort) a tensiunii de pol UB și celei reale (cu timp mort) rezultă:
UB = (UB)ideal – (UB)real (4)
Pe durata unei perioade de comutație, UB depinde de frecvența de comutație fp (dată de semnalul purtător), de UDC, de timpul mort td și de semnul curentului:
pentru (5)
Considerând UAB = UA – UB, valoarea medie-instantanee a diferenței (UAB)ideal – (UAB)real pe o perioadă de comutație se poate scrie:
UAB = UA– – UB– = pentru IA > 0
UAB = UA– – UB– = pentru IA < 0
În concluzie, timpul mort distorsionează valoarea medie-instantanee a tensiunii de la ieșire, duce la apariția armonicilor de joasă frecvență la ieșirea invertorului și reduce amplitudinea fundamentalei tensiunii de ieșire.
La invertoarele cu tranzistoare IGBT timpul mort este de (13)s.
Pentru compensarea timpului mort s-au propus mai multe metode printre care:
compensarea timpului mort prin modificarea undei de referință;
compensarea timpului mort prin utilizarea circuitelor logice;
compensarea software a timpului mort.
Implementarea modelului matematic al invertorului s-a făcut neglijând influența timpului mort.
6. ALGORITMUL DE CALCUL
În continuare se va prezenta algoritmul de calcul folosit pentru realizarea programului. Acest algoritm este parcurs de către program la fiecare pas de eșantionare. O condiție de bază pentru funcționarea corectă a programului, pe lângă implementarea corectă a ecuațiilor de calcul, este alegerea unui pas de eșantionare corespunzător. În ANEXA 3 (Influența pasului
de calcul) se prezintă un exemplu în acest sens și anume formele de undă ale curenților prin trei circuite RL serie care sunt alimentate cu tensiunile de fază generate de invertor. În Figura 1 sunt reprezentate formele de undă ale curenților prin amintitele circuite RL serie în cazul în care eșantionarea se face la fiecare 5 s; în acest caz se prelevă numai 20 de eșantioane pe perioada triunghiularei (100 s) – ceea ce este puțin. În Figura 2 sunt reprezentate formele de undă ale curenților prin amintitele circuite RL serie în cazul în care eșantionarea se face la fiecare 1 s; în acest caz se prelevă 100 de eșantioane pe perioada triunghiularei – ceea ce este suficient pentru o funcționare corectă.
6.1 Calculul timpilor de conducție
S-a plecat de la un sistem trifazat de tensiuni sinusoidale Ua_ref, Ub_ref și Uc_ref. În funcție de aceste trei mărimi există 23 combinații posibile din punct de vedere matematic între aceste tensiuni:
000
Ua_ref<0
Ub_ref<0
Uc_ref<0
001
Ua_ref<0
Ub_ref<0
Uc_ref>0
010
Ua_ref<0
Ub_ref>0
Uc_ref<0
011
Ua_ref<0
Ub_ref>0
Uc_ref>0
100
Ua_ref>0
Ub_ref<0
Uc_ref<0
101
Ua_ref>0
Ub_ref<0
Uc_ref>0
110
Ua_ref>0
Ub_ref>0
Uc_ref<0
111
Ua_ref>0
Ub_ref>0
Uc_ref>0
Din punct de vedere practic, însă, doar 6 variante sunt posibile; variantele 000 și variantele 111 sunt excluse (condiții de funcționare extremă).
În funcție de aceste variante implementabile în practică, mai întâi se ordonează și apoi se calculează timpii de conducție de pe fiecare braț al invertorului cu următorul sistem de ecuații (unde T este perioada triunghiularei):
, 0 Ta, Tb, Tc T (1)
Pentru combinația 001 :
Uab* < 0, deci Ta < Tb
Ubc* < 0, deci Tb < Tc Tc > Tb > Ta
Uca* > 0, deci Tc > Ta
În această situație : Ta = Tmin = 0
Tb = Tint = (din prima relație a sistemului 1 pentru Ta = 0)
Tc = Tmax = (din ultima relație a sistemului 1 pentru Ta = 0)
Pentru combinația 010 :
Uab* < 0, deci Ta < Tb
Ubc* > 0, deci Tb > Tc Tb > Ta > Tc
Uca* < 0, deci Tc < Ta
În această situație : Ta = Tint = (din ultima relație a sistemului 1 pentru Tc = 0)
Tb = Tmax = (din a doua relație a sistemului 1 pentru Tc = 0)
Tc = Tmin = 0
Pentru combinația 011 :
Uab* < 0, deci Ta < Tb
Ubc* > 0, deci Tb > Tc Tb > Tc > Ta
Uca* > 0, deci Tc > Ta
În această situație :
Ta = Tmin = 0
Tb = Tmax = (din prima relație a sistemului 1 pentru Ta = 0)
Tc = Tint = (din ultima relație a sistemului 1 pentru Ta = 0)
Pentru combinația 100 :
Uab* > 0, deci Ta > Tb
Ubc* < 0, deci Tb < Tc Ta > Tc > Tb
Uca* < 0, deci Tc < Ta
În această situație :
Ta = Tmax = (din prima relație a sistemului 1 pentru Tb = 0)
Tb = Tmin = 0
Tc = Tint = (din a doua relație a sistemului 1 pentru Tb = 0)
Pentru combinația 101 :
Uab* > 0, deci Ta > Tb
Ubc* < 0, deci Tb < Tc Tc > Ta > Tb
Uca* > 0, deci Tc > Ta
În această situație :
Ta = Tint = (din prima relație a sistemului 1 pentru Tb = 0)
Tb = Tmin = 0
Tc = Tmax = (din a doua relație a sistemului 1 pentru Tb = 0)
Pentru combinația 110 :
Uab* > 0, deci Ta > Tb
Ubc* > 0, deci Tb > Tc Ta > Tb > Tc
Uca* < 0, deci Tc < Ta
În această situație :
Ta = Tmax = (din ultima relație a sistemului 1 pentru Tc = 0)
Tb = Tint = (din a doua relație a sistemului 1 pentru Tc = 0)
Tc = Tmin =0
6.2 Calculul funcțiilor de comandă
După ordonarea și calcularea timpilor, aceștia sunt comparați după strategia PWM cu un semnal triunghiular avînd frecvența de 10 kHz. În asta constă esența acestei strategii de comandă PWM : compararea unor timpi cu o tensiune (pentru a fi comparate mărimile trebuie să aibă cel mult același ordin de mărime). În urma comparării, se obțin funcțiile de comandă pentru fiecare braț al invertorului în felul următor : dacă valoarea instantanee la momentul t a triunghiularei este mai mare decît valoarea instantanee a timpului de conducție (de fapt această comparare se face la fiecare eșantion pentru fiecare timp în parte) la același moment t, atunci funcția de comandă ia valoarea 1; în caz contrar funcția de comandă ia valoarea 0. Cînd funcția de comandă a unui braț al invertorului este 1 atunci se comandă tranzistorul celulei elementare de comutație de sus, în caz contrar se comandă tranzistorul celulei elementare de comutație de jos.
6.3 Calculul tensiunilor generate la ieșirea invertorului
După determinarea funcțiilor de comandă se calculează tensiunile (de fază) cu care va fi alimentat motorul asincron implementat pe calculator de colegul Chiulan Traian. Determinarea relațiilor pe baza cărora se calculează aceste tensiuni se face în felul următor: se pleacă de la
Uab = Ua – Ub
Ubc = Ub – Uc
Ua + Ub + Uc = 0 Uc = – (Ua – Ub) , dar se știe că Uab = (Fa – Fb)Udc
Ubc = (Fb – Fc)Udc
Uca = (Fc – Fa)Udc ,
2Ub + Ua = Ubc Ua = –2Ub + Ubc
Înlocuind în prime relație se obține : Uab = –2Ub + Ubc – Ub
3Ub = Udc[( Fb – Fc) – (Fa – Fb)]
3Ub = Udc( 2Fb – Fa – Fc) (1)
(2)
(3)
7. MODELUL MATEMATIC AL INVERTORULUI
TRIFAZAT
În continuare este prezentat modelul matematic al invertorului care a fost implementat sub formă de modul de clasă :
Option Explicit
Expresia “Option Explicit ” indică faptul că, în acest caz, Visual Basic-ul nu permite compilarea codului dacă găsește variabile ce nu au fost declarate în zona de declarații (fie de la începutul clasei fie de la începutul fiecărei funcții în parte). Această linie de cod nu este obligatorie; ea a fost folosită în cazul de față pentru a evita eventualele erori la compilare.
Public UTr As Double
Public PUTr As Double
Public tgAlfa As Double
Public Timp As Double
Public Udc As Double
Public Step As Double
Public R As Double
Public L As Double
Public Ta As Double, Tb As Double, Tc As Double
Public Ua_Ref As Double, Ub_Ref As Double, Uc_Ref As Double
Public bUa As Boolean, bUb As Boolean, bUc As Boolean
Public Ua As Double, Ub As Double, Uc As Double
Public Fa As Integer, Fb As Integer, Fc As Integer
Public diA_dt As Double, diB_dt As Double, diC_dt As Double
Public CrtA As Double, CrtB As Double, CrtC As Double
Public diAd_dt As Double, diBd_dt As Double, diCd_dt As Double
Public CrtAd As Double, CrtBd As Double, CrtCd As Double
Public Uab As Double, Ubc As Double, Uca As Double
Urmează apoi declararea tuturor variabilelor ce vor fi folosite în continuare. Proprietatea “Public” indică faptul că variabilele pot fi “văzute” numai în funcțiile din cadrul acestui modul de clasă. Asignarea acestui atribut nu duce la folosirea imediată a variabilelor utilizate în modelul matematic în exterior (de exemplu pentru reprezentare grafică). Pentru aceasta for fi asignate proprietăți speciale, ce vor fi descrise ulterior.
Semnificațiile variabilelor declarate mai sus sunt următoarele :
Utr reprezintă tensiunea triunghiulara cu ajutorul căreia se face eșantionarea timpilor de conducție de pe fiecare braț al invertorului;
PUTr reprezintă frecvența triunghiularei;
tgAlfa reprezintă panta triunghiularei (figura alăturată);
Timp este o variabilă cu ajutorul căreia se generează triunghiulara;
(variază numai în intervalul [0, PUTr]).
Udc este tensiunea continuă cu care se alimentează invertorul;
Step reprezintă pasul de calcul al programului;
R reprezintă valoarea rezistenței de test folosită la verificarea bunei funcționări a invertorului;
L reprezintă valoarea inductivității de test folosită de asemenea la verificarea bunei funcționări a invertorului;
Ta, Tb, Tc sunt timpii de conducție de pe fiecare braț al invertorului;
Ua_ref, Ub_ref, Uc_ref sunt tensiunile de fază cerute de la invertor.
bUa, bUb, bUc sunt variabile de tip boolean folosite la ordonarea și calculul timpilor de conducție Ta, Tb și Tc;
Ua, Ub, Uc sunt tensiunile de fază generate (sintetizate) de invertor;
Fa, Fb, Fc sunt funcțiile de comandă de pe fiecare braț al invertorului;
diA_dt, diB_dt, diC_dt sunt cuantele cu care se incrementează valorile curenților CrtA, CrtB, CrtC la fiecare pas de calcul;
CrtA, CrtB, CrtC sunt curenții prin circuitele serie RL (alimentate cu tensiunile generate) legate la ieșirea invertorului;
diAd_dt, diBd_dt, diCd_dt sunt cuantele cu care se incrementează valorile curenților CrtAd, CrtBd, CrtCd la fiecare pas de calcul;
CrtAd, CrtBd, CrtCd sunt curenții prin circuitele serie RL (alimentate cu tensiunile Ua_ref, Ub_ref, Uc_ref) legate la ieșirea invertorului;
Uab, Ubc, Uca sunt tensiunile de linie generate de invertor.
Trebuie acordată atenție și la declararea tipului variabilelor. Visual Basic recunoaște 12 tipuri de bază :
Public Sub InvertorInitializare()
PTimpi = CDbl(GetSetting("Invertor", "Param", "PTimpi", "0,02"))
Step = CDbl(GetSetting("Invertor", "Param", "Step", "0,000001"))
PUTr = CDbl(GetSetting("Invertor", "Param", "PUTr", "0,0001"))
Udc = CDbl(GetSetting("Invertor", "Param", "Udc", "300"))
R = CDbl(GetSetting("Invertor", "Param", "R", "10"))
L = CDbl(GetSetting("Invertor", "Param", "L", "0,01"))
UTr = 0
tgAlfa = 2
Timp = 0
Ua_Ref = 0
Ub_Ref = 0
Uc_Ref = 0
Ta = 0
Tb = 0
Tc = 0
Ua = 0
Ub = 0
Uc = 0
Uab = 0
Ubc = 0
Uca = 0
Fa = 0
Fb = 0
Fc = 0
diA_dt = 0
diB_dt = 0
diC_dt = 0
CrtA = 0
CrtB = 0
CrtC = 0
diAd_dt = 0
diBd_dt = 0
diCd_dt = 0
CrtAd = 0
CrtBd = 0
CrtCd = 0
DoEvents
End Sub
În cadrul funcției InvertorInitializare se inițializează aproape toate variabilele cu zero (excepție făcând doar tgAlfa care este inițializat cu 2). Totodată la începutul acestei funcții se observă că pentru anumite variabile, care în timpul simulării nu se vor modifica, se fac altfel inițializări. Pentru aceste variabile valorile se atribuie după citirea (din regiștri) și convertirea lor în tipul de variabile corespunzătoare.
Public Sub GenerareTriunghiulara(bCrescator As Boolean)
If bCrescator Then
UTr = tgAlfa * Timp
Else
UTr = 2 * PUTr – tgAlfa * Timp
End If
Timp = Timp + Step
End Sub
Funcția GenerareTriunghiulara care are un parametru bCrescator de tip boolean generează semnalul triunghiular (purtător) folosit la modularea PWM a impulsurilor de comandă. Dacă bCrescator este True se generează panta crescătoare a triunghiularei, în caz contrar generându-se panta descrescătoare.
Public Sub ComparareTensiuniReferinta()
Uab_Ref = Ua_Ref – Ub_Ref
Ubc_Ref = Ub_Ref – Uc_Ref
Uca_Ref = Uc_Ref – Ua_Ref
If Uab_Ref >= 0 Then
bUa = True
Else
bUa = False
End If
If Ubc_Ref >= 0 Then
bUb = True
Else
bUb = False
End If
If Uca_Ref >= 0 Then
bUc = True
Else
bUc = False
End If
End Sub
Funcția ComparareTensiuniReferinta compară tensiunile Uab_ref, Ubc_ref și Uca_ref (tensiuni de faza) cu valoarea zero. În cazul în care tensiunea Uab_ref este mai mare sau egală cu zero variabila bUa (de tip boolean) ia valoarea True; în caz contrar ia valoarea False. Pentru celelalte două tensiuni (Ubc_ref și Uca_ref) algoritmul de calcul este similar. Combinațiile posibile ale acestor tensiuni sunt în număr de opt (23). Din considerente practice cazul 000 și cazul 111 se exclud din calculele ulterioare; în acest fel rămân șase cazuri posibile care în final se reduc la numai trei cazuri posibile. ComparareTensiuniReferinta are rolul de a simplifica condițiile pe baza cărora se vor ordona timpii în cadrul funcției următoare.
Public Sub CalculTimpi()
' 0 0 1 0 1 1
If ((Not bUa) And (Not bUb) And bUc) Or ((Not bUa) And bUb And bUc) Then
Ta = 0 ‘ Ta = timp minim
Tb = -(PUTr * (Ua_Ref – Ub_Ref)) / Udc ‘ Tb = timp intermediar
Tc = (PUTr * (Uc_Ref – Ua_Ref)) / Udc ‘ Tc = timp maxim
End If
' 1 0 0 1 0 1
If (bUa And (Not bUb) And (Not bUc)) Or (bUa And (Not bUb) And bUc) Then
Ta = (PUTr * (Ua_Ref – Ub_Ref)) / Udc ‘ Ta = timp intermediar
Tb = 0 ‘ Tb = timp minim
Tc = -(PUTr * (Ub_Ref – Uc_Ref)) / Udc ‘ Tc = timp maxim
End If
' 0 1 0 1 1 0
If ((Not bUa) And bUb And (Not bUc)) Or (bUa And bUb And (Not bUc)) Then
Ta = -(PUTr * (Uc_Ref – Ua_Ref)) / Udc ‘ Ta = timp intermediar
Tb = (PUTr * (Ub_Ref – Uc_Ref)) / Udc ‘ Tb = timp maxim
Tc = 0 ‘ Tc = timp minim
End If
End Sub
În cadrul acestei funcții se ordonează timpii de conducție de pe fiecare braț al invertorului în funcție de tensiunile de referință (mai precis de semnul lor). Deducerea corectă a relațiilor de calcul a acestor timpi precum și ordonarea lor corectă sunt vitale pentru buna “funcționare” a invertorului. Liniile de cod care încep cu apostrof (‘) nu sunt compilate de Visual Basic; ele reprezintă comentarii ce pot fi inserate în cod.
Public Sub FunctiiDeComanda()
If (UTr < Ta) Then
Fa = 1
Else
Fa = 0
End If
If (UTr < Tb) Then
Fb = 1
Else
Fb = 0
End If
If (UTr < Tc) Then
Fc = 1
Else
Fc = 0
End If
End Sub
Această secvență de cod determină funcțiile de comandă pentru fiecare braț (al invertorului) în parte. Se observă că modalitatea de determinare este compararea triunghiularei generate de funcția GenerareTriunghiulara cu timpii calculați anterior. În cazul în care triunghiulara este mai mică decât timpii (la un moment dat) atunci funcția de comandă ia valoarea 1, în caz contrar ia valoarea 0.
Public Sub SintezaTensiuni()
Ua = ((2 * Fa – Fb – Fc) / 3) * Udc
Ub = ((2 * Fb – Fa – Fc) / 3) * Udc
Uc = ((2 * Fc – Fa – Fb) / 3) * Udc
End Sub
Această funcție are rolul de a genera (sintetiza) tensiunile, corespunzătoare funcțiilor de comandă, de la ieșirea invertorului. Deoarece funcțiile de comandă Fa, Fb și Fc pot lua numai valorile 0 sau 1 rezultă că tensiunile Ua, Ub și Uc sunt tensiuni în pulsuri egale (la un moment dat) cu sau din Udc.
Public sub VerificareCalculTimpi()
Uav = ((2 * Ta – Tb – Tc) / (3 * PUTr)) * Udc
Ubv = ((2 * Tb – Ta – Tc) / (3 * PUTr)) * Udc
Ucv = ((2 * Tc – Ta – Tb) / (3 * PUTr)) * Udc
End Sub
VerificareCalculTimpi este o funcție ce permite verificarea corectitudinii determinării timpilor Ta, Tb și Tc. În cazul în care calculele s-au făcut corect, dacă se reprezintă grafic tensiunile Uav, Ubv, Ucv respectiv Ua_ref, Ub_ref și Uc_ref acestea ar trebui să coincidă două câte două (Uav cu Ua_ref, Ubv cu Ub_ref și Ucv cu Uc_ref). În caz contrar există o greșeală fie la ordonarea tensiunilor fie la ordonarea și/sau calculul timpilor.
Public Sub CalculTensiuniDeLinieSintetizate()
Uab = Ua – Ub
Ubc = Ub – Uc
Uca = Uc – Ua
End Sub
În această funcție se calculează tensiunile de linie pe baza tensiunilor de linie furnizate de invertor. Fiind diferența a două tensiuni în pulsuri și Uab, Ubc respectiv Uca vor fi tot în pulsuri.
Public Sub CurentiSarcina()
diA_dt = (Ua – R * CrtA) / L
CrtA = CrtA + diA_dt * Step
diB_dt = (Ub – R * CrtB) / L
CrtB = CrtB + diB_dt * Step
diC_dt = (Uc – R * CrtC) / L
CrtC = CrtC + diC_dt * Step
End Sub
Public Sub CurentiSarcinaDirect()
diAd_dt = (Ua_Ref – R * CrtAd) / L
CrtAd = CrtAd + diAd_dt * Step
diBd_dt = (Ub_Ref – R * CrtBd) / L
CrtBd = CrtBd + diBd_dt * Step
diCd_dt = (Uc_Ref – R * CrtCd) / L
CrtCd = CrtCd + diCd_dt * Step
End Sub
Cele două funcții de mai sus (CurentiSarcina și CurentiSarcinaDirect) permit verificarea bunei funcționări a întregului invertor.
La ieșirea invertorului s-a conectat pe fiecare fază câte un circuit RL (funcția CurentiSarcina). În acest fel curentul prin circuitele RL de pe fiecare fază se obține prin integrarea pulsurilor de tensiune de pe fiecare fază.
Totodată fiecare tensiune de intrare (Ua_ref, Ub_ref și Uc_ref) se aplică la bornele unui circuit RL’ același ca în cazul anterior (funcția CurentiSarcinaDirect).
Astfel, curenții prin circuitele RL trebuie să fie identici cu cei prin circuitele RL’. În caz contrar invertorul nu funcționează corect.
Public Property Let InvUa_ref(ByVal Valoare As Double)
Ua_Ref = Valoare
End Property
Public Property Let InvUb_ref(ByVal Valoare As Double)
Ub_Ref = Valoare
End Property
Public Property Let InvUc_ref(ByVal Valoare As Double)
Uc_Ref = Valoare
End Property
Public Property Get InvUa_ref() As Double
InvUa_ref = Uab_Ref
End Property
Public Property Get InvUb_ref() As Double
InvUb_ref = Ub_Ref
End Property
Public Property Get InvUc_ref() As Double
InvUc_ref = Uc_Ref
End Property
Public Property Get InvUa() As Double
InvUa = Ua
End Property
Public Property Get InvUb() As Double
InvUb = Ub
End Property
Public Property Get InvUc() As Double
InvUc = Uc
End Property
Public Property Get InvUab() As Double
InvUab = Uab
End Property
Public Property Get InvUbc() As Double
InvUbc = Ubc
End Property
Public Property Get InvUca() As Double
InvUca = Uca
End Property
Public Property Get InvCrtA() As Double
InvCrtA = CrtA
End Property
Public Property Get InvCrtB() As Double
InvCrtB = CrtB
End Property
Public Property Get InvCrtC() As Double
InvCrtC = CrtC
End Property
Public Property Get InvCrtAd() As Double
InvCrtAd = CrtAd
End Property
Public Property Get InvCrtBd() As Double
InvCrtBd = CrtBd
End Property
Public Property Get InvCrtCd() As Double
InvCrtCd = CrtCd
End Property
Public Property Get InvTa() As Double
InvTa = Ta
End Property
Public Property Get InvTb() As Double
InvTb = Tb
End Property
Public Property Get InvTc() As Double
InvTc = Tc
End Property
Public Property Let InvTimp(ByVal Valoare As Double)
Timp = Valoare
End Property
Public Property Get InvTimp() As Double
InvTimp = Timp
End Property
Public Property Get InvFa() As Double
InvFa = Fa
End Property
Public Property Get InvFb() As Double
InvFb = Fb
End Property
Public Property Get InvFc() As Double
InvFc = Fc
End Property
Public Property Get InvUTr() As Double
InvUTr = UTr
End Property
Deoarece modelul matematic al invertorului a fost implementat ca un modul de clasă, variabilele folosite pot fi “văzute” în exteriorul modulului doar dacă li se atribuie proprietăți de scriere (Property Let) și/sau de citire (Property Get). Liniile de cod de mai sus realizează acest lucru.
8. CREAREA UNOR FACILITĂȚI DE REPREZENTARE GRAFICĂ PENTRU MĂRIMILE SISTEMULUI SIMULAT
8.1 Generalități
Programul realizat (în Visual Basic 5.0) este alcătuit din două părți distincte: o parte care cuprinde modelul matematic al invertorului implementat într-un modul de clasă și cealaltă parte care realizează reprezentarea grafică a mărimilor invertorului precum și diferite facilități care țin de realizarea unei interfețe prietenoase cu utilizatorul.
Printre facilitățile puse la dispoziție de acest program se pot aminti:
modificarea parametrilor invertorului;
alegerea mărimilor care se doresc a fi reprezentate dintr-o listă;
alegerea dimensiunii mărimilor;
alegerea originilor;
alegerea culorilor de reprezentare;
posibilitatea de a măsura pe rând formele de undă selectate folosind cele patru cursoare disponibile (două orizontale și două verticale).
8.2 frmMain
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmMain.
Option Explicit
Const PI = 3.1415926535932
Public objInv As New InvertorCls
Dim Culoare(6) As Long
Dim bStop As Boolean
Public UTr As Double
Public PTimpi As Double, OldUTr As Double
Public Ta As Double, Tb As Double, Tc As Double
Public OldTa As Double, OldTb As Double, OldTc As Double
Public Ua_Ref As Double, Ub_Ref As Double, Uc_Ref As Double
Public OldUa_ref As Double, OldUb_ref As Double, OldUc_ref As Double
Public Uav As Double, Ubv As Double, Ucv As Double, Alfa As Double
Public Uavirf As Double, Ubvirf As Double, Ucvirf As Double
Public OldUav As Double, OldUbv As Double, OldUcv As Double
Public Udc As Double
Public Step As Double
Public PUTr As Double
Public Clik As Integer
Public Fa As Double, Fb As Double, Fc As Double
Public OldFa As Integer, OldFb As Integer, OldFc As Integer
Dim i As Double
Public Ua As Double, OldUa As Double, Ub As Double, OldUb As Double, Uc As Double, OldUc As Double
Public L As Double, R As Double
Public CrtA As Double, OldCrtA As Double
Public CrtB As Double, OldCrtB As Double
Public CrtC As Double, OldCrtC As Double
Public CrtAd As Double, OldCrtAd As Double
Public CrtBd As Double, OldCrtBd As Double
Public CrtCd As Double, OldCrtCd As Double, Timp As Double
Dim nrMarimi(8) As Integer, xContor As Double, Toggle As Integer
Mai sus s-au declarat variabilele utilizate în program.
Private Sub Init()
frmInv.Picture1.Cls
frmInv.Picture1.Refresh
bStop = False
PTimpi = 0.02
PUTr = 0.0001
xContor = 0
UTr = 0
OldUTr = 0
Clik = 0
Ua_Ref = 0
Ub_Ref = 0
Uc_Ref = 0
OldUa_ref = 0
OldUb_ref = 0
OldUc_ref = 0
Alfa = 0
Timp = 0
Ta = 0
Tb = 0
Tc = 0
OldTa = 0
OldTb = 0
OldTc = 0
Fa = 0
Fb = 0
Fc = 0
OldFa = 0
OldFb = 0
OldFc = 0
CrtA = 0
OldCrtA = 0
CrtB = 0
OldCrtB = 0
CrtC = 0
OldCrtC = 0
CrtAd = 0
OldCrtAd = 0
CrtBd = 0
OldCrtBd = 0
CrtCd = 0
OldCrtCd = 0
frmInv.HScroll1.Max = 5000
frmInv.HScroll1.LargeChange = 200
frmInv.HScroll1.SmallChange = 50
frmInv.Picture1.Left = 0
frmInv.VScroll1.Max = 5000
frmInv.VScroll1.LargeChange = 200
frmInv.VScroll1.SmallChange = 50
frmInv.Picture1.Top = 0
Uavirf = CDbl(GetSetting("Invertor", "Param", "Uab", "300"))
Ubvirf = CDbl(GetSetting("Invertor", "Param", "Ubc", "300"))
Ucvirf = CDbl(GetSetting("Invertor", "Param", "Uca", "300"))
Udc = CDbl(GetSetting("Invertor", "Param", "Udc", "300"))
Step = CDbl(GetSetting("InvertorX", "Date", "Step", "0,000001"))
PTimpi = CDbl(GetSetting("Invertor", "Param", "PTimpi", "0,02"))
PUTr = CDbl(GetSetting("Invertor", "Param", "PuTr", "0,0001"))
Param.txtPTimpi.Text = GetSetting("Invertor", "Param", "PTimpi", "0,02")
Param.txtPUTr.Text = GetSetting("Invertor", "Param", "PUTr", "0,0001")
Param.txtR.Text = GetSetting("Invertor", "Param", "R", "10")
Param.txtL.Text = GetSetting("Invertor", "Param", "L", "0,01")
Param.txtXUnit.Text = GetSetting("Invertor", "Param", "XUnit", 1)
objInv.InvertorInitializare
End Sub
Procedura anterioară face inițializările variabilelor fie cu zero fie cu valori pe care le citește din regiștri. Totodată se inițializează și modulul de clasă în care a fost implementat modelul matematic al invertorului.
Private Sub cmdExit_Click()
Set objInv = Nothing
Unload frmInv
Unload Cursor
Unload Config
Unload FormaLinii
Unload frmMasurari
Unload Param
Unload frmMain
Unload Me
End Sub
Procedura anterioară descarcă toate formele dacă se apasă butonul Iesire.
Private Sub cmdMap_Click()
frmMain.StatusBar1.Panels(1).Text = "Mapare marimi…"
frmMarimi.Show
End Sub
Procedura încarcă forma frmMarimi și scrie pe bara de stare a ferestrei principale starea programului.
Public Sub cmdStart_Click()
Dim v As Integer, i As Integer
frmMain.StatusBar1.Panels(1).Text = "Simulare in progres…"
Load frmInv
frmInv.Show
frmMain.cmdStart.Enabled = False
frmMain.cmdStop.Enabled = True
frmMain.cmdMap.Enabled = False
frmMain.cmdExit.Enabled = False
frmMain.submnuIesire.Enabled = False
i = 0
Init
frmInv.WindowState = 1
Do
Do
Ua_Ref = Uavirf * Sin(Alfa)
Ub_Ref = Ubvirf * Sin(Alfa – (2 * PI) / 3)
Uc_Ref = Ucvirf * Sin(Alfa – (4 * PI) / 3)
objInv.InvUa_ref = Ua_Ref
objInv.InvUb_ref = Ub_Ref
objInv.InvUc_ref = Uc_Ref
objInv.GenerareTriunghiulara True
objInv.ComparareTensiuniReferinta
objInv.CalculTimpi
objInv.TimpiConductiePWM
objInv.ComparareTensiuniReferinta
objInv.SinVolt
objInv.CurentiSarcina
objInv.CurentiSarcinaDirect
For i = 0 To (UBound(nrMarimi) – 1)
frmInv.Picture1.DrawWidth = 2
If (Param.FrMar(i).Caption = "Tr") Then
UTr = objInv.InvUTr
frmInv.Picture1.Line (xContor, -OldUTr * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -UTr * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
OldUTr = UTr
End If
'=============== Ta, Tb, Tc ================
frmInv.Picture1.DrawWidth = 2
If (Param.FrMar(i).Caption = "Ta") Then
Ta = objInv.InvTa
frmInv.Picture1.Line (xContor, -OldTa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ta * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTa = Ta
End If
If (Param.FrMar(i).Caption = "Tb") Then
Tb = objInv.InvTb
frmInv.Picture1.Line (xContor, -OldTb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Tb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTb = Tb
End If
If (Param.FrMar(i).Caption = "Tc") Then
Tc = objInv.InvTc
frmInv.Picture1.Line (xContor, -OldTc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Tc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTc = Tc
End If
'=============== TENSIUNI DE REFERINȚĂ ===============
If (Param.FrMar(i).Caption = "Ua_ref") Then
frmInv.Picture1.Line (xContor, -OldUa_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ua_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUa_ref = Ua_Ref
End If
If (Param.FrMar(i).Caption = "Ub_ref") Then
frmInv.Picture1.Line (xContor, -OldUb_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ub_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUb_ref = Ub_Ref
End If
If (Param.FrMar(i).Caption = "Uc_ref") Then
frmInv.Picture1.Line (xContor, -OldUc_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uc_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUc_ref = Uc_Ref
End If
'=============== FUNCTII DE COMANDA ================
If (Param.FrMar(i).Caption = "Fa") Then
Fa = objInv.InvFa
frmInv.Picture1.Line (xContor, -OldFa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFa = Fa
End If
If (Param.FrMar(i).Caption = "Fb") Then
Fb = objInv.InvFb
frmInv.Picture1.Line (xContor, -OldFb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFb = Fb
End If
If (Param.FrMar(i).Caption = "Fc") Then
Fc = objInv.InvFc
frmInv.Picture1.Line (xContor, -OldFc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFc = Fc
End If
'================== TENSIUNI SINTETIZATE ====================
If (Param.FrMar(i).Caption = "Ua") Then
Ua = objInv.InvUa
frmInv.Picture1.Line (xContor, -OldUa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ua * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUa = Ua
End If
If (Param.FrMar(i).Caption = "Ub") Then
Ub = objInv.InvUb
frmInv.Picture1.Line (xContor, -OldUb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ub * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUb = Ub
End If
If (Param.FrMar(i).Caption = "Uc") Then
Uc = objInv.InvUc
frmInv.Picture1.Line (xContor, -OldUc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUc = Uc
End If
'=============== VERIFICARE TIMPI CONDUCTIE ================
If (Param.FrMar(i).Caption = "Uav") Then
Uav = objInv.InvUav
frmInv.Picture1.Line (xContor, -OldUav * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uav * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUav = Uav
End If
If (Param.FrMar(i).Caption = "Ubv") Then
Ubv = objInv.InvUbv
frmInv.Picture1.Line (xContor, -OldUbv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ubv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUbv = Ubv
End If
If (Param.FrMar(i).Caption = "Ucv") Then
Ucv = objInv.InvUcv
frmInv.Picture1.Line (xContor, -OldUcv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ucv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUcv = Ucv
End If
'================== CURENTI SARCINA =================
If (Param.FrMar(i).Caption = "CrtA") Then
CrtA = objInv.InvCrtA
frmInv.Picture1.Line (xContor, -OldCrtA * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtA * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtA = CrtA
End If
If (Param.FrMar(i).Caption = "CrtB") Then
CrtB = objInv.InvCrtB
frmInv.Picture1.Line (xContor, -OldCrtB * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtB * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtB = CrtB
End If
If (Param.FrMar(i).Caption = "CrtC") Then
CrtC = objInv.InvCrtC
frmInv.Picture1.Line (xContor, -OldCrtC * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtC * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtC = CrtC
End If
'================== CURENTI SARCINA DIRECT =================
If (Param.FrMar(i).Caption = "CrtAd") Then
CrtAd = objInv.InvCrtAd
frmInv.Picture1.Line (xContor, -OldCrtAd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtAd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtAd = CrtAd
End If
If (Param.FrMar(i).Caption = "CrtBd") Then
CrtBd = objInv.InvCrtBd
frmInv.Picture1.Line (xContor, -OldCrtBd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtBd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtBd = CrtBd
End If
If (Param.FrMar(i).Caption = "CrtCd") Then
CrtCd = objInv.InvCrtCd
frmInv.Picture1.Line (xContor, -OldCrtCd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtCd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtCd = CrtCd
End If
Next i
Alfa = Alfa + 314 * Step
xContor = xContor + CDbl(Param.txtXUnit.Text)
If bStop = True Then
Exit Do
End If
DoEvents
Loop While objInv.InvTimp <= PUTr / 2
Do
Ua_Ref = Uavirf * Sin(Alfa)
Ub_Ref = Ubvirf * Sin(Alfa – (2 * PI) / 3)
Uc_Ref = Ucvirf * Sin(Alfa – (4 * PI) / 3)
objInv.InvUa_ref = Ua_Ref
objInv.InvUb_ref = Ub_Ref
objInv.InvUc_ref = Uc_Ref
objInv.GenerareTriunghiulara False
objInv.ComparareTensiuniReferinta
objInv.CalculTimpi
objInv.TimpiConductiePWM
objInv.ComparareTensiuniReferinta
objInv.SinVolt
objInv.CurentiSarcina
objInv.CurentiSarcinaDirect
For i = 0 To (UBound(nrMarimi) – 1)
frmInv.Picture1.DrawWidth = 2
If (Param.FrMar(i).Caption = "Tr") Then
UTr = objInv.InvUTr
frmInv.Picture1.Line (xContor, -OldUTr * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -UTr * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
OldUTr = UTr
End If
'=============== Ta, Tb, Tc ================
frmInv.Picture1.DrawWidth = 2
If (Param.FrMar(i).Caption = "Ta") Then
Ta = objInv.InvTa
frmInv.Picture1.Line (xContor, -OldTa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ta * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTa = Ta
End If
If (Param.FrMar(i).Caption = "Tb") Then
Tb = objInv.InvTb
frmInv.Picture1.Line (xContor, -OldTb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Tb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTb = Tb
End If
If (Param.FrMar(i).Caption = "Tc") Then
Tc = objInv.InvTc
frmInv.Picture1.Line (xContor, -OldTc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Tc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldTc = Tc
End If
'=============== TENSIUNI DE REFERINTA ================
If (Param.FrMar(i).Caption = "Ua_ref") Then
frmInv.Picture1.Line (xContor, -OldUa_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ua_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUa_ref = Ua_Ref
End If
If (Param.FrMar(i).Caption = "Ub_ref") Then
frmInv.Picture1.Line (xContor, -OldUb_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ub_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUb_ref = Ub_Ref
End If
If (Param.FrMar(i).Caption = "Uc_ref") Then
frmInv.Picture1.Line (xContor, -OldUc_ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uc_Ref * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUc_ref = Uc_Ref
End If
'=============== FUNCTII DE COMANDA ================
If (Param.FrMar(i).Caption = "Fa") Then
Fa = objInv.InvFa
frmInv.Picture1.Line (xContor, -OldFa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFa = Fa
End If
If (Param.FrMar(i).Caption = "Fb") Then
Fb = objInv.InvFb
frmInv.Picture1.Line (xContor, -OldFb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFb = Fb
End If
If (Param.FrMar(i).Caption = "Fc") Then
Fc = objInv.InvFc
frmInv.Picture1.Line (xContor, -OldFc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Fc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldFc = Fc
End If
'================== TENSIUNI SINTETIZATE ====================
If (Param.FrMar(i).Caption = "Ua") Then
Ua = objInv.InvUa
frmInv.Picture1.Line (xContor, -OldUa * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ua * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUa = Ua
End If
If (Param.FrMar(i).Caption = "Ub") Then
Ub = objInv.InvUb
frmInv.Picture1.Line (xContor, -OldUb * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ub * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUb = Ub
End If
If (Param.FrMar(i).Caption = "Uc") Then
Uc = objInv.InvUc
frmInv.Picture1.Line (xContor, -OldUc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uc * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUc = Uc
End If
'=============== VERIFICARE TIMPI CONDUCTIE ================
If (Param.FrMar(i).Caption = "Uav") Then
Uav = objInv.InvUav
frmInv.Picture1.Line (xContor, -OldUav * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Uav * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUav = Uav
End If
If (Param.FrMar(i).Caption = "Ubv") Then
Ubv = objInv.InvUbv
frmInv.Picture1.Line (xContor, -OldUbv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ubv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUbv = Ubv
End If
If (Param.FrMar(i).Caption = "Ucv") Then
Ucv = objInv.InvUcv
frmInv.Picture1.Line (xContor, -OldUcv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -Ucv * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldUcv = Ucv
End If
'================== CURENTI SARCINA =================
If (Param.FrMar(i).Caption = "CrtA") Then
CrtA = objInv.InvCrtA
frmInv.Picture1.Line (xContor, -OldCrtA * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtA * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtA = CrtA
End If
If (Param.FrMar(i).Caption = "CrtB") Then
CrtB = objInv.InvCrtB
frmInv.Picture1.Line (xContor, -OldCrtB * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtB * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtB = CrtB
End If
If (Param.FrMar(i).Caption = "CrtC") Then
CrtC = objInv.InvCrtC
frmInv.Picture1.Line (xContor, -OldCrtC * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtC * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtC = CrtC
End If
'================== CURENTI SARCINA DIRECT =================
If (Param.FrMar(i).Caption = "CrtAd") Then
CrtAd = objInv.InvCrtAd
frmInv.Picture1.Line (xContor, -OldCrtAd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtAd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtAd = CrtAd
End If
If (Param.FrMar(i).Caption = "CrtBd") Then
CrtBd = objInv.InvCrtBd
frmInv.Picture1.Line (xContor, -OldCrtBd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtBd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtBd = CrtBd
End If
If (Param.FrMar(i).Caption = "CrtCd") Then
CrtCd = objInv.InvCrtCd
frmInv.Picture1.Line (xContor, -OldCrtCd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text))-(xContor + Step, -CrtCd * CDbl(Param.txtPasY(i).Text) + CDbl(Param.txtOrig(i).Text)), Param.FrMar(i).ForeColor
frmInv.Picture1.Line (xContor, CDbl(Param.txtOrig(i).Text))-(xContor + Step, CDbl(Param.txtOrig(i).Text)), RGB(0, 0, 0)
OldCrtCd = CrtCd
End If
Next i
Alfa = Alfa + 314 * Step
xContor = xContor + CDbl(Param.txtXUnit.Text)
If bStop = True Then
Exit Do
End If
DoEvents
Loop While objInv.InvTimp + Step <= PUTr
objInv.InvTimp = 0
DoEvents
Loop Until bStop
End Sub
Aceasta este cea mai importantă procedură a programului deoarece prin intermediul ei se apelează modulul de clasă care conține modelul matematic al invertorului și se face reprezentarea grafică, la apăsarea butonului Start.
Private Sub cmdStop_Click()
frmMain.StatusBar1.Panels(1).Text = "Simulare intrerupta…"
bStop = True
frmInv.WindowState = 0
frmMain.cmdStart.Enabled = True
frmMain.cmdStop.Enabled = False
frmMain.cmdMap.Enabled = True
frmMain.cmdExit.Enabled = True
frmMain.submnuIesire.Enabled = True
End Sub
La apăsarea butonului Stop, această procedură întrerupe simularea.
Public Sub Configurare_Init()
Dim ToolTip(5) As String
ToolTip(0) = "Linie neintrerupta"
ToolTip(1) = "Linie intrerupta"
ToolTip(2) = "Linie punctata"
ToolTip(3) = "Linie punct linie"
ToolTip(4) = "Linie punct punct linie"
Config.optBut.Value = GetSetting("Invertor", "Config", "optBut", 1)
Config.optToolbar.Value = GetSetting("Invertor", "Config", "optToolbar", 0)
If (Config.optToolbar.Value = True) Then
frmMain.frBut.Visible = False
frmMain.frToolbar.Top = 0
Else
frmMain.frBut.Visible = True
frmMain.frToolbar.Top = 1000
End If
Config.cekStatMain.Value = GetSetting("Invertor", "Config", "StatMain", 1)
Config.cekOra.Value = GetSetting("Invertor", "Config", "cekOra", 1)
If (Config.cekOra.Value = 1) Then
frmMain.StatusBar1.Panels(2).Style = sbrTime
frmMain.StatusBar1.Panels(1).MinWidth = 3900
Else
frmMain.StatusBar1.Panels(2).Style = sbrText
frmMain.StatusBar1.Panels(1).MinWidth = 4800
End If
Config.cmdSCulXY1.BackColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
Config.cmdSCulXY2.BackColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &HFF&))
Config.cekCuloare.Value = GetSetting("Invertor", "Config", "cekCuloare", 0)
Config.cekForma.Value = GetSetting("Invertor", "Config", "cekForma", 1)
Config.LineFormaTest.BorderStyle = (CInt(GetSetting("Invertor", "Config", "Index")) + 1)
Config.lblFormaTest.ToolTipText = ToolTip(Config.LineFormaTest.BorderStyle – 1)
Config.cekLock.Value = GetSetting("Invertor", "Config", "cekLock", 1)
Config.cekDifVal.Value = GetSetting("Invertor", "Config", "cekDifVal", 1)
Config.cekStatfrmInv.Value = GetSetting("Invertor", "Config", "cekStatfrmInv", 1)
Config.lblPicTestInvCul.BackColor = CLng(GetSetting("Invertor", "Config", "cekfrmInvBCul", &H80000005))
Cursor.cekX2.ForeColor = Config.cmdSCulXY2.BackColor
Cursor.cekY2.ForeColor = Config.cmdSCulXY2.BackColor
frmInv.X2Line.BorderColor = Config.cmdSCulXY2.BackColor
frmInv.Y2Line.BorderColor = Config.cmdSCulXY2.BackColor
Cursor.cekX1.ForeColor = Config.cmdSCulXY1.BackColor
Cursor.cekY1.ForeColor = Config.cmdSCulXY1.BackColor
frmInv.X1Line.BorderColor = Config.cmdSCulXY1.BackColor
frmInv.Y1Line.BorderColor = Config.cmdSCulXY1.BackColor
End Sub
Procedura anterioară este rulată la fiecare lansare a programului, încărcând configurațiile făcute la simulările anterioare.
Private Sub Form_Load()
Dim ImgLToolBar As ListImage
Dim btnToolBar As Button
Configurare_Init
If (Config.optBut.Value = True) Then
frmMain.frBut.Visible = True
frmMain.frToolbar.Top = 1000
Else
frmMain.frBut.Visible = False
frmMain.frToolbar.Top = 0
End If
frmMain.Hide
Cursor.Hide
frmSplash.Show
Init
objInv.InvertorInitializare
SaveSetting "Invertor", "Param", "DUab", "300"
SaveSetting "Invertor", "Param", "DUbc", "300"
SaveSetting "Invertor", "Param", "DUca", "300"
SaveSetting "Invertor", "Param", "DUdc", "300"
SaveSetting "Invertor", "DPasY", "Ta", "190000"
SaveSetting "Invertor", "DPasY", "Tb", "190000"
SaveSetting "Invertor", "DPasY", "Tc", "190000"
SaveSetting "Invertor", "DPasY", "Tr", "19000"
SaveSetting "Invertor", "DPasY", "Uab_ref", "5"
SaveSetting "Invertor", "DPasY", "Ubc_ref", "5"
SaveSetting "Invertor", "DPasY", "Uca_ref", "5"
SaveSetting "Invertor", "DPasY", "Uav", "20"
SaveSetting "Invertor", "DPasY", "Ubv", "20"
SaveSetting "Invertor", "DPasY", "Ucv", "20"
SaveSetting "Invertor", "DPasY", "Ua", "10"
SaveSetting "Invertor", "DPasY", "Ub", "10"
SaveSetting "Invertor", "DPasY", "Uc", "10"
SaveSetting "Invertor", "DPasY", "CrtA", "100"
SaveSetting "Invertor", "DPasY", "CrtB", "100"
SaveSetting "Invertor", "DPasY", "CrtC", "100"
SaveSetting "Invertor", "DPasY", "CrtAd", "100"
SaveSetting "Invertor", "DPasY", "CrtBd", "100"
SaveSetting "Invertor", "DPasY", "CrtCd", "100"
SaveSetting "Invertor", "DOrig", "Ta", "4500"
SaveSetting "Invertor", "DOrig", "Tb", "4500"
SaveSetting "Invertor", "DOrig", "Tc", "4500"
SaveSetting "Invertor", "DOrig", "Tr", "4500"
SaveSetting "Invertor", "DOrig", "Uab_ref", "7500"
SaveSetting "Invertor", "DOrig", "Ubc_ref", "7500"
SaveSetting "Invertor", "DOrig", "Uca_ref", "7500"
SaveSetting "Invertor", "DOrig", "Uav", "6000"
SaveSetting "Invertor", "DOrig", "Ubv", "6000"
SaveSetting "Invertor", "DOrig", "Ucv", "6000"
SaveSetting "Invertor", "DOrig", "Ua", "9000"
SaveSetting "Invertor", "DOrig", "Ub", "9000"
SaveSetting "Invertor", "DOrig", "Uc", "9000"
SaveSetting "Invertor", "DOrig", "CrtA", "11000"
SaveSetting "Invertor", "DOrig", "CrtB", "11000"
SaveSetting "Invertor", "DOrig", "CrtC", "11000"
SaveSetting "Invertor", "DOrig", "CrtAd", "11000"
SaveSetting "Invertor", "DOrig", "CrtBd", "11000"
SaveSetting "Invertor", "DOrig", "CrtCd", "11000"
SaveSetting "Invertor", "Param", "DXUnit", "1"
SaveSetting "Invertor", "Param", "PTimpi", "0,02"
SaveSetting "Invertor", "Param", "PUTr", "0,0001"
SaveSetting "Invertor", "Param", "R", "10"
SaveSetting "Invertor", "Param", "L", "0.01"
Uavirf = GetSetting("Invertor", "Param", "Uab", 300)
Ubvirf = GetSetting("Invertor", "Param", "Ubc", 300)
Ucvirf = GetSetting("Invertor", "Param", "Uca", 300)
Udc = GetSetting("Invertor", "Param", "Udc", 300)
Param.txtUab.Text = GetSetting("Invertor", "Param", "Uab", 300)
Param.txtUbc.Text = GetSetting("Invertor", "Param", "Ubc", 300)
Param.txtUca.Text = GetSetting("Invertor", "Param", "Uca", 300)
Param.txtUdc.Text = GetSetting("Invertor", "Param", "Udc", 300)
Cursor.lblValX1.Caption = "0"
Cursor.lblValX2.Caption = "0"
Cursor.lblValY1.Caption = "0"
Cursor.lblValY2.Caption = "0"
Cursor.lblValXDif.Caption = "0"
Cursor.lblValYDif.Caption = "0"
frmMain.cmdStart.Enabled = False
frmMain.cmdStop.Enabled = False
frmMain.StatusBar1.Panels(1).Text = "Invertor"
frmMasurari.lblclick.Caption = "0"
Config.Icon = LoadPicture("C:\1\Tools 2.ico")
Cursor.cekLX1.Enabled = False
Cursor.cekLY1.Enabled = False
Cursor.cekLX2.Enabled = False
Cursor.cekLY2.Enabled = False
Cursor.Show
frmInv.WindowState = 1
frmInv.Y1Line.Visible = False
frmInv.Y2Line.Visible = False
frmInv.X1Line.Visible = False
frmInv.X2Line.Visible = False
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolParam", LoadPicture("C:\1\Notepad Pink.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolMarimi", LoadPicture("C:\1\CheckBook.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolStart", LoadPicture("C:\1\Arw01rt.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolStop", LoadPicture("C:\1\Stop.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolMap", LoadPicture("C:\1\Crdfle04.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolIesire", LoadPicture("C:\1\Lips.ico"))
Set ImgLToolBar = ImageList1.ListImages.Add(, "toolAjutor", LoadPicture("C:\1\Yield.ico"))
Set Toolbar1.ImageList = ImageList1
Toolbar1.Buttons.Add , , , tbrSeparator
Set btnToolBar = Toolbar1.Buttons.Add(, "toolStart", , tbrDefault, "toolStart")
btnToolBar.ToolTipText = "Incepe simularea"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, "toolStop", , tbrDefault, "toolStop")
btnToolBar.ToolTipText = "Opreste simularea"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, , , tbrSeparator)
Set btnToolBar = Toolbar1.Buttons.Add(, "toolParam", , tbrDefault, "toolParam")
btnToolBar.ToolTipText = "Parametri invertor"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, "toolMarimi", , tbrDefault, "toolMarimi")
btnToolBar.ToolTipText = "Marimi reprezentate"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, "toolMap", , tbrDefault, "toolMap")
btnToolBar.ToolTipText = "Mapare marimi"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, , , tbrSeparator)
Set btnToolBar = Toolbar1.Buttons.Add(, "toolIesire", , tbrDefault, "toolIesire")
btnToolBar.ToolTipText = "Iesire din program"
btnToolBar.Description = btnToolBar.ToolTipText
Set btnToolBar = Toolbar1.Buttons.Add(, "toolAjutor", , tbrDefault, "toolAjutor")
btnToolBar.ToolTipText = "Ajutor…"
btnToolBar.Description = btnToolBar.ToolTipText
splash
frmMain.Show
If (GetSetting("Invertor", "Param", "View Cursoare", "True") = True) Then
ssubmnuCursoare.Checked = True
Cursor.Show
Else
ssubmnuCursoare.Checked = False
Cursor.Hide
End If
DoEvents
End Sub
Această procedură este rulată de asemenea la fiecare lansare a programului, stabilind ordinea de încărcare a formelor și încărcând resursele pentru toolbar.
Private Sub splash()
Unload frmSplash
End Sub
Private Sub smnuOptiuni_Click()
Config.SSTabConfig.Tab = 0
Config.Show
End Sub
Private Sub smnuStart_Click()
cmdStart_Click
End Sub
Private Sub smnuStop_Click()
cmdStop_Click
End Sub
Private Sub ssmnuMapare_Click()
frmMain.StatusBar1.Panels(1).Text = "Mapare marimi…"
frmMasurari.Show
End Sub
Private Sub ssubmnuCursoare_Click()
Dim ViewCursoare As Boolean
If ssubmnuCursoare.Checked = False Then
ssubmnuCursoare.Checked = True
ViewCursoare = True
Cursor.Show
Else
ssubmnuCursoare.Checked = False
ViewCursoare = False
Cursor.Hide
End If
SaveSetting "Invertor", "Param", "View Cursoare", ViewCursoare
End Sub
Private Sub submnuDespre_Click()
frmSplash.Show
End Sub
Private Sub submnuIesire_Click()
Set objInv = Nothing
Unload frmInv
Unload Cursor
Unload Config
Unload FormaLinii
Unload frmMasurari
Unload Param
Unload frmSplash
Unload frmMain
Unload Me
End Sub
Private Sub submnuParametri_Click(Index As Integer)
Param.SSTab1.Tab = 0
Param.Show
End Sub
Private Sub submnuScalare_Click(Index As Integer)
Param.SSTab1.Tab = 1
Param.Show
End Sub
Procedurile anterioare realizează aceleași acțiuni ca și butoanele din fereastra principală, folosind opțiunile existente în meniul Simulare.
Private Sub toolbar1_ButtonClick(ByVal Button As ComctlLib.Button)
Dim rasp As Integer
Select Case Button.Key
Case Is = "toolParam"
Param.SSTab1.Tab = 0
Param.Show
Case Is = "toolMarimi"
Param.SSTab1.Tab = 1
Param.Show
Case Is = "toolStart"
frmMain.StatusBar1.Panels(1).Text = "Simularea poate incepe…"
cmdStart_Click
Case Is = "toolStop"
frmMain.StatusBar1.Panels(1).Text = "Simulare intrerupta…"
bStop = True
Case Is = "toolMap"
frmMain.StatusBar1.Panels(1).Text = "Mapare marimi…"
frmMasurari.Show
Case Is = "toolIesire"
submnuIesire_Click
Case Is = "toolAjutor"
frmSplash.Show
End Select
End Sub
Această procedură sesizează care buton al toolbar-ului a fost apăsat și apelează procedurile corespunzătoare.
8.3 frmMarimi
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmMarimi.
Option explicit
Dim Marimi(22) As String
Dim i As Integer, k As Integer, j As Integer
Dim nrMarimi(8) As Integer, rasp As Integer
Dim Click As Integer
Private Sub cek_Click(Index As Integer)
For j = 0 To 21
If (frmMasurari.cek(j).Value = 1) Then
Click = Click + 1
frmMasurari.lblclick.Caption = Click
If (Click > 8) Then
rasp = MsgBox("Prea multe marimi selectate ! (minim 1, maxim 8)", vbCritical + vbOKOnly, "Graba strica treaba…")
End If
Else
frmMasurari.lblclick.Caption = Click
End If
Next j
End Sub
Aceasta procedura testează daca utilizatorul a ales mai mult de numărul maxim de mărimi reprezentabile la o simulare. Daca testul este pozitiv, atunci este afișat un mesaj de eroare, iar butonul Ok este dezactivat.
Private Sub cekSelNone_Click()
Dim t As Integer
For t = 0 To 21
frmMasurari.cek(t).Value = 0
Next t
frmMasurari.cekSelNone.Value = 0
End Sub
Procedura anterioară deselectează toate mărimile selectate dacă s-a apăsat butonul Select none.
Private Sub cmdOK_Click()
Dim rasp As Integer
Dim DefCul As Long
frmMain.StatusBar1.Panels(1).Text = "Marimi alese…"
DefCul = RGB(0, 0, 0)
If (Click = 0) Then
rasp = MsgBox("Prea putine marimi selectate ! (minim 1, maxim 8)", vbCritical + vbOKOnly, "Graba strica treaba…")
Else
For i = 0 To 7
Param.FrMar(i).Visible = False
nrMarimi(i) = 0
Next i
For j = 0 To 21
Marimi(j) = ""
Next j
k = 0
For i = 0 To 21
If (frmMasurari.cek(i).Value = 1) Then
Marimi(k) = frmMasurari.cek(i).Caption
nrMarimi(k) = k
k = k + 1
Else
k = k + 0
End If
Next i
For i = 0 To 7
frmInv.lblNume(i).Caption = ""
Next i
For i = 0 To k – 1
Param.FrMar(i).Caption = Marimi(i)
If (Param.FrMar(i).Caption <> "") Then
frmInv.lblNume(i).Caption = Marimi(i)
Param.FrMar(i).Visible = True
Param.txtOrig(i).Text = CStr(GetSetting("Invertor", "Orig", Marimi(i), 3000))
Param.txtPasY(i).Text = CStr(GetSetting("Invertor", "Pasy", Marimi(i), 10))
Param.FrMar(i).ForeColor = CLng(GetSetting("Invertor", "Culoare", Marimi(i), DefCul))
End If
Next i
Param.txtStep.Text = GetSetting("Invertor", "Param", "Step", 0.00005)
Param.txtUab.Text = GetSetting("Invertor", "Param", "Uab", 220)
Param.txtUbc.Text = GetSetting("Invertor", "Param", "Ubc", 220)
Param.txtUca.Text = GetSetting("Invertor", "Param", "Uca", 220)
Param.txtUdc.Text = GetSetting("Invertor", "Param", "Udc", 220)
frmMasurari.Hide
Param.SSTab1.Tab = 1
Param.Show
End If
End Sub
Această procedură “memorează” mărimile selectate, pe care apoi le încarcă în forma frmParametri. Concomitent, încarcă din regiștri parametrii mărimilor alese: origine, dimensiune verticală și culoare. De asemenea sunt încărcate, tot din regiștri, valorile de vârf ale tensiunilor de referință, amplitudinea tensiunii continue de alimentare a invertorului, pasul de reprezentare, pasul de eșantionare, valorile rezistorului și bobinei de test precum și perioada timpilor de conducție.
8.4 frmParametri
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmParametri.
Option explicit
Dim Culoare(8) As Long, ToggleX As Integer, ToggleU As Integer
Private Sub cekAllOrig_Click()
If (Param.cekAllOrig.Value = 1) Then
For i = 0 To 7
If (Param.FrMar(i).Visible = True) Then
Param.txtOrig(i).Text = Param.txtOrig(0).Text
End If
Next i
End If
Param.cekAllOrig.Value = 0
End Sub
Procedura anterioară, dacă este apăsat butonul All like first de sub Origine, egalează toate valorile originilor mărimilor selectate cu valoarea originii primei mărimi.
Private Sub cekAllPasY_Click()
If (Param.cekAllPasY.Value = 1) Then
For i = 0 To 7
If (Param.FrMar(i).Visible = True) Then
Param.txtPasY(i).Text = Param.txtPasY(0).Text
End If
Next i
End If
Param.cekAllPasY.Value = 0
End Sub
Procedura anterioară, dacă este apăsat butonul All like first de sub Pas Y, egalează toate valorile pasului pe Y a mărimilor selectate cu valoarea pasului pe Y a primei mărimi.
Private Sub cmdAnuleaza_Click()
Param.Hide
End Sub
Această procedură descarcă forma frmParametri fără să salveze în regiștri.
Private Sub cmdAplica_Click()
Main.StatusBar1.Panels(1).Text = "Simularea poate incepe…"
For i = 0 To 7
If (Param.FrMar(i).Caption <> "") Then
SaveSetting "Invertor", "Orig", Param.FrMar(i).Caption, Param.txtOrig(i).Text
SaveSetting "Invertor", "PasY", Param.FrMar(i).Caption, Param.txtPasY(i).Text
SaveSetting "Invertor", "Culoare", Param.FrMar(i).Caption, Param.FrMar(i).ForeColor
frmInv.lblNume(i).ForeColor = Param.FrMar(i).ForeColor
End If
Next i
SaveSetting "Invertor", "Param", "Uab", Param.txtUab.Text
SaveSetting "Invertor", "Param", "Ubc", Param.txtUbc.Text
SaveSetting "Invertor", "Param", "Uca", Param.txtUca.Text
SaveSetting "Invertor", "Param", "Udc", Param.txtUdc.Text
SaveSetting "Invertor", "Param", "XUnit", Param.txtXUnit.Text
SaveSetting "Invertor", "Param", "Step", Param.txtStep.Text
SaveSetting "Invertor", "Param", "R", Param.txtR.Text
SaveSetting "Invertor", "Param", "L", Param.txtL.Text
Main.cmdStart.Enabled = True
Param.Hide
End Sub
Procedura de mai sus salvează în regiștri originile și pașii pe Y pentru toate mărimile selectate, precum și ceilalți parametri ai invertorului.
Public Sub cmdCulori_Click(Index As Integer)
k = 0
For i = 0 To 7
If (Param.FrMar(i).Caption <> "") Then
k = k + 1
Else
k = k + 0
End If
Next i
For i = 0 To k – 1
If (cmdCulori(i).Value = True) Then
Param.CDialog(i).Flags = cdlCCRGBInit
Param.CDialog(i).ShowColor
Param.FrMar(i).ForeColor = Param.CDialog(i).Color
Culoare(i) = Param.CDialog(i).Color
End If
Next i
End Sub
Această procedură permite alegerea culorilor cu care vor fi reprezentate mărimile selectate.
Private Sub cmdDefTens_Click()
If (ToggleU = 0) Then
SaveSetting "Invertor", "Param", "Uab", Param.txtUab.Text
SaveSetting "Invertor", "Param", "Ubc", Param.txtUbc.Text
SaveSetting "Invertor", "Param", "Uca", Param.txtUca.Text
SaveSetting "Invertor", "Param", "Udc", Param.txtUdc.Text
Param.txtUab.Text = GetSetting("Invertor", "Param", "DUab", 300)
Param.txtUbc.Text = GetSetting("Invertor", "Param", "DUbc", 300)
Param.txtUca.Text = GetSetting("Invertor", "Param", "DUca", 300)
Param.txtUdc.Text = GetSetting("Invertor", "Param", "DUdc", 300)
Param.cmdDefTens.Caption = "Restore"
Param.cmdDefTens.ToolTipText = "Incarca valorile anterioare"
Param.txtUab.ToolTipText = "Amplitudinea tensiunii pe faza 1 : Valoare default"
Param.txtUbc.ToolTipText = "Amplitudinea tensiunii pe faza 2 : Valoare default"
Param.txtUca.ToolTipText = "Amplitudinea tensiunii pe faza 3 : Valoare default"
Param.txtUdc.ToolTipText = "Amplitudinea tensiunii de alimentare a invertorului : Valoare default"
ToggleU = 1
Else
Param.txtUab.Text = GetSetting("Invertor", "Param", "Uab", 300)
Param.txtUbc.Text = GetSetting("Invertor", "Param", "Ubc", 300)
Param.txtUca.Text = GetSetting("Invertor", "Param", "Uca", 300)
Param.txtUdc.Text = GetSetting("Invertor", "Param", "Udc", 300)
Param.cmdDefTens.Caption = "Default"
Param.cmdDefTens.ToolTipText = "Incarca valorile default"
Param.txtUab.ToolTipText = "Amplitudinea tensiunii pe faza 1 : Valoare anterioara"
Param.txtUbc.ToolTipText = "Amplitudinea tensiunii pe faza 2 : Valoare anterioara"
Param.txtUca.ToolTipText = "Amplitudinea tensiunii pe faza 3 : Valoare anterioara"
Param.txtUdc.ToolTipText = "Amplitudinea tensiunii de alimentare a invertorului : Valoare anterioara"
ToggleU = 0
End If
End Sub
Private Sub cmdDefXUnit_Click()
If (ToggleX = 0) Then
SaveSetting "Invertor", "Param", "XUnit", Param.txtXUnit.Text
Param.txtXUnit.Text = GetSetting("Invertor", "Param", "DXUnit", 1)
Param.cmdDefXUnit.Caption = "Restore"
Param.cmdDefXUnit.ToolTipText = "Incarca valoarea anterioara"
Param.txtXUnit.ToolTipText = "Pasul pe axa X : Valoare default"
ToggleX = 1
Else
Param.txtXUnit.Text = GetSetting("Invertor", "Param", "XUnit", 1)
Param.cmdDefXUnit.Caption = "Default"
Param.cmdDefXUnit.ToolTipText = "Incarca valoarea default"
Param.txtXUnit.ToolTipText = "Pasul pe axa X : Valoare anterioara"
ToggleX = 0
End If
End Sub
Aceste proceduri permit încărcarea valorilor default pentru parametrii invertorului, iar dacă se dorește, apoi, se pot reîncărca ultimele valori.
8.5 frmCursoare
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmCursoare.
Option explicit
Private Sub cekY1_Click()
If Cursor.cekY1.Value = 1 Then
frmInv.Y1Line.Visible = True
Cursor.cekLY1.Enabled = True
Else
frmInv.Y1Line.Visible = False
Cursor.cekLY1.Value = 0
Cursor.cekLY1.Enabled = False
End If
End Sub
Private Sub cekY2_Click()
If Cursor.cekY2.Value = 1 Then
frmInv.Y2Line.Visible = True
Cursor.cekLY2.Enabled = True
Else
frmInv.Y2Line.Visible = False
Cursor.cekLY2.Value = 0
Cursor.cekLY2.Enabled = False
End If
End Sub
Private Sub cekX1_Click()
If Cursor.cekX1.Value = 1 Then
frmInv.X1Line.Visible = True
Cursor.cekLX1.Enabled = True
Else
frmInv.X1Line.Visible = False
Cursor.cekLX1.Value = 0
Cursor.cekLX1.Enabled = False
For i = 0 To 6
frmInv.lblNume(i).BackColor = &H8000000F 'button face
Next i
End If
End Sub
Private Sub cekX2_Click()
If Cursor.cekX2.Value = 1 Then
frmInv.X2Line.Visible = True
Cursor.cekLX2.Enabled = True
Else
frmInv.X2Line.Visible = False
Cursor.cekLX2.Value = 0
Cursor.cekLX2.Enabled = False
For i = 0 To 6
frmInv.lblNume(i).BackColor = &H8000000F 'button face
Next i
End If
End Sub
Aceste proceduri permit sau nu afișarea cursoarelor în fereastra de reprezentare după cum s-au selectat sau nu. Totodată se activează un număr de patru opțiuni care permit, în fucție de selecție, blocarea celor patru cursoare.
8.6 frmReprezentare
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmReprezentare.
Option explicit
Private Sub Form_Load()
frmMain.Show
End Sub
Private Sub HScroll1_Change()
Picture1.Left = (-HScroll1.Value / 4100) * frmInv.Picture1.ScaleHeight
DoEvents
End Sub
Private Sub HScroll1_Scroll()
Picture1.Left = (-HScroll1.Value / 4100) * frmInv.Picture1.ScaleHeight
DoEvents
End Sub
Private Sub VScroll1_Change()
Picture1.Top = -((VScroll1.Value) / 17530) * frmInv.Picture1.ScaleWidth
DoEvents
End Sub
Private Sub VScroll1_Scroll()
Picture1.Top = -((VScroll1.Value) / 17530) * frmInv.Picture1.ScaleWidth
DoEvents
End Sub
Cu aceste proceduri se face scroll la cursoarele disponibile în fereastra de reprezentare prin drag-and-drop.
Private Sub lblNume_Click(Index As Integer)
Dim i As Integer
For i = 0 To 6
frmInv.lblNume(i).BackColor = &H8000000F 'button face
Next i
If (frmInv.lblNume(Index).Caption <> "") Then
frmInv.lblNume(Index).BackColor = &H80000009 'alb
End If
If (frmInv.lblNume(Index).Caption = "Ua_ref") Or (frmInv.lblNume(Index).Caption = "Ub_ref") Or (frmInv.lblNume(Index).Caption = "Uc_ref") Then
Cursor.lblUnit1.Caption = "V"
Cursor.lblUnit2.Caption = "V"
Cursor.lblUnitDif.Caption = "V"
ElseIf (frmInv.lblNume(Index).Caption = "Ua") Or (frmInv.lblNume(Index).Caption = "Ub") Or (frmInv.lblNume(Index).Caption = "Uc") Then
Cursor.lblUnit1.Caption = "V"
Cursor.lblUnit2.Caption = "V"
Cursor.lblUnitDif.Caption = "V"
ElseIf (frmInv.lblNume(Index).Caption = "CrtA") Or (frmInv.lblNume(Index).Caption = "CrtB") Or (frmInv.lblNume(Index).Caption = "CrtC") Then
Cursor.lblUnit1.Caption = "A"
Cursor.lblUnit2.Caption = "A"
Cursor.lblUnitDif.Caption = "A"
ElseIf (frmInv.lblNume(Index).Caption = "CrtAd") Or (frmInv.lblNume(Index).Caption = "CrtBd") Or (frmInv.lblNume(Index).Caption = "CrtCd") Then
Cursor.lblUnit1.Caption = "A"
Cursor.lblUnit2.Caption = "A"
Cursor.lblUnitDif.Caption = "A"
Else
Cursor.lblUnit1.Caption = "-"
Cursor.lblUnit2.Caption = "-"
Cursor.lblUnitDif.Caption = "-"
End If
End Sub
Această procedură ajută la selectarea mărimii reprezentate pe care utilizatorul dorește să o măsoare. De asemenea se stabilește și unitatea de măsură pentru mărimea selectată.
Public Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Integer, Y1Timp As Double, UnitateY1 As String, UnitateY2 As String, Y2Timp As Double
Dim X1Marime As Double, X2Marime As Double, UnitateX1 As String, UnitateX2 As String
Dim UnitX1 As String, UnitX2 As String
Y1Timp = 0
Y2Timp = 0
X1Marime = 0
X2Marime = 0
If (Button = 1) Then
If ((Cursor.cekX1.Value = 1) And (Cursor.cekLX1.Value = 0)) Then
frmInv.X1Line.Y1 = Y
frmInv.X1Line.Y2 = Y
For i = 0 To 6
If (frmInv.lblNume(i).BackColor = &H80000009) Then
X1Marime = (CDbl(Param.txtOrig(i).Text) – Y) / CDbl(Param.txtPasY(i).Text)
Cursor.lblValX1.Caption = Format(X1Marime, "##0.00######")
End If
Next i
End If
If ((Cursor.cekY1.Value = 1) And (Cursor.cekLY1.Value = 0)) Then
frmInv.Y1Line.X1 = X
frmInv.Y1Line.X2 = X
Y1Timp = (X * CDbl(Param.txtStep.Text)) / CDbl(Param.txtXUnit.Text)
If (Y1Timp < 0.000001) Then
UnitateY1 = "ns"
Y1Timp = Y1Timp * 1000000000
End If
If (Y1Timp < 0.001) Then
UnitateY1 = "us"
Y1Timp = Y1Timp * 1000000
End If
If (Y1Timp < 1) Then
UnitateY1 = "ms"
Y1Timp = Y1Timp * 1000
End If
Cursor.lblValY1.Caption = Format(Y1Timp, "##0.0#######")
Cursor.Label3.Caption = UnitateY1
Cursor.lblTimpDif.Caption = UnitateY1
End If
Cursor.lblValXDif.Caption = Format(Abs(CDbl(Cursor.lblValX1.Caption) – CDbl(Cursor.lblValX2.Caption)), "##0.0#######")
Cursor.lblValYDif.Caption = Format(Abs(CDbl(Cursor.lblValY2.Caption) – CDbl(Cursor.lblValY1.Caption)), "##0.0#######")
End If
If (Button = 2) Then
If ((Cursor.cekX2.Value = 1) And (Cursor.cekLX2.Value = 0)) Then
frmInv.X2Line.Y1 = Y
frmInv.X2Line.Y2 = Y
For i = 0 To 6
If (frmInv.lblNume(i).BackColor = &H80000009) Then
Cursor.lblValX2.Caption = Format((CDbl(Param.txtOrig(i).Text) – Y) / CDbl(Param.txtPasY(i).Text), "##0.0#######")
End If
Next i
End If
If ((Cursor.cekY2.Value = 1) And (Cursor.cekLY2.Value = 0)) Then
frmInv.Y2Line.X1 = X
frmInv.Y2Line.X2 = X
Y2Timp = (X * CDbl(Param.txtStep.Text)) / CDbl(Param.txtXUnit.Text)
If (Y2Timp < 0.000001) Then
UnitateY2 = "ns"
Y2Timp = Y2Timp * 1000000000
End If
If (Y2Timp < 0.001) Then
UnitateY2 = "us"
Y2Timp = Y2Timp * 1000000
End If
If (Y2Timp < 1) Then
UnitateY2 = "ms"
Y2Timp = Y2Timp * 1000
End If
Cursor.lblValY2.Caption = Format(Y2Timp, "##0.0#######")
Cursor.Label4.Caption = UnitateY2
End If
Cursor.lblValXDif.Caption = Format(Abs(CDbl(Cursor.lblValX1.Caption) – CDbl(Cursor.lblValX2.Caption)), "##0.0#######")
Cursor.lblValYDif.Caption = Format(Abs(CDbl(Cursor.lblValY2.Caption) – CDbl(Cursor.lblValY1.Caption)), "##0.0#######")
End If
End Sub
Procedura anterioară permite măsurarea mărimii selectate prin intermediul celor două cursoare disponibile și afișează valorile în fereastra Cursoare.
8.7 frmConfigurare
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmConfigurare.
Option Explicit
Private Sub cekCuloare_Click()
If (Config.cekCuloare.Value = 1) Then
Cursor.cekX1.ForeColor = &H0&
Cursor.cekY1.ForeColor = &H0&
Cursor.cekX2.ForeColor = &H0&
Cursor.cekY2.ForeColor = &H0&
frmInv.X1Line.BorderColor = &H0&
frmInv.Y1Line.BorderColor = &H0&
frmInv.X2Line.BorderColor = &H0&
frmInv.Y2Line.BorderColor = &H0&
Config.cmdSCulXY1.BackColor = &H0&
Config.cmdSCulXY2.BackColor = &H0&
Else
Cursor.cekX2.ForeColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &HFF&))
Cursor.cekY2.ForeColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &HFF&))
frmInv.X2Line.BorderColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &HFF&))
frmInv.Y2Line.BorderColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &HFF&))
Cursor.cekX1.ForeColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
Cursor.cekY1.ForeColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
frmInv.X1Line.BorderColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
frmInv.Y1Line.BorderColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
Config.cmdSCulXY1.BackColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY1", &H8000000D))
Config.cmdSCulXY2.BackColor = CLng(GetSetting("Invertor", "Config", "cmdSCulXY2", &H8000000D))
End If
End Sub
Procedura de mai sus încarcă culoarea default (negru), pentru cursoarele cu care se pot realiza măsurători, daca este selectata opțiunea Culoare default; totodată nu este permis accesul la butoanele cu care se pot alege culori pentru aceste cursoare. Daca aceasta opțiunea nu este activa, atunci se încarcă, din regiștrii Windows-ului (unde în prealabil au fost salvate) culorile alese pentru cursoare. Alegerea culorii se face apelând Color Dialog Box din Windows; astfel se poate alege practic orice culoare.
Private Sub cekDifVal_Click()
If (Config.cekDifVal.Value <> 1) Then
Cursor.lblValXDif.Visible = False
Cursor.lblValYDif.Visible = False
Cursor.Label1.Visible = False
Cursor.Label2.Visible = False
Cursor.lblTimpDif.Visible = False
Cursor.lblUnitDif.Visible = False
Else
Cursor.lblValXDif.Visible = True
Cursor.lblValYDif.Visible = True
Cursor.Label1.Visible = True
Cursor.Label2.Visible = True
Cursor.lblTimpDif.Visible = True
Cursor.lblUnitDif.Visible = True
End If
End Sub
Procedura prezentata permite sau nu (daca este selectata sau nu) vizualizarea text box-ului în care se afiseaza diferenta dintre cele doua cursoare disponibile.
Private Sub cekForma_Click()
Dim ToolTip(5) As String
ToolTip(0) = "Linie neintrerupta"
ToolTip(1) = "Linie intrerupta"
ToolTip(2) = "Linie punctata"
ToolTip(3) = "Linie punct linie"
ToolTip(4) = "Linie punct punct linie"
If (Config.cekForma.Value = 1) Then
frmInv.X1Line.BorderStyle = 3
frmInv.Y1Line.BorderStyle = 3
frmInv.X2Line.BorderStyle = 3
frmInv.Y2Line.BorderStyle = 3
Config.LineFormaTest.BorderStyle = 3
Config.lblFormaTest.ToolTipText = "Linie punctata"
Else
Config.LineFormaTest.BorderStyle = CInt(GetSetting("Invertor", "Config", "Index")) + 1
frmInv.X1Line.BorderStyle = Config.LineFormaTest.BorderStyle
frmInv.Y1Line.BorderStyle = Config.LineFormaTest.BorderStyle
frmInv.X2Line.BorderStyle = Config.LineFormaTest.BorderStyle
frmInv.Y2Line.BorderStyle = Config.LineFormaTest.BorderStyle
Config.lblFormaTest.ToolTipText = ToolTip(Config.LineFormaTest.BorderStyle – 1)
End If
End Sub
Procedura anterioara, daca este activata opțiunea Forma default, selectează (default) forma liniei cursoarelor. Forma default este linie punctata; totodată dezactivează butonul cu care se poate alege o alta forma pentru cursoare. Daca, în schimb, opțiunea nu este activa se încarcă din regiștri forma liniei salvata în prealabil. Exista si o zona de test în care se poate vedea forma liniei selectate.
Private Sub cekLock_Click()
If (Config.cekLock.Value <> 1) Then
Cursor.cekLX1.Visible = False
Cursor.cekLY1.Visible = False
Cursor.cekLX2.Visible = False
Cursor.cekLY2.Visible = False
Else
Cursor.cekLX1.Visible = True
Cursor.cekLY1.Visible = True
Cursor.cekLX2.Visible = True
Cursor.cekLY2.Visible = True
End If
End Sub
Aceasta procedura seteaza sau nu (daca s-a selectat sau nu optiunea Optiune "Lock") vizibilitatea optiunilor Lock.
Private Sub cekOra_Click()
If (Config.cekOra.Value = 1) Then
Main.StatusBar1.Panels(2).Style = sbrTime
Main.StatusBar1.Panels(1).MinWidth = 3900
Else
Main.StatusBar1.Panels(2).Style = sbrText
Main.StatusBar1.Panels(1).MinWidth = 4800
End If
End Sub
Procedura anterioara afiseaza sau nu (daca s-a selectat sau nu optiunea Afiseaza ora) ora în bara de stare a ferestrei principale. Optiunea este activa numai daca s-a selectat, în prealabil, optiunea Bara de stare.
Private Sub cekStatMain_Click()
If (Config.cekStatMain.Value = 1) Then
Main.StatusBar1.Visible = True
Config.cekOra.Enabled = True
Else
Main.StatusBar1.Visible = False
Config.cekOra.Enabled = False
End If
End Sub
Selectarea afisarii sau nu a barei de stare (prin selectarea optiunii Bara de stare din meniul de tip tab Main) a ferestrei principale se face cu aceasta procedura, care conditioneaza afisarea orei.
Private Sub cekStatfrmInv_Click()
If (Config.cekStatfrmInv.Value = 1) Then
frmInv.Frame1.Visible = True
frmInv.HScroll1.Top = 6480
frmInv.VScroll1.Height = 6495
Else
frmInv.Frame1.Visible = False
frmInv.HScroll1.Top = 6750
frmInv.VScroll1.Height = 6765
End If
End Sub
Aceasta procedura afișează sau nu (daca s-a selectat sau nu opțiunea Bara de stare din meniul de tip tab Reprezentare) bara de stare a ferestrei de reprezentare grafica. În aceasta bara de stare se afișează mărimile reprezentate la fiecare simulare în parte.
Private Sub cmdCancel_Click()
Config.Hide
End Sub
Aceasta procedura descarcă forma frmConfigurare daca s-a apăsat butonul Cancel, fără a salva ceva în regiștri.
Private Sub cmdOK_Click()
SaveSetting "Invertor", "Config", "optBut", Config.optBut.Value
SaveSetting "Invertor", "Config", "optToolbar", Config.optToolbar.Value
SaveSetting "Invertor", "Config", "StatMain", Config.cekStatMain.Value
SaveSetting "Invertor", "Config", "cekOra", Config.cekOra.Value
SaveSetting "Invertor", "Config", "cmdSCulXY1", Config.cmdSCulXY1.BackColor
SaveSetting "Invertor", "Config", "cmdSCulXY2", Config.cmdSCulXY2.BackColor
SaveSetting "Invertor", "Config", "cekCuloare", Config.cekCuloare.Value
SaveSetting "Invertor", "Config", "cekForma", Config.cekForma.Value
SaveSetting "Invertor", "Config", "cekLock", Config.cekLock.Value
SaveSetting "Invertor", "Config", "cekDifVal", Config.cekDifVal.Value
SaveSetting "Invertor", "Config", "cekStatfrmInv", Config.cekStatfrmInv.Value
SaveSetting "Invertor", "Config", "cekfrmInvBCul", Config.lblPicTestInvCul.BackColor
Config.Hide
End Sub
Procedura anterioara, salvează mai întâi, configurările făcute după care descarcă forma frmConfigurare.
Private Sub cmdSCulXY1_Click()
Dim Culoare As Long
Config.CDialXY1.Flags = cdlCCRGBInit
Config.CDialXY1.ShowColor
Culoare = Config.CDialXY1.Color
Config.cmdSCulXY1.BackColor = Culoare
Cursor.cekX1.ForeColor = Culoare
Cursor.cekY1.ForeColor = Culoare
frmInv.X1Line.BorderColor = Culoare
frmInv.Y1Line.BorderColor = Culoare
End Sub
Private Sub cmdSCulXY2_Click()
Dim Culoare As Long
Config.CdialXY2.Flags = cdlCCRGBInit
Config.CdialXY2.ShowColor
Culoare = Config.CdialXY2.Color
Config.cmdSCulXY2.BackColor = Culoare
Cursor.cekX2.ForeColor = Culoare
Cursor.cekY2.ForeColor = Culoare
frmInv.X2Line.BorderColor = Culoare
frmInv.Y2Line.BorderColor = Culoare
End Sub
Prin intermediul procedurilor anterioare se aleg culorile pentru cele doua cursoare.
Private Sub cmdSelForma_Click()
Dim i As Integer
FormaLinii.Show
For i = 0 To 4
FormaLinii.lblForm(i).BackColor = &H8000000F 'button face
Next i
FormaLinii.lblForm(CInt(GetSetting("Invertor", "Config", "Index", 2))).BackColor = &HC0C0FF 'portocaliu deschis
Config.cmdSelForma.Caption = ""
Config.cmdSelForma.Picture = LoadPicture("C:\program files\devstudio\vb\graphics\icons\arrows\arw04rt.ico")
End Sub
Aceasta procedura permite utilizatorului sa aleagă forma liniei cursoarelor.
Private Sub cmdSelInvCul_Click()
Dim Culoare As Long
Config.cmdSelInvCul.Caption = ""
Config.cmdSelInvCul.Picture = LoadPicture("C:\program files\devstudio\vb\graphics\icons\arrows\arw04rt.ico")
Config.CDialInvCul.Flags = cdlCCRGBInit
Config.CDialInvCul.ShowColor
Culoare = Config.CDialInvCul.Color
frmInv.Picture1.BackColor = Culoare
Config.cmdSelInvCul.Caption = "Select"
Config.cmdSelInvCul.Picture = LoadPicture()
Config.lblPicTestInvCul.BackColor = Culoare
End Sub
Cu ajutorul acestei proceduri se poate schimba culoarea de fond a ferestrei în care se face reprezentarea grafica. Culoarea de fond implicita este alba.
Private Sub optBut_Click()
If (Config.optBut.Value = True) Then
Main.frBut.Visible = True
Main.frToolbar.Top = 1000
End If
End Sub
Private Sub optToolbar_Click()
If (Config.optToolbar.Value = True) Then
Main.frBut.Visible = False
Main.frToolbar.Top = 0
End If
End Sub
Cele doua proceduri de mai sus permit utilizatorului sa aleagă, pentru fereastra principala fie butoane, fie bara de unelte (toolbar).
8.8 frmFormaLinii
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmFormaLinii.
Option Explicit
Private Sub cmdOkForma_Click()
Dim i As Integer
FormaLinii.Hide
Config.cmdSelForma.Picture = LoadPicture()
Config.cmdSelForma.Caption = "Select"
For i = 0 To 4
If (FormaLinii.lblForm(i).BackColor = &HC0C0FF) Then
SaveSetting "Invertor", "Config", "Index", i
End If
Next i
End Sub
Procedura descarcă forma salvând în regiștrii opțiunea selectata de către utilizator (mai precis forma liniei cursoarelor).
Private Sub lblForm_Click(Index As Integer)
Dim i As Integer
Dim ToolTip(5) As String
ToolTip(0) = "Linie neintrerupta"
ToolTip(1) = "Linie intrerupta"
ToolTip(2) = "Linie punctata"
ToolTip(3) = "Linie punct linie"
ToolTip(4) = "Linie punct punct linie"
For i = 0 To 4
FormaLinii.lblForm(i).BackColor = &H8000000F 'button face
Next i
FormaLinii.lblForm(Index).BackColor = &HC0C0FF 'portocaliu deschis
For i = 0 To 4
If (FormaLinii.lblForm(i).BackColor = &HC0C0FF) Then
frmInv.X1Line.BorderStyle = i + 1
frmInv.Y1Line.BorderStyle = i + 1
frmInv.X2Line.BorderStyle = i + 1
frmInv.Y2Line.BorderStyle = i + 1
Config.LineFormaTest.BorderStyle = i + 1
Config.lblFormaTest.ToolTipText = ToolTip(i)
End If
Next i
End Sub
Aceasta procedura "alege" în funcție de evenimentul click al mouse-ului forma liniei cursoarelor.
8.9 frmSplash
În acest capitol sunt prezentate fereastra de program și codul sursa pentru modulul formă frmSplash.
Option Explicit
' Reg Key Security Options…
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
' Reg Key ROOT Types…
Const HKEY_LOCAL_MACHINE = &H80000002
Const ERROR_SUCCESS = 0
Const REG_SZ = 1 ' Unicode nul terminated string
Const REG_DWORD = 4 ' 32-bit number
Const gREGKEYSYSINFOLOC = "SOFTWARE\Microsoft\Shared Tools Location"
Const gREGVALSYSINFOLOC = "MSINFO"
Const gREGKEYSYSINFO = "SOFTWARE\Microsoft\Shared Tools\MSINFO"
Const gREGVALSYSINFO = "PATH"
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Sub cmdSysInfo_Click()
Call StartSysInfo
End Sub
Public Sub StartSysInfo()
On Error GoTo SysInfoErr
Dim rc As Long
Dim SysInfoPath As String
' Try To Get System Info Program Path\Name From Registry…
If GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFO, gREGVALSYSINFO, SysInfoPath) Then
' Try To Get System Info Program Path Only From Registry…
ElseIf GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFOLOC, gREGVALSYSINFOLOC, SysInfoPath) Then
' Validate Existance Of Known 32 Bit File Version
If (Dir(SysInfoPath & "\MSINFO32.EXE") <> "") Then
SysInfoPath = SysInfoPath & "\MSINFO32.EXE"
' Error – File Can Not Be Found…
Else
GoTo SysInfoErr
End If
' Error – Registry Entry Can Not Be Found…
Else
GoTo SysInfoErr
End If
Call Shell(SysInfoPath, vbNormalFocus)
Exit Sub
SysInfoErr:
MsgBox "System Information Is Unavailable At This Time", vbOKOnly
End Sub
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String, ByRef KeyVal As String) As Boolean
Dim i As Long ' Loop Counter
Dim rc As Long ' Return Code
Dim hKey As Long ' Handle To An Open Registry Key
Dim hDepth As Long '
Dim KeyValType As Long ' Data Type Of A Registry Key
Dim tmpVal As String ' Tempory Storage For A Registry Key Value
Dim KeyValSize As Long ' Size Of Registry Key Variable
'––––––––––––––––––––
' Open RegKey Under KeyRoot {HKEY_LOCAL_MACHINE…}
'––––––––––––––––––––
rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Open Registry Key
If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' Handle Error…
tmpVal = String$(1024, 0) ' Allocate Variable Space
KeyValSize = 1024 ' Mark Variable Size
'––––––––––––––––––––
' Retrieve Registry Key Value…
'––––––––––––––––––––
rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
KeyValType, tmpVal, KeyValSize) ' Get/Create Key Value
If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError ' Handle Errors
If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then ' Win95 Adds Null Terminated String…
tmpVal = Left(tmpVal, KeyValSize – 1) ' Null Found, Extract From String
Else ' WinNT Does NOT Null Terminate String…
tmpVal = Left(tmpVal, KeyValSize) ' Null Not Found, Extract String Only
End If
'––––––––––––––––––––
' Determine Key Value Type For Conversion…
'––––––––––––––––––––
Select Case KeyValType ' Search Data Types…
Case REG_SZ ' String Registry Key Data Type
KeyVal = tmpVal ' Copy String Value
Case REG_DWORD ' Double Word Registry Key Data Type
For i = Len(tmpVal) To 1 Step -1 ' Convert Each Bit
KeyVal = KeyVal + Hex(Asc(Mid(tmpVal, i, 1))) ' Build Value Char. By Char.
Next
KeyVal = Format$("&h" + KeyVal) ' Convert Double Word To String
End Select
GetKeyValue = True ' Return Success
rc = RegCloseKey(hKey) ' Close Registry Key
Exit Function ' Exit
GetKeyError: ' Cleanup After An Error Has Occured…
KeyVal = "" ' Set Return Val To Empty String
GetKeyValue = False ' Return Failure
rc = RegCloseKey(hKey) ' Close Registry Key
End Function
La apăsarea butonului System Info, folosind procedurile anterioare, se furnizează utilizatorului informații despre sistem.
Private Sub Form_KeyPress(KeyAscii As Integer)
Unload Me
End Sub
Private Sub Frame1_Click()
Unload Me
End Sub
Aceste două proceduri interceptează evenimentele mouse-ului și ale tastaturii pentru a descărcă forma. Totodată această formă este și fereastra Despre… (About).
9. FORME DE UNDĂ
Mai sus au fost reprezentate tensiunile de referință Ua_ref, Ub_ref și Uc_ref (figura 1) și tensiunile de fază Ua (figura 2), Ub (figura 3) și Uc (figura 4) generate de invertor. Se observă cum aceste tensiuni urmăresc tensiunile de referință.
În figura 5 sunt prezentate funcțiile de comandă (Fa, Fb și Fc) pentru brațele invertorului și modul de calcul (PWM).
În figura 6 sunt prezentate formele de undă pentru timpii de conducție Ta, Tb și Tc.
În figura 7 sunt prezentate formele de undă ale curenților Iad, Ibd și Icd determinați de tensiunile de referință prin trei circuite serie RL, iar în figura 8 sunt prezentate formele de undă ale curenților Ia, Ib și Ic determinați de tensiunile de fază generate de invertor și aplicate unor circuite serie RL.
ANEXA 1 – Comutarea tranzistorului bipolar
COMUTAREA TRANZISTORULUI BIPOLAR
Introducere:
În regim staționar, dispozitivele semiconductoare se pot afla în una din următoarele stări:
Blocare Conducție
Dispozitivele care realizează comutarea trebuie să :
ofere în conducție o rezistență cît mai mică (ideal zero);
ofere în regim de blocare o rezistență cît mai mare (ideal infinit);
asigure un răspuns cît mai aproape de ideal la un semnal treaptă.
Pragul tensiunii sau curentul de comandă a comutării să fie stabil în timp. Timpul de comutare directă este intervalul de timp în care se parcurge (0,1 0,9) din valoarea finală. Timpul de comutare inversă este intervalul de timp în care se parcurge (0,9 0,1) din valoarea inițială.
a) Comutarea blocare RAN . se consideră un tranzistor NPN în conexiune EC care urmează să comute în RAN din blocare ca urmare a aplicării la intrarea sa a unui salt de tesiune corespunzător (Figura 5 a). Prin aceasta punctul său static de funcționare parcurge dreapta de sarcină din A către C trecând printr-un punct B al RAN-ului (Figura 5 b). variația curentului de bază la comutarea directă, IB1 , reproduce pe aceea a curentului printr-o joncțiune pn (porțiunea punctată din Figura 5 c). Răspunsul tranzistorului la această comutare este prezentat prin variația curentului său de colector.
Intervalul de timp 0 – ti se datorește:
descărcării capacității de barieră a joncțiunii emitor – bază (era încărcată până la comutarea directă la o tensiune corespunzătoare polarizării inverse).
timpului până când tensiunea pe această joncțiune crește de la zero la valoarea sa de deschidere (E = 0,1 V diode din Ge și0,5 V pentru cele din Si).
timpului în care purtătorii injectați în bază o parcurg (regiune finită) fiind extrași apoi în colector.
ANEXA 1 – Comutarea tranzistorului bipolar
Timpul de creștere, tc (Figura 5 c) este proporțional cu durata medie de viață a purtătorilor minoritari în bază (în cazul de față electroni), n .
În majoritatea cazurilor timpul de întârziere, ti se neglijează și se demonstrează că pentru orice punct B al RAN timpul de comutare directă din blocare în RAN este constant și egal cu
tcd= 2,2n tc. Se arată de asemenea că și timpul de comutare inversă td este proporțional cu n .
b) Comutarea blocare saturație. Punctul C care se află la intersecția dreptei de sarcină dată de valoarea rezistorului RC cu regiunea ascendentă de pantă cea mai mare a caracteristicilor de ieșire este ultimul punct al RAN (în care mai este valabilă relația ICS =NIBS) în care tranzistorul mai amplifică și primul punct al regiunii de saturație. Din acest motiv acest punct se numește de saturație incipientă și se obține atunci când tranzistorul are la intrare un curent de bază egal cu IBS obținându-se la ieșire un curent de colector notat cu ICS=NIBS.
În figura 6 se observă ce se întâmplă dacă la intrarea tranzistorului din figura 5 se aplică un salt de tensiune care generează diferiți curenți de bază. Pentru oricare curent de bază de tip IB1<IBS timpul de creștere (de comutare directă) este constant și egal cu 2,2n adică valoarea staționară a curentului de colector se atinge în acest interval de timp. Când curentul de bază de comandă a comutării este mai mare decât IBS (curentul de bază corespunzător saturației incipiente) curentul de colector al tranzistorului își pornește variația cu o pantă mare în tendința de a ajunge la valoarea finală tot
ANEXA 1 – Comutarea tranzistorului bipolar
în timpul 2,2n (curba punctată din figura 6) neștiind că până acolo i se schimbă condițiile de funcționare.
Aceasta se întâmplă când curentul de colector atingând valoarea de saturație (incipientă), ICS, se saturează rămânând constant obținându-se curba limitată cu linie plină din figura 6.
În acest mod timpul în care se stabilește valoarea de regim staționar (finală) este . Aceasta se întâmplă pentru orice curent de bază de comandă a comutării pentru care IB3 > IBS deoarece pentru oricare asemenea curent, punctul static de funcționare se obține în același loc (C), la intersecția dreptei de sarcină cu caracteristica de ieșire respectivă corespunzătoare lui IB2 > IBS (figura 5 b).
În general avem nevoie de timpi mici de comutare (frecvență ridicată de lucru a tranzistorului) și, de aceea, este avantajos să comutăm în regiunea de saturație unde mai avem și avantajul unei tensiuni reziduale mici pe tranzistor, uCEsat .
Dar, prin aplicarea unui curent de comandă IB2 > IBS se introduce în bază, suplimentar față de cea de la comutarea până la saturația incipientă, o sarcină de purtători minoritari. Această sarcină suplimentară stocată în bază este proporțională cu diferența IB2 – IBS . Datorită acestei sarcini stocate suplimentare la comutarea inversă este necesar un timp de eliminare a
ANEXA 1 – Comutarea tranzistorului bipolar
ei. Apare o întârziere egală cu tS în care la comutarea inversă se evacuează această sarcină stocată înainte ca tranzistorul să intre în RAN.
După acest timp există timpul de descreștere de valoare egală cu cel de la comutarea din RAN în blocare (td’). Formele de undă care rezultă pentru acest caz de comutare sunt cele din figura 7.
Pentru micșorarea timpului de comutare directă este necesar, deci, să aplicăm un salt de curent de bază cît mai mare pentru a comuta tranzistorul în saturație. Aceasta are dezavantajul unui timp de comutare inversă ridicat din cauza existenței timpului de stocare (tci = tS + td); tS se poate micșora aplicând un salt de curent invers mare ceea ce întârzie la rândul său comutarea directă din cauza necesității reîncărcării capacității joncțiunii EB. Rezultă că forma ideală a curentului de comandă la comutarea directă și inversă în și din saturație ar fi de forma celei din figura 8.
Comutarea directă s-ar face cu un curent de bază mare IB1i > IBS necesar eliminării rapide a sarcinii înmagazinate în capacitatea de barieră a joncțiunii EB blocate și asigurării unui timp de comutare mic (figura 6). Valoarea de regim staționar a curentului de bază la comutarea directă ar urma să fie IB1f IBS pentru a împiedica intrarea în saturație puternică și a reduce către zero timpul tS.
ANEXA 2 – Tranzistorului IGBT
Tranzistorul IGBT
Tranzistorul IGBT este un dispozitiv semiconductor ce a rezultat din combinarea a două tehnologii : MOS și Bipolară. Astfel, tranzistorul IGBT posedă avantajele și dezavantajele ambelor tehnologii. Se poate considera IGBT-ul ca fiind un tranzistor compus (Darlington) de tip MOS – Bipolar având în etajul de comandă un MOSFET iar în etajul de putere un bipolar (Figura 1).
Principalele avantaje ale IGBT-ului sunt :
se comandă ca un MOSFET (în tensiune);
timpi de stocare foarte reduși.
Principalele dezavantaje ale IGBT-ului sunt :
în comparație cu tranzistorul Darlington, căderea de tensiune în conducție este mare (poate ajunge până la 34 V la curentul nominal);
în momentul blocării curentul nu descrește rapid către zero, provocând pierderi suplimentare.
Pentru o compensare a acestui ultim principal dezavantaj s-au propus (de către constructori) mai multe soluții printre care : reducerea duratei de viață a purtătorilor minoritari prin dopare cu aur, platină sau iradiere. Totuși, această compensare nu se poate face prea bine deoarece odată cu scăderea timpului de descreștere a curentului crește căderea de tensiune în conducție.
Intrarea unui IGBT fiind echivalentă cu cea a unui MOSFET, punerea în conducție se face aplicând o tensiune pozitivă (515 V) între poartă (G) și emitor (E), iar blocarea se face reducând această tensiune la zero.
În condiții de funcționarea statică IGBT-ul nu necesită un control în curent pe poartă, deoarece fiind un MOSFET la intrare se comandă în tensiune. La intrarea în conducție sunt aplicate pe poartă pulsuri de curent de scurtă durată generate de capacitatea proprie de intrare (Figura 2).
ANEXA 2 – Tranzistorului IGBT
Fenomenul de comutație al IGBT-ului
td(on) = timpul de întârziere la deschidere – intervalul de timp dintre momentul când impulsul de comandă atinge 10% din valoarea lui finală și momentul când curentul de colector ajunge la 10% din valoarea pe care o va avea în conducție;
tr = timpul de creștere – intervalul de timp dintre momentul când curentul de colector reprezintă 10% și cel când ajunge la 90% din valoarea pe care o va avea în conducție;
td(off) = timpul de întârziere la blocare – intervalul de timp dintre momentul când impulsul de comandă scade la 90% din valoarea lui și momentul când curentul de colector ajunge la 90% din valoarea pe care o va avea inițial în conducție;
tf = timp de cădere – intervalul de timp dintre momentul când curentul de colector reprezintă 90% și cel când curentul de colector ajunge la 10% din valoarea pe care o va avea în conducție;
ton = timpul de intrare în conducție al IGBT-ului;
toff = timpul de blocare al IGBT-ului.
De asemenea, pentru acești timpi se pot scrie următoarele relații :
ton = td(on) + tr ; toff = td(off) + tf
ANEXA 3 – Influența pasului de calcul
BIBLIOGRAFIE
Jamsa K., Klander L. – 1001 Sugestii pentru programatorii Visual Basic
Clark J. C., Webb J. – Microsoft Visual Basic 5.0 – Manualul programatorului
Floricău D. – Sisteme de comandă pentru convertoare statice de putere
Ionescu F., ș.a. – Convertoare statice de putere. Îndrumar de laborator
Ionescu F., ș.a. – Dispozitive semiconductoare de putere. Îndrumar de laborator
Boost M. A., Ziogas P. D. – State-of-the-Art Carrier PWM Techniques: A Critical Evaluation
Bose B.K., Sutherland H.A. – A High-Performance Pulsewidth Modulator for an Inverter-Fed Drive System Using a Microcomputer
Trzynadlowski A.M., Kirlin R.L., Legowski F. – Space Vector PWM Technique with Minimum Switching Losses and a Variable Pulse Rate
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: Sistemele de Comanda cu Modularea In Latime a Impulsurilor – Pwm Pentru Convertoarele Statice de Putere cu Frecvență Variabilă (ID: 161306)
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.
