特定于用户的 G 代码函数
这个 CNC11_CustomFunctions.project 示例项目位于的安装目录中 CODESYS 下面 ..\CODESYS SoftMotion\Examples。
此示例说明如何创建自己的函数以用于 G 代码中的表达式。
有关 G 代码中表达式和函数的更多信息,请参阅: 表达式。在这里,您将找到默认支持的所有运算符和函数的列表。
该示例定义了 SEL 操作符来自 IEC 61131-3,因此也可以在 G 代码中使用。
应用程序的结构
与CNC应用程序一样,该应用程序包括路径处理(CNC_PreparePath 程序)和插值(CNC 程序)。由于插值与其他示例没有区别,因此此处将不进一步讨论该主题
在低优先级中,每隔 20 毫秒循环调用路径处理 PathTask。在高优先级中,每 4 毫秒循环调用插值 MotionTask。后台任务 VISU_TASK 是为可视化定义的。
在可视化中,您可以开始处理 G 代码并设置变量的值 $LONGLINE$。G 代码和机器的移动(3D 龙门架)显示在可视化的右侧
G 代码
数控
LET #WIDTH : LREAL N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110) N20 F50 E100 E-100 N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2 N40 Y-#WIDTH N50 X-#WIDTH Z-#WIDTH/2 N60 Y#WIDTH N70 X0 Y0 Z0
第 1 行:局部变量的声明 #WIDTH 类型的 LREAL。
第 2 行,区块 N10:赋值 SEL($LONGLINE$, 40, 110) 到变量 #WIDTH。如果 PLC 变量的值 $LONGLINE$ 是 TRUE,则表达式的值为 110;否则为 40。
在以下几行中,遍历一个在 Z 方向上有额外移动的矩形;矩形一边的长度为 2*#WIDTH。
的实施 SEL 函数

要创建用户定义的函数,你需要编写一个函数块来实现 SMC_NC_IFunction 接口。
有关更多信息,请参阅: smc_nc_iFunction。
GetSignature。此处返回函数参数的返回类型、计数和类型。在此示例中,SEL函数返回类型为的值T_OTHER并有 3 个类型的参数T_BOOL,T_OTHER,以及T_OTHER。T_OTHER代表任何类型(要么T_BOOL,T_LREAL,或T_STRING]。的所有 3 次出现T_OTHER必须具有相同的类型。METHOD GetSignature VAR_OUTPUT resultType : SMC_GVar_Type; nNumArguments : UDINT; pType : POINTER TO SMC_GVar_Type; END_VAR VAR argTypes : ARRAY[0..2] OF SMC_GVar_Type := [SMC_GVar_Type.T_BOOL, SMC_GVar_Type.T_OTHER, SMC_GVar_Type.T_OTHER]; END_VAR resultType := SMC_GVAR_Type.T_OTHER; nNumArguments := 3; pType := ADR(argTypes);
Call:处理 G 代码时调用此方法。参数是通过传递的pa输入。这个表情pa[0].argValue.bValue用于访问第一个参数的布尔值。取决于第二个参数的类型pa[1].argType,结果是返回值result.argType然后分支成一个 CASE 语句。METHOD Call VAR_IN_OUT result : SMC_NC_GArgument; END_VAR VAR_INPUT pa : POINTER TO SMC_NC_GArgument; END_VA RVAR_OUTPUT eError : SMC_ERROR; END_VAR VAR g : BOOL; END_VAR g := pa[0].argValue.bValue; result.argType := pa[1].argType; CASE result.argType OF SMC_GVAR_Type.T_BOOL: result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue); SMC_GVAR_Type.T_STRING: result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue); SMC_GVAR_Type.T_LREAL: result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue); ELSE eError := SMC_INVALID_PARAMETER; END_CASE
的配置 SMC_ReadNCFile2
的一个实例 CNC_Sel 函数块是在 GVL_CNCFunctions 全局变量列表。
一个数组 aCNCFunctions 长度为 1 的使用功能块的名称和实例进行初始化。然后将该数组链接到表中 funTable 类型的 SMC_NC_GFunctionTable。
aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction := [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)]; funTable : SMC_NC_GFunctionTable := (numFunctions:= 1, pFunction:= ADR(aCNCFunctions)) ;
最后,将此表传递给 SMC_ReadNCFile2 功能块:
rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE); [...] rncf2( bExecute:= TRUE, sFileName:= sFileName, pCustomFunTable:= ADR(funTable), pvl:= ADR(varList));
调试
生成应用程序并将其下载到控制器。
启动应用程序,切换到可视化,然后按
Start。你可以使用Longline用于设置变量值的单选按钮$LONGLINE$在 G 代码中TRUE或者FALSE。