Ejemplo de CNC 10: Programación de una ruta de CNC dinámica
Vea el proyecto de ejemplo para esto CNC10_DynamicPath.project en el directorio de instalación de CODESYS por debajo ..\CODESYS SoftMotion\Examples.
Este ejemplo muestra cómo se puede crear una ruta CNC directamente en la aplicación en tiempo de ejecución, sin alimentar con código G de un objeto de programa CNC o un archivo. Cuando se compila este tipo de programa CNC convencional, los datos de ruta se almacenan en un SMC_CNC_Data tipo de estructura de datos. Estos datos internos luego se compilan en estructuras de datos globales específicas según el modo de compilación (SMC_CNC_REF o SMC_OutQueue).
En modo de compilación SMC_CNC_REF, los datos se almacenan en una matriz de SMC_GEOINFO elementos. La matriz en el código de la aplicación generalmente se pasa a la instancia del bloque de funciones. SMC_NCDecoder. En tiempo de ejecución, los datos se decodifican allí y se almacenan en una estructura de datos global de tipo SMC_OUTQUEUE. Luego se pueden llamar los bloques de funciones de preprocesamiento de ruta.
En modo de compilación SMC_OutQueue, una estructura de datos global (SMC_OUTQUEUE) es generado directamente. Esta estructura de datos en el código de la aplicación se pasa al interpolador (SMC_Interpolator instancia de FB). El bloque de funciones SMC_NCDecoder no se llama
En modo de compilación EXPEDIENTE, los datos se almacenan en un archivo. Los datos se almacenan como una matriz de elementos de tipo SMC_GEOINFO y corresponden a los datos que se generan en modo compilación SMC_CNC_REF.
En lugar de programar la ruta del CNC, puede programar un código de aplicación que instancia una estructura de datos de tipo SMC_OUTQUEUE en tiempo de ejecución y asigna sus valores. Se programa una ruta de CNC que se genera dinámicamente en tiempo de ejecución. Puede pasar la estructura de datos a otras instancias de bloques de funciones (por ejemplo, a los bloques de funciones de preprocesamiento de ruta o al bloque de funciones SMC_Interpolator).
Programación
Sugerencia
Él CNCDynamicPath proyecto de muestra se encuentra en el directorio de instalación de CODESYS. El proyecto de muestra fue desarrollado a partir de la CNConline proyecto. Incluye el Path programa en lugar del programado gráficamente Example camino. Una estructura de datos de tipo SMC_OUTQUEUE se genera dinámicamente.
Declarar una estructura de datos de tipo
SMC_OUTQUEUE. La estructura de datos contiene los datos de la ruta del CNC y se completa dinámicamente.Ejemplo:
QUEUEAsigne memoria para la ruta con la cantidad requerida para
SMC_GEOINFOelementos.Ejemplo:
BUFDeclarar una variable de tipo
SMC_GEOINFOcon un paso inicial.Ejemplo:
GEO
Un elemento de matriz de tipo de datos
SMC_GEOINFOcorresponde a un elemento de ruta en el código CNC. Los siguientes pasos deben realizarse para cada elemento con el fin de agregar el elemento alSMC_OUTQUEUE:Cada elemento de la matriz tiene una posición inicial que corresponde a la posición final del elemento de la matriz anterior.
Ejemplo:
GEO.piStartPos.dX := 0;oGEO.piStartPos := GEO.piDestPos;Determine un tipo de movimiento para cada elemento de la matriz.
Ejemplo:
GEO.iMoveType := CCLW;oGEO.iMoveType := LIN;Configure los parámetros del tipo de movimiento. Esto no es necesario para todos los tipos de movimiento.
Ejemplo: para un arco (tipo de movimiento: CCLW), es necesario configurar las siguientes posiciones:
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;Inserte el cálculo de la posición final.
SMC_CalcEndPnt(ADR(GEO));Inserte el cálculo de la longitud del objeto.
SMC_CalcLengthGeo(ADR(GEO));Guarde el objeto en
QUEUE:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
Cuando la ruta se crea por completo, los marcadores finales deben establecerse: QUEUE-bEndOfList = TRUE;
Sugerencia
Luego, cuando se llama a un bloque de funciones de preprocesamiento de ruta, es necesario establecer el bit de inicio o fin para InternMark.
Ruta CNC con dos elementos de ruta
En este ejemplo, las matrices no están definidas con las posiciones X / Y. Si este debe ser un ejemplo con dos elementos de ruta como se describe, entonces estas matrices tendrían que tener dos elementos cada una.
Por ejemplo, derivado del proyecto de muestra:
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
iState : INT;
QUEUE : SMC_OUTQUEUE;
BUF : ARRAY[0..49] OF SMC_GEOINFO;
// Memory allocation
GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
// Initial path element
n : INT := 0;
QUEUE.nSize := SIZEOF(BUF);
END_VAR
CASE iState OF
0:
QUEUE.pbyBuffer := ADR(BUF[0]);
// Initialize QUEUE
SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
iState := iState + 1;
1:
// Fill QUEUE
WHILE NOT QUEUE.bFull DO
// When QUEUE is full, wait until it has been processed by the following FBs
n := n + 1;
GEO.iSourceLine_No := n;
GEO.piStartPos := GEO.piDestPos;
// Copying last destination
GEO.iMoveType := LIN;
// Generating linear movement
GEO.iObjNo := GEO.iObjNo + 1;
// Calculating number
GEO.piDestPos.dX := xp[n];
// Generatint position
GEO.piDestPos.dY := yp[n];
SMC_CalcLengthGeo(pg := ADR(GEO));
// Calculating length of object with the help of the standard function
SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
// Appending object to QUEUE
IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
// All target positions processed
QUEUE.bEndOfList := TRUE;
n := 0;
iState := 2;
EXIT;
END_IF
END_WHILE
2:
//Done
;
END_CASE
CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // PreprocessingImportante
Si el SMC_OUTQUEUE la estructura de datos está poblada con SMC_GEOINFO datos y el elemento de estructura de datos se estableció en bFULL = TRUE, entonces no recomendamos una asignación adicional de SMC_GEOINFO datos. En este caso, la creación de la ruta se interrumpe en tiempo de ejecución hasta que el primer elemento del SMC_OUTQUEUE La estructura de datos se procesa en el interpolador. Solo entonces se inserta otro elemento.
Evite esta interrupción asignando suficiente memoria. Ver variable BUF.
Importante
Si la estructura de datos SMC_OUTQUEUE se vuelve a llenar después de la primera ejecución, luego el interpolador y todos los bloques de funciones de preprocesamiento (ejemplo: SMC_CheckVelocities) tienen que ser reiniciados por un flanco ascendente en Execute.