分享

​Modbus通讯协议初学

 痕迹资料库 2024-05-24 发布于印度尼西亚

什么是Modbus?

顾名思义,它是一个bus,即总线协议。比如串口协议、IIC协议、SPI都是通讯协议。你接触到这种协议,相信你所处的行业是工业方面或者你的产品用于工业。

Modbus用来做什么?

用两个来概括:通讯。

4个种类的寄存器

线圈状态(Coil Status)  可读可写

离 散 输入状 态(Discrete Input Status) 只读

保 持 寄 存 器(Holding Register) 可读可写

输 入 寄 存 器( Input Register)只读

图片
在这里插入图片描述

协议速记

Modbus 是一主多从的协议

图片
在这里插入图片描述

主控发出的数据里,必定含有如下信息:

① 设备地址:你要访问从设备 1,还是访问从设备 2

② 访问哪类寄存器,是读还是写,只访问 1 个寄存器,还是多个寄存器:这被称为功能码

③ 起始寄存器地址、寄存器数量:这在数据里定义

④ 为了保证数据传输的可靠,还附带有 CRC 检验码

以 Modbus RTU 协议为例,主控发出的数据包格式如下:

图片
在这里插入图片描述

功能码

图片
在这里插入图片描述

功能代码有哪些?常用的功能码如下:

① 读线圈状态(01)

② 读离散输入状态(02)

③ 写单个线圈(05)、写多个线圈(15)

④ 读保持寄存器(03)

⑤ 读输入寄存器(04)

⑥ 写单个保存寄存器(06)、写多个保存寄存器(16)

Modbus 报文帧

一个报文就是一帧数据,一个数据帧就一个报文:指的是一串完整的指令数据,本质就是一串数据。

Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。

Modbus 协议 RTU 报文格式如下所示:

帧结构 = 地址 + 功能吗 + 数据 + 校验

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。

功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。

数据:根据功能码不同,有不同结构,在后续的实例中有说明。

校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。

示例解读

以(0x01)读取线圈为例

图片
在这里插入图片描述

从我上图的这个例子中,进行如下的解析

主机发送:07 01 00 00 00 08 3D AA从机回复:07 01 01 20 50 D8
解析如下:07(从设备地址) 01(功能码) 00 00(起始地址16bit,高位在前,低位在后) 00 08(寄存器数16bit 高位在前,低位在后) 3D AA (CRC校验)
07(从设备地址) 01(功能码) 01(数据域字节数) 20(数据 1) 50 D8(校验)

参考资料:

https://blog.csdn.net/qq_39400113/article/details/118369506

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多