Reply
This is an open group. Sign in and click the "Join Group" button to become a group member and start posting.
Highlighted

Přenos dat mezi RT a PC

Zdravím, nemohl by někdo poradit, s přenosem dat mezi RT (RealTarget) a PC?

Potřebuji na RT sbírat data na 5kHz ty data si chci zobrazovat na PC a zároveň je uládat do souboru.

Zobrazení dat v grafu je asi v pohodě. Vytvořím na RT Shared Variable (nazvavá třeba Temp) s RT FOFO typu SingleElement a tím pádem v ní budu mít uloženou vždy jen poslední hodnotu. Na PC (My Computer) si udělám cyklus třeba 50ms a vždy přečtu Temp hodnotu zobrazím na Chart. Funguje bez problémů.

Pak ale potřebuji všechny data uložit do souboru a chci ho mít na PC (můžu sice na RT,mám myRIO, připojit flasku, ale nechci :-) ). Jak posílat všechny data do PC když nevím, jak dlouho mi bude trvat zápis? Zkoušel jsem to hledat, ale v Examplech je to řešeno většinou tak, že se vytvoří FIFO na RT, na PC je pak dvojitý cyklus. Vnější je hlavní a vnitřní cyklus, který běží bez zpoždění a vždy přečte všechny hodnoty z FIFO (vyprázdní ji). To sice asi funguje, ale nejsem si jistý, zda by to bude fungovat i pokud bych data zapisoval na disk dlouhodobě.

Viz. \LabVIEW 2014\examples\Real-Time Module\RT Communication

Neexistuje nějaký elegantnější způsob? Např. něco jako v DAQmx, kdy přenáším naměřená data v buferech, vždy např. 1s? 

Napadlo mě si na PC číst data do queue, a v druhém cyklu je zapisovat (Producer Consumer pattern), ale to mi přijde zbytečně komplikované.

Díky za nápady.

Pepa

0 Kudos
Message 1 of 5
(5,975 Views)
4 REPLIES

Re: Přenos dat mezi RT a PC

Mně to přijde celkem elegantní řešení :-) FIFO vám umožní přenášet víc data najednou a když to v Hostu (PC) budete strkat do fronty, tak zajistíte, že se vám data neztratí a také nezpřehází, když je budete ukládat po delší dobu. To že Vám tam pofrčí víc smyček (GUI, logging, processing, ....) resp. procesů, které budete muset nějak synchronizovat (producer/consumer) je prostě nutnost...

Ale neříkám, že jsem na RT expert. Prostě mi to Vaše řešení přijde ok...

0 Kudos
Message 2 of 5
(3,584 Views)

Re: Přenos dat mezi RT a PC

Je niekolko moznosti, ako prenasat data po sieti: vid Data Communication Methods in LabVIEW.

Asi najjednoduchsie je vyuzit priamo Shared Variable, tak ako to mas teraz. Akurat je treba zapnut aj network buffering. Tu je o tom viac: Using the LabVIEW Shared Variables. Pre mensie objemy dat, ako v tomto pripade je to celkom elegantne a jednoduche riesenie.

Relativne jednoducho sa tiez konfiguruje network stream. Ten je viac optimalizovany na vykon:

Teoria: Lossless Communication with Network Streams: Components, Architecture, and Performance

Priklad: Using Network Streams for Data Transfer in Real-time Applications

Martin

Certified-LabVIEW-Developer_rgb.jpg

0 Kudos
Message 3 of 5
(3,584 Views)

Re: Přenos dat mezi RT a PC

Děkuji za nápady. Trochu jsem si s tím hrál a mám výsedek je následující:

project.jpg

pc_main.vi

pc_main_all.jpg

RT_main.vi

RT_main.jpg

Používám Shared Variable.

Temp most recent - RT FIFO - Single Element (+ Network buffering)

Temp buffered - RT FIFO Multi-element (+Network buffering)

A00, AO1 používám jako zdroj signálu pro testování.

V programu jsou 3 cykly. První zobrazuje data v grafu z nastavitelnám krokem. Druhá ukládá data do fronty ve třetím se data z fromty ukládají do souboru. Tváří se, že to funguje dobře, ale úplně se mi to nelíbí. Asi by to chtělo data posílat po dávkách a ne po jedné hodnodě.

Dále pak sem mi zobrazuje Warning -2220 "The variable RT FIFO read buffer is empty" a nejsem si jistý proč.

Neví někdo, zda Shared Variable s RT FIFO funguje skutečně jako FIFO? Tedy, zda po přečtení proměnné je poslední přečtená hodnota smazána? Zatím mi to tak nepřijde, proto testuji rozdíl v timestamp na výstupu ze Shared Variable.

Může Warning souviset s ukončováním programu - současně RT i PC? Pokud ano, jak to napsat "správně".

A předem děkuji za připomínky k programu.

P.

0 Kudos
Message 4 of 5
(3,584 Views)

Re: Přenos dat mezi RT a PC

1) Buffered Network Shared Variable funguje skutocne ako prenos pomocou FIFO. Je to popisane v tom dokumente Using the LabVIEW Shared Variables. Jedina hodnota, ktora nie je zmazana je posledna hodnota, avsak potom SV Engine vrati chybu/warning

2) Warning -2220 idikuje, ze na RT systeme sa snazis vycitat data, ale RT FIFO je prazdne. Typicke dovody: data sa vycitaju rychlejsie ako sa zapisuju, alebo sa uz vycitali vsetky potrebne data, ale program bezi dalej. Ziadnu zahadu nad touto hlaskou nie je treba hladat, ide iba o informaciu ze FIFO je prazdne. Ak sa nemylim, zdielana premenna aj tak vrati poslednu hodnotu (tu si nie som isty). (vid Real-Time Shared Variable Error Codes)

3) To co robis pomocou porovnavania timestampu je spravne. Moze sa to myslim tiez robit tym, ze skorntrolujes Error Code. Ak dostanes "Error 180121602", tak Shared Variable neobsahuje nove data, a vsetko uz bolo precitane. Zdielana premenna vrati poslednu znamu hodnotu (vid Shared Variable Error Codes)

Ak sa nemylim, tak cela sietova komunikacia je do podrobna prebrana v kurze LabVIEW Real Time 1 alebo 2 (nie som si isty). Skola ma tieto kurzy k dizpozicii cez Web nahravky: ni.com/self-paced-training.

Martin

Certified-LabVIEW-Developer_rgb.jpg

0 Kudos
Message 5 of 5
(3,584 Views)
Reply
This is an open group. Sign in and click the "Join Group" button to become a group member and start posting.