Kutatás kategória bejegyzései

Sávszélesség hatása a független mérési pontok számára

Szimulációk esetén könnyű úgy generálni a jeleket, hogy az egymás utáni adatpontok statisztikailag függetlenek legyenek, a valós mérések esetén viszont a sávszélesség óhatatlanul korrelációt vezet be az adatpontok között. E miatt merül fel a kérdés, hogy egy adott pontosság eléréséhez vajon hány mérési pontra lesz szükségünk. Vagy másképp megfogalmazva: ha van N mérési pontunk, ez hány, egymástól statisztikailag független mérési pontnak felel meg (k)?

A Shannon-féle mintavételi tételt egy egyszerű megoldást javasol arra, hogy mérésünk során milyen gyakran kapunk majd független adatpontokat: adott sávszélesség esetén, ha a sávszélesség (kicsit több mint) kétszeresével mintavételezünk, akkor nincs információveszteségünk, a valódi jelalakot bármelyik pontban rekonstruálni tudjuk. Ez viszont azt is jelenti, hogy ha gyakrabban mérünk, nem jutunk további információhoz.

Lefordítva a korábbi kérdésre a tételt, ha f_s a mintavételi frekvenciánk, f_{bw} pedig a sávszélességünk, a statisztikailag független mérési pontok száma a sávszélesség és a mintavételi frekvencia arányában fog csökkenni a következő képlet szerint:

k=N \cdot {2 f_{bw} \over f_s}

Ha a sávszélesség pont a mintavételi frekvencia fele, akkor minden egyes mért adatpontot statisztikailag függetlennek tekinthetjük. Természetesen ez csak akkor igaz, hogy a vizsgált jelünk korrelálatlan volt, vagyis fehér zaj.

A valóságban olyan fehér zajt nem találunk, ami f_{bw} alatt tökéletesen egyenletes frekvenciamenetű, felette viszont 0 teljesítménnyel rendelkezik. Analóg és digitális szűrőkkel megközelíthetjük ezt a frekvenciamenetet, de nem tökéletesen. Vajon a szűrők milyen hatással lesznek a mérésekre?

A KLJN-hez és a FES-hez kapcsolódó méréseknél két gyakran mért paraméter a jel középértéke és szórása. Megvizsgálhatjuk, hogy N mérést elvégezve, az így kapott mennyiségek milyen eloszlást követnek. A következőkben egy olyan szimuláció eredményét mutatom be, ahol a mintavételi frekvencia 1 kHz, a zaj sávszélességét egy 10-edfokú Butterworth szűrő határozza meg 100 Hz-es levágási frekvenciával, a mintavételezett pontok száma (N) pedig 500. A mérések száma 100 000. Ahogy a következő ábrán látszik, a kapott átlagok igen pontosan normál eloszlást követnek.

A mért középértékek eloszlása sávkorlátozott jel esetén

A mért középértékek eloszlása sávkorlátozott jel esetén

A statisztikában középérték szórását az adatpontok szórásából a következő képlettel tudjuk meghatározni (lásd konfidenciaintervallum):

sd(\bar{x_k})={sd(x) \over \sqrt{k} }

A zaj mért szórása 0,8937, a középértékek szórása pedig 0,0891. Ez alapján k, a független adatpontok száma 100,681, ami lényegében megfelel a mintavételi tételből kapott képletnek.

Hasonlóan megvizsgálhatjuk a kapott szórások eloszlását is. Az a következő ábrán jól látszik, hogy a kapott eloszlás megfelel a várt Chi-négyzet eloszlásnak. A korábbi bejegyzés alapján a mérési adatok alapján meghatározhatjuk k értékét, erre a konkrét esetre k-nak 105,69-et kapunk. Ha görbét illesztünk, a kapott k érték 107 lesz. Ez ugyan kis mértékben eltér a várttól, de mutatja, hogy ha elegendően meredek a sávszűrőnk, a mintavételi tételből kapott összefüggés jól használható.

