Skip to main content

CNC 示例 10:编程动态 CNC 路径

CNC10_DynamicPath.project 安装目录下的示例工程 CODESYS 在下面 ..\CODESYS SoftMotion\Examples.

此示例展示了如何在运行时直接在应用程序中创建 CNC 路径,而不是使用来自 CNC 程序对象或文件的 G 代码。这种传统的CNC程序编译时,路径数据存放在一个 SMC_CNC_Data 数据结构类型。然后根据编译模式将此内部数据编译为特定的全局数据结构(SMC_CNC_REF 或者 SMC_OutQueue).

在编译模式下 SMC_CNC_REF,数据存储在一个数组中 SMC_GEOINFO 元素。应用程序代码中的数组通常传递给功能块实例 SMC_NCDecoder.在运行时,数据在那里被解码并存储在一个全局数据结构中 SMC_OUTQUEUE.然后可以调用路径预处理功能块。

在编译模式下 SMC_OutQueue, 一个全局数据结构 (SMC_OUTQUEUE) 生成 直接地.应用程序代码中的这个数据结构被传递给插值器(SMC_Interpolator FB 实例)。功能块 SMC_NCDecoder 不叫。

在编译模式 文件,数据存储在文件中。数据存储为类型元素的数组 SMC_GEOINFO 并对应编译模式下生成的数据 SMC_CNC_REF.

您可以编写一个应用程序代码来实例化类型为 SMC_OUTQUEUE 在运行时并为其赋值。编写在运行时动态生成的 CNC 路径。您可以将数据结构传递给其他功能块实例(例如传递给路径预处理功能块或功能块 SMC_Interpolator)。

编程

提示

CNCDynamicPath 示例项目位于安装目录 CODESYS.示例项目是从 CNConline 项目。它包括 Path 程序而不是图形编程 Example 小路。类型的数据结构 SMC_OUTQUEUE 是动态生成的。

. 宣言:
  • 声明一个类型的数据结构 SMC_OUTQUEUE.数据结构包含 CNC 路径数据并动态填充。

    例子: QUEUE

  • 为具有所需数量的路径分配内存 SMC_GEOINFO 元素。

    例子: BUF

  • 声明一个类型的变量 SMC_GEOINFO 与初始步骤。

    例子: GEO

. 执行:
  • 数据类型的数组元素 SMC_GEOINFO 对应于 CNC 代码中的路径元素。必须对每个元素执行以下步骤才能将元素添加到 SMC_OUTQUEUE

  • 每个数组元素都有一个起始位置,对应于前一个数组元素的结束位置。

    例子: GEO.piStartPos.dX := 0; 或者 GEO.piStartPos := GEO.piDestPos;

  • 确定每个数组元素的移动类型。

    例子: GEO.iMoveType := CCLW; 或者 GEO.iMoveType := LIN;

  • 设置运动类型的参数。并非所有运动类型都需要这样做。

    示例:对于圆弧(运动类型:CCLW),需要设置以下位置: 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;

  • 插入结束位置的计算。

    SMC_CalcEndPnt(ADR(GEO));

  • 插入对象长度的计算。

    SMC_CalcLengthGeo(ADR(GEO));

  • 将对象保存在 QUEUE

    SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));

完全创建路径后,必须设置结束标记: QUEUE-bEndOfList = TRUE;

提示

然后,当调用路径预处理功能块时,需要设置起始位或结束位 InternMark.

50. 例子

带有两个路径元素的 CNC 路径

在这个例子中,数组没有用 X/Y 位置定义。如果这应该是一个具有两个路径元素的示例,那么这些数组每个都必须有两个元素。

例如,从示例项目派生:

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


重要

如果 SMC_OUTQUEUE 数据结构填充有 SMC_GEOINFO 数据和数据结构元素被设置为 bFULL = TRUE,那么我们不建议进一步分配 SMC_GEOINFO 数据。在这种情况下,路径的创建在运行时被中断,直到路径的第一个元素 SMC_OUTQUEUE 数据结构在插值器中处理。只有这样才能插入另一个元素。

通过分配足够的内存来避免这种中断。见变量 BUF.

重要

如果数据结构 SMC_OUTQUEUE 在第一次执行后重新填充,然后是插值器和所有预处理功能块(例如: SMC_CheckVelocities) 必须在上升沿重新启动 Execute.