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
Cast Clustera - przechowywanie konfiguracji przy zmianie str
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
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
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:

Minusem tego podejścia jest to że tracimy atrybuty waveformów i variantów ale w praktyce nigdy ich sie nie ładuje do ini.
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:

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
Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str
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.
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
Ale jak chcesz zbudowac cluster? Mozesz odczytac wartsci poszczegolnych elementow, ale clustera nie zbudujesz. Albo mi sie tak wydaje.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:
Minusem tego podejścia jest to że tracimy atrybuty waveformów i variantów ale w praktyce nigdy ich sie nie ładuje do ini.
Jesli zas ilosc elementow w clustrze jest stala,to jest kilka sposobow

Re: Cast Clustera - przechowywanie konfiguracji przy zmianie str
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
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ą.

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.

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