Logischer Operator bei NC Programmierung ?!

Nissandriver

Level-2
Beiträge
73
Reaktionspunkte
3
Guten Morgen,

wir probieren gerade ein Vergleich von Werten bei der NC-Steuerung zumachen ,die wir mit IF... und OR eigentlich programmieren wollten.
Aber das "OR" oder "AND" wird immer übersprungen..

Bsp.

DEF REAL unteres_Limit
DEF REAL oberes_LImit
DEF REAL aktueller_Wert
DEF REAL Sollposition

unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
aktueller_Wert = 50
Sollposition = 100

IF (Sollposition < unteres_Limit)
OR (Sollposition > oberes_Limit) THEN
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF


Er springt immer gleich zur MSG("Stehe schon da")
Habt ihr ein Tipp , warum das OR oder AND nicht funktionieren ?

Vielen Dank im Voraus
 
Nur mal kurz überfolgen:

Hast du es mal statt
Code:
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
aktueller_Wert = 50
Sollposition = 100

so probiert ( du rechnest ja mit dem "aktueller_Wert, beschreibst ihn aber erst nach den zwei Limit-Berechnungen ):
Code:
aktueller_Wert = 50
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
Sollposition = 100

Außerdem hast du alles als REAL definiert.

Dann würde ich nicht 5, 50 oder 100 schreiben sondern:
5.0
50.0
100.0

Dann werden diese Zahlen auch als REAL interpretiert und nicht als INT
 
Zuletzt bearbeitet:
...
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
aktueller_Wert = 50
Sollposition = 100

IF (Sollposition < unteres_Limit)
OR (Sollposition > oberes_Limit) THEN
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF

Ein AND was nicht gehen könnte sehe ich nicht

aktueller_Wert = 50
unteres_Limit = aktueller_Wert - 5 // in deiner Version ist hier das Limit -5
oberes_Limit = aktueller_Wert + 5 // in deiner Version ist hier das Limit 5
Sollposition = 100

// ein THEN gibt es im NC Code nicht für das IF
IF (Sollposition < unteres_Limit) OR (Sollposition > oberes_Limit)
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF

so sollte es funktionieren
 
Sollte man nicht um die Sollposition ein Fenster legen und nicht um die Aktualposition?
Für das Verständnis gebe ich dir absolut recht, aber für die Arbeitsaufwendung des Programmierers (also uns) und SPS (also benötigte Rechenleistung und Speichplatz) kann ein Fenster um die Akuialposition günstiger sein.

z. Bsp. 4 Sollwerte und die Aktualposition soll mit 4 Lampen angezeigt werden:
  • bei Fenster über Sollwert:
    4 Sollpositionen -> 4 Sollwertfenster, jeweils mit +/- Toleranz berechnen, welche jeweils mit dem Aktualwert verglichen werden
  • bei Fenster über Aktualwert
    1 Istwertfenster, mit +/- Toleranz berechnet, welches mit 4 Sollwerten verglichen wird
In diesen Fall spart man sich 3 * die Grenzwertberechnung der Sollwertfenster.
 
Ein AND was nicht gehen könnte sehe ich nicht

aktueller_Wert = 50
unteres_Limit = aktueller_Wert - 5 // in deiner Version ist hier das Limit -5
oberes_Limit = aktueller_Wert + 5 // in deiner Version ist hier das Limit 5
Sollposition = 100

// ein THEN gibt es im NC Code nicht für das IF
IF (Sollposition < unteres_Limit) OR (Sollposition > oberes_Limit)
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF

so sollte es funktionieren
Haben wir schon probiert.
Geht leider nicht.
Wenn ich dein Code so eingebe, kommt :
Name "aktueller_Wert" nicht bekannt oder definiert

Wenn ich dann oben drüber dann :

DEF aktueller_Wert
DEF unteres_Limit

etc. eingebe, kommt dann : Syntaxfehler bei Text aktueller_Wert

beim AND war nur ein bsp. Haben es statt OR mit ein AND probiert , genauso ein Verhalten.
 
Haben wir schon probiert.
Geht leider nicht.
Wenn ich dein Code so eingebe, kommt :
Name "aktueller_Wert" nicht bekannt oder definiert
Ja gut, definieren musst du trotzdem
Code:
DEF REAL unteres_Limit
DEF REAL oberes_LImit
DEF REAL aktueller_Wert
DEF REAL Sollposition

Wie sieht denn jetzt dein kompletter Code aus? Hast du folgende Zeile wie vorgeschlagen in der Zeilen-Reihenfolge geändert?
aktueller_Wert = 50
 
Nur mal kurz überfolgen:

Hast du es mal statt
Code:
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
aktueller_Wert = 50
Sollposition = 100

so probiert ( du rechnest ja mit dem "aktueller_Wert, beschreibst ihn aber erst nach den zwei Limit-Berechnungen ):
Code:
aktueller_Wert = 50
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
Sollposition = 100

Außerdem hast du alles als REAL definiert.

Dann würde ich nicht 5, 50 oder 100 schreiben sondern:
5.0
50.0
100.0

Dann werden diese Zahlen auch als REAL interpretiert und nicht als INT
Ja, auch so probiert.

er überspringt es.


falls das temp variablen sind, auch gerne mal am Bausteinanfang mit einer konstante initialisieren
In der PLC gebe ich dir Recht ! ;-)
 
Ja gut, definieren musst du trotzdem
Code:
DEF REAL unteres_Limit
DEF REAL oberes_LImit
DEF REAL aktueller_Wert
DEF REAL Sollposition

Wie sieht denn jetzt dein kompletter Code aus? Hast du folgende Zeile wie vorgeschlagen in der Zeilen-Reihenfolge geändert?
Ja habe ich

Kam auch erst ein fehler.

Aber ich habe es geändert.

Er sieht jetzt so aus :

DEF REAL aktueller_Wert
DEF REAL unteres_Limit
DEF REAL oberes_Limit
DEF REAL Sollposition


aktueller_Wert = 50.0
unteres_Limit = aktueller_Wert - 5 ;in deiner Version ist hier das Limit -5
oberes_Limit = aktueller_Wert + 5 ; in deiner Version ist hier das Limit 5
Sollposition = 46.0

IF (Sollposition < unteres_Limit) OR (Sollposition > oberes_Limit)
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF


Habe es eben mit Sinutrain probiert ! Da funktioniert es !

Danke für eure Hilfe und Unterstützung @DeltaMikeAir und @Peter Gedöns
 
1737134726999.png

ich habs mal getippt auf one mit 6.25 gehts
hat mir keine ruhe gelassen
DEF REAL unteres_Limit
DEF REAL oberes_LImit
DEF REAL aktueller_Wert
DEF REAL Sollposition
aktueller_Wert = 50
unteres_Limit = aktueller_Wert - 5
oberes_Limit = aktueller_Wert + 5
aktueller_Wert = 50
Sollposition = 100


IF (Sollposition < unteres_Limit) OR (Sollposition > oberes_Limit)
MSG("Verfahre mich")
ELSE
MSG("Stehe schon da")
ENDIF
m0
MSG("")

m30
 
Anhang anzeigen 84704

ich habs mal getippt auf one mit 6.25 gehts
hat mir keine ruhe gelassen
Werden wir mal testen. Also bis vorhin ging es nicht.


Also bei der One mit 6.22 kam immer ein Syntaxfehler.
Auch bei 840D (Sinutrain) kam auch ein Syntaxfehler

EDIT: Danke für deine Mühe @Peter Gedöns

Kann es aber erst in 2 Wochen beim Kunden testen, da wir da wieder vor Ort sind.
 
Zuletzt bearbeitet:
Habe ewig keine CNC mehr programmiert. Versteht die CNC denn etwas anderes als "G-Code"?
'IF', 'AND' bzw. 'OR' und VergleichsOperaroren wie '<' bzw. '>' gibt/gab es im G-Code nicht.
Falls Du doch mit Hilfe von R-Parametern arbeiten willst, sieh Dir mal '@655' .. '@676' an.
 
Habe ewig keine CNC mehr programmiert. Versteht die CNC denn etwas anderes als "G-Code"?
'IF', 'AND' bzw. 'OR' und VergleichsOperaroren wie '<' bzw. '>' gibt/gab es im G-Code nicht.
Falls Du doch mit Hilfe von R-Parametern arbeiten willst, sieh Dir mal '@655' .. '@676' an.
die NC versteht sogar mich (manchmal )
ansehen kann er sich das , mit dem Klammeraffen Befehlen allerdings in der 840C Doku .
in der 840Dpl, 840Dsl oder ONE gibt es das nicht mehr .
und R Parameter sollten für den OEM an der stelle Tabu sein.
 
Zurück
Oben