完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. modbus的基本概念
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。 2. modbus的寄存器类型的介绍 [tr]寄存器读写权限说明[/tr]线圈bool类型变量 可读写 离散输入bool类型变量只读 保持寄存器长度为16bit的变量 可读写可以多可16bit 拼成浮点或者双精度数据 输入寄存器长度为16bit的变量 只读可以多可16bit 拼成浮点或者双精度数据 为啥叫线圈? 我猜测是因为最早是用来控制继电器的,继电器在电气图里面就是个线圈 离散输入 其实还有个名字叫触点 就是开关的触点的意思,所以他也是只能获取状态而不能去改写状态 2 。 modbus常用的功能码 功能码就是表明这一个数据帧的作用的,常用功能码如下 0x01: 读线圈寄存器 0x02: 读离散输入寄存器 0x03: 读保持寄存器 0x04: 读输入寄存器 0x05: 写单个线圈寄存器 0x06: 写单个保持寄存器 0x0f: 写多个线圈寄存器 0x10: 写多个保持寄存器 线圈寄存器:实际上就可以类比为开关量,每个bit都对应一个信号的开关状态。 离散输入寄存器:也可以叫做触点。只能去读取状态不能去写入状态。 保持寄存器:长度是16个bit 的寄存器,可以被读取和写入,用于保存一定的信息 输入寄存器:和保持寄存器比较相似,但是只能被读取不能写入。 注意上面提到的不能写入是指不能被主机端写入,从机自己是可以修改自己的离散输入和输入寄存器的! 3. modbus报文类型 Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 Modbus-RTU :一种紧凑的,采用二进制表示数据的方式,一般使用的是 RS485 或者RS232 Modbus-ASCII :一种人类可读的形式。一般使用的是 RS485 或者RS232 (不详细展开) Modbus-TCP :基于TCP/IP的数据形式。由 报文头和帧结构构成。 3.1 Modbus-RTU 数据帧分析 modbus-RTU 帧包含 1字节的从站号+1字节的功能码+n字节的数据+2字节的CRC16校验 主机发送数据帧如下: 000010-Rx:01 03 00 00 00 0A C5 CD 01: 从设备ID 03: 功能号。读取保持寄存器值。 00 00: 读取的起始地址 0x0012 00 0A: 主机的读取数量 0x0003个寄存器 C5 CD: CRC16 校验的结果 接收的数据帧如下: 000011-Tx:01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A3 67 01: 从设备ID 03: 功能号。读取保持寄存器值。 14: 数据帧长度 0x14。 也就是十进制的20字节,代表10个寄存器值 … 连续20个参数 A3 67 : CRC16 校验结果 3.2 Modbus-TCP 数据帧分析 以下引自 https://www.cnblogs.com/ioufev/articles/10830028.html ModbusTCP的数据帧可分为两部分:MBAP+PDU。 MBAP为报文头,长度为7字节,组成如下: [tr]事务处理标识协议标识长度单元标识符[/tr]2字节2字节2字节1字节 [tr]内容解释[/tr]事务处理标识可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。 协议标识符00 00表示ModbusTCP协议。 长度表示接下来的数据长度,单位为字节。 单元标识符可以理解为设备地址。 以下字段截取字 modbus poll 的commucition 用于读取从设备id为1的设备的前十个保持寄存器 Tx:000054-19 B9 00 00 00 06 01 03 00 00 00 0A Rx:000055-19 B9 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Tx:000056-19 BA 00 00 00 06 01 03 00 00 00 0A Rx:000057-19 BA 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 分析Tx:000054 字段: 第0~1位 19 B9 : 代表事务处理标志头。 用于和 返回信息一一对应。(事务处理标识) 第2~3位 00 00 : 00 00 代表是 TCP-IP协议 第4~5位 00 06 : 是后面的数据帧的长度 第6位 01 : 从站的ID 第7位 03 : 03 是功能码 读取保持线圈 (多个连续读取模式,参考之前的功能码) 第8~9位 00 00 : 连续读取的起始地址 第10~11位00 0A: 连续读取的数量 上面的Tx:000054 数据帧的意思就是 使用modbus tcp的方式去从站1的 从0x0000 开始的 连续0x000A(十进制10)个保持寄存器。 分析Rx:000055:00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 第0~1位 19 B9 : 代表事务处理标志头。 用于和发送的信息对应。 第2~3位 00 00 : 00 00 代表是 TCP-IP协议 第4~5位 00 17 : 是后面的数据帧的长度0x0017 = 23 第6位 01 : 从站ID 第7位 03 :功能号 读取保持线圈 (多个连续读取模式) 第8位 14 : 代表返回的数据长度 0x14 = 20 字节,对应于 10个modbus保持寄存器 第9~10 位 00 00 : 第一个寄存器的值为 0x0000 3.3 两种数据帧的对比与分析 modbus-RTU相较于modbus-TCP 少了处理头,多了CRC 少了处理头是因为串口的协议硬件上保证了数据帧的到达的时序。 多了校验是因为没有TCP的校验功能,数据的可靠性需要在应用层进行保证。 上面提到的两种modbus的报文形式都包含以下信息 ID 。 这个是发送给哪一个从机以及哪一个从机返回的重要判断依据。所有协议都需要有这个参数。 该参数的长度为一个字节,理论上一条总线上最多支持247 个modbus从设备。 功能码。 这个参数决定了这个数据帧对应的功能,主机发送一个功能码之后从机的返回数据中也会包含这个功能码。 有效数据。使用modbus的目的肯定是传输数据的。主机发送给从机的有效数据一般是四个字节。前两个代表起始地址,后两个代表长度。 从机返回的数据 前两个字节一般代表后面的数据的长度紧接着的就是寄存器的数值。 4. modbus通讯的物理层设置 物理层的设置主要就是保证通讯的双方能正常的进行通讯。 4.1 modbus-RTU的配置 关于这一部分的配置其实就是物理层的配置,主要包括波特率,数据位,奇偶校验 ,停止位。 4.2 modbus-TCP的配置 这一部分就是TCP通讯所需要的参数,主要就是IP和端口 。 5. 一些问题的解释 问1: 为什么 modbus-TCP不需要校验? modbus-TCP是基于TCP协议的,tcp 是可靠的, 就是有重传, 校验, 有序等措施。 问2:为什么 modbus-TCP需要处理头信息 主要是为了解决 先发后至 问题。保证处理的时序。 问3:modbus 在RS-485 和RS-232的区别 区别主要在232 和485 协议本身,232 是一对一全双工,485 是一对多半双工,所以485 上可以挂载很多的modbus 从站设备。 |
|
|
|
只有小组成员才能发言,加入小组>>
865浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 23:37 , Processed in 0.689552 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号