1. “地址偏移”到底指什么?
所谓“Modbus 地址偏移”,是指 相对于 HoldStart 指定起始地址的字节偏移量。
HoldStart:定义了 Modbus 保持寄存器(Holding Registers, 4xxxx)映射到 PLC V 区的起始字节地址。例如 &VB0 表示从 VB0 开始映射。
偏移量计算:Modbus 主站访问的第 N 个保持寄存器,对应的 PLC 地址为:PLC_Byte_Address=HoldStart_Address+(??×2)
注意:Modbus 保持寄存器是 16 位(2 字节) 数据。因此,寄存器索引每增加 1,PLC 字节地址增加 2。
2. VB1000 与 VB1002 的关系
这两个地址本身没有特殊的逻辑联系,它们只是 V 存储区中普通的相邻字节区域。它们的区别仅在于 被映射为不同的 Modbus 寄存器,或者属于同一个寄存器的不同半字。
若 HoldStart = &VB1000:
Modbus 寄存器 #0
→
→ 占用 VB1000 (高字节) 和 VB1001 (低字节)。
Modbus 寄存器 #1
→
→ 占用 VB1002 (高字节) 和 VB1003 (低字节)。
结论:VB1000 和 VB1002 分别属于两个不同的 Modbus 保持寄存器。
若 HoldStart = &VB0(常见默认配置):
VB1000 并不是直接从 VB0 偏移过来的第一个寄存器。
此时,Modbus 寄存器索引 N 与 VB1000 的关系需反推:N=(VB1000_Offset?HoldStart)/2
如果 HoldStart 是 &VB0,那么 VB1000 对应的是第 (1000?0)/2=500 号 Modbus 寄存器(即 Modbus 地址 40501)。
VB1002 则对应第 (1002?0)/2=501 号 Modbus 寄存器(即 Modbus 地址 40502)。
二、为什么容易看不懂?常见误区
误区 1:认为 Modbus 地址就是 PLC 物理地址
错误理解:主站写 Modbus 地址 40001,PLC 里就是 VW0。
正确理解:主站写 Modbus 地址 40001,写入的是 HoldStart 指向的第一个寄存器。如果 MBUS_INIT 中 HoldStart 设为 &VB1000,那么 40001 实际写入的是 VW1000(由 VB1000 和 VB1001 组成)。
误区 2:忽略“字对齐”导致的数据错位
Modbus 寄存器必须是偶数字节边界(因为每个寄存器占 2 字节)。
如果将 HoldStart 设置为奇数地址(如 &VB1),虽然某些库可能允许,但会导致标准 Modbus 主站读取时出现高低字节交换或解析错误。建议始终使用偶数起始地址(VB0, VB2, VB1000 等)。
误区 3:混淆“偏移量”与“绝对地址”
手册中提到的“偏移量”通常指内部指针计算过程(如资料中提到的 +D AC0, VD1000),这是底层汇编逻辑,普通编程时无需关心。
用户只需关注:HoldStart 参数填什么,Modbus 地址就从这个位置开始往后排。
以上内容由智造求索app生成。