MODBUS通讯应用
在很多高工们出去做项目时遇到的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通讯方式:
如下图使用我们的调试软件创建一个Modbus主从站
主站发送01 04 0000 0002 71 CB
从站发送01 04 0032 0032 DB 9E
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:读单个线圈
02:读输入信
03:读连续多个寄存器地址
04:读连续多个输入地址
05:写单个线圈
06:写单个寄存器数据
08:诊断:
15:写多个连续线圈
16:写多个连续寄存器
17:返回从站ID:
20:读参考信息(文件记录)
21:写参考信息(文件记录)
23:读写FIFO队列
不同的Modbus设备支持的功能代码也有区别,总的来说Modbus设备可分为三个类型:
基本型
支持03和16功能码。
标准型
支持03和16、01、02、08、15功能码。
扩展型
支持除标准型的功能码外,还支持20、21、23功能码。
Modbus读寄存器时最大可连续读取125个字的数据,写100个子的数据。
读位时可读2000个位信息,写1600个位信息。(位的数据与字的数据是16倍的关系)
很多人认为做Modbus读写位操作时,所有数据应该保存在位地址中。其实不是,在做Modbus
通讯时,由于所有数据都是按照字节方式打包的,因此,所有位数据都是存储到字节中发送或读取的(这就是个别通讯一直疑问为什么做位读写时数据还要存储到字地址中的原因)。
刚开始应用MODBUS通讯的时候,犯过错,拿出来分享下。
功能码 03 16 对应的 4***x(寄存器) 应用最多。
一般起始地址对应的40001。例如仪表的地址是0x1F0 。容易对应成40496 。实际是40497.
采用Modbus通讯读写数据时,数据内容中并不包含数据的地址,数据地址包含在Modbus读写的请求中。
如下所示
通讯时读请求格式如下:
从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、读数据长度(2个字节)、CRC校验(2个字节)。
因此,需要注意如下内容:
从Modbus地址编码来说,最小地址为1,如1xxx、0xxx、3xxx、4xxx地址中最小地址都为1,如10001,00001,30001,40001等。但是很多厂家的设备在编码时都是按照最小地址为0来编码的,所以,写设备的数据区地址时必须加1
常用的测试Modbus通讯的调试软件
可以微Pengllllllllllll获得链接
可以测试Modbus和Modbus TCP/IP。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!