A mért szórások eloszlása sávkorlátozott jel esetén

A mért szórások eloszlása sávkorlátozott jel esetén

Ha a szűrő meredeksége nem elég meredek, azt várjuk, hogy több nagyfrekvenciás tag marad a jelben, növelve a statisztikailag független pontok számát. A tizedfokú szűrőt elsőfokúra cserélve ezt könnyen megfigyelhetjük, a középérték eloszlása alapján azt kapjuk, hogy a független mérési pontok száma 123. Ezzel ugyanakkor nincs összhangban a variancia eloszlása alapján kapott érték, ami 198. Ha a sávszélességet elsőfokú szűrő mellett lecsökkentjük 10 Hz-re, akkor a két eredmény különbsége még nagyobb lesz, a középérték alapján számolt 15,5 pont, a variancia alapján számolt pedig 30,2 pont. Az alábbi ábrán látható, hogy míg a középérték továbbra is normál eloszlást követ, a variancia eloszlása már nem tökéletesen Chi-négyzet. (Az eltérést biztosan nem a pontok kis száma okozza, 10-ed fokú szűrőt alkalmazva, a „helyes” eredmény jön ki. A pontok számát növelve (pl. N=5000) az eloszlás jobban közelít a Chi-négyzet eloszláshoz, a középérték és a variancia alapján számolt k közötti különbség viszont megmarad).

Alacsonyabb fokú szűrő használata esetén a variancia eloszlása már eltér az illesztett Chi-négyzet görbétől

Alacsonyabb fokú szűrő használata esetén a variancia eloszlása már eltér az illesztett Chi-négyzet görbétől

A szimuláció eredményei alapján látszik, hogy elegendően meredek levágású szűrőket alkalmazva, a mintavételi tétel alapján kapott összefüggés teljesül. Ha a szűrő nem elég meredek, akkor a független mérési pontok száma emelkedik, de még ugyanabban a nagyságrendben lesz. Ugyanakkor a kapott k értékek eltérőek lesznek a középérték és a variancia esetén, jelezve, hogy ilyen esetben a mintavételi tételből kapott eredményeket már nem használhatjuk automatikusan.

Gauss-eloszlás tesztelése vizuálisan

Mérések és szimulációk során gyakran felmerül az a kérdés, hogy egy eloszlás vajon normál eloszlású-e, vagy nem. Például a következő ábrán vajon mindkét adatsor Gauss-eloszlású-e?

Vajon mind a két görbe normál eloszlást követ?

A hisztogramok 100 000 adatpont alapján készültek. A nagy mennyiségű adatpont ellenére sem egyszerű megmondani, hogy vajon tényleg normál eloszlásúak-e vagy sem. Az eltéréseket viszont ki tudjuk nagyítani, hogy ha a grafikonokat úgy transzformáljuk át, hogy a normál eloszlás pontjai egy, törött egyenesre essenek. A mennyiségek átskálázása a következő képleteknek megfelelően történik:

x_{scaled}=sign(x-\mu)\cdot(x-\mu)^2

y_{scaled}=ln(PDF)

Az átskálázott grafikonok pedig:

Az átskálázott grafikonok

Az átskálázott grafikonok

Az új grafikonokon már jól látszik, hogy az első eloszlás biztos nem normál eloszlást követ (egyébként Chi-négyzet, szabadsági fokok száma 200).

A Chi-négyzet eloszlás és a szórás kapcsolata

A FES és KLJN kutatások során gyakran felmerül annak igénye, hogy egy mennyiség szórását határozzuk meg. Mivel a minták száma véges, a kapott szórás ingadozik annak várható értéke körül.

A kapott szórások szemléltetése KLJN kommunikáció esetén

A kapott szórások szemléltetése KLJN kommunikáció esetén

