4. MC_Home详解:回零模式、时序图与调试技巧
大家好,我是老张。今天咱们聊聊回零——也就是MC_Home这个指令。
说实话,回零这个功能,看着简单,坑却不少。我见过太多工程师,程序写得很漂亮,一上电回零就出问题。要么撞限位,要么回不准,要么干脆回不了。
为什么会这样?
说白了,很多人没搞明白回零的几种模式,也没理解时序图背后的逻辑。今天我就把这些东西掰开了讲清楚。
4.1 回零的本质
回零,就是让轴找到一个绝对参考点。这个点,是所有绝对定位的基准。
你想想看,伺服电机编码器是增量的,断电后位置就丢了。下次上电,控制器不知道轴在哪。所以必须通过回零,让轴找到那个“家”。
我个人习惯把回零分成两大类:
- 绝对回零:轴会朝一个固定方向找原点信号
- 相对回零:轴在当前基础上偏移一段距离作为零点
嗯,这里要注意,PLCopen标准里还有“限位回零”这种特殊模式,后面我会细说。
4.2 回零模式详解
PLCopen标准定义了多种回零模式。我挑最常用的几种讲。
4.2.1 绝对回零(Mode 0)
这是最标准的回零方式。轴会按照设定的方向、速度去找原点传感器。
时序大概是这样的:
- 轴以高速朝原点方向运动
- 碰到原点传感器后,减速停止
- 反向低速离开传感器
- 再次低速接近传感器,在传感器边沿处停止
- 当前位置设为零点
我在项目中遇到过一个问题:传感器信号抖动,导致回零位置每次都不一样。后来加了滤波时间,问题就解决了。
关键参数:
- HomePosition:回零完成后,当前位置被映射成的坐标值
- HomeSwitch:原点传感器信号
- HomeVelocity:高速搜索速度
- HomeAcceleration:加减速度
4.2.2 相对回零(Mode 1)
这种模式不找传感器。轴直接以当前位置为基准,移动一段设定距离后,把那个点设为零点。
说白了,就是“假装”那里是原点。
什么时候用?
- 系统没有原点传感器
- 轴已经在已知位置,只需要微调零点
- 调试阶段临时用一下
注意:相对回零没有物理参考,断电后位置信息会丢失。下次上电必须重新回零。
4.2.3 限位回零(Mode 2)
这种模式比较特殊。轴先朝一个方向运动,直到撞上硬限位或软限位,然后反向找原点。
我建议在以下场景使用:
- 设备没有原点传感器,但有行程限位
- 原点传感器故障时的应急方案
- 某些特殊机械结构,比如旋转台
我曾经在一个包装机上用过限位回零。当时原点传感器坏了,客户又急着生产。我临时改了参数,用限位当原点,撑了三天直到新传感器到货。
4.3 回零时序图
下面这张图,是我自己画的回零时序图。你看一眼就能明白整个过程。
你看,整个过程分四个阶段:
- 阶段1:轴以高速冲向传感器,节省时间
- 阶段2:碰到传感器后减速,防止过冲
- 阶段3:反向低速离开,消除回程间隙
- 阶段4:再次低速接近,在传感器边沿精确定位
为什么要搞这么复杂?
因为机械有惯性,有间隙。如果直接高速撞传感器然后停止,每次停止位置都不一样。通过两次低速逼近,可以消除大部分误差。
4.4 配置参数详解
下面这个表,是我整理的回零相关参数。你调试的时候对着看就行。
| 参数名称 | 数据类型 | 说明 | 我的建议 |
|---|---|---|---|
| HomePosition | REAL | 回零完成后,当前位置被映射成的坐标值 | 通常设为0,除非有特殊需求 |
| HomeSwitch | BOOL | 原点传感器输入信号 | 注意信号滤波,防止抖动 |
| HomeVelocity | REAL | 高速搜索速度,单位mm/s或deg/s | 设为额定速度的30%-50% |
| HomeAcceleration | REAL | 加减速度 | 不要太大,否则容易过冲 |
| HomeDirection | INT | 回零方向:0=正方向,1=负方向 | 根据机械结构确定 |
| HomeOffset | REAL | 回零完成后,再偏移一段距离 | 用于调整零点位置 |
调试小技巧:
我一般先把HomeVelocity设得很低,比如10mm/s。确认传感器信号正常、方向正确后,再逐步提高速度。这样可以避免撞坏机械。
4.5 调试技巧与避坑指南
调试回零,说难不难,说简单也不简单。我总结了几条经验:
4.5.1 先确认传感器
我曾经遇到过一个问题:回零时轴一直冲,不停。查了半天,发现是传感器线松了。所以调试第一步,先用手动模式移动轴,确认传感器信号能正常触发。
4.5.2 注意回零方向
HomeDirection这个参数,一定要和机械结构匹配。如果方向设反了,轴会朝远离传感器的方向跑,永远回不了零。
4.5.3 加减速度要合理
HomeAcceleration设得太小,回零时间会很长。设得太大,轴会过冲,导致回零位置不准。我一般先设一个中间值,然后根据实际效果微调。
4.5.4 处理传感器抖动
有些传感器信号不稳定,会在边沿处反复跳变。这会导致回零位置每次都不一样。解决办法:
- 硬件上:加RC滤波电路
- 软件上:在PLC中设置数字滤波时间
- 参数上:增加回零时的低速逼近次数
重要提醒:
回零完成后,一定要检查Done信号。如果Done没有置位,说明回零失败。这时候不要执行后续的绝对定位指令,否则轴会乱跑。
4.5.5 多轴同步回零
如果你有多个轴需要同步回零,比如龙门结构,我建议:
- 先让所有轴独立回零
- 确认每个轴都回零成功后,再执行同步操作
- 不要试图让两个轴同时回零,容易出问题
4.6 代码示例
下面是一个简单的MC_Home调用示例。我用的是结构化文本(ST)语言。
// 回零指令调用
MC_Home_Instance(
Axis := Axis_1, // 轴引用
Execute := bHomeStart, // 上升沿触发
Position := 0.0, // 回零后位置
HomeMode := 0, // 绝对回零模式
HomeSwitch := bHomeSensor, // 原点传感器
HomeVelocity := 50.0, // 高速搜索速度 mm/s
HomeAcceleration := 500.0, // 加减速度 mm/s²
HomeDirection := 0, // 正方向回零
HomeOffset := 0.0, // 无偏移
Done => bHomeDone, // 回零完成
Busy => bHomeBusy, // 回零进行中
Error => bHomeError, // 错误标志
ErrorID => wHomeErrorID // 错误代码
);
// 错误处理
IF bHomeError THEN
// 记录错误代码
sErrorMsg := '回零失败,错误代码:' + INT_TO_STRING(wHomeErrorID);
// 复位错误
bHomeStart := FALSE;
END_IF
这段代码很简单,但有几个细节要注意:
- Execute是上升沿触发,不要一直给TRUE
- 回零过程中,不要给其他运动指令
- 错误处理一定要做,否则轴卡住了你都不知道
4.7 总结
回零这件事,说白了就是让轴找到回家的路。模式选对了,参数调好了,时序理解了,基本就不会出大问题。
我个人习惯是:调试时先低速、先手动、先确认传感器。等一切正常了,再上高速。这样虽然慢一点,但安全。
嗯,今天就讲到这里。回零这块内容不少,但只要你动手调一次,就全明白了。
公众号:蓝海资料掘金营,微信deep3321