Gdzie jest błąd w warunku ?

Dyskusje na temat systemu Sinumerik

Autor tematu
seites
Stały bywalec (min. 70)
Stały bywalec (min. 70)
Posty w temacie: 1
Posty: 70
Rejestracja: 06 lut 2011, 15:46
Lokalizacja: Nowa Huta

Gdzie jest błąd w warunku ?

#1

Post napisał: seites » 20 wrz 2014, 07:42

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



Tagi:

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#2

Post napisał: Zienek » 20 wrz 2014, 09:22

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?


artur235
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 1
Posty: 271
Rejestracja: 09 lut 2010, 19:40
Lokalizacja: SE

#3

Post napisał: artur235 » 21 wrz 2014, 14:43

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

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#4

Post napisał: Zienek » 21 wrz 2014, 21:06

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.

Awatar użytkownika

djronin
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 2
Posty: 262
Rejestracja: 22 kwie 2011, 01:19
Lokalizacja: Jarocin

Re: Gdzie jest błąd w warunku ?

#5

Post napisał: djronin » 23 wrz 2014, 01:43

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
...Programowanie ma to do siebie, że urzeczywistnienie nawet najbardziej
oczywistego pomysłu jest znakomitą definicją słowa "frustracja"...

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#6

Post napisał: Zienek » 23 wrz 2014, 09:31

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'.

Awatar użytkownika

djronin
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 2
Posty: 262
Rejestracja: 22 kwie 2011, 01:19
Lokalizacja: Jarocin

#7

Post napisał: djronin » 23 wrz 2014, 12:45

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.
...Programowanie ma to do siebie, że urzeczywistnienie nawet najbardziej
oczywistego pomysłu jest znakomitą definicją słowa "frustracja"...

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Siemens Sinumerik CNC”