Első ránézésre azt is gondolhatnánk, hogy a kapott eloszlások normál eloszlásúak. Ugyanakkor, hogy ha jobban megvizsgáljuk a helyzetet, hamar egyértelművé válik, hogy nem azok. Az általunk vizsgált feszültség (vagy áramjelek) általában normál eloszlásúak, középértékük pedig nulla. A jel varianciáját a következő képlettel kaphatjuk meg:

V = {1 \over k} \sum_{i=1}^{k} x_i^2

, ahol x_i-k az aktuális mérési értékek. A képlet alapján látszik, hogy az általunk keresett eloszlásnak a Chi-négyzet eloszláshoz lesz köze. Ha z_i-k egymástól független standard normál eloszlású változók (0 középértékkel és egységnyi szórással), akkor a következő egyenlettel definiált Q, Chi-négyzet eloszlást követ  k szabadsági fokkal.

Q = \sum_{i=1}^{k} z_i^2

Q legfontosabb tulajdonságai:

mean(Q) = k

var(Q) = 2k

A korábban felhasznált x_i változók nem standard eloszlásúak, szórásuk nem egységnyi, hanem \sigma. Így:

z_i={x_i \over \sigma}

x_i=\sigma z_i

V = {\sigma^2 \over k} Q

Ezekből az egyenletekből meghatározhatjuk a mért variancia várható értékét és szórását:

mean(V) = \sigma^2

var(V) = {\sigma^4 \over k^2} 2k = 2 {\sigma^4 \over k}

Az első egyenlet nem különösen meglepő, hiszen ezt várjuk. A második viszont azért érdekes, mert látszik, hogy a mérések során kapott szórás vagy RMS értékek szórása csak és kizárólag a szórás várható értékétől, valamint az egymástól statisztikailag független pontok számától függ.

A számolás ellenőrzésére egy egyszerű LabVIEW szimulációt készítettem (lásd következő ábra). A programban meg lehet figyelni, hogy a Chi-négyzet eloszlás sűrűségfüggvényének megfelelő skálázásához mind a x értékeket, mind pedig a függvény kimenetét meg kell szorozni \sigma^2/k-val.

Az elkészített szimuláció blokk diagramja

Az elkészített szimuláció blokk diagramja

A szimuláció eredménye

A szimuláció eredménye

A szimuláció eredményeként jól látható, hogy a kapott eloszlás, bár közel áll a normál eloszláshoz, nem illeszkedik rá pontosan, a jósolt Chi-négyzet eloszlás viszont jól követi a mért adatpontokat. A különbség bár nem tűnik lényegesnek (sok helyen a Chi-négyzet eloszlást normál eloszlással szokták közelíteni), de a tartomány szélein, az eltérés akár több nagyságrend is lehet. A KLJN kommunikáció során pedig pont ez a tartomány lesz érdekes a hibaráta becslésénél.

Egy érdekesség van még: a beépített LabVIEW-s Chi-négyzet sűrűségfüggvényt számoló rutin sajnos nem lett igazán jól implementálva, néhány száz mérési pont felett már nem ad használható eredményt. Ezért egy új verziót implementáltam a beépített alapján, mely nagy számokra is tökéletesen működik. Ennek a blokk diagramja a következő ábrán látható:

Chi-négyzet sűrűségfüggvényét nagy számok esetén is helyesen meghatározó rutin

Chi-négyzet sűrűségfüggvényét nagy számok esetén is helyesen meghatározó rutin

NI USB-7856R

A tanszék a REVLAB pályázat keretén belül szerzett be egy NI USB-7856R multifunkciós USB valós idejű adatgyűjtőt. A projektben elsősorban valós idejű vezérlési, jelfeldolgozási és jelgenerálási feladatokat valósítunk meg az eszköz segítségével. E mellett az eszköz tudományos kutatási és oktatási feladatokban is fel lesz használva, többek között két futó szakdolgozat is felhasználja ezt az eszközt.

NI USB-7856R

