Problem z maszyną stanów w szablonie Producer/Consumer

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
czaro05
Posty: 8
Rejestracja: 08 lis 2014 22:30
Wersja środowiska: LabVIEW 2013

Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: czaro05 »

Witam,
jestem początkującym użytkownikiem Labview. Mam stworzyć program symulujący drukowanie. Chcę, żeby to działało tak, że po wybraniu liczby stron i jakości i zatwierdzeniu ich przyciskiem drukuj program wysłał do kolejki informację o ww, a następnie, żeby Consumer (maszyna stanu - czeka; przygotowuje do "drukowania"; "drukuje" - wyświetla numer strony w określonym tempie) "drukował". Program na razie nie jest gotowy, ale czy ktoś mógłby mi powiedzieć dlaczego maszyna stanu nie zawsze wraca do stanu Waiting (świeci się inna dioda) w przypadku braku oczekujących poleceń drukowania? Proszę szybko klikać przycisk drukuj, aby zdążyć dodać polecenia "drukowania". Przepraszam jeśli źle wybrałem dział.
Pozdrawiam
Załączniki
PKvidrukarka.vi
(26.23 KiB) Pobrany 386 razy
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: aaddaas »

Cześć!
Odnosząc się do Twojego problemu: Masz przede wszystkim źle skonstruowaną strukturę w pętli consumer. Za każdym obiegiem pobierasz jeden "plik" z kolejki, czyli na inicjalizację odpada Ci jeden plik, na drukowanie trzeci, na czekanie czwarty, na inicjalizację piąty i tak w koło macieju. Zatem to, czy po skończeniu świeci się inna dioda niż drukowanie, to już zwykły przypadek;) Przyglądnij się jak jest skonstruowana struktura P-C w templejtach. W razie kolejnych pytań - pisz;)
Obrazek
Awatar użytkownika
J.Sz
Posty: 34
Rejestracja: 09 sty 2014 11:31
Wersja środowiska: LabVIEW 2014
Lokalizacja: Gliwice

Re: Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: J.Sz »

Dlaczego nie działa:
  1. 1 Pętla się nie kręci, bo masz ustawiony nieskończony timeout w dequeue element.
    2 Jak się coś pojawi dane idą w ...., bo jesteś w stanie waiting, a tam do kabla z danymi z klastra nie masz nic podpiętego.
    3 Nr stron się nie zmieniają, bo dałeś numeric 2 poza pętle, czyli dostaniesz tylko ostatnią wartość.
    4 czytałeś dane z kolejki a potem sprawdzałeś czy coś w niej jest
w załączniku masz to trochę poprawione. plik lv 2012
Hinty:

Używaj narzędzi debugowych jak żarówka (highlight execution).

Nie używaj 2 stopów w jednym vi zrób sobie np zmienną lokalną lub property node zwracający value do drugiej petli, możesz też dodać wartość stop do klastra z danymi

Podpisuj kontrolki w klastrze (prawy przycisk myszki label) w sumie to podpisuj wszystko, nie zostawiaj domyślnych nazw.

Z enumów zrób sobie type definition, jak będziesz miał coś zmienić/ dodać to nie będziesz musiał wszystkiego przeklikiwać.
Załączniki
PKvidrukarka (1).vi
(19.13 KiB) Pobrany 365 razy
Ja tu tylko wklejam linki ale i tak możesz kliknąć pochwal ;)
czaro05
Posty: 8
Rejestracja: 08 lis 2014 22:30
Wersja środowiska: LabVIEW 2013

Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: czaro05 »

aaddaas, J.Sz,
Bardzo dziękuję za wyjaśnienia i rady oraz J.Sz, za poprawnie wykonany program.
Przeanalizowałem i rozumiem dlaczego nie działało i dlaczego działa. Do Hintów się zastosuję.
Pozdrawiam :)
PawelR
Posty: 38
Rejestracja: 03 sie 2014 16:12
Wersja środowiska: LabVIEW 2013

Re: Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: PawelR »

Jeszcze jedna wskazówka: pilnuj porządku w kodzie! W LabVIEW to bardzo ważne, bo ułatwia (w skrajnym wypadku: umożliwia) ogarnięcie, co program robi.
Staraj się trzymać kolejność "z lewej na prawą" - w jednym miejscu dałeś z lewej strony wyświetlacz od bloczka umieszczonego z prawej strony (chyba klaster "Elements").
Unikaj długich kabli i raczej ich nie załamuj. Często czyść je (poleceniem "Clean up wire").
Pomocna bywa miotełka czyszcząca cały kod (lub zaznaczony fragment), ale po jej użyciu możesz nie poznać swojego programu :) Ja wolę sprzątać ręcznie, ale to tylko moje (nie najlepsze) przyzwyczajenie. Zresztą - zawsze jest ctrl+Z :)
Nie rozciągaj schematu nadmiernie! Maszyna stanów (czyli "konsument") bardzo to ułatwia. Ogólnie kod powinien mieścić się na ekranie. Jak Ci się coś nie mieści, zamknij w subVI'u.

I na koniec: wyobraź sobie, że wracasz do pisania programu po dwutygodniowym urlopie albo po pół roku, bo "coś źle działa". Nad pogmatwanym kodem możesz spędzić dobrą chwilę przypominając sobie, "co do czego".

Żeby nie być gołosłownym, posiedziałem chwilkę nad Twoim kodem i trochę uprzątnąłem. Dużo jeszcze można poprawić, ale już powinieneś widzieć różnicę.

Pozdrawiam
Paweł
Załączniki
PKvidrukarka_sprzatniete.vi
(27.08 KiB) Pobrany 364 razy
Pomogłem? Kliknij "Pochwal" :)
czaro05
Posty: 8
Rejestracja: 08 lis 2014 22:30
Wersja środowiska: LabVIEW 2013

Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: czaro05 »

Dzięki za wskazówkę. Nie mogę otworzyć programu, masz nowszą wersję.
Pozdrawiam
Awatar użytkownika
semper fidelis
Posty: 74
Rejestracja: 28 paź 2014 20:45
Wersja środowiska: LabVIEW 2013

Re: Problem z maszyną stanów w szablonie Producer/Consumer

Post autor: semper fidelis »

Plik PawelR zapisany do 2012.
Załączniki
PKvidrukarka_sprzatniete.vi
(18.88 KiB) Pobrany 372 razy
Gdy wszyscy wiedzą, że coś jest niemożliwe, przychodzi ktoś, kto o tym nie wie, i to robi...
ODPOWIEDZ