Dodawanie czasu do danych

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Dodawanie czasu do danych

Post autor: xamrex »

Witam,
Mierze temperaturę i dane przychodzą mi za pomocą RS485 (MODBUS).
Zrobiłem sobie pętlę while i co 5 sekund jest dokonywany odbierana temperatura, ktora potem jest dodawana do tablicy po to, aby wyświetlić ja na Wykresie.(temperatura jest dzielona przez 10, bo urządzenie z którego odczytuje temperaturę właśnie w taki sposób ją wysyła)
Chciałbym móc mieć możliwość zapisu tych wyników pomiarów (teoretycznie już to zrobiłem, bo są zapisywane wyniki do pliku) ale chcę jeszcze dodać DATĘ I CZAS kiedy był wykonany pomiar.
I mam tutaj problem.
Najlepiej byłoby, aby na grafie na skali x również był wyświetlany czas w którym dokonano pomiar (bo teraz jest tylko numer pomiaru czyli 1,2,3,...itd.)
Jak tego dokonać

Obrazek Obrazek

Tutaj można pobrac bibliotekę do MODBUSA:
http://zone.ni.com/devzone/cda/epd/p/id/4756

w załączniku mój VI

Wydaje mi się że najlepiej jest zrobić tablicę.
Np pierwsza kolumna to byłaby ID (int)
druga to czas(string)
i trzecia to wynik (double)
Załączniki
Piecv5-data.vi
VI
(33.48 KiB) Pobrany 446 razy
Awatar użytkownika
cyjan1
Posty: 63
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2017
Lokalizacja: podkarpacie

Re: Dodawanie czasu do danych

Post autor: cyjan1 »

Witam,

Odnośnie wykresu z czasem, najlepiej to zrobić przy pomocy XY Graph. Z każdego pomiaru tworzysz klaster składający się z daty i danej a z takich klastrów tworzysz tablicę którą podpinasz na wejście XY Graph.

Natomiast dane do pliku można chyba zapisywać w każdej pętli. Przekonwertuj wszystkie zmienne, które chcesz zapisać na String, następnie stwórz z nich tablicę. Tablicę podaj na wejście funkcji Write To Spreadsheet File. Należy pamiętać by ustawić dopisywanie do pliku a nie tworzenie nowego (append to file? == true).
Przed pętlą warto pomyśleć o 'nagłówku' pliku.

Funkcjonalność proponowanych rozwiązań myślę, że oddaje poniższy obrazek:
wykres i zapis do pliku.png
Pozdrawiam
Zenek
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Dodawanie czasu do danych

Post autor: xamrex »

Dzięki ;)
Będę jutro w pracy to sobie to obadam :)
Mam jeszcze jeden problem :)
Bo ty do tego Bundle dodajesz TYP Timestamp oraz Double
Niestety ja mam ten mój wynik w tabicy...
W jaki sposób mogę go przekonwertować tak aby dało się te dane umieścić na XYChart?
Wystarczy Index Array?
Obrazek

I w jaki sposób utworzyłeś te LP DATA oraz POMIAR jeśli ja kliknę na 1D Data i Create Constant to nie dostaję stringa ;/
Ostatnio zmieniony 06 lis 2013 19:57 przez xamrex, łącznie zmieniany 2 razy.
Awatar użytkownika
cyjan1
Posty: 63
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2017
Lokalizacja: podkarpacie

Re: Dodawanie czasu do danych

Post autor: cyjan1 »

xamrex pisze: I w jaki sposób utworzyłeś te LP DATA oraz POMIAR jeśli ja kliknę na 1D Data i Create Constant to nie dostaję stringa ;/
Funkcja Write To Spreadsheet File jest polimorficzna tzn. może przyjmować na wejściu dane różnego typu. Domyślnie dla tej funkcji tablice wejściowe są typu Double. Żeby były one typu String możesz:
a) Stworzyć tablicę 1D typu String i podpiąć pod wejście tej VI - funkcja automatycznie się 'przełączy' na String. Tablicę taką ja najczęściej robię tak: tworzę String Constant oraz Array Constant a potem przeciągam String Constant do wnętrza Array Constant.
b) Wykonać: prawy przycisk myszy na funkcji -> Visible Items -> zaznaczyć Polymorphic VI Selector, następnie wybrać String z pola wyboru pod ikonką. Teraz możesz utworzyć tablicę tak jak to robiłeś (Create Constant).
Mam jeszcze jeden problem :)
Bo ty do tego Bundle dodajesz TYP Timestamp oraz Double
Niestety ja mam ten mój wynik w tabicy...
Faktycznie nie zauważyłem że z Read Input Registers dostajesz tablicę. Jeśli interesującą Cię temperaturę masz na jednej pozycji w tej tablicy to faktycznie Index Array pomoże Ci tą temperaturę wyciągnąć.
Ale jeśli masz w tej tablicy kilka pomiarów to, albo robisz średnią z nich i wrzucasz wynik na wejście Double funkcji Bundle, albo dla każdej próbki próbujesz jakoś wygenerować TimeStamp (jak?) i wszystkie próbki dodajesz do wykresu.
Pozdrawiam
Zenek
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Re: Dodawanie czasu do danych