Az adatgyűjtő magja egy Kintex 7 160T FPGA, mely LabVIEW-ból közvetlenül programozható az NI FPGA modul segítségével. Ennek köszönhetően az eszközre egyszerűen lehet definiálni nagy teljesítményű szoftverdefiniált műszereket. Az eszközt USB-n keresztül közvetlenül a számítógéphez tudjuk kötni, a FPGA és a PC közötti adatátvitelt DMA csatornák biztosítják. A program feltöltését követően az eszköz korlátozottan, a PC használata nélkül is működtethető.

Az eszköz legfontosabb tulajdonságai:

  • 8 db 1 MHz-es 16 bit-es analóg bemenet, 4 különböző mérési tartománnyal, szimultán mintavételezés
  • 8 db 1 MHz-es 16 bit-es analóg kimenet
  • 32 db 80 MHz-es digitális I/O vonal
  • 16 db 10 MHz-es digitális I/O vonal
  • 202 800 Flip-Flop, 101 400 LUT, 11 700 Kib RAM, 600 DSP egység
  • 40, 80, 120, 160 vagy 200 MHz órajel
  • 3 DMA csatorna

A műszer két VHDCI csatlakozóval rendelkezik, melyekről az NI SCB-68A és NI SCB-68 HSDIO csatlakozóblokkokra vezethetjük az analóg és digitális jeleket. (Érdekesség: az SCB-68A csatlakozóblokkra rajzolt kiosztás nem felel meg a műszer által jelzett kiosztásnak, a helyes elrendezést a „Where Can I Find NI SCB-68A Quick Reference Labels?” oldalon lehet elérni.)

A készülék ára a csatlakozókkal együtt kb. 2 MFt. Ez nyilvánvalóan nem kevés, csak akkor célszerű egy ilyen eszköz beszerzése, hogy ha valaki valóban ki is használja a képességeit, pl. a nagy számú és gyors analóg és digitális I/O vonalakat, valamint a beépített FPGA programozhatóságát.

Virtuális műszerek és Szoftverdefiniált műszerek

Ahogy a technika fejlődött, számos műszert fejlesztettek ki különböző célokra (pl. multiméter, oszcilloszkóp, spektrumanalizátor, Lock-in erősítő); az idő telésével pedig ezek a műszerek egyre többet tudtak, egyre okosabbak lettek. Problémát jelentett ugyanakkor, hogy komplexebb mérések esetén az egyénnek számos műszert kellett egyszerre kezelni, valamint a mérés végeredménye is csak hosszas számolást követően született meg. E miatt merült fel az igény, hogy a műszereket kössük számítógépekhez, és a számítógépen futó program hangolja össze az egyedi műszerek működését, valamint számolja ki a felhasználó számára hasznos adatokat. Így tulajdonképp egy újfajta műszer jött létre, melynek működését elsősorban a számítógépen futó szoftver határozza meg. A szoftver cseréjével pedig ugyanazok a hardverelemek egészen más feladatra is alkalmassá tehetők. Az így létrehozott műszereket virtuális műszereknek hívjuk.

A virtuális műszerek egy új fizikai műszer igényét fogalmazták meg: az univerzális adatgyűjtőét, mely nem egy speciális feladatra van kitalálva, nincsenek is rajta kezelőszervek, hanem kizárólag számítógépről használhatók. Ugyanakkor, a könnyen fejleszthető és cserélhető szoftvernek köszönhetően, ugyanaz a hardver számos komplex mérési feladatra alkalmassá tehető. Az egyre inkább elterjedő moduláris műszerek pedig azt a lehetőséget is megteremtették, hogy könnyen személyre szabhassuk mérőrendszerünkben a bemenetek és kimenetek számát, típusát és tulajdonságait.

Egy hátránya viszont van ezeknek a műszereknek: mivel a vezérlő és feldolgozó szoftver döntő többsége a számítógépen fut, csak korlátozottan alkalmasak gyors reagálást igénylő komplex mérések és vezérlések lebonyolítására. Ehhez az szükséges, hogy a személyre szabható szoftver magán a műszerbe beágyazott feldolgozóegységen fusson. Az így létrehozott műszereket szoftverdefiniált műszereknek hívjuk (hard virtual instrumentation-ként is hivatkoznak rá). A feldolgozóegység lehet beágyazott számítógép is, de manapság egyre gyakoribb, hogy egy FPGA-n „futó” szoftver határozza meg a műszer tényleges viselkedését.

