Cast Clustera - przechowywanie konfiguracji przy zmianie str

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
piotrva
Posty: 3
Rejestracja: 15 sty 2016 00:14
Wersja środowiska: LabVIEW 2014

Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: piotrva »

Witam serdecznie,

Od razu przedstawię problem z jakim się borykam.
Otóż mamy dosyć sporą aplikację, komunikującą się ze sprzętem.
Konfiguracja sprzętu przechowywana jest jako Cluster, w którym znajdują się inne clustery, w nich konkretne pola (wartości liczbowe, enumy, tekst, uchwyty do sprzętu i inne). Konfiguracja taka (aby za każdym razem nie ustawiać wszystkich parametrów przy prowadzeniu serii pomiarów) musi być zapisywana do pliku.
Obecnie realizowane jest to na zasadzie takiej, że cluster jest zapisywany w postaci "binarnej" za pomocą funkcji Write Datalog i read Datalog.

Rozwiązanie ma to jednak pewną wadę - otóż aplikacja nasza zmienia się dosyć często - jakiś sprzęt jest dodawany, jakiś modyfikowany, jakiś permanentnie usuwany - pociąga to za sobą odpowiednie modyfikacje clustera z konfiguracją. No i niestety po takiej modyfikacji stary plik konfiguracyjny nie nadaje się do niczego...

I tu właśnie moje pytanie - jak w LabVIEW osiągnąć efekt taki, że:
Po wczytaniu danych konfiguracyjnych w jakimś formacie, jeśli dane pole istnieje w clusterze w programie to ma być ustawione na daną wartość, jeśli pole z pliku nie istnieje w clusterze to jest pomijane, jeśli w clusterze istnieje pole nie zawarte w pliku to ma zostać uzupełnione wartością domyślną.

Myślałem, że nada się do tego zapis w formacie json/XML (flatten to JSON/XML string), ale niestety bloczki w wersji 2015 nie obsługują ostatniego punktu - jeśli w clusterze jest pole nie opisane w pliku to funkcja nie zmienia wartości żadnych pól.

Czy macie pomysł jak osiągnąć taki efekt? Wiem, ze zawsze zostaje ręczne kodowanie i dekodowanie danych, ale wtedy dodając jakieś pole konfiguracyjne musimy prowadzić też modyfikacje systemu zapisu/odczytu konfiguracji. Tymczasem pożądaną rzeczą jest to, aby działało to względem rozszerzania programu jak najbardziej automatycznie.

Z góry dziękuję za wszelkie pomysły.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: aaddaas »

Niestety w LabView nie ma możliwości programowalnej zmiany rozmiaru clustera.
W Twoim przypadku najlepiej by było używać variant zamiast cluster. Przewaga Variant polega na tym, że może przyjmować jaką chcesz wartość, a każda "zmienna" powinna mieść ustawioną swoją własną etykietę.
Rozwiązanie to wymagałoby przerobienia całego programu (niestety), ale przy tak częstych zmianach programu to by było idealne rozwiązanie.
http://flylib.com/books/en/3.352.1.179/1/ Tutaj masz wstęp o variantach w razie czego
Obrazek
pawhan11
Posty: 67
Rejestracja: 21 wrz 2011 16:25
Wersja środowiska: LabVIEW 2012

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: pawhan11 »

Da się zrobić, najlepiej rozbić sobie tego clustera do pliku ini tak że będzie można zmieniać wartości w pliku a następnie odtworzyć tą strukturę z tych stringów.
Jest kilka modułów ttóre to robią tj MGi read/Write anything czy OpenG Variant config file.
Trzeba tylko dadać case że gdy dany element nie został znaleziony w ini to przepisz jego wartośc domyślną.

Idea działania odtwarzania struktury danych ze stringów jest mniej więcej taka:

Obrazek

Minusem tego podejścia jest to że tracimy atrybuty waveformów i variantów ale w praktyce nigdy ich sie nie ładuje do ini.
CLS - Certified LabVIEW Student
piotrva
Posty: 3
Rejestracja: 15 sty 2016 00:14
Wersja środowiska: LabVIEW 2014

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: piotrva »

A czy ostatnia metoda zadziała także dla zagnieżdżonych structów?
Ja wpadłem na pomysł, żeby napisać aplikację w C++, która na wejście otrzyma 2 dane w formie xml - jedną wczytaną z pliku, drugą wygenerowaną na podstawie aktualnego structa. Następnie w C++ bez problemu obrobię sobie dane porównując je po nazwie (czyli jak robimy unbundle by name np. Cluster.InnerCluster.Numeric to to będę traktować jako nazwę) i podmienię odpowiednie wartości w domyślnym XML a następnie jeszcze wygeneruję tekst informujący o tym co nie zostało wczytane.

Co sądzicie o takim podejściu? Wtedy C++ jako exe lub dll'ka.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: aaddaas »

pawhan11 pisze:Da się zrobić, najlepiej rozbić sobie tego clustera do pliku ini tak że będzie można zmieniać wartości w pliku a następnie odtworzyć tą strukturę z tych stringów.
Jest kilka modułów ttóre to robią tj MGi read/Write anything czy OpenG Variant config file.
Trzeba tylko dadać case że gdy dany element nie został znaleziony w ini to przepisz jego wartośc domyślną.

Idea działania odtwarzania struktury danych ze stringów jest mniej więcej taka:

Obrazek

Minusem tego podejścia jest to że tracimy atrybuty waveformów i variantów ale w praktyce nigdy ich sie nie ładuje do ini.
Ale jak chcesz zbudowac cluster? Mozesz odczytac wartsci poszczegolnych elementow, ale clustera nie zbudujesz. Albo mi sie tak wydaje.
Jesli zas ilosc elementow w clustrze jest stala,to jest kilka sposobow
Obrazek
piotrva
Posty: 3
Rejestracja: 15 sty 2016 00:14
Wersja środowiska: LabVIEW 2014

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: piotrva »

Właśnie ilość elementów clustera jak i ich typy są zmienne w czasie ewolucji programu.
pawhan11
Posty: 67
Rejestracja: 21 wrz 2011 16:25
Wersja środowiska: LabVIEW 2012

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

Post autor: pawhan11 »

Da się odtworzyć cluster bez problemów, type descriptor mówi typie wszystkich danych w strukturze. Zagnieżdżone struktury i tablice tez sie da rozłożyć i złożyć bez problemu tylko trzeba to rekurencyjnie robić albo jakąs kolejką.

Obrazek

To że klaser zmienia rozmiar nie ma znaczenia ponieważ lecisz po każdym elemencie. W OpenG jest funkcja Cluster to array of VData bodajże. W aplikacji podajesz typ danych które chcesz odtworzyć, jeżeli nie znajdziej jakiegoś elementu w pliku lub typ będzie nieodpowiedni to użyjesz wartości klastra z programu a nie z pliku do składania.
Przy ponownym zapisie do pliku typy i pola będa uaktualnione.
Proponuje powzorowac się na tych 2 modułach, tam jest z 90% zrobione.
CLS - Certified LabVIEW Student
ODPOWIEDZ