ReadNCFile2 con modificador de token
El CNC12_TokenModifier.project
el proyecto de ejemplo se encuentra en el directorio de instalación de CODESYS debajo ..\CODESYS SoftMotion\Examples
.
En este ejemplo se muestra cómo modificar el código G durante la importación para convertir la unidad de velocidad de trayectoria (palabra F) de mm/min a mm/s. Esto se hace insertando el código G 1/60.0 *
antes del valor de velocidad mientras se lee el código G de la palabra F. F6000
luego se convierte F 1/60.0 * 6000
, que posteriormente es procesado por el SMC_NCInterpreter
bloque de función para F100
. En casos simples, puedes saltarte la multiplicación por 1/60
y simplemente ajusta el valor (por ejemplo, desde 6000
para 100
). Sin embargo, la multiplicación es más general porque también funciona cuando se usan variables F $SPEED$
se convierte F 1/60.0 * $SPEED$
.
Estructura de la solicitud
Como es habitual en las aplicaciones de CNC, la aplicación consiste en el procesamiento de rutas (CNC_PreparePath
programa) e interpolación (CNC
programa). Debido a que la interpolación no es diferente de los otros ejemplos, no se analizará más aquí
El procesamiento de rutas se llama cíclicamente cada 20 ms en la prioridad baja PathTask
. La interpolación se llama cíclicamente cada 4 MotionTask
. La tarea en segundo plano VISU_TASK
está definido para la visualización.
Puede empezar a procesar el código G en la visualización. El código G y el movimiento de la máquina (pórtico 3D) se muestran en el lado derecho de la
El código G
CNC_PathSpeed
N10 G01 X1000 F6000 N20 Y1000
En este código G, la velocidad de la trayectoria en bloque N10
está configurado con F6000
a 6000 mm/min. Sin embargo, los bloques de funciones del CNC esperan la velocidad de trayectoria en mm/s. Se ordenan dos movimientos lineales, primero X=1000
y luego a X=1000, Y=1000
.
Procesamiento de tokens
El SMC_ReadNCFile2
y SMC_ReadNCFromStream
los bloques de funciones proporcionan la capacidad de realizar sus propias transformaciones cuando se lee el código G. Aquí lo estamos usando con SMC_ITokenModifier
interfaz, que se pasa a través de aTokenModifier
entrada.
Esta interfaz funciona con «tokens». Estas son las partes básicas del código G en las que se subdivide el texto del código G cuando se inicia el procesamiento
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)
Este código G se subdivide de la siguiente manera:
Texto | 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 |
La información que no es necesaria para un procesamiento posterior (por ejemplo, espacios en blanco, saltos de línea y comentarios) no aparece en la lista de fichas.
Cuando el SMC_ITokenModifier
está implementada la interfaz, la lista de tokens se puede adaptar añadiendo nuevos tokens, eliminando tokens y cambiando los valores de los tokens.
Start
: Inicialización del bloque de funciones. Se restablece el estado internoCall
: Llamada a este método mientras se procesa el código G. Los tokens pueden leerse y eliminarse de la cola de entrada y añadirse a la cola de salida
Implementación
Todos los tokens se mueven de la cola de entrada a la cola de salida.
Si se detecta una palabra con F, entonces dos símbolos nuevos,
1/60
y*
, se añaden después del símbolo de «F» y antes del símbolo del valor de velocidad.
El Call
El método contiene la lógica para procesar los tokens. Es útil mover primero los tokens de la cola de entradatokensIn
) a una cola temporal (m_tmpQueue
), procesarlos allí y, a continuación, moverlos a la cola de salida (tokensOut
). La cola temporal no es absolutamente necesaria para adaptar la velocidad de la ruta, pero simplifica la estructura del programa en casos más complicados
Método: Llamar
Al principio, el sistema espera en STATE_RUNNING
estado hasta que se pueda iniciar el procesamiento (cuando los tokens estén disponibles en la cola de entrada y aún haya espacio en la cola de salida).
IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN // Wait until processing can proceed RETURN; END_IF
Luego, un token se mueve de la cola de entrada a la cola temporal.
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
El procesamiento real se realiza en ConvertSpeed
método.
IF NOT m_tmpQueue.IsEmpty() THEN // The actual processing is done here ConvertSpeed(); END_IF
Al final del método, un token se mueve de la cola temporal a la cola de salida.
Método: ConvertSpeed
Se comprueba el primer token de la cola temporal.
Si es un identificador con el valor F
se encuentra, luego se agregan dos fichas adicionales: el número 1/60.0
y el operador *
.
(El tamaño de la cola temporal se selecciona de forma que quepan dos fichas más en la cola además del único token de la cola de entrada).
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
Puesta en servicio
Cree la aplicación y descárguela en un controlador.
Inicie la aplicación, cambie a la visualización y pulse
Start
.