- 威纶通 EasyBuilder Pro 的穿透传输(Pass-Through)功能死穴: 威纶通 cMT 系列 HMI,网口接外网/局域网,串口(RS485)接三菱 FX3U PLC。 在 EBPr
- 松下 A6 伺服脉冲控制调到怀疑人生: A6 伺服驱动器(带 20 位高精编码器),接 PLC 发送差分脉冲(PULSE/DIR)控制定位。 电机低速(100 rpm)运转时,声音极度安静,定位也准
- 求助施耐德 Modicon M241 走 Ethernet/IP 控 ATV340 的抗干扰死坑: 软件使用 EcoStruxure Machine Expert。PLC 通过网线直接连接 3 台
- 台达 AS300 走 CANopen 控制自家 C2000 变频器求助: AS300 主机自带 CANopen 总线,通过台达官方软件(ISPSoft / CANopen Builder)配置了 DS
- 被欧姆龙 PLC 和第三方/自家 HMI 的 Modbus TCP 数据格式折腾炸了: OMRON NX1P2 PLC 作为 Modbus TCP Server,给触摸屏提供温度和压力数据(32 位
求助 S7-1500 搭配 V90 PN 的绝对值编码器校准死坑: 在博途(TIA Portal)工艺对象(Technology Object)里,调用 MC_Home 指令(Mode=7 或 6)
联系人:15632955945729
电话/手机:联系客服
发布时间:2026-09-20 06:17
浏览:89次
在博途(TIA Portal)工艺对象(Technology Object)里,调用 MC_Home 指令(Mode=7 或 6)对 V90 绝对值编码器进行了校准,把当前位置设为了 0。
软件里看 Position 变成 0,Homed 标志位也变 TRUE,一切正常。
核心故障: 只要设备一断电重启,博途里的轴状态 Homed 标志位立马变成 FALSE!机械坐标直接变成了一个几百毫米的随机机械数,相当于根本没校准成功!
我在博途里已经点击了‘将装载内存复制到RAM’和‘保持性设置’,驱动器参数也执行了‘Copy RAM to ROM’。
为什么绝对值编码器每次重新上电都会丢原点?”



















































MC_Home Mode=6/7 做的“绝对值编码器校准”,零点偏置不是写进 V90 编码器,也不是靠 V90 的 Copy RAM to ROM 保存;这个 Absolute Encoder Offset 是由 S7-1500 Technology Object 计算后,保持性地存储在 CPU 里的。
Mode 7 是绝对设定位置,Mode 6 是相对偏移。Siemens Industry
所以你现在做的:
V90 → Copy RAM to ROM
TIA → 装载内存 / RAM保持
并不是解决这件事的核心。
正常情况下,真正的绝对值轴应该是:
MC_Home Mode=7, Position=0
↓
CPU计算 Absolute Encoder Offset
↓
<TO>.StatusSensor[x].AbsEncoderOffset
被保持性保存
↓
整机断电
↓
重新上电
↓
读取编码器绝对位置
+
CPU中保存的Offset
↓
恢复原机械坐标
↓
Homed仍然有效
西门子明确说明,绝对值调整得到的 offset 是 retentively saved in the CPU。Siemens Industry
所以你这个故障最反常的其实不是“坐标变几百毫米”
而是这一句:
重新上电以后 Homed = FALSE。
因为西门子对 Incremental Encoder 明确规定:
POWER OFF
↓
Homed = FALSE
但是对于真正配置和识别正确的 Absolute value encoder,掉电本身不应该要求重新做绝对值调整。早期和后续 S7-1500 文档都把这一区别写得很清楚。西门子行业支持
所以:
如果每次普通 POWER OFF → POWER ON 就把 Homed 清掉,我第一怀疑不是“保持区没保存”,而是 Technology Object 根本没有把这个反馈链当成一个有效的绝对值编码器在使用。
这才是第一刀。
先检查 TIA 里的 Encoder Type
进入:
Technology Object
→ Configuration
→ Hardware interface / Encoder
重点看编码器类型究竟是不是:
Absolute
或者:
Cyclic absolute
而不是:
Incremental
这一点特别容易出问题:
电机物理上装的是绝对值编码器,不等于 Technology Object 自动就按照 absolute encoder 处理。
V90 + 1FL6 本身既支持:
Incremental TTL 2500 ppr
Absolute single-turn 21-bit
Absolute multi-turn 20-bit + 12-bit
所以必须和实际电机订货型号、V90识别结果、TO编码器配置一致。西门子行业支持
Absolute 和 Cyclic absolute 也不能随便选
这个地方是第二个大坑。
西门子对这两个词的定义,并不是:
Absolute = 单圈绝对编码器
Cyclic Absolute = 多圈绝对编码器
不是这个意思。
它们描述的是:
轴的最大机械行程与编码器绝对测量范围之间的关系。
西门子 V90/S7-1500 配置文档明确说明:
Absolute
如果轴的全部机械行程:
都位于编码器一个绝对测量范围以内
可以用:
Absolute
CPU上电后直接由编码器绝对值恢复位置。
Cyclic absolute
如果轴的运行范围可能超过编码器的一个绝对测量范围:
Encoder measuring range < Axis traversing range
就应该使用:
Cyclic absolute
CPU会额外累计 encoder measuring-range overflow,并把这些计数保持性保存。西门子行业支持
这可以解释你说的“几百毫米随机机械数”
假设你的机械:
丝杠导程 = 10 mm/rev
编码器实际是:
20 bit + 12 bit multiturn
也就是绝对多圈范围大约:
4096 motor revolutions
机械范围理论上约:
4096 × 10 mm
= 40960 mm
如果机械整个有效行程远小于这个范围,那么一般可以按真正 absolute 使用。
但如果:
- 编码器实际类型配置错;
- encoder revolutions 配错;
- mechanics ratio 配错;
- TO把反馈按 incremental 解释;
- 或实际跨过了一个 encoder measuring-range zero crossing;
重新启动以后 CPU 根据原始编码器值重建机械位置,就可能突然得到:
+386.4 mm
-728.1 mm
+1024 mm
这种看起来“随机”的数。
实际上它通常并不随机。
它很可能就是原始绝对编码器数值经过错误的比例/圈数/机械传动比换算后的结果。
我现在最想看的其实是 AbsEncoderOffset
重新做一次:
MC_Home
Mode = 7
Position = 0
成功以后,不要马上断电。
在线记录:
<TO>.StatusSensor[1].AbsEncoderOffset
具体数组下标按实际使用的 encoder。
西门子明确说明,这个就是绝对值校准后得到并保持保存的偏置。Siemens Industry
例如校准前:
Encoder raw position = 537.286 mm
你告诉系统:
当前位置 = 0 mm
CPU实际上建立类似:
Absolute encoder raw value
+
AbsEncoderOffset
=
Axis Position
于是可能得到:
AbsEncoderOffset ≈ -537.286 mm
这就是你的“机械零点”。
然后真正关键的实验来了
断电以前记录:
Homed = TRUE
AbsEncoderOffset = -537.286 mm
Position = 0
完全断电再上电。
立即检查:
Homed
AbsEncoderOffset
Encoder actual value
Position
StatusSensor.State
这样故障马上能被分成三类。
情况 A:上电后 AbsEncoderOffset 变成 0
例如:
断电前:
AbsEncoderOffset = -537.286
上电后:
AbsEncoderOffset = 0
那说明:
真正丢掉的是 CPU 里的绝对值校准偏置。
接下来查:
- CPU有没有被 Memory Reset;
- 是否启动时重新下载/重建 TO;
- 是否程序或 Commissioning 脚本重置了 Technology Object;
- 是否更换/重新初始化 Memory Card;
- 是否开机程序重新修改了 encoder configuration;
- CPU/TO firmware或项目版本有没有变化。
因为西门子说明,absolute encoder 的 Homed 状态在:
CPU replacement
encoder configuration change
factory reset
different project download
encoder fault
这类事件下会被重置;普通掉电不是正常触发条件。西门子行业支持
情况 B:AbsEncoderOffset还在,但 Homed = FALSE
这个情况我反而最怀疑:
编码器在 TO 里并没有作为有效 Absolute Encoder 建立起来。
马上检查:
<TO>.StatusSensor[1].State
西门子规定,做 absolute encoder adjustment 前,实际编码器值必须有效:
StatusSensor.State = 2
``` :chatgpt-content-reference{index="7"}
如果重新上电后经历:
```text
State ≠ 2
甚至产生 encoder fault,
TO可以丢失 Homed。
那么要查:
V90 encoder fault
PROFINET telegram
encoder actual-value validity
motor encoder identification
而不是继续折腾 PLC 保持区。
情况 C:Offset还在,Homed也正常,但 Position变几百毫米
这个才属于:
absolute encoder scaling / mechanics configuration 错误。
重点核对:
Encoder type
Increments per revolution
Number of revolutions
Fine resolution
Encoder revolutions
Load revolutions
Spindle pitch
Gear ratio
尤其是:
Number of revolutions
如果实际是多圈编码器,却在 TO 里把多圈范围配置错,启动后 raw absolute value 可以完全合法,但转换成机械 mm 后就是错的。
Siemens 用户在实际 absolute encoder 调试中也验证过:Mode 7 校准后,只要 Encoder Type、scaling 和 mechanics 正确,断电上电后零点应该仍然保持。西门子行业支持
为什么 V90 的 Copy RAM to ROM 对这个问题基本没帮助?
这是很多人最容易走错的地方。
现在其实有两个完全不同的数据:
V90保存的是
Motor parameters
Control parameters
Encoder configuration
Drive parameters
所以:
Copy RAM to ROM
保存的是这些驱动参数。
S7-1500 TO保存的是
机械坐标 ↔ Encoder absolute value
之间的关系,也就是:
AbsEncoderOffset
这是 PLC Technology Object 的数据。
因此:
V90 Copy RAM to ROM
不会把:
“现在这个机械位置叫0mm”
写进电机编码器。
换句话说:
Mode 7不是给编码器“烧一个新零点”,而是让 CPU 记住:这个编码器绝对读数,对应机械0mm。
这两个概念差别很大。
Mode 6 和 Mode 7也不要混着理解
西门子官方定义非常清楚:
Mode = 7
Absolute specification
即:
当前位置 := Position
所以:
Mode=7
Position=0
就是:
“当前位置定义为机械0。”
而:
Mode = 6
是 relative specification:
新位置
=
当前位置 + Position
``` :chatgpt-content-reference{index="9"}
所以如果你是机械找好零点以后做最终绝对值校准,我建议逻辑上用:
```text
Mode = 7
Position = 0
更直接。
Mode 6不是“另一种更可靠的保存方式”。
还有一个经常被忽略的问题:你用的到底是不是真正 Multi-turn absolute 电机
V90/1FL6 同一个系列有:
TTL incremental 2500 ppr
21-bit single-turn absolute
20-bit + 12-bit multi-turn absolute
``` :chatgpt-content-reference{index="10"}
如果实际电机是:
```text
21-bit single-turn absolute
那么它知道:
一圈里面在哪里。
但掉电以后并不知道:
已经转了多少圈。
对于滚珠丝杠来说:
一圈 = 10 mm
那么掉电重新上电以后,只靠单圈 absolute encoder,自然无法唯一判断:
当前是 3.7 mm
还是
13.7 mm
还是
203.7 mm
这就会让人产生:
“不是绝对编码器吗?为什么掉电以后位置没了?”
所以一定确认完整的 1FL6 电机型号 / encoder type。
如果这是一条几百毫米甚至几米的线性轴,而你希望真正做到:
掉电
→ 上电
→ 不回零
→ 立即知道机械绝对位置
通常需要足够测量范围的 multiturn absolute feedback,并在 TO 中正确设置 Absolute/Cyclic absolute。
所以这个故障我现在的嫌疑排序是
第一:TO里 Encoder Type 配置不是真正的 Absolute / Cyclic absolute。
因为:
POWER OFF
→ Homed FALSE
是非常像 incremental encoder 的行为。西门子行业支持
第二:物理电机实际上是 single-turn absolute,而机械是多圈线性轴。
先核完整 1FL6 型号。
第三:Absolute / Cyclic absolute 选择不符合实际机械行程和编码器 measuring range。 西门子行业支持
第四:TO里的 encoder revolutions / motor-load ratio / spindle pitch 配错。
导致上电后的原始绝对值被换算成几百毫米。
第五:绝对值 Offset 其实被保存了,但启动过程中 encoder feedback 暂时 invalid,造成 Homed reset。
看:
StatusSensor.State
以及 V90 diagnostics。
第六:CPU启动时存在 Memory Reset、项目重新下载或 TO/encoder configuration 被重建。
普通掉电本身不应该让 absolute encoder calibration失效。
我建议你下一次不要再改任何参数,做这个最短测试
校准以后记录四个数:
① Position
② Homed
③ StatusSensor[1].AbsEncoderOffset
④ StatusSensor[1].State
例如:
Position = 0.000
Homed = TRUE
AbsEncoderOffset = -486.327
State = 2
然后完全断电再上电,一毫米都不要动,马上重新看这四个值。
如果:
Offset归0
→ 查 CPU 保持/TO初始化。
如果:
Offset还在
Homed变FALSE
State异常
→ 查 encoder identification / TO encoder type / feedback validity。
如果:
Offset还在
Homed TRUE
但Position错
→ 查 encoder scaling / Absolute vs Cyclic absolute /机械比。
如果:
Homed FALSE
且配置页显示 Incremental
→ 基本破案。
所以这个案例最重要的一句话是:
MC_Home Mode=6/7 的绝对值校准并不是把“0点”写入 V90 ROM,而是在 S7-1500 Technology Object 中建立并保持 AbsEncoderOffset。真正配置正确的 absolute encoder 不应该因为普通掉电就丢掉 Homed;如果 POWER OFF 后 Homed 必然变 FALSE,首先检查 TO 是否真的把 V90 反馈配置成 Absolute/Cyclic Absolute,以及上电后 StatusSensor.State 是否有效,而不是继续做 V90 的 Copy RAM to ROM。