Timer OnDelay - szeregowanie zadań w programie

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
MTomczak
Posty: 5
Rejestracja: 22 cze 2015 18:04
Wersja środowiska: LabVIEW 2014

Timer OnDelay - szeregowanie zadań w programie

Post autor: MTomczak »

Witam!

Jestem w trakcie realizacji drobnego projektu, który bazuje na pomiarach ciśnienia.
Postaram się w prosty sposób opisać problem na którym utknąłem.

Po załączeniu przez użytkownika przycisku program rozpoczyna prostą regulację, jeśli w jej wyniku pomiar znajdzie się w ustalonym zakresie program powinien zakończyć regulację oraz przeskoczyć do momentu, gdzie przez 5 sekund badana jest wcześniej mechanicznie regulowana wartość. Jeśli w przeciągu tego czasu przekroczy ustalone granice, program powinien powrócić do punktu pierwszego i od nowa rozpocząć regulację, a następnie pomiar i tak w kółko.

Reasumując mam część programu odpowiedzialną za początkową regulację i późniejszy pomiar. Chciałbym zrobić coś w rodzaju Timera On Delay znanego ze sterowników PLC - dopóki poprawny będzie pomiar 2 ( w sensie true ) to ma odliczać czas. Jeśli zdoła odliczyć go do końca to element jest prawidłowy, jeśli nie to reguluje od nowa. Nie wiem jak wszystkie te elementy uszeregować programowo, żeby wiedziały jak mają działać + nie wiem jak uruchomić równolegle pomiar oraz odliczanie ( tak, aby w przypadku błędnej wartości przy pomiarze program przerwał pomiar jak i odliczanie i od nowa zaczął regulację).

Będę wdzięczny za wszelką pomoc.
Pozdrawiam MTomczak
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Re: Timer OnDelay - szeregowanie zadań w programie

Post autor: aaddaas »

Hej!
Problem, który opisujesz jest klasycznym przykładem zagadnienia wymaganego na certyfikat CLD;)
Wrzuciłem Ci snippeta z przykładowym wykorzystaniem bloczka elapsed time (ale możesz sobie zbudować swój własny timer). Przeciągnij go na swój BD i będziesz miał cały kod. Oczywiście wybór struktury programu zostawiam Tobie, przykład ma jedynie pomóc zobrazować sobie pomysł.
I oczywiście enum powinien być TypDefem!

http://zapodaj.net/b47f812bf523c.png.html
Obrazek
Zyga
Posty: 86
Rejestracja: 26 sty 2012 23:36
Wersja środowiska: LabVIEW 2011

Re: Timer OnDelay - szeregowanie zadań w programie

Post autor: Zyga »

Bardziej intuicyjnym rozwiązaniem dla programisty PLC będzie timer z załącznika. Możesz zaadoptować rozwiązanie aaddaas, co da Ci większą elastyczność.
Załączniki
Tmr.vi
2013
(15.05 KiB) Pobrany 457 razy
MTomczak
Posty: 5
Rejestracja: 22 cze 2015 18:04
Wersja środowiska: LabVIEW 2014

Timer OnDelay - szeregowanie zadań w programie

Post autor: MTomczak »

Dziękuję serdecznie za odpowiedź.
Pierwotnie zaadaptowałem pierwszy pomysł - działa prawidłowo. Serdecznie za niego dziękuje.
Druga propozycja także mnie zainteresowała, ale dopiero teraz zacznę ją testować.

Pojawił się nowy problem i postanowiłem opisać go tutaj.
Okazało się, że wcześniej opisywany przeze mnie test musi odbyć się dwukrotnie. Będą dwa czujniki, które wysyłają nam sygnał.
Postanowiłem więc w programie ( który dla jednej pętli działał dobrze ) dodać po prostu drugą pętlę.
LabVIEW wyrzuca problem w związku z ponownym wywołaniem bloku DAQAssistant ( w moim przypadku na obrazku nr 5 ), który ma pobierać dane za pomocą karty PCIE 6320.
Pojawia się problem błąd nr 50103. Czy idzie w jakiś sensowny sposób rozwiązać ten problem? Np poprzez pojedyncze wywołanie DAQ - jak tylko wtedy rozwiązać problem przepływu danych przez dość sporą ilość pętli. Wstawiam część kodu gdzie znajdują się te dwie pętle Będę bardzo wdzięczny za wszelkie podpowiedzi - gdyby problem był nie jasny postaram się go bardziej opisać.

Obrazek
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Timer OnDelay - szeregowanie zadań w programie

Post autor: aaddaas »

Trudno mi określić co z tym zrobić po tym wycinku kodu (chociaż już w kościach czuję wiele pętli while z kolejnymi pętlami while w środku). Najlepiej by było, gdybyś wrzucił swój kod (i polecam nauczyć się obsługi DAQmx bez ekspresów, ale to już inna kwestia).
Obrazek
MTomczak
Posty: 5
Rejestracja: 22 cze 2015 18:04
Wersja środowiska: LabVIEW 2014

Re: Timer OnDelay - szeregowanie zadań w programie

Post autor: MTomczak »

Wrzucam cały kod vi.
Czy możesz w takim razie polecić jakieś dobre źródło nauki o DAQ od podstaw ?
Załączniki
wt9.vi
(330 KiB) Pobrany 431 razy
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Timer OnDelay - szeregowanie zadań w programie

Post autor: Jamal79 »

