编辑
2026-02-08
自动化
00
请注意,本文编写于 41 天前,最后修改于 41 天前,其中某些信息可能已经过时。

目录

效果演示
算法
到位判断
上机测试
  • 循环伺服使用相对控制走定长很简单,但是中间暂停后无法继续,如何用绝对定位的方式实现?
  • 假如皮带一直往一个方向运行,为了防止位置溢出,需要设置循环值

效果演示

点击观看测试视频

算法

ST
IF RealAxis.iMovementType = 0 THEN //循环轴 fCycPos := stAxisParam.aAxisPosData[iPosIndex].fTargetPos + stAxisParam.aAxisPosData[iPosIndex].fOffset; //fCycPos定长距离 //1.需要重新计算目标位置,比如目标是100,假如当前位置是10,那么只需要再走90 //当前位置/定长距离的余数就是还需要走的距离 ModReal(In1 := RealAxis.fSetPosition, //当前位置 In2 := fCycPos, //定长距离 Out => fCycModTarget //新的目标位置 ); //2.计算出最终目标位置,这里用轴的当前位置+定长距离-已经走的距离 //由于是循环值伺服,需要除以循环值,得到余数,就是最终目标 ModReal(In1 := RealAxis.fSetPosition + fCycPos - fCycModTarget , In2 := RealAxis.fPositionPeriod, //循环值 Out => fPosition //最终定位目标 ); END_IF

到位判断

ST
FOR i := 0 TO AxisConst.MAX_POS_COUNT BY 1 DO //stAxisParam.aAxisPosData[i].fVelocity:=50; IF RealAxis.iMovementType = 0 THEN //循环模式,设定的目标位置是步长 ModReal(In1 :=stAxisState.fAxisPos, //当前位置 In2 := stAxisParam.aAxisPosData[i].fTargetPos + stAxisParam.aAxisPosData[i].fOffset, //目标定长 Out => fCycArrive //余数 ); aPosArrive[i] := RealAxis.nAxisState=SMC_AXIS_STATE.standstill AND ABS(fCycArrive) < stAxisParam.fSetPosWidth; ELSE aPosArrive[i] :=RealAxis.nAxisState=SMC_AXIS_STATE.standstill AND ABS(stAxisParam.aAxisPosData[i].fTargetPos + stAxisParam.aAxisPosData[i].fOffset - stAxisState.fAxisPos) < stAxisParam.fSetPosWidth; END_IF END_FOR

上机测试

image.png

每次走200,目前位置在1474.70

image.png

触发绝对定位后,位置到1600

image.png

本文作者:zhusenlin

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 版权所有:zhusenlin 许可协议。转载请注明出处!