北冥有鱼,其名曰鲲,鲲之大,不知其几千里也;化而为鸟,其名为鹏,鹏之背,不知其几千里也,怒而飞,其翼若垂天之云。
分类: LINUX
2013-03-26 15:07:38
Modbus协议最初由Modicon公司开发出来,是针对PLC设备设计的基于串行总线的主从模式的应用层总线设备协议。ModbusTCP是封装在TCP包内的Modbus协议,虽然有一些变化,但是根本上还是主从模式。
随着嵌入式技术的发展,国内很多系统的控制和采集单元部分为公司自主研发,我一般建议这些公司的串行通讯协议采用Modbus协议,在和客户的沟通中,我发现很多常见的针对modbus协议理解错误,现在分析如下:
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报文的地址域中的地址为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)
Coil 127 decimal is addressed as coil 007E hex (126 decimal).- 保持寄存器40001的报文地址为00 00。因为报文功能码明确要操作“保持寄存器”,所以,协议就以“4XXXX”代表这个寄存器。
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)
Holding register 40108 is addressed as register 006B hex (107 decimal).上面摘自Modicon_Modbus协议.pdf Page27
总之,Modbus地址一般指4****(保持寄存器/输出寄存器)和3****(输入寄存器),这时应用层面的:
比如设备说明书可以简要说明设备支持Modbus RTU标准协议,并详细描述其地址对应关系为:40001 —— 模拟量采集通道1,16位有符号数,.....。
比如组态软件的地址设置,一般为输出寄存器,从地址1开始,连续多少个。或者指明400001:16位有符号数。
但是,在数据报文层面,寄存器起始地址从0开始。
数据报文包括:设备地址+功能码+起始地址+寄存器个数+校验位。其中,起始地址是从0开始的。
举例说明:从设备17读40001开始的2个寄存器数据的报文
设备地址 功能码 起始地址 寄存器个数 校验
11 03 00 00 00 02 --
客户问题:
1)、使用和定义40000地址;
2)、分析报文时,直接将报文起始地址当作应用层寄存器地址。
具体请参考:Modicon_Modbus协议.pdf
注意:关于Modbus协议,本人推荐使用Modicon官方英文文档,中文翻译协议中,很多关键地方不能说清楚。
待续
zsszss00002013-03-26 15:08:13
忘了说了 这是转发别人的文章
http://blog.csdn.net/a358763471/article/details/6109584
zsszss00002013-03-26 15:08:13
忘了说了 这是转发别人的文章
http://blog.csdn.net/a358763471/article/details/6109584