通常 Modbus地址由 5位数字组成,包括起始的数据类型代号,以
及后面的偏移地址。 Modbus Master协议库把标准的 Modbus 地址
映射为所谓 Modbus功能号,读写从站的数据。 Modbus Master协
议库支持如下地址:
00001 - 09999:数字量输出( 线圈)
10001 - 19999:数字量输入(触点)
30001 - 39999:输入数据寄存器(通常为模拟量输入)
40001 - 49999:数据保持寄存器
Modbus Master协议库支持的功能
为了支持上述 Modbus地址的读写, Modbus Master协议库需要从
站支持下列功能:
表 1.需要从站支持的功能
Modbus 读 / Modbus从站须支持
地址
写
的功能
00001 - 读
09999
功能 1
功能 5:写单输出点
功能 15:写多输出点
数字量输写
出
10001 - 读
19999 写
功能 2
-
数字量输
入
30001 - 读
39999
功能
4
输入寄存 写
器
-
读
功能 3
40001 -
功能 6:写单寄存器
49999
单元
保持寄存 写
器
功能 16:写多寄存器
单元
如何理解 Modbus地址与功能码的区别?
Modbus地址与 Modbus的功能码是两个层次的概念。
根据 Modbus通信协议, Modbus数据的地址使用 0xxxx、 1xxxx、
3xxxx和 4xxxx的形式,分别表示数字量输出、数字量输入、模拟
量输入等数据地址。在使用 S7-200的指令库时, Modbus 数据地址
与 S7-200的 I/O和数据存储区地址间有特定的对应关系。
有些设备表明它支持 Modbus RTU通信协议,但也详细提供了读写
数据的详细通信帧格式,其中包括如何指定
Modbus站的地址,需
要读写数据类型、长度等等。数据帧有特定字节指出此指令读写的数
据类型和地址,此字节的数据内容即所谓 “功能码”,如功能 1 指定
读取单个 /多个数字量输出点的值。
支持 Modbus协议的设备或软件,使用时用户直接设置或看到的应
当是 Modbus数据地址。 Modbus地址所访问的数据,是通过各种
“功能”读写而来。功能码是 Modbus地址的底层。如果 Modbus通
信的一方提供的所谓 Modbus协议只有功能码,则需要注意了解此
功能号与 Modbus地址间的对应关系。
使用 modbus地址时应注意下述问题:
1) 40001~4xxxx是美国 modicon公司和 ge公司 plc 使用的
modbus地址,它是基于 1的地址,即同类元件的首地址为 1 。西门子
plc的 modbus地址是基于 0 的地址。
2)美国的 modbus地址左起第 2位用来表示元件的类型,例如
i0.0的 modbus地址为 010001。因为数据类型已经包含在功能码中了,
西门子的 i0.0的 modbus地址实际上为 000000,i2.0的 modbus 地址为
000016(或十六进制数 16#0010),而不是 010017。
其他问题:
1、 modbus的保持和输入寄存器是以 word( 16bit)为单位的。( Data
is packed as two bytes per register.
)
比如 4****(保持寄存器 /输出寄存器)和 3****(输入寄存器)是以字为
单位的。
所以,如果读 40001寄存器开始的一个 16位的无符号数,那么返回 2
个 Byte,并可以从 40002开始读下一个 16位的无符号数。
但是,如果读 40001寄存器开始的一个 32位浮点数,那么,返回 4个
Byte,而且,下一个 32位浮点数必须从 40003 开始。
客户问题:
1)、将 40001定义为一个 Byte 的数据;
2)、将 40001定义为 32位浮点数, 40002为下一个 32位浮点数。
我们可以参考一下国标 GBT_19582-1 2008(基于 Modubs 协议的工
业自动化网络规范)的功能码表:
2、寄存器最小地址为 1,而报文起始地址为 0。( Register 1 is
addressed as 0)
在数据报文中 ,所有的 modbus地址都是从 0开始的。也就是首次出现
的数据项在报文中的地址为 0。比如:( All data addresses in Modbus
messages are referenced to zero. The first occurrence of a data item
is addressed as item number zero. For example: )
在控制器中,“线圈 1”在 Modbus报文的地址域中的地址
1.
为 00 00。
( The coil known as ,coil 1? in a programmable
controller is addressed as coil
0000 in the data address field of a Modbus message.
)
线圈 127的十六进制报文地址为 007E hex(十进制的
126)
2.
Coil 127 decimal is addressed as coil 007E hex (126
decimal).
保持寄存器 40001的报文地址为 00 00。因为报文功能码
明确要操作“保持寄存器”,所以,协议就以“ 4XXXX”代表
这个寄存器。
3.
Holding register 40001 is addressed as register 0000 in
the data address field
of the message. The function code field already
specifies a ,holding register?
operation. Therefore the ,4XXXX? reference is implicit.
保持寄存器 40108的报文地址为 006B hex (十进制 107)
4.
Holding register 40108 is addressed as register 006B
hex (107 decimal).
上面摘自 Modicon_Modbus协议 .pdf Page27
总之, Modbus地址一般指 4****(保持寄存器 /输出寄存器)和 3****(输
入寄存器),这时应用层面的:
比如设备说明书可以简要说明设备支持
细描述其地址对应关系为: 40001—— 模拟量采集通道 1, 16 位有符
号数, …。
Modbus RTU标准协议,并详
比如组态软件的地址设置,一般为输出寄存器,从地址
1开始,连续多
少个。或者指明 400001: 16位有符号数。
但是,在数据报文层面,寄存器起始地址从
0开始。
数据报文包括:设备地址 +功能码 +起始地址 +寄存器个数 +校验位。其
中,起始地址是从 0 开始的。
举例说明:从设备 11读 40001开始的 2个寄存器数据的报文
设备地址 功能码起始地址 寄存器个数 校验
11
03
00 00
00 02
来源:https://blog.csdn.net/zhuangyuanlang1/article/details/100535611