Skip to main content

Esempio 17 CNC: lettura del codice G dalle stringhe

Vedi il CNC17_ReadGCodeFromStrings.project progetto di esempio nella directory di installazione di CODESYS in ..\CODESYS SoftMotion\Examples.

Il progetto di esempio mostra come usare SMC_StringStream2 per leggere il codice G da una stringa.

Questo esempio può essere visto come punto di partenza e utilizzato per leggere il codice G da altre fonti, ad esempio tramite comunicazione di rete (socket). In questo caso, è necessario implementare un blocco funzionale che implementa SMC_ITextStream interfaccia e legge il testo (ad esempio, da un socket). Questo è simile a come SMC_StringStream2 implementa questa interfaccia per leggere il codice G da una stringa.

Struttura dell'applicazione

La struttura è tipica delle applicazioni CNC. Il codice G viene letto nell'attività in backgroundPathTask) e qui avviene anche la preelaborazione del percorso. L'interpolazione viene eseguita nel task del bus

Nel Path programma, il SMC_ReadNCFromStream blocco funzione viene utilizzato per leggere il codice G. Per motivi tecnici, non solo uno stream di tipo SMC_StringStream2 viene passato a questo blocco funzione, ma anche a un array la cui dimensione dipende dal parametro SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH. Il primo stream dell'array viene utilizzato per il programma principale, mentre gli altri stream vengono utilizzati per eventuali chiamate al sottoprogramma

All'inizio, il programma principale viene caricato nel primo flusso dell'array:

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

Quindi tutto è pronto per leggere i soliti programmi G-code. L'esempio mostra anche come possono essere supportate le chiamate ai sottoprogrammi

Per fare ciò, è necessario creare un blocco funzione che implementa SMC_INCLookup interfaccia. Questo blocco funzionale è responsabile della restituzione del codice G di un sottoprogramma quando viene letto SMC_ReadNCFromStream. Lookup il metodo riceve il nome del sottoprogramma e inizializza un flusso in entrata con il codice G:

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

Questo esempio esegue una ricerca in una serie di sottoprogrammi. L'array è definito in Path programma come VAR_INPUT:

   // 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')
        ] ;

Nel Lookup, l'array viene ripetuto finché non viene trovato un sottoprogramma con un nome corrispondente:

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 ;

Messa in servizio

  1. Crea l'applicazione e scaricala su un controller.

  2. Aprire la visualizzazione.

  3. Premere Inizio per avviare l'elaborazione del codice G.