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:
QUEUE
Asigne memoria para la ruta con la cantidad requerida para
SMC_GEOINFO
elementos.Ejemplo:
BUF
Declarar una variable de tipo
SMC_GEOINFO
con un paso inicial.Ejemplo:
GEO
Un elemento de matriz de tipo de datos
SMC_GEOINFO
corresponde 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)); // Preprocessing
Importante
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
.