Projekt z LabVIEW

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Serqq
Posty: 9
Rejestracja: 02 sty 2015 17:28
Wersja środowiska: LabVIEW 2014

Re: Projekt z LabVIEW

Post autor: Serqq » 09 sty 2015 13:44

2013

Awatar użytkownika
J.Sz
Posty: 34
Rejestracja: 09 sty 2014 11:31
Wersja środowiska: LabVIEW 2014
Lokalizacja: Gliwice

Re: Projekt z LabVIEW

Post autor: J.Sz » 10 sty 2015 12:31

Uruchom sobie program w highlight execution (żarówka w górnej części okna), a zobaczysz gdzie masz błąd.
Twój program działa mniej więcej tak:
Przycisk losuj nie robi nic.
1 Program wchodzi do pętli while runda jest 0, czyli mniejsza od 3.
2 Zaczyna mieszać kostkami pętla while wykona się 30 razy po czym niezależnie, czy naklikałeś OK1-5, czy nie program wychodzi z pętli, a runda jest iterowana.
3 Następuje obrót pętli runda 1 czyli mniejsza od 3. przechodzi do pkt 2
4 Następuje obrót pętli runda 2 czyli mniejsza od 3. przechodzi do pkt 2
5 Następuje obrót pętli runda 3 nie jest mniejsza 3. przechodzi do pkt 6
6 Wszystkie zmienne są resetowane i jest wyświetlany komunikat następnie program leci do kroku 1
Nie jest to mega zgrabnie napisane ale widać, że program się nie przerywa losowania, nie ma stanu bezczynności/ oczekiwania aż znów naciśniesz przycisk losuj i nie czeka aż zatrzymasz/ wylosujesz wszystkie kostki ok1-5.

Zrób sobie jakąś prostą maszynę stanów możesz użyć też event structure do obsługi przycisków.
Maszyna stanów http://www.ni.com/white-paper/7595/en/
Event Structure http://zone.ni.com/reference/en-XX/help ... structure/
Poszukaj też sobie czegoś na YouTube lub w examplach LabVIEW. (W oknie programu Help-> Find Examples)
Ja tu tylko wklejam linki ale i tak możesz kliknąć pochwal ;)

Serqq
Posty: 9
Rejestracja: 02 sty 2015 17:28
Wersja środowiska: LabVIEW 2014

Projekt z LabVIEW

Post autor: Serqq » 10 sty 2015 19:34

Dzięki :)
Wybrałem event structure, bo nie miałem za bardzo pomysłu jak zabrać się za tą maszynę stanu
miałem jeszcze jeden problem z event structure, ale okazało się to łatwe w wykorzystaniu (na filmikach jakieś dziwne opcje były)

@edit. Witam. Jest możliwość zrobienia, żeby na końcu (w tym komunikacie nowa runda) podawało mi wartości wylosowanych kostek?
Czyli
Klikam te 3x losuj i za 4 kliknięciem wyskakuje mi:
Wylosowane kostki: a a a a a
Nowa runda

PawelR
Posty: 38
Rejestracja: 03 sie 2014 16:12
Wersja środowiska: LabVIEW 2013

Projekt z LabVIEW

Post autor: PawelR » 10 sty 2015 22:44

Jeśli zostajesz przy wyskakującym okienku dialogowym, to musisz zamienić wylosowane wartości na Stringi i połączyć ze stałą "Nowa r". Skorzystaj z funkcji Format into String (do zamiany liczb na tekst) i Concatenate Strings (do łączenia tekstów).

Drugi sposób, który pozwoli Ci zrobić ładniejsze okienko to wykorzystanie subVI'a, w którym poprzez SubVI Node Setup ustawiasz, że panel czołowy pokazuje się w chwili wywołania subVI i znika, kiedy zakończy on swoje działanie. Żaby to działało, jak trzeba, w tym subVI musi być element oczekiwania na kliknięcie guzika OK (no i sam guzik). A więc pętla While, ewentualnie ze strukturą Event (żeby pętla się nie kręciła bez potrzeby, a jednocześnie czas odpowiedzi był krótki).
W tym przypadku możesz formatować okienko tak, jak panel czołowy (bo to w końcu JEST panel czołowy) - dać większe literki, pokolorować, dodać jakąś rameczkę, obrazek itp. itd. Okienko dialogowe tej opcji nie daje. Nawiasem mówiąc, na panelu głównym też możesz to zrobić.