Poszukaj na sieci. Jak lubisz sam eksperymentowac to kliknij Expres VIaja PPM i wybierz Open Front Panel. Przerobi ci go na normalnego subVIaja. Analizujac go zobaczysz, ze polowy zeczy nie potrzebujesz bo ExpresVI sa uniwersalne i dlatego zawieraja wiekszosc dostepnych opcji. Przez co zjadaja pamiec i inne resorsy. Dlatego jak zalezy ci na wydajnosci i plynnosci lepiej samemu budowac takie zeczy od podstaw...

A co do kodu...
Majac LV10 i wyzej masz dostep do templatow,
Nowy project => wybierz szablon. Sa dostepne nawet z DAQem. Jest to najlepszy sposob aby nauczyc sie dobrej architektury.
W twoim kodzie nawet niema Stopu!!!, domyslam; sie ze to z powodu podwojnej "architektury".
Brak jakiejkolwiek dokumentacji. Wiem z doswiadczenia ze nawet na taki dosc prosty kod bedziesz potrzebowal minimum 30 do 1h czasu aby przypomniec sobie "oco kaman"... Nie wspominam nawet opcji gdzie mialbys komu ten kod przeslac...

Zlych nawykow jest sie ciezko pozbyc...
Ostatnio zmieniony 24 cze 2015 12:44 przez Jamal79, łącznie zmieniany 1 raz.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Re: Timer OnDelay - szeregowanie zadań w programie

Post autor: aaddaas »

To co wyżej, plus szybkie wprowadzenie: Praca z DAQmx przeważnie zawiera się w etapach: inicjalizacja -> uruchamianie -> pomiar/zapis -> czyszczenie -> kończenie.

Najprostszym zobrazowaniem tej idei jest: http://i61.tinypic.com/1z1uy38.png

Jednak wygodniejszy, a do tego pozwalający na dalszą rozbudowę jest state machine (maszyna stanów), który pozwala na sterowanie kolejnymi etapami według uznania. Tutaj zobrazowanie idei: http://i60.tinypic.com/egwadu.png
Co jest istotne w tej architekturze?
-jedna pętla while (brak pętli w pętli)
-kończenie programu przyciskiem stop
-kończenie programu w pierwszej kolejności zatrzymuje pomiar, a później program (bezpieczne zamykanie).
-należy używać TypeDef dla enumów! (prawy przycisk - make typedef), ponieważ wraz z dodaniem lub usunięciem zawartości, zaktualizują się wszystkie jego kopie

Sama obsługa DAQmx ogranicza się do zdefiniowania parametrów pomiaru (można wybrać, czy to analogowe, czy cyfrowe wejście, jaki rodzaj pomiarów, jakie próbkowanie, zakres etc), rzecz jasna nie trzeba wszystkiego ustawiać - tutaj pozostaje już wiedza inżynierska.
Istotną kwestią jest możliwość pomiaru z wielu kanałów jednocześnie (multiple channels), co się dzieje w Twoim przypadku (zakładam, że drugi czujnik podłączony jest do tej samej karty), a następnie operowanie na wynikach w tablicy, lub waveformach.

Jeśli chodzi o sterowanie logiką (bo po to były Twoje DAQmx express cyfrowe?), to możesz zrobić kolejny shift register w tej samej pętli pod spodem i użyć już gotowej architektury.

A na koniec takie rady na przyszłość: staraj się utrzymać kod w obrębie jednego monitora, bądź w takim układzie, by wymagane było scrollowanie tylko i wyłącznie na jednym kierunku. Dokumentacja kodu, używanie subVI i prowadzenie prostych kabli (dla czytelności)

Help w LabVIEW jest bardzo dobrze zrobiony, więc tam też znajdziesz dużo pomocy.

Pozdrawiam!
Obrazek
MTomczak
Posty: 5
Rejestracja: 22 cze 2015 18:04
Wersja środowiska: LabVIEW 2014

Timer OnDelay - szeregowanie zadań w programie

Post autor: MTomczak »

Czy mógłbym poprosić o jaśniejsze i bardziej rozbudowane rady co do użycia danych pobranych przez DAQ w drugiej pętli? Czy mogę wykorzystać jakąś tablicę danych, tak, żeby odwoływać się do niej w różnych częściach programu? Program dla jednego testu działa prawidłowo - teraz chciałbym drugi test i nie wiem właśnie jak przerzucić te dane.

Niestety, ale nie mam teraz czasu na naukę DAQ od podstaw w tym projekcie. Wiem, że będe musiał to zrobić dla efektywnej pracy, ale nie mogę zrobić tego teraz. Ale bardzo dziękuję za rady, bo zdaje sobię teraz sprawę z możliwości jakie daje osobiste podjeście do pobierania danych, a nie korzystanie z funkcji express :)
Jamal79
Posty: 289
Rejestracja: 01 maja 2012 14:14
Wersja środowiska: LabVIEW 2012
Lokalizacja: Farum

Timer OnDelay - szeregowanie zadań w programie

Post autor: Jamal79 »

Jasniej??
Robisz maszyna stanow.
W pierwszym stanie inicjujesz DAXa
W kolejnym ze stanow pobierasz dane.
Wnastepnych ze stanow obrabiasz dane, zapisujesz i takie tam.
W ostatnim uwalniasz DAXa.

Tak mniej wiecej w przypadku maszyny stanow. Z wykozystaniem kolejek troche inaczej to wyglada....

Do przezycania danych pomiedzy stanami uzywamy shift registra, Cluster bedzie odpowiednim nosnikiem w twoim przypadku.
Uzyj szablonu dostepnego w lv...
ODPOWIEDZ