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

Similar Posts