Skip to main content

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.

. Declaración:
  • 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

. Implementación:
  • 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 al SMC_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; o GEO.piStartPos := GEO.piDestPos;

  • Determine un tipo de movimiento para cada elemento de la matriz.

    Ejemplo: GEO.iMoveType := CCLW; o GEO.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.

ejemplo 50. Ejemplo

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.