请选择 进入手机版 | 继续访问电脑版

UBAINS

 找回密码
 立即注册
搜索
热搜: UBAINS
查看: 866|回复: 1

[硬件设置] Modbus RTU协议

[复制链接]

10

主题

11

帖子

417

积分

版主

Rank: 7Rank: 7Rank: 7

积分
417
QQ
发表于 2021-8-15 17:36:30 | 显示全部楼层 |阅读模式
本帖最后由 pidtfork 于 2021-8-15 17:40 编辑
Modbus RTU协议

关于Modbus协议
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议事实上的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
•        公开发表并且无著作权要求,不需要交纳许可证费,也不会侵犯知识产权。
•        易于部署和维护,Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易。
•        对供应商来说开发简单,修改编辑没有很多限制
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的设备,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

协议架构
Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。
Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

协议版本
由于Modbus协议没有规定物理层,因此Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
大多数Modbus设备通信通过串口 RS-485 物理层进行。
对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。Modbus RTU 是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII 是一种人类可读的,冗长的表示方式。这两个变种都使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和 (CRC16-Modbus),而ASCII格式采用纵向冗余校验的校验和。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算。
对于所有的这三种通信协议在数据模型和功能调用上都是相同的,只有封装方式是不同的。常用为 Modbus RTU 版本。
Modbus有一个扩展版本Modbus Plus(Modbus+或者MB+),不过此协议是 施耐德 专有的,和Modbus不同。它需要一个专门的协处理器来处理类似HDLC的高速令牌旋转。连接Modbus Plus到计算机需要特别的接口,通常是支持ISA(SA85),PCI或者PCMCIA总线的板卡。
Modbus RTU 介绍
常见的 Modbus 通信参数是用 RS-485 波特率 9600,数据为 8,停止位 1,无校验位,物理层通信参数以实际产品文档为准。
根据 Modbus 的协议架构,提供 Modbus 协议接口的设备为 Slave 端即从机,控制端为 master 端即主机如 Modbus控制软件或中控等设备
主机发送的 Modbus RTU 请求报文格式为,数据值均为 16 进制值
从机地址 (1字节)        功能码(1字节)        寄存器起始地址(2字节)        读:寄存器个数/写:数值(2字节)        循环冗余校验(2字节)
01        03        00 01        00 0A        0D 94
01        06        00 01        01 F0        C1 C9
第一条报文为读取从机地址为 0x01 设备,寄存器地址为 0x0001 位置开始,读取 0x000A 即 10 个连续寄存器的值
第二条报文为往从机地址为 0x01 设备,寄存器地址为 0x0001 位置写入数值 0x01F0 的值.
从上面两条报文可以看出,这个通用形式的报文可以对某设备的某单个寄存器进行读写,也可以一次读多个寄存器值。想要一次写入多个数据使用功能码为 0x10 可以一次写入多个数据,只是格式稍微有点变化,具体看下文。
实际使用中常见问题
•        现场对接时对方提供的从机 ID 可能是 10 进制值(容易记录),使用时需转成 16 进制值
•        寄存器地址和寄存器个数/数值 这两项为两个字节,所以有高位在前和在后的区别,标准的为高位在前方式,也有设备为高位在后的,使用时请根据文档要求操作
•        循环冗余校验(CRC16-Modbus)值为两个字节,同样有高位在前和在后的区别,标准为高位在前,有的设备要求寄存器高位在前 CRC 校验时要求高位在后,根据文档要求操作
•        项目中一般情况下设备收到正确的指令后会返回数据,例如发送上面第一条报文,在知道设备 ID 的情况下经常用类似 01 03 00 00 00 01 0A 84 这样的指令读取设备 0x00 或 0x01 寄存器的值,以此来判断物理层线路是否连接正确。
•        在不知道设备的 ID 的情况下可以使用 0 作为 ID,0 为广播 ID 所有在链路上的从机都会执行,但是都不会返回数据,可以用来广播设置某些值。
•        在对接一些较大组网的空调或者灯光系统时,对方提供的寄存器地址为 40002,40100,30100,这样寄存器地址,这时候需要注意这些地址可能需要减去 40001 或 30001 ,这些10 进制的地址值转为 16 进制使用。
Modbus 功能码说明
这里只列举一些常用的功能码,更多的功能码以受控设备产品文档为准,有些产品会自定义一些功能码或加一些报头报尾情况。
功能码 0x03 读寄存器
主机请求报文        从机响应报文        
01 03 00 00 00 01 0A 84        01 03 02 00 07 86 F9        读取地址0x0000数量为1 的寄存器值
响应报文 第 3 个字节为返回的数据长度,第 4、5为数据值
01 03 01 16 00 03 F3 E5        01 03 06 17 84 17 80 17 8A 47 58        读取地址为0x0116开始数量为 3 的寄存器值
响应报文第3个字节0x06为返回的数据长度
寄存器地址值分别为
0x0116 = 0x1784,0x0117 = 0x1780,0x0118 = 0x178A
功能码 0x06 写寄存器
从机响应与主机发送的报文格式及数据内容完全相同。
主机请求报文        从机响应报文        
01 06 00 2C 00 FF 43 08         01 06 00 2C 00 FF 43 08         往从机0x01的寄存器地址0x002C写入数据0x00FF
0A 06 00 64 00 00 6E C9         0A 06 00 64 00 00 6E C9         往从机10的寄存地址100写入数据0
更多功能码使用请参见产品文档或百度了解

UBAINS中控使用 Modbus RTU
modbus协议使用主要难点为计算 CRC16-Modbus 码,UBAINS中控的API文档中有实例演示,或者 UBAINS 论坛也有关于CRC相关帖子
现在很多串口调试助手做的很好,带有自动发送附加位 功能,只需要发送 地址 寄存器地址等自动在末尾加上CRC校验,非常方便。
当然也可以使用 modbus 的调试助手

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

10

主题

11

帖子

417

积分

版主

Rank: 7Rank: 7Rank: 7

积分
417
QQ
 楼主| 发表于 2021-8-15 17:44:24 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

Archiver|手机版|小黑屋|BBS.UBAINSYUN.COM

GMT+8, 2022-6-30 07:06 , Processed in 0.036023 second(s), 21 queries .

Powered by UBAINS! X3.4

© 2001-2017 UBAINS Inc.

快速回复 返回顶部 返回列表