Skip to main content

CNC-Beispiel 17: G-Code aus String lesen

Sehen Sie hierzu das Beispielprojekt CNC17_ReadGCodeFromStrings.project im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples.

Das Beispielprojekt zeigt, wie G-Code mit Hilfe von SMC_StringStream2 von einem String gelesen werden kann.

Das Beispiel dient als Startpunkt und kann dazu dienen, G-Code auch von anderen Quellen einzulesen, zum Beispiel über Netzwerkkommunikation (Sockets). In diesem Fall muss ein Funktionsbaustein umgesetzt werden, der die Schnittstelle SMC_ITextStream implementiert und den Text beispielsweise von einem Socket liest. Das ist analog dazu, wie SMC_StringStream2 diese Schnittstelle implementiert um den G-Code von einem String zu lesen.

Aufbau der Applikation

Der Aufbau ist für CNC-Applikationen typisch. In der Hintergrundtask (PathTask) wird der G-Code eingelesen, hier findet auch die Bahnvorverarbeitung statt. In der Bustask wird die Interpolation ausgeführt.

Im Programm Path wird der Baustein SMC_ReadNCFromStream verwendet um den G-Code einzulesen. Aus technischen Gründen wird diesem nicht nur ein Stream vom Typ SMC_StringStream2 übergeben, sondern ein Array, dessen Größe vom Parameter SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH abhängt. Der erste Stream im Array wird für das Hauptprogramm verwendet, die weiteren für mögliche Unterprogrammaufrufe.

Das Hauptprogramm wird zu Beginn in den ersten Stream des Arrays geladen:

// Load G-Code into first stream
aStringStream[0].Init(sProgramName) ;
aStringStream[0].AppendData(sGCode) ;
aStringStream[0].SetEndOfData() ;

Damit ist alles vorbereitet, um gewöhnliche G-Code-Programme einzulesen. Das Beispiel zeigt zusätzlich noch, wie auch Unterprogrammaufrufe unterstützt werden können.

Dazu ist es nötig, einen Funktionsbaustein zu erstellen, der die Schnittstelle SMC_INCLookup implementiert. Dieser Funktionsbaustein ist dafür verantwortlich, den G-Code eines Unterprogramms zurückzugeben, wenn er von SMC_ReadNCFromStream benötigt wird. Die Methode Lookup erhält dazu den Namen des Unterprogramms und initialisiert einen hereingereichten Stream mit dem G-Code:

METHOD LookUp : SMC_ERROR
VAR_IN_OUT CONSTANT
    programName : STRING;
END_VAR
VAR_INPUT
    stream : SMC_ITextStream;
END_VAR
VAR
    i : UDINT ;
    pStringStream : POINTER TO SMC_StringStream2 ;
END_VAR

Im Beispiel wird dafür ein Array von Unterprogrammen durchsucht. Das Array wird im Programm Path als VAR_INPUT definiert:

   // The table of subprograms.
   aSubs : ARRAY[0..0] OF SubProgram := [
            (stName := 'SUB1',
             stContent := '
SUBPROGRAM SUB1{#p1 : LREAL, #p2 : LREAL, #p3 : LREAL}
N10 G1 X#p1
N20 G1 X#p2
N30 G1 X#p3
END_SUBPROGRAM')
        ] ;

In Lookup wird durch das Array iteriert, bis ein Unterprogramm mit passendem Namen gefunden wird:

i := 0 ;
WHILE i < nNumSPs DO
    IF psp[i].stName = programName THEN
        IF NOT __QUERYPOINTER(stream, pStringStream) OR_ELSE
           pStringStream = 0
        THEN
            // A stream of the wrong type has been passed by SMC_ReadNCFromStream.
            LookUp := SMC_CNC_INTERNAL_ERROR ;
        ELSE
            pStringStream^.Init(sName := psp[i].stName) ;
            LookUp := pStringStream^.AppendData(psp[i].stContent) ;
            pStringStream^.SetEndOfData() ;
        END_IF
        RETURN ;
    END_IF

    i := i + 1 ;
END_WHILE
 
// No subprogram with name programName has been found in the array psp.
LookUp := SMC_RNCF_SUBPROGRAM_FILE_NOT_FOUND ;

Inbetriebnahme

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

  2. Öffnen Sie die Visualisierung.

  3. Drücken Sie auf Start um die G-Code-Abarbeitung zu starten.