Utóbbira jó példa a NI USB-7856R adatgyűjtő, melyben egy Kintex-7 160T FPGA végzi a vezérlést. A NI PXIe-5170R újrakonfigurálható oszcilloszkóp esetén pedig nagy sebességű méréseket végezhetünk, pl. speciálisan az adott alkalmazásra szabott trigger feltételek között.

Lineáris kongruencia véletlenszám-generátorok

Az egyik legelterjedtebb véletlenszám-generátor típus a lineáris kongruencia típusú véletlenszám-generátor (LCG). A véletlenszám-generátort meghatározó rekurziós képlet a következő:

 \xi_n= (m \cdot \xi_{n-1} + a) \textrm{mod} M

A véletlenszám-generátor működését meghatározzák az m, a és M paraméterek. Amennyiben rosszul választjuk meg őket, akkor a véletlenszám-generátor minősége elfogadhatatlan lesz. Az M változó megadja a generátor maximális ciklusidejét. Általában kettő hatványként van választva, így az algoritmus könnyű bináris számítógépen implementálni.

Az LCG legfontosabb előnye, hogy implementációja egyszerű és kevés erőforrást igényel. Viszont a módszernek több hátránya is van. Egyrészt, korlátozott a ciklushossz, tipikusan 264 alatti. Ha M kettő hatvány, akkor az alacsonyabb helyértékű bitek ciklushossza még rövidebb. További hátránya, hogy bizonyos dimenziószám felett, mely a paraméterektől függ, a véletlen számok térbeli elhelyezkedése nem egyenletes, hipersíkok mentén csoportosulnak az adatok. Ezek a hátrányok nem minden gyakorlati esetben jelentenek problémát, így megfelelő körültekintéssel jól használhatók az LCG generátorok.

A következő táblázat bemutat néhány egyszerű példát az m, a és M paraméterekre.

m a       M      Megjegyzés
1664525 1013904223 232 Forrás: Numerical Recipies
25214903917 11 248 JAVA véletlenszámgenerátora
6364136223846793005 1442695040888963407 264 Forrás: Donald Knuth

Véletlenszám-generátorok ciklusideje

Ahogy az előző bejegyzésben írtam, a pszeudovéletlenszám-generátorok ciklushossza alapvető fontosságú alkalmazásuk során, mivel ezt követően a generátor kimenete ismétli korábbi értékeit, így alkalmatlan arra, hogy további statisztikai adatokat gyűjtsünk. A véletlenszám-generátor ciklusidejét meghatározza az, hogy az algoritmus hány bit-en tárolja belső állapotát: egy 32 bit-es véletlenszám-generátor ciklushossza legfeljebb 232 szám lehet.

A következő táblázatban összefoglalom, hogy amennyiben a véletlenszám-generátort pl. zajgenerálásra használjuk fel, a különböző bitszámú és ciklushosszú algoritmusok mennyi idő után fogják magukat ismételni.

Ciklusidő a következő mintavételi frekvenciák esetén:
Bit-ek száma Ciklushossz (szám) 10 kHz 100 kHz 1 MHz 100 MHz
16 65536 6,5 s 0,65 s 0,065 s 0,65 ms
31 2147483648 2,5 nap 6 óra 36 perc 21 s
32 4294967296 5 nap 12 óra 1,2 óra 43 s
48 2,8147E+14 893 év 89 év 8,9 év 4,7 hét
63 9,2234E+18 2,9E+07 év 2,9E+06 év 2,9E+05 év 292 év
64 1,8447E+19 5,9E+07 év 5,9E+06 év 5,9E+05 év 585 év
128 3,4028E+38 1,1E+27 év 1,1E+26 év 1,1E+25 év 1,1E+23 év

