代码
INT iAxis
REAL HomeVel
REAL SearchLimitVel
REAL HomeOffset
REAL timeout
iAxis = 0
HomeVel = 5
SearchLimitVel = 10
HomeOffset = 157
timeout = 50000
VEL(iAxis) = SearchLimitVel
ACC(iAxis) = VEL(iAxis) * 10
DEC(iAxis) = VEL(iAxis) * 10
JERK(iAxis) = VEL(iAxis) * 100
KDEC(iAxis) = VEL(iAxis) * 100
MFLAGS(iAxis).#HOME = 0
FDEF(iAxis).#LL = 0
FDEF(iAxis).#RL = 0
ENABLE (iAxis)
TILL MST(iAxis).#ENABLED,timeout
IF ^ MST(iAxis).#ENABLED
GOTO FAULT_PROCESS
END
!IF ^MFLAGS(iAxis).#BRUSHOK
! COMMUT(iAxis)
! TILL MFLAGS(iAxis).#BRUSHOK
!END
JOG/v (iAxis),1*SearchLimitVel
TILL FAULT(iAxis).#RL,timeout
IF ^FAULT(iAxis).#RL
GOTO FAULT_PROCESS
END
JOG/v (iAxis),-1*SearchLimitVel
TILL ^FAULT(iAxis).#RL
IST(iAxis).#IND=0
TILL IST(iAxis).#IND,timeout
IF ^IST(iAxis).#IND
GOTO FAULT_PROCESS
END
SET FPOS(iAxis)=FPOS(iAxis)-IND(iAxis)+HomeOffset
PTP/e (iAxis),0
FDEF(iAxis).#LL = 1
FDEF(iAxis).#RL = 1
MFLAGS(iAxis).#HOME = 1
!!!!!!!!!!!!!!!!!!!!!!!!
local int zone_x
local real base_x
local real step_x
zone_x = 0!!56.9216
base_x = -119.16021
step_x = 9.2736
CORRECTON_X(0) = 0.00069 * 0
CORRECTON_X(1) = 0.00069 * 5
CORRECTON_X(2) = -0.00069 * 4
CORRECTON_X(3) = -0.00069 * 7
CORRECTON_X(4) = -0.00069 * 3
CORRECTON_X(5) = -0.00069 * 8
CORRECTON_X(6) = -0.00069 * 6
CORRECTON_X(7) = -0.00069 * 2
CORRECTON_X(8) = -0.00069 * 7
CORRECTON_X(9) = 0.00069 * 1
CORRECTON_X(10) = -0.00069 * 0
CORRECTON_X(11) = -0.00069 * 6
CORRECTON_X(12) = 0.00069 * 2
CORRECTON_X(13) = -0.00069 * 1
CORRECTON_X(14) = -0.00069 * 3
CORRECTON_X(15) = 0.00069 * 5
CORRECTON_X(16) = 0.00069 * 0
CORRECTON_X(17) = 0.00069 * 6
CORRECTON_X(18) = 0.00069 * 6
CORRECTON_X(19) = -0.00069 * 2
CORRECTON_X(20) = 0.00069 * 3
CORRECTON_X(21) = 0.00069 * 0
CORRECTON_X(22) = -0.00069 * 7
CORRECTON_X(23) = 0.00069 * 0
CORRECTON_X(24) = 0.00069 * 0
CORRECTON_X(25) = 0.00069 * 0
ERRORMAP1D 0, zone_x, base_x, step_x, CORRECTON_X
ERRORMAPON 0, zone_x
!!!!!!!!!!!!!!!!!!!!!!!!
STOP
FAULT_PROCESS:
FDEF(iAxis).#LL = 1
FDEF(iAxis).#RL = 1
HALT(iAxis)
STOP
!????????homeflag
!ON (MERR(0)<>0)|(MST(0).0<>1)
!MFLAGS(0).#HOME = 0
!RET
!ON (MERR(1)<>0)|(MST(1).0<>1)
!MFLAGS(0).#HOME = 0
!RET
!ON (MERR(2)<>0)|(MST(2).0<>1)
!MFLAGS(0).#HOME = 0
!RET
!ON (MERR(3)<>0)|(MST(3).0<>1)
!MFLAGS(0).#HOME = 0
!STOP
代码完整解读
这是一段运动控制器(伺服 / 步进控制)的轴回零 + 误差补偿 程序,语法是固高 / 雷赛 / 众为兴类运动控制卡专用脚本 ,核心功能:X 轴自动找原点 → 设定坐标系 → 加载点位误差补偿表。
我分模块逐行解释,你能直接看懂每一步做什么。
一、变量定义(参数初始化)
INT iAxis ! 定义轴号变量(整数)
REAL HomeVel ! 回零速度
REAL SearchLimitVel ! 找限位速度
REAL HomeOffset ! 原点偏移量
REAL timeout ! 超时时间(单位:ms)
iAxis = 0 ! 控制第0轴(X轴)
HomeVel = 5 ! 回零速度 = 5
SearchLimitVel = 10 ! 找限位速度 = 10
HomeOffset = 157 ! 原点偏移 = 157 个脉冲/单位
timeout = 50000 ! 超时50秒
二、运动参数设置(速度、加速度、加加速度)
VEL(iAxis) = SearchLimitVel ! 设置运行速度
ACC(iAxis) = VEL(iAxis) * 10 ! 加速度 = 速度×10
DEC(iAxis) = VEL(iAxis) * 10 ! 减速度 = 速度×10
JERK(iAxis) = VEL(iAxis) * 100 ! 加加速度(S曲线平滑)
KDEC(iAxis) = VEL(iAxis) * 100 ! 急停减速度
三、标志位初始化
MFLAGS(iAxis).#HOME = 0 ! 清除"回零完成"标志
FDEF(iAxis).#LL = 0 ! 禁用左限位
FDEF(iAxis).#RL = 0 ! 禁用右限位
四、使能伺服(上电)
ENABLE (iAxis) ! 伺服使能
TILL MST(iAxis).#ENABLED,timeout ! 等待伺服准备好,超时50s
IF ^ MST(iAxis).#ENABLED ! 若没使能成功
GOTO FAULT_PROCESS ! 跳转到故障处理
END
五、回零核心流程(自动找原点)
1. 正向 JOG 找右限位
JOG/v (iAxis),1*SearchLimitVel ! 正向点动
TILL FAULT(iAxis).#RL,timeout ! 等待触发右限位
IF ^FAULT(iAxis).#RL ! 没碰到限位=故障
GOTO FAULT_PROCESS
END
2. 反向离开限位 → 找原点 INDEX 信号
JOG/v (iAxis),-1*SearchLimitVel ! 反向移动
TILL ^FAULT(iAxis).#RL ! 直到离开右限位
IST(iAxis).#IND=0 ! 清除原点标志
TILL IST(iAxis).#IND,timeout ! 等待捕获INDEX(Z相信号)
IF ^IST(iAxis).#IND ! 没捕获到=故障
GOTO FAULT_PROCESS
END
3. 设定当前坐标 = 原点
SET FPOS(iAxis)=FPOS(iAxis)-IND(iAxis)+HomeOffset
! 公式:当前位置 - 索引偏移 + 原点偏移 = 设定为原点坐标
PTP/e (iAxis),0 ! 移动到 0 点
FDEF(iAxis).#LL = 1 ! 开启左限位
FDEF(iAxis).#RL = 1 ! 开启右限位
MFLAGS(iAxis).#HOME = 1 ! 标记【回零成功】
六、误差补偿表(核心:点位精度校正)
local int zone_x ! 补偿区域号
local real base_x ! 补偿起始坐标
local real step_x ! 补偿区间步长
zone_x = 0
base_x = -119.16021 ! X轴补偿起点
step_x = 9.2736 ! 每9.2736距离一个补偿点
定义 0~25 号点位的误差补偿值
CORRECTON_X(0) = 0.00069 * 0
CORRECTON_X(1) = 0.00069 * 5
...
CORRECTON_X(25) = 0.00069 * 0
每一个数字对应一个位置的精度修正值,用于消除机械误差。
加载并开启误差补偿
ERRORMAP1D 0, zone_x, base_x, step_x, CORRECTON_X
! 加载一维误差补偿表
ERRORMAPON 0, zone_x
! 开启X轴误差补偿
七、正常结束 & 故障处理
STOP ! 程序正常结束
FAULT_PROCESS: ! 故障处理
FDEF(iAxis).#LL = 1
FDEF(iAxis).#RL = 1
HALT(iAxis) ! 紧急停止
STOP
整体功能总结(最直白)
- 初始化:设置 X 轴速度、加速度、限位
- 伺服上电:检查是否正常使能
- 自动回零 :
- 先碰右限位
- 反向找电机 Z 相信号
- 设定原点坐标
- 精度补偿:加载 25 个点位的误差修正表,提升定位精度
- 保护机制:任何一步失败 → 立即急停 + 报警
你可能关心的关键问题
- 这是什么设备? 自动化设备(机械手、工作台、切割机、检测设备)的X 轴回零 + 精度校正程序。
- **HomeOffset = 157 是什么?**原点偏移量,机械安装时的微调距离。
- **CORRECTON_X 有什么用?**补偿丝杆 / 导轨误差,让设备定位更准(微米级精度)。
- **故障会发生什么?**轴立即停止,限位保护开启,程序终止