ReadNCFile2 con modificatore di token
Le CNC12_TokenModifier.project
il progetto di esempio si trova nella directory di installazione di CODESYS sotto ..\CODESYS SoftMotion\Examples
.
Questo esempio mostra come modificare il codice G durante l'importazione per convertire l'unità di velocità del percorso (parola F) da mm/min a mm/s inserendo il codice G. 1/60.0 *
prima del valore della velocità durante la lettura del codice G per la parola F. F6000
quindi diventa F 1/60.0 * 6000
, che viene successivamente elaborato dal SMC_NCInterpreter
blocco funzionale per F100
. In casi semplici, puoi saltare la moltiplicazione per 1/60
e basta regolare il valore (ad esempio, da 6000
fino a 100
). Tuttavia, la moltiplicazione è più generale perché funziona anche quando si utilizzano variabili F $SPEED$
diventa F 1/60.0 * $SPEED$
.
Struttura dell'applicazione
Come di consueto per le applicazioni CNC, l'applicazione consiste nell'elaborazione del percorso (CNC_PreparePath
programma) e interpolazione (CNC
programma). Poiché l'interpolazione non è diversa dagli altri esempi, non verrà discussa ulteriormente qui
L'elaborazione del percorso viene chiamata ciclicamente ogni 20 ms nella modalità a bassa priorità PathTask
. L'interpolazione viene chiamata ciclicamente ogni 4 ms MotionTask
. L'attività in background VISU_TASK
è definito per la visualizzazione.
È possibile iniziare a elaborare il codice G nella visualizzazione. Il codice G e il movimento della macchina (portale 3D) sono visualizzati sul lato destro della
Il codice G
CNC_PathSpeed
N10 G01 X1000 F6000 N20 Y1000
In questo codice G, la velocità del percorso in blocco N10
è impostato con F6000
fino a 6000 mm/min. Tuttavia, i blocchi funzionali CNC prevedono la velocità del percorso in mm/s. Vengono comandati due movimenti lineari X=1000
e poi a X=1000, Y=1000
.
Elaborazione dei token
Le SMC_ReadNCFile2
e SMC_ReadNCFromStream
i blocchi funzione forniscono la capacità di eseguire le proprie trasformazioni quando viene letto il codice G. Qui stiamo usando con SMC_ITokenModifier
interfaccia, che viene passata tramite aTokenModifier
input.
Questa interfaccia funziona su «token». Queste sono le parti base del codice G in cui viene suddiviso il testo del codice G all'avvio dell'elaborazione
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)
Questo codice G è suddiviso come segue:
Testo | SMC_TOKENTYPE | SMC_TOKENVALUE |
---|---|---|
| identifer | stValue = 'N' |
| number | fValue = 50.0 |
| identifer | stValue = 'G' |
| number | fValue = 36.0 |
| identifer | stValue = 'O' |
| variable | stValue = 'plc_variable' |
| identifer | stValue = 'D' |
| strLiteral | stValue = 'TextTest' |
| identifer | stValue = 'X' |
| operator | stValue = '-' |
| number | fValue = 1.0 |
Le informazioni che non sono necessarie per l'ulteriore elaborazione (ad esempio, spazi bianchi, interruzioni di riga e commenti) non vengono visualizzate nell'elenco dei token.
Quando il SMC_ITokenModifier
l'interfaccia è implementata, l'elenco dei token può essere adattato aggiungendo nuovi token, eliminando i token e modificando i valori dei token.
Start
: inizializzazione del blocco funzionale. Lo stato interno viene ripristinatoCall
: Chiamata di questo metodo durante l'elaborazione del codice G. I token possono essere letti e rimossi dalla coda di input e aggiunti alla coda
Attuazione
Tutti i token vengono spostati dalla coda di input alla coda di output.
Se viene rilevata una parola F, allora due nuovi token,
1/60
e*
, vengono aggiunti dopo il token per «F» e prima del token per il valore della velocità.
Le Call
il metodo contiene la logica per elaborare i token. È utile spostare prima i token dalla coda di inputtokensIn
) in una coda temporanea (m_tmpQueue
), li elabora lì e poi li sposta nella coda di output (tokensOut
). La coda temporanea non è assolutamente necessaria per adattare la velocità del percorso, ma semplifica la struttura del programma nei
Metodo: chiamata
Inizialmente, il sistema attende STATE_RUNNING
stato fino all'inizio dell'elaborazione (quando i token sono disponibili nella coda di input e c'è ancora spazio nella coda di output).
IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN // Wait until processing can proceed RETURN; END_IF
Quindi un token viene spostato dalla coda di input alla coda temporanea.
IF m_tmpQueue.IsEmpty() THEN // Move the next token from the in-queue to the tmp-queue. pt := tokensIn.GetFromStart(0); m_tmpQueue.Append(pt^); tokensIn.RemoveFirst(); END_IF
L'elaborazione effettiva viene effettuata nel ConvertSpeed
metodo.
IF NOT m_tmpQueue.IsEmpty() THEN // The actual processing is done here ConvertSpeed(); END_IF
Alla fine del metodo, un token viene spostato dalla coda temporanea alla coda di output.
Metodo: ConvertSpeed
Viene selezionato il primo token della coda temporanea.
Se un identificatore con il valore F
viene trovato, quindi vengono aggiunti due token aggiuntivi: il numero 1/60.0
e l'operatore *
.
(La dimensione della coda temporanea è selezionata in modo tale che altri due token entrino nella coda oltre a quello della coda di input).
tk := m_tmpQueue.GetFromStart(0)^; IF tk.tokenType = SMC_TokenType.identifier THEN tk.GetString(pbyString => pby, iSize => iSize); // 70 = ASCII code for F (path velocity) IF iSize = 1 AND pby^ = 70 THEN // Insert the number 1/60 SMC_Token_InitNumber( tk:= tkNumber, value:= 1/60.0, srcPos:= tk.srcPos); m_tmpQueue.Append(tkNumber); // Insert operator '*' for multiplication SMC_Token_InitOperator( tk:= tkOperator, value:= '*', srcPos:= tk.srcPos); m_tmpQueue.Append(tkOperator); END_IF END_IF
Messa in servizio
Crea l'applicazione e scaricala su un controller.
Avviare l'applicazione, passare alla visualizzazione e premere
Start
.