Aha: subVI to odpowiednik funkcji, czy też procedury, z "klasycznych" języków programowania. Czyli kawałek kodu zamknięty w jednym bloczku. Warto je stosować z co najmniej dwóch powodów:
1) masz mniej zapchany kod, nie rozciągnięty powyżej wymiarów ekranu i mniej przypominający spaghetti :)
2) możesz tego samego subVI'a użyć w kilku miejscach. Jeśli okaże się, że chcesz coś w nim poprawić, zmiany pojawią się w tych wszystkich miejscach.

W Twoim programie w takim subVI'u można by zamknąć losowanie liczby od 1 do 6, jeśli przycisk OK jest wciśnięty.

A co do maszyny stanów - to w pewnym sensie ją zrobiłeś. Jest nią ta duża struktura Case, zależna od warunku "Nr rundy>3". Tyle, że do terminala masz podpiętą zmienną logiczną. Wbrew pozorom, zamiast niej można podpinać też inne typy zmiennych, np. listy enumeratywne (czyli Enumy). Dzięki temu możesz mieć więcej przypadków, niż True/False, a poza tym każdy stan jest podpisany tym, co jest zawarte w danym polu Enuma. A tenże Enum zawiera listę stanów, w jakich jest aplikacja.
Trzeba tylko przerzucić go przez rejestr przesuwny, dzięki czemu w jednej iteracji możesz zadeklarować, jak stan ma się wykonać w następnej.

W Twojej aplikacji widziałbym takie stany:
- Inicjalizacja (gdzie zadajesz wartości początkowe, jeśli trzeba)
- Czekanie na rzut
- Rzut kostkami
- Następna runda?
- Koniec
Algorytmu Ci nie rozpisuję, bo sam go zdefiniowałeś:)
W tym przypadku możesz też dużo łatwiej ustawić opóźnienia, które trochę Ci kuleją.

Zajrzyj do tematu "Zapis do pliku - konkretny format". Tam koledze MS91 rozpisałem się trochę ("trochę"...) o maszynach stanu i innych strukturach, wrzuciłem mu też taką prostą maszynkę. Możesz ją łatwo przerobić i rozbudować, pozwalam ;)

Pozdr (i wracam do swojej roboty... gdyby nie ona, pewnie nie siedziałbym na forum :) )
Paweł
Pomogłem? Kliknij "Pochwal" :)

PawelR
Posty: 38
Rejestracja: 03 sie 2014 16:12
Wersja środowiska: LabVIEW 2013

Re: Projekt z LabVIEW

Post autor: PawelR » 11 sty 2015 23:28

Pytałeś na PW, czemu nie działa przycisk STOP. Utwórz dla niego drugi event, powinno pomóc.
Pomogłem? Kliknij "Pochwal" :)

Pieczywo
Posty: 5
Rejestracja: 03 paź 2018 20:57
Wersja środowiska: LabVIEW 2017

Re: Projekt z LabVIEW

Post autor: Pieczywo » 23 mar 2020 16:40

kwitek pisze:
02 sty 2015 18:57
funkcja "Random number" (generująca liczbę losową z zakresu 0-1 więc będzie trzeba ją pomnożyć przez 6 i zaokrąglić w górę),
Przepraszam, że odkopuję ale ta wiadomość kole w oczy jak kaktus.
Zakres jest [0-1) co oznacza że może wypaść 0 ale nie może jedynka.
Zatem przemnożenie przez 6 da możliwe wyniki [0 6), a po zaokrągleniu w górę {0 1 2 3 4 5 6}.
Jedyne prawidłowe symulowanie rzutu kostką to floor(6*random+1) czyli do przemnożonego zakresu dodanie jedynki i zaokrąglenie w dół...

A potem systemy się sypią bez powodów jak mamy takich programistów....

ODPOWIEDZ