Strona 2 z 2

Re: Projekt z LabVIEW

: 09 sty 2015 13:44
autor: Serqq
2013

Re: Projekt z LabVIEW

: 10 sty 2015 12:31
autor: J.Sz
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)

Projekt z LabVIEW

: 10 sty 2015 19:34
autor: Serqq
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

Projekt z LabVIEW

: 10 sty 2015 22:44
autor: PawelR
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ł

Re: Projekt z LabVIEW

: 11 sty 2015 23:28
autor: PawelR
Pytałeś na PW, czemu nie działa przycisk STOP. Utwórz dla niego drugi event, powinno pomóc.

Re: Projekt z LabVIEW

: 23 mar 2020 16:40
autor: Pieczywo
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....