如果大家从事物联网相关行业的开发或者运维,相信对于Modbus协议不会陌生。刚好我在平时运维工作中,也会因为需要排查问题而接触到Modbus协议。本文就通过常用调试工具结合实例带大家来解析Modbus协议,希望可以通过具体协议数据解析,让大家加深对该协议的理解。
一、Modbus协议简介
Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。
此外,Modbus协议是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
此协议是一个请求/应答协议,包括ASCII、RTU、TCP等版本。它定义了控制器能够认识和使用的消息结构,而不管它们是通过何种硬件方式进行通信的。所以硬件接口可以是RS-232、RS-422、RS-485和以太网等设备。TCP和RTU是Modbus协议的两种常见形式,其中TCP的使用频率更高一些。
二、案例协议文档
以下解析案例来自某厂家的温湿度传感器协议文档。
(一)通讯参数 1、上位机串口设置 本温湿度传感器通讯数据帧格式采用固定的“N,8,1”格式,使用时请将串口设置成1位起始位,8位数据位,1位停止位,无奇偶校验位。
2、数据寄存器地址
(二)应用举例 1、应用举例 (1)多个寄存器数据读取 主机发送
子机响应 地址为1的传感器收到上面的数据后,将会做出以下响应
(2)功能码06应用举例:将子机地址改为2,波特率改为19200
功能码06时的子机响应:子机会将主机发来的数据原封返回。
三、协议解析
以下对上方温湿度传感器及其协议进行数据解析。以下环境均搭建完毕
(一)需要准备工具及其环境: 1、温湿度传感器设备一套; 2、485串口线一条(USB转232线,再通过232转485口接传感器485口); 3、windows环境作为上位机软件Modbus Poll运行环境; (二)Modbus协议数据解析举例 1、读取温湿度传感器的温度的测量值 (1)打开上位机软件Modbus Poll,如下图所示:
(2)通过在上位机软件中进行串口连接相关配置(根据自己实际电脑串口号进行配置),如下图所示:
(3)在上位机软件中设置读取传感器的相关参数,一般根据协议文档中说明设置,如下图对传感器的温度值进行读取:
(4)打开日志进行记录传感器串口收发数据,方便我们等下转化值进行比对,如下所示:
点击Log按钮还可以将串口收发数据保存在文件中,方便查看。
(5)完成以上设置后,即可读取传感器的温度值,如下所示:
(6)执行读取操作后,可以看到如下结果:
串口收发数据如下:
Tx:002-01 03 00 33 00 01 74 05
Rx:003-01 03 02 06 49 7A 12
根据协议文档对上位机发送的串口数据01 03 00 33 00 01 74 05进行解析: 第一个字节01表示读取地址为1的传感器数据; 第二个字节03表示功能码; 第三、第四个字节00 33表示从寄存器的地址0x0033开始读; 第五、第六个字节00 01表示读取寄存器的个数为1; 第七、第八个字节74 05表示CRC码; 根据协议文档对传感器返回的串口数据01 03 02 06 49 7A 12进行解析: 第一个字节01表示485地址为1的传感器进行回应; 第二个字节03表示功能码对应3; 第三个字节02表示读取一个寄存器对应2个字节数; 第四、第五两个字节06 49表示寄存器地址为0x0033对应的内容,转化为10进制等于1609,跟上位机软件自动转化的值一样; 第六、第七两个字节7A 12表示CRC码; 2、读取温湿度传感器的湿度、温度、露点的测量值,即读取3个寄存器地址所对应的值
(1)在上位机软件中设置读取传感器的相关参数,一般根据协议文档中说明设置,如下图所示:
(2)开启串口数据收发日志记录
(3)执行读取操作后,可以看到如下结果:
串口收发数据如下:
Tx:004-01 03 00 32 00 03 A4 04
Rx:005-01 03 06 0F 5A 06 50 00 E4 79 55
根据协议文档对上位机发送的串口数据01 03 00 32 00 03 A4 04进行解析: 第一个字节01表示读取地址为1的传感器数据; 第二个字节03表示功能码; 第三、第四个字节00 32表示从寄存器的地址0x0032开始读; 第五、第六个字节00 03表示读取寄存器的个数为3; 第七、第八个字节A4 04表示CRC码; 根据协议文档对传感器返回的串口数据01 03 06 0F 5A 06 50 00 E4 79 55进行解析: 第一个字节01表示485地址为1的传感器进行回应; 第二个字节03表示功能码对应3; 第三个字节06表示读取3个寄存器对应6个字节数; 第四、第五两个字节0F 5A表示寄存器地址为0x0032对应的内容,转化为10进制等于3930,跟上位机软件自动转化的值一样; 第六、第七两个字节06 50表示寄存器地址为0x0033对应的内容,转化为10进制等于1616,跟上位机软件自动转化的值一样; 第八、第九两个字节00 E4表示寄存器地址为0x0034对应的内容,转化为10进制等于228,跟上位机软件自动转化的值一样; 第十、第十一两个字节79 55表示CRC码;
四、总结 到此,我们已经结合一款温湿度传感器的协议文档,对它的Mudbus协议进行数据解析。其它产品的跟这个差不多,无非可能是参数指标多点。掌握其协议原理并且解析,可以有助于我们排查问题。比如客户反馈温湿度的值不准了,我们第一时间只能通过协议抓包解析,看看它底端的原始值是多少,才能知道不准的根本原因。 关于Mudbus协议数据转化,我们经常在16进制与10进制之间进行转化,下面给大家附上一些在线转换工具网址。 https://jisuan5.com/hexadecimal-to-decimal/