Anwenderspezifische G-Code-Funktionen
Das Beispielprojekt CNC11_CustomFunctions.project
finden Sie im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples
.
Dieses Beispiel zeigt, wie Sie eigene Funktionen zur Verwendung in Ausdrücken im G-Code erstellen können.
Für weitere Informationen zu Ausdrücken und Funktionen im G-Code siehe Ausdrücke. Dort finden Sie eine Liste aller standardmäßig unterstützten Operatoren und Funktionen.
Das Beispiel definiert den aus der IEC 61131-3 bekannten Operator SEL, sodass er auch im G-Code verwendet werden kann.
Struktur der Applikation
Die Applikation besteht, wie für CNC-Applikationen üblich, aus einer Bahnverarbeitung (Programm CNC_PreparePath
) und der Interpolation (Programm CNC
). Da die Interpolation sich nicht von den anderen Beispielen unterscheidet, wird hier nicht weiter auf das Thema eingegangen.
Die Bahnverarbeitung wird in der niederprioren Task PathTask
zyklisch alle 20 ms aufgerufen. Die Interpolation wird in der hochprioren Task MotionTask
zyklisch alle 4 ms aufgerufen. Für die Visualisierung die Hintergrund-Task VISU_TASK
definiert.
In der Visualisierung können Sie die Abarbeitung des G-Codes starten und den Wert der Variablen $LONGLINE$
setzen. Auf der rechten Seite der Visualisierung wird der G-Code und die Bewegung der Maschine (3D-Portal) dargestellt.
Der G-Code
CNC
LET #WIDTH : LREAL N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110) N20 F50 E100 E-100 N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2 N40 Y-#WIDTH N50 X-#WIDTH Z-#WIDTH/2 N60 Y#WIDTH N70 X0 Y0 Z0
Zeile 1: Deklaration der lokalen Variable #WIDTH
vom Typ LREAL
.
Zeile 2, Satz N10: Zuweisung des Werts von SEL($LONGLINE$, 40, 110)
auf die Variable #WIDTH
. Wenn der Wert der PLC-Variable $LONGLINE$
TRUE
ist, dann ist der Wert des Ausdrucks 110, andernfalls 40.
In den folgenden Zeilen wird ein Quadrat mit zusätzlicher Bewegung in Z-Richtung abgefahren, die Seitenlänge des Quadrats ist 2*#WIDTH
.
Umsetzung der Funktion SEL

Um eine benutzerdefinierte Funktion zu erstellen, müssen Sie einen Funktionsbaustein schreiben, der die Schnittstelle SMC_NC_IFunction
implementiert.
Für weitere Informationen siehe: SMC_NC_IFunction.
GetSignature
. Hier wird der Rückgabetyp, die Anzahl und die Typen der Argumente der Funktion zurückgegeben. In diesem Beispiel gibt die FunktionSEL
einen Wert vom TypT_OTHER
zurück und hat 3 Argumente vom TypT_BOOL
,T_OTHER
undT_OTHER
.T_OTHER
steht für einen beliebigen Typ, also entwederT_BOOL
,T_LREAL
, oderT_STRING
. Alle 3 Vorkommen vonT_OTHER
müssen denselben Typ haben.METHOD GetSignature VAR_OUTPUT resultType : SMC_GVar_Type; nNumArguments : UDINT; pType : POINTER TO SMC_GVar_Type; END_VAR VAR argTypes : ARRAY[0..2] OF SMC_GVar_Type := [SMC_GVar_Type.T_BOOL, SMC_GVar_Type.T_OTHER, SMC_GVar_Type.T_OTHER]; END_VAR resultType := SMC_GVAR_Type.T_OTHER; nNumArguments := 3; pType := ADR(argTypes);
Call
: Diese Methode wird während der Abarbeitung des G-Codes aufgerufen. Die Argumente werden über den Eingangpa
übergeben. Mit dem Ausdruckpa[0].argValue.bValue
wird auf den boolschen Wert des ersten Arguments zugegriffen. Je nach Typ des zweiten Argumentspa[1].argType
ergibt sich der Rückgabewertresult.argType
und die Verzweigung in einen Zweig der CASE-Anweisung.METHOD Call VAR_IN_OUT result : SMC_NC_GArgument; END_VAR VAR_INPUT pa : POINTER TO SMC_NC_GArgument; END_VA RVAR_OUTPUT eError : SMC_ERROR; END_VAR VAR g : BOOL; END_VAR g := pa[0].argValue.bValue; result.argType := pa[1].argType; CASE result.argType OF SMC_GVAR_Type.T_BOOL: result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue); SMC_GVAR_Type.T_STRING: result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue); SMC_GVAR_Type.T_LREAL: result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue); ELSE eError := SMC_INVALID_PARAMETER; END_CASE
Konfiguration von SMC_ReadNCFile2
In der globalen Variablenliste GVL_CNCFunctions
wird eine Instanz des Funktionsbausteins CNC_Sel
angelegt.
Dann wird ein Array aCNCFunctions
der Länge 1 mit Namen und Instanz des Funktionsbausteins initialisiert und dieses Array in der Tabelle funTable
vom Typ SMC_NC_GFunctionTable
verlinkt.
aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction := [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)]; funTable : SMC_NC_GFunctionTable := (numFunctions:= 1, pFunction:= ADR(aCNCFunctions)) ;
Diese Tabelle wird dann dem Funktionsbaustein SMC_ReadNCFile2
mitgegeben:
rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE); [...] rncf2( bExecute:= TRUE, sFileName:= sFileName, pCustomFunTable:= ADR(funTable), pvl:= ADR(varList));
Inbetriebnahme
Übersetzen Sie die Applikation und laden Sie sie auf eine Steuerung.
Starten Sie die Applikation, wechseln Sie zur Visualisierung und drücken Sie auf
Start
. Mit dem RadiobuttonLongline
können Sie den Wert der Variablen$LONGLINE$
im G-Code aufTRUE
oderFALSE
setzen.