Post autor: xamrex »

Cyjan1
Stokrotne dzięki :)

Teraz mam wszystko tak jak chce.
Mam jeszcze jedną (ostatnią) prośbę.
Bo tych termoregulatorów, z których odczytuję temperaturę mam 2.
Oba mają inne adresy.

I teraz jeśli się by dało, chciałbym mieć możliwość wyświetlania grafu i zapisu danych z obu tych czujników.

Musiałbym tak to zrobić, że z jednogo jest robiony pomiar i zapisywane są dane, potem z drugiego.. i tak w kółko..
W jaki sposób to rozwiązać?
Obrazek Obrazek Obrazek
Załączniki
Lodowkav6Final.vi
lodowka
(45.92 KiB) Pobrany 423 razy
Piecv6Final.vi
piec
(45.16 KiB) Pobrany 420 razy
Awatar użytkownika
cyjan1
Posty: 63
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2017
Lokalizacja: podkarpacie

Re: Dodawanie czasu do danych

Post autor: cyjan1 »

Dać się da :)

Jeśli czasy pomiędzy pomiarami w obu przypadkach są takie same to zrobiłbym to to na jednej pętli. Wyświetlanie na wykresie i zapis do pliku też może być wtedy wspólny.

Przerzuć inicjację i pobieranie danych do wspólnej pętli.
Z dodaniem drugiej danej do pliku sobie poradzisz (dodatkowa zmienna na Build Array + roszczerzenie Array Constant dla 'nagłówka' pliku).
Odnośnie wykresu to myślę, że koncepcję połączeń tłumaczy taki obrazek:
wykres.png
wykres.png (26.72 KiB) Przejrzano 17465 razy
Natomiast jeśli czasy pomiędzy pomiarami miałyby być różne to sytuacja trochę się komplikuje ale nie jakoś tragicznie. :) Myślę, że wtedy rozwiązaniem byłyby dwie niezależne pętle.
Pozdrawiam
Zenek
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Dodawanie czasu do danych

Post autor: Jamal79 »

Modbus jest dosc szczegolny, i chyba niemozna wyslac zapytania jednoczesnie do dwoch roznych adresow.
Termoregulatory tez maja jakies opoznienie i stala czasowa.
Wydaje mi sie, ze najlepiej jakbys zrobil maszyne stanow. Na poczatku zainicjowal port, odczyt 1 danej, odczyt 2 danej i zapis.
Jezeli dane chcesz odczytywac i zapisywac dokladnie co 5 sec zrobil bym kolejke i osobny mechanizm do akwizycji i osobny do zapisu lub/i wyswietlania danych.
laradek
Posty: 47
Rejestracja: 06 kwie 2013 18:25
Wersja środowiska: LabVIEW 2012

Re: Dodawanie czasu do danych

Post autor: laradek »

proponuje żebyś się jeszcze zastanowił dobrze jak często mierzyć temperaturę. moim zdaniem w lodówce nie zmienia się ona aż tak szybko. hmm, a może jak ją otworzysz to rzeczywiście musisz mierzyć co dwie sekundy :-? :) poza tym prawdopodobnie opóźnienia wynikające z czytania wartości po modbusie z dwóch urządzeń są dla Ciebie pomijalne. częstotliwość pomiaru powinna wynikać z tego co chcesz zaobserwować na wykresie lub ewentualnie z instrukcji testu :)

pozdrawiam
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Re: Dodawanie czasu do danych

Post autor: xamrex »

laradek musi być odczyt co ok 2 sekundy.
Uważam, że nie jest to ani jakoś specjalnie szybko, ani wolno.
A musi dlatego, że będzie w tej zamrażarce badane urządzenie.
I musi być rejestrowana temperatura..

Myślałem, że wszystko już opanowałem,
Ale pojawił się pewien błąd, którego rozgryźć nie potrafię.

Mianowicie po upływie około 50 minut program albo pokazuje mi wartość temperatury 65535
Albo czasami wyświetla błąd 6101.

Aby znowu zaczął działać poprawnie, muszę wyciągnąć przejściówkę USB->Rs485 z portu USB, a następnie włożyć ponownie i ponownie uruchomić mój VI.
Przeczytałem od razu te informacje:
http://digital.ni.com/public.nsf/allkb/ ... D700349D99
Z których wynika, że mogą występować zakłócenia.
Ale co do tych zakłóceń jestem prawie pewny, że ich nie ma (jest do tego termoregulatora inne oprogramowanie, które wyświetla temperaturę i ten program dostarczony z termoregulatorem potrafi działać cały dzień i nic mu nie ma)