A táblázatból jól látható, hogy a rövid bitszámú véletlenszám-generátorok (32 bit és alatta), még egyszerű, jelgenerálási feladatokra sem használhatók igazán, hiszen nagyon könnyen kifuthatunk a rendelkezésre álló ciklusidőből. A 64 bit-es jelgenerátorok ciklusideje már a legtöbb feladatra elegendő. Ami korlát lehet, hogy számos generátor esetén (pl. az LCG-k esetén) az alacsonyabb helyértékű bit-ek ciklusideje már jóval kevesebb, pl. ha 32 bit-et használunk fel egy-egy 64 bit-es számból, akkor a legkisebb helyértékű bit ciklusideje már csak egy 33 bit-es generátorénak felel meg.

Szükség esetén rendelkezésre állnak sokkal nagyobb periódusidejű pszeudovéletlenszám-generátorok is, pl. a Mersene Twister (219937-1 szám), ezek implementálása viszont sokszor túlságosan sok erőforrást igényelhet.

Véletlen számok létrehozása: pzeudovéletlenszám-generátor

A számítógépek determinisztikusak, az általuk végzett műveletek mindig határozott, megjósolható eredményt adnak. Felmerülhet a kérdés, hogy akkor hogyan tudunk vele véletlen folyamatokat modellezni, véletlen számokat létrehozni. Bár számos fizikai folyamat is alkalmas valódi véletlen jelek létrehozására, ezeket pedig digitális számokká alakíthatjuk, e módszer általában túl lassan állítja elő a véletlen számokat ahhoz, hogy szimulációk és mérések számára felhasználhassuk. Éppen ezért az általánosan használt eljárás, hogy algoritmusok segítségével állítunk elő determinisztikus, de véletnennek tűnő számsorozatot. Ezeket az algoritmusokat hívjuk pszeudovéletlenszám-generátornak.

Mivel ezek a generátorok determinisztikusak, meg van az az előnyük, hogy bármikor reprodukálni tudjuk a korábban előállított jelet. Erre a jelgenerátor seed nevű kezdőparaméterét használhatjuk.

Természetesen vannak hátrányai is a pszeudovéletlenszám-generátoroknak. Az egyik, hogy a létrehozott számsornak van egy bizonyos ismétlődési ideje, ennek lejártakor a generátor már pontosan ugyanazt a számsorozatot adja vissza. Ennek oka, hogy a véletlenszám-generátorok meghatározott bitszámon tárolják el belső állapotukat, működésük során pedig előbb utóbb eljutnak egy olyan állapotba, amiben már tartózkodtak valamikor; ezt követően pedig elkezdik ismételni a legenerált számsorozatot. Például egy olyan véletlenszám-generátor ami 16 bit-en tárolja az adatait, legfeljebb 216 létrehozott számsorozatot tud előállítani ismétlés nélkül. Ha segítségével egy olyan zajgenerátort hozunk létre, mely 10 kHz-es mintavételi frekvenciával állít elő fehér zajt, az 6,5 másodperc után már ismétlődni fog, jelentősen korlátozva az alkalmazhatóságát.

A véletlenszám-generátor által létrehozott számsorban, az algoritmustól függően, különböző rövid és hosszú távú kapcsolatok, összefüggések lehetnek. Ezen összefüggések egyes szimulációk során akár hibás eredményre is vezethetnek, amennyiben a véletlenszám-generátor hibája pont torzítja a végeredmény statisztikáját. Ezért fontos, hogy alkalmazás előtt megismerjük véletlenszám-generátorunk tulajdonságait és korlátait.

