Strona 1 z 1

Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 15 sty 2016 00:39
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.

Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 15 sty 2016 10:52
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

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 15 sty 2016 21:38
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.

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 15 sty 2016 23:05
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.

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 15 sty 2016 23:48
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

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 16 sty 2016 00:31
autor: piotrva
Właśnie ilość elementów clustera jak i ich typy są zmienne w czasie ewolucji programu.

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str

: 16 sty 2016 09:55
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.