功能描述:
实现CNC应用中常用的双轴(XY轴)或三轴(XYZ轴)伺服插补控制功能,目前指令支持包含直线和圆弧插补功能。
(1) 指令格式
指令 | 名称 | 图形表现 | ST表现 |
IMC_IpoController | 直线圆弧插补指令 | IMC_IpoController( apAxis:= , bExecute:= , bEmergencyStop:= , astuProfInfo:= , diProfSum:= , dAngleTol:= , bLoop:= , bDone=> , bBusy=> , bCommandAborted=> , bError=> , uiErrorID=> ); |
(2) 相关变量
² 输入输出变量
输入输出变量 | 名称 | 数据类型 | 有效范围 | 初始值 | 描述 |
apAxis | 控制轴 指针 | ARRAY[0..2] OF POINTER TO AXIS_REF_SM3 | - | - | 映射到XYZ轴的指针数组 |
² 输入变量
输入变量 | 名称 | 数据类型 | 有效范围 | 初始值 | 描述 |
bExecute | 指令执行 | BOOL | TRUE,FALSE | FALSE | 上升沿:启动插补功能 下降沿:结束插补功能 |
bEmergencyStop | 急停 | BOOL | TRUE,FALSE | FALSE | TRUE:急停使能,插补轴停止动作,复位后继续执行剩余动作 |
astuProfInfo | 路径信息 | ARRAY[0..99] OF PROFILEINFO | - | - | 路径信息列表,其中包含按照执行顺序排列的路径段元素 |
diProfSum | 路径段数 | DINT | - | 0 | 有效路径段数,不大于100 |
dAngleTol | 速度约束拐角 | LREAL | - | 0.001 | 设置检测路径的尖锐段速度方向变化的角度(单位:deg),用于处理轴在路径尖锐处的速度平滑过渡。若某段路径的拐角大于等于该值,该位置的速度将减至0。若设置为负角,内部自动转换成正角(范围在0~360内的补角) |
² 输出变量
输出变量 | 名称 | 数据类型 | 有效范围 | 初始值 | 描述 |
bDone | 指令完成标志 | BOOL | TRUE,FALSE | FALSE | TRUE:指令执行完成 |
bBusy | 指令执行标志 | BOOL | TRUE,FALSE | FALSE | TRUE:当前指令正在执行中 |
bCommandAborted | 指令中断标志 | BOOL | TRUE,FALSE | FALSE | TRUE:当前指令被中断 |
bError | 错误标志 | BOOL | TRUE,FALSE | FALSE | TRUE:指令运行异常 |
uiErrorID | 错误代码 | UINT | - | 0 | 发生异常时,输出错误代码 |
(3) 功能说明
本指令涵盖的主要功能:
1. 根据用户设置的坐标位置和插补周期实现直线或圆弧插补功能,目前支持G00,G01,G02,G03指令;
2. 支持两个轴(二维平面)和三个轴(三维立体)的插补运动,支持在XY/ZX/YZ参考平面(G17/G18/G19)的圆弧插补运动;
3. 支持多个指令路径同时输入,功能块将按照指令路径的队列顺序依次执行;
4. 支持对路径进行预处理,实现对不同指令路径之间衔接位置的路径段进行包括位置曲线和速度曲线的光滑处理。
插补运行过程中的路径信息需要用户事先给出,每段的路径信息被定义为一个结构体,通过对结构体相关属性进行配置,并将结构体放入队列中,即可实现多路段连续执行的插补运动。路径结构体包括成员参数如下:
成员名称 | 参数类型 | 参数说明 |
eMoveType | SMC_MOVTYP | 指定路径移动曲线类型: G00(快速定位): 100 G01(直线插补): 1 G02(顺时针圆弧插补): 2 G03(逆时针圆弧插补): 3 |
eDimension | IMC_DIMTYP | 绘制圆弧时圆心的参考平面: XY_PLANE(二维XY平面):3 ZX_PLANE(二维ZX平面):5 YZ_PLANE(二维YZ平面):6 |
eCoordType | IMC_COORDTYP | 绝对坐标系模式:0 相对坐标系模式:1 |
lrTargetPosX | LREAL | X轴方向的目标位置或位置增量 |
lrTargetPosY | LREAL | Y轴方向的目标位置或位置增量 |
lrTargetPosZ | LREAL | Z轴方向的目标位置或位置增量 |
iArcMode | INT | 圆弧生成模式: 依据给定半径生成(仅生成不大于180度的圆弧):0 依据给定圆弧角度生成:1 依据圆弧段上给定点生成:2 生成整圆:3 |
lrMidPosX | LREAL | 圆弧段上给定点的X轴坐标 |
lrMidPosY | LREAL | 圆弧段上给定点的Y轴坐标 |
lrMidPosZ | LREAL | 圆弧段上给定点的Z轴坐标 |
lrMid2PosX | LREAL | 圆弧段上额外给定点的X轴坐标,用于绘制整圆 |
lrMid2PosY | LREAL | 圆弧段上额外给定点的Y轴坐标,用于绘制整圆 |
lrMid2PosZ | LREAL | 圆弧段上额外给定点的Z轴坐标,用于绘制整圆 |
lrArcAngle | LREAL | 圆弧角度(单位:°) |
lrRadius | LREAL | 圆弧插补半径(单位:units) |
lrVel | LREAL | 目标速度(单位:units/sec) |
lrAcc | LREAL | 最大加速度(单位:units/sec2) |
lrDec | LREAL | 最大减速度(单位:units/sec2) |
bRoundPath | BOOL | True:路径平滑处理 |
lrRoundRadius | LREAL | 路径衔接位置的圆弧半径(单位:units) |
(4) 注意事项
输入项apAxis指针数组中三个元素分别对应X,Y,Z轴,例如若只需控制X和Y轴,仅对X和Y轴对应元素赋值即可,Z轴对应元素无须赋值;
eMoveType为枚举输入,表示路径段的运动模式:快速定位G00(LINPOS:100),直线插补G01(LIN:1),圆弧插补G02(CLW:2),G03(CCLW:3);
eDimension为枚举输入,表示路径段在指定的参考平面执行,不同的参考平面设置会影响到绘制圆弧时的圆心坐标,例如当设置ZX平面为参考平面时,以当前位置为起点绘制的圆弧圆心与当前位置在同一个ZX平面上,即圆心的Y坐标与起点的Y坐标相同;
eCoordType为枚举输入,表示在此路径段执行绝对/相对位置控制,当设置成绝对坐标系模式时,轴将移动至指定的目标位置;当设置成相对坐标系模式时,将轴当前位置加上设置的位置值计算得到真正的目标位置后,再对轴实施控制;
lrTargetPosX,lrTargetPosY,lrTargetPosZ分别对应X,Y,Z轴的输入位置信息,注意在给eCoordType设置不同值的情况下,其代表的位置物理意义有所不同(见上条);
iArcMode表示用户绘制圆弧曲线时选用的参数模式,0表示根据圆弧起始结束点以及给定的半径长生成圆弧段;1表示根据圆弧起始结束点以及给定的圆弧角度生成圆弧段;2表示根据圆弧起始结束点以及给定圆弧段上任意点生成圆弧段;3表示根据圆弧起始结束点以及圆弧段上任意两个不同点生成整圆,默认为0;
lrMidPosX,lrMidPosY,lrMidPosZ分别对应圆弧段任意给定点在X,Y,Z轴的输入位置信息,仅在iArcMode设置为2或3时有效,注意若生成的圆弧段与设置的圆弧走向(逆时针或顺时针)不匹配,以生成圆弧段为准;
lrMid2PosX,lrMid2PosY,lrMid2PosZ分别对应圆弧段任意给定点在X,Y,Z轴的输入位置信息,仅在iArcMode设置为3时有效,注意该点坐标不应与上述点重叠,否则无法确定整圆位置;
lrArcAngle表示圆弧从起始点到结束点所跨过的角度,范围应大于0且小于360度,仅在iArcMode设置为1时有效;
lrRadius表示圆弧插补时的圆弧半径,若执行直线插补,无须设置此项;
lrVel表示该路径段的目标速度(单位:unit/s),lrAcc和lrDec分别表示最大允许的加速度和减速度(单位:unit/s2);
bRoundPath为路径平滑处理使能输入,若设置为TRUE,则将该段路径结束点与下一段路径起始点的衔接处用一小段圆弧代替,此圆弧的半径大小由lrRoundRadius给定,而圆弧起始结束位置则是由功能块内部决定,需要注意的是,若两段路径中至少存在一段为圆弧插补路径,则路径平滑功能在此处失效;
lrRoundRadius为路径平滑处理时替代圆弧的半径大小(单位:unit),若bRoundPath为TRUE时该值为0,相当于不执行平滑处理功能。
(5) 范例
首先配置各个路径段的信息:
stuProfInfoQueue : ARRAY [0..99] OF IMC_PROFILEINFO;
stuProfInfoQueue[0].eMoveType:= 1;
stuProfInfoQueue[0].eCoordType:= 0;
stuProfInfoQueue[0].lrTargetPosX:= 82.9;
stuProfInfoQueue[0].lrTargetPosY:= 8.9;
stuProfInfoQueue[0].lrVel:= 20;
stuProfInfoQueue[0].lrAcc:= 100;
stuProfInfoQueue[0].lrDec:= 100;
stuProfInfoQueue[0].bRoundPath:= TRUE;
stuProfInfoQueue[0].lrRoundRadius:= 10;
stuProfInfoQueue[1].eMoveType:= 1;
stuProfInfoQueue[1].eCoordType:= 1;
stuProfInfoQueue[1].lrTargetPosX:= 2; // 目标位置为84.9
stuProfInfoQueue[1].lrTargetPosY:= 75.7; // 目标位置为84.6
stuProfInfoQueue[1].lrVel:= stuProfInfoQueue[0].lrVel;
stuProfInfoQueue[1].lrAcc:= stuProfInfoQueue[0].lrAcc;
stuProfInfoQueue[1].lrDec:= stuProfInfoQueue[0].lrDec;
stuProfInfoQueue[1].bRoundPath:= TRUE;
stuProfInfoQueue[1].lrRoundRadius:= 10;
stuProfInfoQueue[2].eMoveType:= 1;
stuProfInfoQueue[2].eCoordType:= 0;
stuProfInfoQueue[2].lrTargetPosX:= 6.6;
stuProfInfoQueue[2].lrTargetPosY:= 25.7;
stuProfInfoQueue[2].lrVel:= stuProfInfoQueue[0].lrVel;
stuProfInfoQueue[2].lrAcc:= stuProfInfoQueue[0].lrAcc;
stuProfInfoQueue[2].lrDec:= stuProfInfoQueue[0].lrDec;
stuProfInfoQueue[2].bRoundPath:= TRUE;
stuProfInfoQueue[2].lrRoundRadius:= 10;
stuProfInfoQueue[3].eMoveType:= 3;
stuProfInfoQueue[3].eCoordType:= 0;
stuProfInfoQueue[3].lrTargetPosX:= 54.6;
stuProfInfoQueue[3].lrTargetPosY:= 49.7;
stuProfInfoQueue[3].lrRadius:= 100;
stuProfInfoQueue[3].lrVel:= stuProfInfoQueue[0].lrVel;
stuProfInfoQueue[3].lrAcc:= stuProfInfoQueue[0].lrAcc;
stuProfInfoQueue[3].lrDec:= stuProfInfoQueue[0].lrDec;
stuProfInfoQueue[3].bRoundPath:= FALSE;
stuProfInfoQueue[4].eMoveType:= 100;
stuProfInfoQueue[4].eCoordType:= 0;
stuProfInfoQueue[4].lrTargetPosX:= 0;
stuProfInfoQueue[4].lrTargetPosY:= 0;
stuProfInfoQueue[4].lrVel:= stuProfInfoQueue[0].lrVel;
stuProfInfoQueue[4].lrAcc:= stuProfInfoQueue[0].lrAcc;
stuProfInfoQueue[4].lrDec:= stuProfInfoQueue[0].lrDec;
stuProfInfoQueue[4].bRoundPath:= FALSE;
上述例子生成的曲线预览如下:
然后定义轴指针数组apAxis : ARRAY [0..2] OF POINTER TO AXIS_REF_SM3 := [ADR(X_Drive), ADR(Y_Drive)],以及MC_Power和IMC_IpoController:
dAngleTol的值默认为0.001,此处设置成100,表示若路径切换点的拐角小于或等于100°,均不作减速处理,以下为XY轴的位置和速度变化情况:
由上图可知,第一条曲线为路径段的标号,XY轴在第一段路径结束时接近给定的目标位置,且XY轴的合速度大小为设置的速度值,但是在第二段路径开始时两个轴的速度发
{{item.nickname}}
{{key+1}}楼{{item.content}}
{{item2.nickname}}
{{item2.content}}