Skip to main content

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

_sm_img_function_sel.png

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.

. Die Schnittstelle definiert zwei Methoden:
  1. GetSignature. Hier wird der Rückgabetyp, die Anzahl und die Typen der Argumente der Funktion zurückgegeben. In diesem Beispiel gibt die Funktion SEL einen Wert vom Typ T_OTHER zurück und hat 3 Argumente vom Typ T_BOOL, T_OTHER und T_OTHER. T_OTHER steht für einen beliebigen Typ, also entweder T_BOOL, T_LREAL, oder T_STRING. Alle 3 Vorkommen von T_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);
  2. Call: Diese Methode wird während der Abarbeitung des G-Codes aufgerufen. Die Argumente werden über den Eingang pa übergeben. Mit dem Ausdruck pa[0].argValue.bValue wird auf den boolschen Wert des ersten Arguments zugegriffen. Je nach Typ des zweiten Arguments pa[1].argType ergibt sich der Rückgabewert result.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

  1. Übersetzen Sie die Applikation und laden Sie sie auf eine Steuerung.

  2. Starten Sie die Applikation, wechseln Sie zur Visualisierung und drücken Sie auf Start. Mit dem Radiobutton Longline können Sie den Wert der Variablen $LONGLINE$ im G-Code auf TRUE oder FALSE setzen.