Strona 1 z 1
Gdzie jest błąd w warunku ?
: 20 wrz 2014, 07:42
autor: seites
Nie mogę się doszukać błędu w warunku , jeśli jeden z parametrów R13 R15 R17 R19 będzie większy od 20 pod paramter R139 ma być wpisane 1 w przeciwnym przypadku 0 .
Jest jakiś symulator z tablicą parametrów ?
Pozdrawiam
Kod: Zaznacz cały
IF R139==1 OR R139==0 GOTOF MANUAL
R140=20
IF R13>=R140 OR R15>=R140 OR R17>=R140 OR R19>=R140 GOTOF S_UPAL
GOTOF S_N_UPAL
S_UPAL:
R139=0
S_N_UPAL:
R139=1
MANUAL:
to tylko wycinek trochę zakręconego programu ale czy taki zapis jest poprawny ?
IF R13>=R140 OR R15>=R140 OR R17>=R140 OR R19>=R140 GOTOF S_UPAL
: 20 wrz 2014, 09:22
autor: Zienek
Trochę mały ten wycinek, bo nie wiadomo, co się dzieje przed, a co po tym.
Jakie masz objawy?
Przechodzi dalej i przypisuje wszystko czy jak?
: 21 wrz 2014, 14:43
autor: artur235
A może zapisz tak, łatwiej będzie znaleźć błąd (można też użyć funkcji MSG do wyświetlania stanu prog.):
IF (R13>=R140) GOTOF S_UPAL
IF (R15>=R140) GOTOF S_UPAL
IF (R17>=R140) GOTOF S_UPAL
IF (R19>=R140) GOTOF S_UPAL
GOTOF S_N_UPAL
S_UPAL:
R139=0
S_N_UPAL:
R139=1
MANUAL:
Wato by też używać nawiasów np
IF ((R13>=R140) OR (R15>=R140) OR (R17>=R140) OR (R19>=R140)) GOTOF S_UPAL
: 21 wrz 2014, 21:06
autor: Zienek
A kod czasem nie jest wykonywany od góry do dołu?
Wynik tego kodu
Że co by nie było w Manual, to jeśli kod jest wykonywany od góry do dołu, to R139 kończy z wartością 1. To jest ostatnie przypisanie, bo w jednym z możliwych rozwiązań dla S_UPAL najpierw jest przypisanie zera, a potem schodzi do jedynki.
Kod: Zaznacz cały
S_UPAL:
R139=0
GOTOF MANUAL
S_N_UPAL:
R139=1
MANUAL:
W kodzie powyżej dostawiłem GOTOF MANUAL, żeby po wykonaniu przypisania zera do R139 robiło skok omijający przypisanie jedynki.
Lubię pomiędzy blokami zostawiać linię pustą - lepiej widać bloki.
Re: Gdzie jest błąd w warunku ?
: 23 wrz 2014, 01:43
autor: djronin
seites pisze:Nie mogę się doszukać błędu w warunku
Czy R139 przyjmuje na począdku programu albo w innym miejscu wartość inną niż 1 lub 0 ??
Bo z tego wynika, że zawsze będzie skakać do manual chyba że gdzieś po drodze przyjmuje wartość poza 0 lub 1
a instrukcja warunkowa może wyglądać tak:
Kod: Zaznacz cały
IF (R13>=R140) OR (R15>=R140) OR (R17>=R140) OR (R19>=R140) ;TEST
R139=1 ;JEŚLI TEST = PRAWDA
ELSE ;W PRZECIWNYM RAZIE
R139=0 ;JEŚLI TEST = FAŁSZ
ENDIF ;KONIEC TESTU
Przy zastosowaniu IF - ENDIF lub IF - ELSE - ENDIF przypisanie wartości zmiennym jest bardziej przejrzyste skoki lepiej stosować do omijania znacznej części kodu, choć można też wyskoczyć z instrukcji np:
Kod: Zaznacz cały
IF (R13>=R140) OR (R15>=R140) OR (R17>=R140) OR (R19>=R140) ;TEST
R139=1 ;JEŚLI TEST = PRAWDA
GOTOF MANUAL
ELSE ;W PRZECIWNYM RAZIE
R139=0 ;JEŚLI TEST = FAŁSZ
GOTOF AUTO
ENDIF ;KONIEC TESTU
...
...
MANUAL:
...
...
...
...
M30
AUTO:
...
...
...
...
M30
POZDRAWIAM
: 23 wrz 2014, 09:31
autor: Zienek
Ogólnie praktyka w szeroko rozumianym programowaniu jest taka, żeby jak tylko można to unikać GOTO.
Jak GOTO jest połączone z jakimiś IFami, to żeby sprawdzić działanie programu zaczyna się śledzenie kodu palcem po ekranie i tzw. 'spaghetti code'.
: 23 wrz 2014, 12:45
autor: djronin
w Fanucu nie ma IF ELSE ENDIF wszystko na skokach
[ Dodano: 2014-09-23, 18:52 ]
Zienek pisze:Ogólnie praktyka w szeroko rozumianym programowaniu...
To są elementy języka wysokiego poziomu w assemblerze który jest najbliżej języka maszynowego wszystkie warunki opierają się na skokach JE JNE więc każdy if else endif jest przekładany na skoki. Są one po prostu mniej wygodne w stosowaniu.