电话/手机:联系客服
求助德国力士乐变频伺服的大坑:
现场一台 IndraDrive C 驱动器带绝对值伺服电机,走 Sercos III 光纤总线。
正常开机调试,定位精度极高,反复跑都没问题。
诡异故障:只要把控制柜主电源切断(掉电),再重新合闸开机,PLC 读出来的伺服当前位置,就会精准地比掉电前的绝对位置‘少(或多)正好 10mm’(机械丝杠的螺距正好是 10mm)!
每次断电重启,它就丢失正好一个 Pitch(螺距)。
伺服使用的是多圈绝对值编码器,电池电压也正常。
为什么带电池的绝对值编码器,断电重启后不仅不记数,还会以‘螺距’为单位产生整倍数的断层漂移?
优质评论内容
亲,这个不像电池或多圈编码器真的“丢了一圈”。
它每次刚好差 10mm = 丝杠一个螺距 = 电机一圈,这个特征太明显了:
不是编码器随机漂移,而是驱动器/PLC 在断电重启后,把“同一个单圈绝对位置”展开到了相邻的一圈。
也就是说,系统没有丢“角度”,而是丢了“这是第几圈”的解释,或者 PLC/NC 侧把位置做了错误的 modulo 展开。
一、绝对值编码器记住的是“电机轴位置”,不是完整机器坐标
带电池的多圈编码器能保存电机轴的多圈信息,但机器坐标还要经过:
编码器原始多圈位置
× 电子齿轮 / 机械传动比
× 丝杠螺距
+ 绝对零点偏置
+ PLC/NC 坐标系偏置
+ modulo / travel range 展开逻辑
Rexroth 文档里,编码器 1 的位置编码器类型 S-0-0277 会定义它是旋转/直线编码器、方向是否反转、是否可进行绝对评估等;其中 bit 6 表示绝对评估是否可能,bit 7 还可以把绝对编码器改成相对评估,bit 8 则是“强制绝对评估”。文档还警告,如果主站基于错误的实际位置值控制,可能造成碰撞或废品。
所以:
电池正常,只说明编码器原始多圈数据还在;不代表 PLC 看到的“机器坐标”一定还对。
二、为什么偏偏差一个 10mm?
因为丝杠螺距正好 10mm。
对这根轴来说:
电机 1 圈
=
丝杠前进 1 个 Pitch
=
10mm
如果断电重启后,系统把电机多圈数展开错了 1 圈,PLC 看到的就是:
当前位置 ± 10mm
这不是玄学,是非常标准的“一圈展开错误”。
随机干扰通常不会每次精准 10mm;电池异常也不会这么稳定地以螺距为单位错。
三、第一嫌疑:PLC/NC 把这根轴设成了 modulo 轴
重点查 PLC 或运动控制器里的轴类型:
Modulo axis
Rotary axis
Modulo value
Period
Cycle length
Travel range
如果某个地方把该轴的 modulo period 设成了:
10mm
那么系统就认为:
0mm 和 10mm 是同一个相位
10mm 和 20mm 是同一个相位
重启时,主站要把编码器读到的“绝对相位”重新展开成“机器坐标”。如果它选择了相邻的 modulo 周期,就会精准差一个 Pitch。
Rexroth 资料里也明确提到,绝对评估会受到 absolute encoder range、maximum travel range 或 modulo value 的影响;也就是说,绝对编码器是否能被正确绝对评估,不只看编码器本身,还看最大行程/模数范围配置是否合理。
四、第二嫌疑:PLC 只用了“单圈位置”,没有用完整多圈绝对位置
很多项目里会犯这个错误:
PLC 读到单圈位置 0~一圈
↓
再用自己的 Retain 变量拼多圈
↓
断电重启时根据上次位置找最近一圈
↓
刚好选错相邻一圈
这样正常上电连续运行时完全没问题,因为 PLC 一直在累计。
但一断电,重新开机时它要“猜”当前属于哪一圈。只要边界、方向、取整或保留变量稍有问题,就会差一圈。
正确做法应该是:
优先读驱动器已经处理好的绝对总位置
不要在 PLC 里自己二次拼单圈 + 多圈
Rexroth 的位置体系里,实际位置值如 S-0-0051 是编码器 1 的 actual position value;建立位置数据参考时,实际位置偏置会反映到 S-0-0175 等参数中。Rexroth 文档把这些参数列为位置参考建立的关键量。
五、第三嫌疑:开机程序每次偷偷执行了一次 SetPosition / Set absolute
这个特别常见。
断电重启后,PLC 程序可能有一段初始化逻辑:
Axis enable
↓
读取当前绝对位置
↓
MC_SetPosition / SetActualPosition
↓
恢复断电前保存的位置
↓
设 Reference OK
如果这段逻辑里的断电前位置、当前编码器位置、丝杠换算、方向符号有一个地方差了一圈,就会每次开机固定偏移 10mm。
Rexroth 的绝对位置设定命令是 C0300 Set absolute position procedure command,对应 S-0-0447;相关诊断也说明,该命令用于设置绝对位置。
所以要重点查:
PLC 上电初始化
Sercos phase-up 之后的参数写入
MC_SetPosition
SetActualPosition
C0300 / S-0-0447
Reference / Homed bit
断电位置恢复 Retain 变量
这类程序平时看起来是在“恢复坐标”,实际可能每次给你多补或少补一个 Pitch。
六、第四嫌疑:绝对位置参考没有真正保存到驱动/编码器
Rexroth 的位置参考不是简单“我今天对零了就永远好了”。
绝对位置和机器零点之间有 offset。相关文档里提到,建立位置数据参考会产生实际位置偏置,如 S-0-0175;如果通过 C0300 设置绝对位置,驱动要把绝对编码器 offset 保存下来。相关诊断 C0303 的说明也提到,执行 C0300 时会确定编码器零点到机器零点的 offset,并保存到编码器数据存储中;如果通信受扰或无法写入,就会保存失败。
所以现场要查:
S-0-0175:Encoder 1 actual position offset
S-0-0403:Actual position value status
S-0-0447:C0300 set absolute position command
S-0-0277:Encoder 1 type / absolute evaluation
S-0-0278:Maximum travel range
S-0-0378:Absolute encoder range
如果 offset 没保存、被 PLC 覆盖,或者每次启动重新设一次绝对位置,断电后就可能出现固定 Pitch 偏移。
七、怎么最快分锅:看驱动器原始位置还是 PLC 位置错
这个故障一定要分两层看。
1. 断电前记录
在 IndraWorks / DriveTop / Sercos 诊断里记录:
驱动器侧 S-0-0051 实际位置
编码器原始单圈值
编码器多圈值
S-0-0175 offset
S-0-0403 reference status
PLC 轴实际位置
PLC 轴 retain 位置
2. 重新上电后,先不要让 PLC 写参数
非常关键:
只上电
不要使能
不要回零
不要执行 SetPosition
不要让自动初始化程序写轴位置
先读驱动器侧位置。
判断:
驱动器 S-0-0051 没变,PLC 位置差 10mm:
问题在 PLC/NC/Sercos master 的坐标展开或初始化。
驱动器 S-0-0051 本身差 10mm:
问题在驱动器绝对评估、offset、travel range、modulo 或 C0300 保存。
驱动器原始多圈值正确,但 S-0-0051 差 10mm:
问题在驱动器内部缩放/offset/参考建立。
原始多圈值也差一圈:
再查编码器、电池、编码器通信和多圈数据。
八、再做一个边界测试
把轴移动到两个位置分别断电重启:
位置 A:接近 0 / 10mm / 20mm 这种 Pitch 边界
位置 B:离边界很远,比如 5mm、15mm、25mm 中间
判断:
只在边界附近偏 10mm:
典型 modulo 展开 / 四舍五入 / 单圈跨界问题。
任何位置都固定偏 10mm:
更像 PLC 初始化多补一圈、offset 固定错一圈,或机械传动比/参考点保存错。
九、整改方向
按优先级来:
1. 不要把直线丝杠轴配置成 10mm modulo 轴。
除非它真的是循环旋转轴。
2. PLC 不要自己用单圈值拼多圈。
使用驱动器提供的绝对总位置。
3. 上电时不要自动执行 MC_SetPosition / C0300。
绝对位置设定只应在机械基准确认时执行一次。
4. 检查 S-0-0277 是否处于绝对评估,而不是相对评估。
注意 bit 7/bit 8 的配置。
5. 检查 S-0-0278 最大行程、S-0-0378 绝对编码器范围。
最大行程和 modulo 配置不能让系统只能识别一圈周期。
6. 检查 S-0-0175 offset 是否断电保持一致。
断电前后比对,不应自己变一个 Pitch。
7. 检查 PLC 轴方向、丝杠螺距、电子齿轮、单位换算。
特别是 1rev = 10mm 的 feed constant。
8. 用 IndraWorks 直接读驱动器位置,与 PLC 显示对比。
先分清是驱动器错,还是 PLC 坐标错。
我会优先判断的真实原因
第一:
PLC/NC 把丝杠轴当 modulo 轴处理,modulo 周期刚好等于 10mm。
第二:
PLC 只读取单圈/模数位置,然后用 Retain 变量二次展开,多圈展开错一圈。
第三:
上电初始化程序执行了 SetPosition / C0300 / 恢复断电位置,固定多补或少补一个 Pitch。
第四:
绝对位置 offset 没有正确保存,或每次上电被主站重新写入。
第五:
S-0-0277、S-0-0278、S-0-0378 配置导致驱动器没有按完整绝对行程评估,而是在一圈周期附近重新解释位置。
一句话:
绝对值编码器没有丢电池记忆;10mm 这个特征说明系统丢的是“电机第几圈”的坐标展开。先别拆电机,先用 IndraWorks 对比断电前后的原始多圈值、S-0-0051、S-0-0175 和 PLC 轴位置。如果驱动器位置正确、PLC 差 10mm,就是主站 modulo/SetPosition/Retain 展开问题;如果驱动器自己差 10mm,再查绝对评估和 C0300 offset 保存。