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/60y*, 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_IFPuesta en servicio
Cree la aplicación y descárguela en un controlador.
Inicie la aplicación, cambie a la visualización y pulse
Start.