《Modbus通讯》word版

《Modbus通讯》word版
《Modbus通讯》word版

Modbus通讯

在坛子中看到很多弟兄们在做Modbus通讯时遇到很多问题,包括Modbus的请求或响应的基本知识,包括编程等等,现将我的一点拙见写出来,供大家参考和批评指正。

Modbus协议最早有施耐德旗下的Modicon公司与1978年提出,目前已经称为国际标准和国家、行业标准。

该协议是典型的串行通讯协议,支持CRC或LRC校验。通讯速率支持2.4kbps~115.2kbps,更快也可以,但是误码率较高。支持RTU或ASCII通讯凡是,支持奇/偶/无校验。

RTU通讯时标准通讯参数为支持8个数据位、1个停止位、偶校验;

ASCII通讯时标准通讯参数为支持7个数据位、1个停止位、偶校验;

Modbus总线理论上支持的从站个数可达248个(单条总线、不加中继时连接的设备个数与通讯端口和连接的设备有关,有的可连接16个设备,最大连接32个设备),不加中继双绞线距离可达1200米。

Modbus通讯时最常用的是RTU通讯方式:

1.通讯时读请求格式如下:

从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、读数据长度(2个字节)、CRC校验(2个字节)。

2.读响应格式如下:

从站地址(1个字节)、功能代码(1个字节)、读数据长度(1个字节)、数据(长度与数据长度中的字节数相同)、CRC校验(2个字节)。

3. 写请求格式:

从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、写出数据长度(1个字节)、写出数据(长度与数据长度字节相同)、CRC校验(2个字节)。

4. 写响应格式:

从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、写数据长度(2个字节)、CRC校验(2个字节)。

如果为RTU通讯,校验方式为CRC校验;ASCII通讯时,校验方式为LRC校验方式。

功能代码有很多:

01:读单个线圈(0***地址)数据

02:读输入信号(1***地址)数据

03:读连续多个寄存器地址(4***)

04:读连续多个输入模拟量地址(3***)

05:写单个线圈(0***地址)数据

06:写单个寄存器数据(4***)

07:读以外状态信息

08:诊断:

15:写多个连续线圈(0***地址)数据

16:写多个连续寄存器(4***)数据

17:返回从站ID:

20:读参考信息(文件记录)

21:写参考信息(文件记录)

23:读写FIFO队列

不同的Modbus设备支持的功能代码也有区别,总的来说Modbus设备可分为三类:

1. 基本型:支持03和16功能码

2. 标准型:支持03和16、01、02、08、15功能码

3. 扩展型:支持除标准型的功能码外,还支持20、21、23功能码。

Modbus读寄存器时最大可连续读取125个字的数据,写100个子的数据。

读位时可读2000个位信息,写1600个位信息。(位的数据与字的数据是16倍的关系)

很多人认为做Modbus读写位操作时,所有数据应该保存在位地址中。其实不是,在做Modbus 通讯时,由于所有数据都是按照字节方式打包的,因此,所有位数据都是存储到字节中发送或读取的(这就是个别通讯一直疑问为什么做位读写时数据还要存储到字地址中的原因)。

最后,由于Modbus通讯同时支持字读写和位读写(在施耐德所有PLC中,所有地址都是按照“字”地址和“位”地址定义的,字地址和位地址没有任何关系,可以任意调用,而西门子所有PLC地址都是按照“字节”方式定义的。)

在存储数据时,西门子PLC中的数据是按照“低字节、高字节”顺序存储的,如果读取浮点数数

据,顺序为:低字低字节、低字高字节、高字低字节、高字高字节。

而施耐德所有PLC由于按照“字”地址和“位”地址定义的,所有数据存储时与西门子PLC完全相反,即如果读取浮点数数据,顺序为:低字高字节、低字低字节、高字高字节、高字低字节的顺序。

这就是为什么有些数据上传到西门子PLC或HMI时,所有数据都不正确的原因,是因为高低字节顺序反了。

如果出现上述问题,只需将高低字节编程做个转换即可。

刚开始应用MODBUS通讯的时候,犯过错,拿出来分享下。

功能码 03 16 对应的 4***x(寄存器)应用最多。

一般起始地址对应的40001。例如仪表的地址是0x1F0 。容易对应成40496 。实际是40497.

采用Modbus通讯读写数据时,数据内容中并不包含数据的地址,数据地址包含在Modbus 读写的请求中。如下所示:

通讯时读请求格式如下:

从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、读数据长度(2个字节)、CRC校验(2个字节)。

因此,需要注意如下内容:

1. 从Modbus地址编码来说,最小地址为1,如1***、0***、3***、4***地址中最小地址都为1,如10001,00001,30001,40001等。但是很多厂家的设备在编码时都是按照最小地址为0来编码的,所以,写设备的数据区地址时必须加1,这就是“瘦锅”提到的问题;

2. 另外有的SCADA软件读取Modbus设备数据时,有的要求地址长度必须为6位(如ifix,所有地址必须为6位),而有的要求为5为(如intouch软件,读施耐德Quantum PLC时为6位,其它中端PLC为5位)。其实,从Modbus响应来说,所有数据中不包含地址,因此,在显示时输入6位或5位地址没有任何区别。ifix或intouch软件中要求的6位或5位只是各自厂家按照自己的习惯来要求的。

常见的测试Modbus通讯的软件除了常见的串口调试工具以外,最常用的是Modscan,可以测试Modbus和Modbus TCP/IP。

我做过MODBUS RTU从站的程序,当时是完成了FC03和FC16的功能

寄存器起始地址的2个字节正好被我定义为DB块号和DBB的号

比如如果主站发01 03 01 02 00 04 CRC_H CRC_L

我就把从DB1.DBW2开始的四个字打包加上CRC校验发出去。

欢迎您的下载,资料仅供参考!

相关主题
相关文档
最新文档