A véletlenszám-generátorokat számos tesztnek vethetjük alá [1], vizsgálhatjuk a számok eloszlását, az egymás utáni elemek közötti korrelációt, a periódushosszt, a generátor megbízhatóságát jól megfogalmazott és ismert eredményű Monte-Carlo feladatokban. E mellett egy hasznos teszt a spektrálpróba, ahol a legenerált számsorozatból egy térbeli (vagy hipertérbeli ábrát) készítünk, ahol az egymás után legenerált számokból egy-egy pontot ábrázolunk. Ideális esetben ezek a pontok egyenletesen lefednék a teret. Valós esetben a pontok párhuzamos hipersíkokba rendeződnek. Az, hogy hanyadik dimenzióban jelennek meg a hipersíkok, illetve hogy milyen távolság van közöttük, a jelgenerátor típusától és paramétereitől függ. A következő ábrán a Fortran programozási RANDU függvény [2] térbeli eloszlását láthatjuk; már 3 dimenzióban is kialakulnak ezek a síkok. Ez azt jelenti, hogy ha pl. egy szimulációban 3 paramétert szeretnénk egymástól függetlenül változtatni, amennyiben ezzel a függvénnyel hoznánk létre őket, az szimuláció eredménye egyáltalán nem fog megfelelni a valóságnak, hiszen a paraméterek nem lesznek egymástól függetlenek.

A RANDU véletlenszámgenerátor térbeli eredménye

A RANDU véletlenszám-generátor által létrehozott pontok térbeli elhelyezkedése

Olyan pszeudovéletlenszám-generátor nincs, mely minden teszten átmenne, de a legtöbb manapság használt véletlenszám-generátor jól teljesít a tesztek nagy részében, és mindig találhatunk a feladatunkhoz leginkább megfelelő algoritmust.

[1] L’ECUYER, P: Testing random number generators. Proceedings of the 1992 Winter Simulation
Conference, (2002), 305–313. p.

[2] DONALD ERVIN KNUTH: A számítógép-programozás művészete 2. kötet (Szeminumerikus
algoritmusok). Budapest, 1987, Műszaki Könyvkiadó.

Szimulációk automatizált futtatása

Gyakori eset, hogy egy tudományos kérdés vizsgálatára számos szimulációt kell futtatni különböző paraméterekkel. A szimulációk egyenkénti futtatása nem a legkényelmesebb, hiszen egy-egy szimuláció órákig is eltarthat, és figyelni kell, mikor indíthatjuk a következőt. Jobb megoldás az automatizált végrehajtás, ekkor a szimulációk paraméterezését nem feltétlenül triviális úgy végrehajtani, hogy közben karbantartható maradjon a kód. Éppen ezért fejlesztettem ki egy olyan környezetet szimulációk automatizált futtatására, mely a korábban ismertetett paraméterezésen alapul.

Az egymás után futtatandó szimulációkat egyszerűen, egy táblázatban lehet paraméterezni, ahol az egymás utáni oszlopok tartalmazzák az egymás utáni paramétereket. A szimulációt végrehajtó VI-t dinamikusan lehet betölteni. A VI-nak megadott be és kimenetekkel (is) kell rendelkeznie ahhoz, hogy a rendszerbe integrálható legyen, a szimulációt végrehajtó kódba viszont csak néhány subVI-t kell beilleszteni. Ezzel a megoldással könnyű olyan szimulációkat írni, melyek futtatását a keretprogrammal kényelmesen végre lehet hajtani.

A környezet a következő fő funkciókkal rendelkezik:

  • Szimulációk egyszerű konfigurálhatósága
  • Munkakönyvtár meghatározása
  • Szimulációk dinamikus betöltése (a VI front panelje is követhető)
  • Hátralévő iterációk és idő előrejelzése
  • Félbehagyott szimulációk folytatása

A környezet továbbfejlesztését is tervezem többek között a következő funkciókkal:

  • Egy futtatás során különböző szimulációs VI-ok betöltése
  • Konfigurációs fájlok betöltése az egyes iterációkhoz
  • Szimulációk futtatása több gépen, párhuhamosan

A következő képeken bemutatok néhány képernyőképet és a feladatok végrehajtását VI-t.

Feladatok végrehajtása

Feladatok végrehajtása

