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

Kod: Zaznacz cały

S_UPAL: 
R139=0 
S_N_UPAL: 
R139=1 
MANUAL: 
Ż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

Kod: Zaznacz cały

IF R139==1 OR R139==0 GOTOF MANUAL
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.