585.906 aktive Mitglieder*
3.524 Besucher online*
Kostenfrei registrieren
Anmelden Registrieren
FANUC Forum

nicht definierte Variable

Beitrag 27.03.2017, 16:18 Uhr
gram
gram
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 20.04.2006
Beiträge: 210

Hallo Gemeinde,

ich möchte in einem Makro, welches ich mittels M-Funktion auslöse, einige Variablen übergeben. Soweit so gut.
Allerdings möchte ich nicht immer alle Variablen vollständig übergeben. Ich möchte eine Abfrage integrieren, so dass nicht definierte Variablen übergangen werden und unverändert bleiben. Allerdings ersetzt die Steuerung nicht definierte Variablen mit "0". Laut Fanuc Handbuch werden nicht definierte Variablen mit "0" ersetzt, es sei denn, sie werden mit <leer> angegeben.
Frage...wie gebe ich eine Variable als <leer> an? Ich habe es bereits mit Leerzeichen und <leer>(über externe Programmierung) versucht. Leider ohne Erfolg. Sie werden immer durch "0" ersetzt.
Hat jemand eine Idee, wie ich die Variable als <leer> angeben kann?

Gruß André
TOP    
Beitrag 27.03.2017, 19:17 Uhr
gottvati
gottvati
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 12.06.2006
Beiträge: 181

Hi André,

für das was du möchtest würde ich Dir den Macroaufruf G65 P.... empfehlen und nicht das Unterprogramm über eine M-Funktion zu starten.
Der Aufruf über eine M-Funktion ist im Prinzip das Gleiche wie M98 P.... und dann solltest Du alle relevanten Variablen vorher definieren z.B.: #100=1 um sicher zu gehen, dass die Variable auch das enthält, was Du möchtest.

Bei G65 P.... hast Du die Variablen 1 bis 33 zur Verfügung und kannst sicher sein, dass alle Variablen beim Aufruf des Macros immer "leer" sind, es sei denn, Du hast sie definiert, z.B. so: G65 P1234 A1 B2 C3 . Diese Variablen werden dann bei M99 oder M30 auch wieder auf "leer" gesetzt.

Die Steuerung ersetzt "leere" Variablen nicht mit 0 , sie rechnet nur mit 0, wenn die Variable "leer" ist.