A szimulációt végrehajtó VI front panelje futtatás közben

A szimulációt végrehajtó VI front panelje futtatás közben

A keretprogram diagramja

A keretprogram diagramja

A program még fejlesztés alatt áll, de kérésre bárkinek elküldöm a forrásokat.

Szimulációk paraméterezése LabVIEW-ban, karbantartható módon

LabVIEW szimulációk késztésekor gyakori probléma, hogy az egyes programokat, illetve subVI-kat folyamatosan bővítjük új funkciókkal, így nehéz egy olyan szimulációs környezetet létrehozni az adott problémára, mely jól átlátható és jól karbantartható.

Amennyiben nem használunk subVI-okat, akkor minden egyes új funkció hozzáadásával programunk egyre inkább hasonlítani fog egy spagetti VI-ra. Ezen a problémán a subVI-ok bevezetése sem fog önmagában segíteni, ugyanis egyre több paraméter kell az egyes subVI-okba bekötni. A paraméterek számának növekedését jól lehet kezelni clusterekkel. Amennyiben várható, hogy egy-egy ilyen clustert egynél több helyen használunk, azonnal célszerű belőle típusdefiníciót készíteni. Így a kódot később is jól karban tudjuk majd tartani, az egyes típusdefiníciókat ugyanis később át tudjuk szerkeszteni, a változást pedig a projekt összes VI-a köveni fogja.

A típusdefiníciók használata általában egy jól követhető és karbantartható kódot eredményez. Azonban, főleg szimulációk kötegelt futtatásánál, rengeteg paramétert kell jól kézben tarthatóan kezelni, erre pedig a sok-sok, beálltásokat tartalmazó cluster nem feltétlenül a legjobb megoldás. Számos próbálkozás után arra jutottam, hogy a legtöbb feladatot jól meg lehet oldani, hogy ha a paramétereket egy 2D táblázatban tárolom el. A táblázat első oszlopa tartalmazza a paraméterek nevét. A második oszloptól kezdve pedig az egyes iterációkban felhasználandó paraméterértékek vannak. Ha egy paraméter értéke nem változik, akkor annak értékét elég a második oszlopban feltűntetni. A következő ábrán egy példa látható a paraméterekre. A LoopCount határozza meg az iterációk számát. Az éppen változtatott paraméter az R-Wire, a többi paraméter állandó a szimuláció során.

Minta konfigurációs táblázatra

Minta konfigurációs táblázatra

A következő ábrákon a szimulációs program blokkdiagramja látható. Minden egyes iterációban egy-egy oszlop van kiválasztva a konfigurációs táblázatból, ez van átadva a szimulációt végző VI-nak. A konfigurációs beálltások minden egyes subVI-hoz eljutnak. Amennyiben egy új funkcióval bővül a szimuláció, elegendő csak a táblázatot módosítani, valamint az éppen érintett subVI-t.

Szimulációs program mely oszloponként olvassa ki a konfigurációs paramétereket

Szimulációs program mely oszloponként olvassa ki a konfigurációs paramétereket

Szimulációt végrehajtó subVI - 1 szint

Szimulációt végrehajtó subVI - 1. szint

Szimulációt végrehajtó subVI 2. szint

Szimulációt végrehajtó subVI 2. szint

Szimulációt végrehajtó subVI 3. szint

Szimulációt végrehajtó subVI 3. szint

A konfigurációs fájlok kezelésére egy saját függvénykönyvtárat késztettem, kérés esetén ezt szívesen rendelkezésre bocsájtom (jelenleg még szerkesztés alatt van). A konfigurációs adatok mentésére és betöltésére két lehetőség is van: maga a fő VI is felkészthető az adatok betöltésére és mentésére (főleg, ha egyéb ok miatt eleve szükség van eseményvezérelt programozásra), de egy külső VI-n keresztül is elérhetjük a konfigurációs táblázatot.

Konfigurációs táblázat szerkeztése

Segédprogram a konfigurációs táblázat szerkeztésére