Ograniczyłem schemat do minimum:
Obrazek
Lecz to nie pomogło..

W Internecie jest dużo informacji właśnie o tym błędzie MODBUSA 6101, ale nigdzie nie potrafię znaleźć konkretów jak sobie z tym błędem poradzić.
Nie mam pojęcia dlaczego po kilkudziesięciu minutach dostaję ten błąd..

Może po prostu jest coś z przejściówką USB->RS485?
No nie wiem po prostu co dalej z tym problemem zrobić.
Proszę o pomoc :))
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Re: Dodawanie czasu do danych

Post autor: xamrex »

Okazało się, że był problem z portem USB z przodu PC :)
Podpiąłem przejściówkę do tyłu i działa elegancko.

Chciałbym jeszcze zrobić kontrolkę, która będzie wyświetlała średnią.
Udało mi się to zrobić, ale nie jest to chyba do końca 'poprawne ze sztuką'
Obrazek

Bo stworzyłem sobie rejestr przesuwny. i teraz wynik dodaję do tablicy. no i ładnie da się z tego policzyć średnią za pomocą mean.

Jednak wolałbym wziąć te dane z clustra, który zawiera 2 elemety (datę i właśnie ten pomiar)
Ale jak próbuje zrobić UNBUNDLE to program sie sypie ;/
Obrazek
Awatar użytkownika
cyjan1
Posty: 63
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2017
Lokalizacja: podkarpacie

Re: Dodawanie czasu do danych

Post autor: cyjan1 »

Według mnie pomysł z rejestrem przesuwnym nie jest zły. Wyciąganie danych z tablicy klastrów to tylko niepotrzebna operacja, skoro dane te masz już w pętli.
Możesz też użyć funkcji Mean PtByPt.vi, dzięki której nie będziesz musiał tworzyć tablicy danych ani rejestru przesuwnego (robi to ta VI). Na wyjściu podajesz tylko kolejną próbkę.
Acha - i pamiętaj żeby w pierwszej iteracji pętli zresetować funkcję (dla i=0 ustaw wejście initialize na true). Zwróć też uwagę na wejście sample length. Jeśli podasz na nie 0 to funkcja liczy średnią ze wszystkich próbek od momentu inicjalizacji, natomiast dla dowolnego n - wówczas liczy średnią z n ostatnich próbek.

Natomiast gdybyś pozostawał przy swoim pomyśle, to wypadałoby jeszcze przed pętlą podpiąć pustą tabelę do rejestru przesuwnego - przy każdym uruchomieniu programu wyczyści Ci rejestr (w Twojej wersji rejestr 'pamięta' dane z poprzednich uruchomień).
Pozdrawiam
Zenek
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Re: Dodawanie czasu do danych

Post autor: xamrex »

Ok,
Wielkie dzięki za dotychczasową pomoc :-)
Już jestem prawie na końcu :-)

Zrobiłem sobie banalnie prostą maszynę stanów
0)inicjalizajca

1)Odczyt z lodówki
2)Zapis danych do lodówki(np. ustawienie żądanej temp)
3)Odczyt z pieca
4)Zapis danych do pieca

No i prawie że wszystko hula.
Mam problem tak jak pisałeś z tą średnią (używam Mean ptbypt, ale nie mogę ustawić wejścia initialize na true, gdyż za każdym 'przelotem' ona się inicjalizuje.
Identyczny problem mam z Wyświetlaniem danych na grafie.

Obrazek
Obrazek
Muszę w jakiś sposób utworzyć tą wartość początkową w sekcji INIT, żeby za każdym razem po wciśnięciu przycisku PLAY program liczył od początku(od 0)
bo teraz jak nie mam tej stałej, to program 'wykreśla na wykresie' kolejne dane a nie od początku :((
Tak samo jest ze średnią :-(
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Dodawanie czasu do danych

Post autor: Jamal79 »

Unbundle/bundle sie sypie bo musisz bezposrednio podpiac do clustra. (bez build arraya)

Jak chcesz aby program liczyl od poczatku, to musisz podpiac pusty array/cluster przed loopem.

PS. masz tam sporo loopow.

Tak na szybko zrobilem takie cudo...
Załączniki
cluster.png
xamrex
Posty: 30
Rejestracja: 21 paź 2013 18:54
Wersja środowiska: LabVIEW 8.5

Re: Dodawanie czasu do danych

Post autor: xamrex »

Jamal79 pisze:Jak chcesz aby program liczyl od poczatku, to musisz podpiac pusty array/cluster przed loopem.
No jak do Shift registr'a podepnę z lewej strony cokolwiek, to za każdym razem on się tym inicjuje.
Gdy z lewej stron utowrzę CONST to za każdym razem dostaję 0.

Już to może zostawię.
Programik działa elegancko ;-) (muszę tylko pamiętać, żeby go zamykać i otwierać na nowo za każdym razem :D )
Dzięki za pomoc wszystkim :-)
ODPOWIEDZ