Wenn Du also eine Variable beim Aufruf "G65" nicht definierst, dann ist sie also "leer" und im Macro kannst du das z.B. so abfragen:
IF [#1 EQ #0] GOTO10 .
#0 steht also für "leer"

Was ich noch nicht probiert (gebraucht) habe, ist eine Variable auf "leer" zu setzen.
Vielleicht weiß ja jemand hier, was passiert, wenn man (angenommen #500 hat einen Wert) #500=#0 schreibt, ob man sie damit auf "leer" setzen kann.

Gruß, Nisse.


--------------------
Gruß, Nisse.
TOP    
Beitrag 27.03.2017, 21:14 Uhr
nico1991
nico1991
Level 5 = Community-Ingenieur
*****
Gruppe: Mitglied
Mitglied seit: 01.11.2012
Beiträge: 628

Huhu

kannst du bitte etwas konkreter werden?

Unterprogramme bei Fanuc sind eigentlich relativ simpel. Vorweg #500=#0 setzt eine Variable "leer"!

Die lokalen Variablen #1-#33 gelten nur jeweils im Aufgerufenen Programm. Das heißt wenn du im Hauptprogramm #1=10 gesetzt hast und dein Unterprogramm mit G65P8000 A30. aufrufst, dann ist #1 im Unterprogramm 30 (#1=30) und im Hauptprogramm 10 (#1=10). Die Variablen #2-#33 sind #0, also leer.

LG Nico

Wie gesagt, wenn du konkreter wirst, kann ich dir besser helfen

Der Beitrag wurde von nico1991 bearbeitet: 27.03.2017, 21:14 Uhr
TOP    
Beitrag 27.03.2017, 22:38 Uhr
gram
gram
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 20.04.2006
Beiträge: 210

Wie ich Makros programmiere und welche Möglichkeiten es gibt (G65,G66,M oder G), das weiß ich durchaus. Und wie ich Argumente übergebe, das ist völlig klar.
Nur dass ein nicht definiertes Argument bei der Übergabe als "0" interpretiert wird. Und dies möchte ich nicht. Aber scheinbar geht es nicht anders. Die Handbücher sind da ein wenig undeutlich. Denn es wird durchaus zwischen "leer" und "0" unterschieden. Allerdings vermutlich nicht bei Übergabe von Argumenten.
Nun ja, muss ich das Ganze eben umgehen.
Aber Danke für die Hilfe

PS: #0 ist immer 0, aber nicht leer

Der Beitrag wurde von gram bearbeitet: 27.03.2017, 22:41 Uhr
TOP    
Beitrag 28.03.2017, 03:50 Uhr
gottvati
gottvati
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 12.06.2006
Beiträge: 181

Hi André,

sorry für die Verwirrung.

Mit M-Befehlen können Unterprogramme im Sinne von M98 P.... aufgerufen werden.
Bei dieser Möglichkeit ist es nicht möglich Argumente zu übergeben.
Dafür können O9001-O9009 verwendet werden. (Parameternummer 6071-6079)

Dass es aber auch die Möglichkeit gibt Macros mit M-Befehlen zu starten wusste ich bisher nicht.
Bei dieser Möglichkeit können Argumente übergeben werden. ( Bsp.: M50 A1. B2. C3. )
Dafür können O9020-O9029 verwendet werden. (Parameternummer 6080-6089)

Ich weiß, dass das nicht die Antwort auf Deine Frage war.

Wenn ich jetzt mal davon ausgehe, dass ein Macroaufruf über M-Code sich gleich verhält wie ein Aufruf über "G65", bin ich mir sicher, dass ein im Macroaufruf nicht definiertes Argument eben nicht als "0" , sondern als "leer" an das Macro übergeben wird.

Und wie gesagt, wenn man mit einer Variable rechnet, der kein Wert zugeordnet ist, die also nicht definiert ist, die also "leer" ist, dann wird immer mit "0" gerechnet.

Wenn man das nicht möchte, hat man z.B. die Möglichkeit, diese Rechnung mit Hilfe einer Abfrage "EQ" oder "NE" ( IF [#1 EQ #0] GOTO10 ) zu überspringen. Bei dieser Abfrage steht dann "#0" für "leer" .
(#0 kann nicht beschrieben, sondern nur gelesen werden)

Gruß, Nisse.


--------------------
Gruß, Nisse.
TOP    
Beitrag 28.03.2017, 06:59 Uhr
gram
gram
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 20.04.2006
Beiträge: 210

So, habe das Problem heute früh lösen können.

1. Klar kann man Argumente mittels M-Befehl übergeben. Das ist kein Problem.
2. #0 ist, wie in meinem vorigen Post bereits geschrieben, nicht leer, sondern hat den Wert 0.

Ich wollte für die Kollegen an der Maschine eine simple Möglichkeit schaffen, um Nullpunkte mittels M-Befehl zu setzen, ohne dass sie mit Tasterlänge oder Aufmaß und sonstigem rechnen müssen.
Das Problem lag einzig und allein darin, dass bei der Übergabe nicht definierte Argumente als "0" gesehen werden. Das wäre dann so, als würde man dort den Nullpunkt setzen.
Ich habe es jetzt wie folgt gelöst...

M400 X Y Z
(die Argumente entsprechen ja #24 #25 und #26 im Makroprogramm)

Wenn ich jetzt eine oder mehrere Achsen nicht neu setzen möchte und nicht angebe, dann erreiche ich das über einen Vergleich mit einem ebenfalls nicht definierten Parameter. In meinem Fall habe ich mir #33 ausgesucht, da ich den eh nie nutze.

Makroprogramm
O9021
IF[#24EQ#33]GOTO... (#33 ist wie gesagt nicht definiert)
...

Damit vergleiche ich ein nicht definiertes Argument mit einem anderen nicht definierten Parameter und die Steuerung behandelt es als nicht definiert und ich kann mittels Sprung die Eingabe (in diesem Fall für X) umgehen.
Man sollte allerdings vorher nicht mit den Argumenten rechnen, dann werden sie wieder durch "0" ersetzt.

Frohes Schaffen wink.gif

Der Beitrag wurde von gram bearbeitet: 28.03.2017, 07:01 Uhr
TOP    
Beitrag 28.03.2017, 07:53 Uhr
nico1991
nico1991
Level 5 = Community-Ingenieur
*****
Gruppe: Mitglied
Mitglied seit: 01.11.2012
Beiträge: 628

Nur nochmal für meine Logik.

In #33 steht eine 0 oder eine #0? Es muss doch eine #0 drin stehen, dass das Makro richtig funktioniert und wieso vergleichst du dann nicht gleich mit #0? Und selbst wenn in #33 eine feste 0 steht, wieso vergleichst du nicht gleich mit einer festen 0?

Könntest du vielleicht das Unterprogramm hier posten? Danke smile.gif
TOP    
Beitrag 28.03.2017, 07:59 Uhr
gram
gram
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 20.04.2006
Beiträge: 210

QUOTE (nico1991 @ 28.03.2017, 07:53 Uhr) *
Nur nochmal für meine Logik.

In #33 steht eine 0 oder eine #0? Es muss doch eine #0 drin stehen, dass das Makro richtig funktioniert und wieso vergleichst du dann nicht gleich mit #0? Und selbst wenn in #33 eine feste 0 steht, wieso vergleichst du nicht gleich mit einer festen 0?

Könntest du vielleicht das Unterprogramm hier posten? Danke smile.gif


In #33 steht gar nichts! Den definiere ich nicht. Der kommt gar nicht vor.
Wenn ich meinen #24 #25 oder #26 mit 0 vergleichen würde, zum Überspringen von Sätzen, dann könnte ich den Nullpunkt nie auf 0 setzen, da er das dann überspringen würde.
Meine Abfrage zielt auf eine Nichtdefinition von Argumenten.
IF [#24EQ nicht definiert] dann...
das "nicht definiert" erreiche ich über #33, da ich ihn nicht definiert habe. wink.gif
TOP    
Beitrag 28.03.2017, 08:13 Uhr
nico1991
nico1991
Level 5 = Community-Ingenieur
*****
Gruppe: Mitglied
Mitglied seit: 01.11.2012
Beiträge: 628

und warum nicht gleich über #0?

IF [#24EQ#0]

Denkst du zu kompliziert, oder ich. Oder reden wir gar aneinander vorbei?
TOP    
Beitrag 28.03.2017, 08:17 Uhr
gram
gram
Level 3 = Community-Techniker
***
Gruppe: Mitglied
Mitglied seit: 20.04.2006
Beiträge: 210

QUOTE (nico1991 @ 28.03.2017, 08:13 Uhr) *
und warum nicht gleich über #0?

IF [#24EQ#0]

Denkst du zu kompliziert, oder ich. Oder reden wir gar aneinander vorbei?

Weil #0 immer 0 ist, also als 0 definiert.
TOP    



1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: