初学MODBUS协议

1.什么是MODBUS?

百度百科:Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

有点难懂。

归纳:
Modbus就是一种用在工业上的简单协议!

2.MODBUS可以用来干什么?

举例:我们熟知的TCP和UDP协议可以用来干嘛?

通信!!!,没错MODBUS也是如此

大致分为以下几种:
Modbus-RTU+Modbus-ASCII
Modbus-TCP
Modbus-Plus
以上三种协议,一个设备只会有一种协议。

3.那如何通信?

TCP通信建立连接是三次握手,需要知道ip+端口,那么MODBUS也是吗

通讯过程:Modbus是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信.(主机需要连发送请求,然后从机收到请求回复,发送数据给主机)

举例1: 一个总线上有一个主机,多个从机,主机查询其中一个从机,首先你必须得这些从机分配地址(每个地址必须唯一,跟TCP协议请求有点像呢),分配好地址后,主机要查询,然后数据下发,从机得到主机发送的数据,然后对应地址的从机回复,主机得到从机数据

举例2: 就像打电话,你得知道对方的电话(这就是唯一地址),然后你打电话过去,相当于主机查找从机,然后对方接通电话,给你回复(返回数据);

4.说说具体协议 

4.1 Modbus-RTU+Modbus-ASCII


这种协议是基于异步串行通信上,一般的介质有:RS-232,RS485,RS-422上,这也是工业上使用的最多的;

对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。
Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

先来详细说一下这个RTU协议(目前设备上刚好用到,且普遍的设备都是RTU协议)

4.2 Modbus-RTU协议

刚刚上面说了如何通信,现在说说通信的数据结构是如何的!!

1. 帧结构
帧结构 = 地址 + 功能码 + 数据 + 校验

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

功能码:" 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能.(这里举个例子比如01是查询,02是修改,03是删除等)

数据: 根据功能码不同,有不同结构。

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

5.来个实战分析!!!

需求:
现在我是主机,我要查询从机地址为1的数据.

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33

 根据上面的图来分析一波这个数据结构

/*发送数据解析*/
01-地址
03-功能码,代表查询功能,其他功能后面再说
00 00-代表查询的起始寄存器地址.说明从0x0000开始查询.
(这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值;
84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止;
(这里新手可能不懂,这个校验就是保证数据传输过程没有错误的一种手段,不同的协议这种校验公式不一样,
只需了解这个就足够了,具体怎么求的,可以直接在输出数据得到结果,地址如下:
http://www.ip33.com/crc.html)
/*回复解析*/
01-地址
03-功能码
02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
12 34-寄存器的值是12 34,结合发送的数据看出,01这个寄存器的值为12 34
B5 33-循环冗余校验

发送:地址正确+我要查的寄存器个数+校验
回复:从机的地址+数据的字节数+数据+校验

需求:
现在我是主机,我要修改从机地址为1的数据.

修改-0x06功能码

主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

*发送数据解析*/
01-主机要查的地址
06-功能码,代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;

/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
06-功能码,代表修改单个寄存器功能;
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;

如果回复的一样,说明这个数据是修改成功的;如果功能码不是06,而是86,说明你发送的数据出错了

需求(批量修改):
现在我是主机,我要修改从机地址为1的所有寄存器的数据.

modbus RTU协议包含了修改连续多个寄存器的方法,就是功能码为0x10;

主机发送: 01 10 00 00 00 01 02 11 22 2A 19
从机回复: 01 10 00 00 00 01 01 C9

*发送数据解析*/
01-主机要查的地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的寄存器数量,这里开始于0x06的修改不同;
02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;
2A 19-循环冗余校验,是modbus的校验公式,从首个字节开始到22前面为止;

/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
10-功能码
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
01 C9-循环冗余校验;

 咱们这个循环冗余校验先不了解

归纳
modbus RTU协议只需要看懂功能码0x03,0x06,0x10这三个基本的就已经足够了;分别回想下其数据域部分:
03-主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;
06-主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)
10-主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modbus RTU是一种在RS485通信协议上运行的串行通信协议。它被广泛用于工业自动化领域,用于在设备之间传输数据。 在使用Modbus RTU协议进行通信时,你需要考虑以下几个方面: 1. 硬件连接:RS485是一种常用的串行通信接口,它允许多个设备共享同一条总线。你需要正确地连接RS485总线,并设置合适的终端电阻。 2. 通信参数:Modbus RTU使用串行通信进行数据传输。你需要设置正确的波特率、数据位、停止位和校验方式等通信参数。 3. Modbus RTU协议格式:Modbus RTU协议使用二进制格式进行数据帧的传输。每个数据帧包含从站地址、功能码、数据域和错误检验等字段。 4. 数据读写:通过发送特定的命令帧,你可以从从设备读取数据或向从设备写入数据。读取数据时,你需要指定寄存器地址和读取长度。写入数据时,你需要指定寄存器地址和写入数据的值。 在实际编程中,你可以使用各种编程语言来实现Modbus RTU通信。一些常见的编程语言,如Python、C、C++和Java,都有相应的Modbus库或模块可供使用。你可以根据自己的需求选择合适的编程语言和库来开发你的程序。 需要注意的是,实现Modbus RTU通信涉及到硬件和软件的综合知识,需要对串行通信、Modbus协议和相关编程语言有一定的了解。如果你是初学者,建议先学习相关基础知识,并通过阅读文档和示例代码来深入理解和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值