modbus TCP协议讲解及实操

前言

关于modbus tcp从0到1的讲解,案例结合讲解,详细了解整个modbus的可以参考这个:详解Modbus通信协议

正文

首先说明一下一个概念,所谓的传输协议,不管是mqtt也好还是modbus也罢,实际上传递的基本都是16进制的字节数组,不同的是每个协议,每个字节,每个字节对应的每一位具有不同的含义,所以,想了解一种协议,就要明白它的字节含义即可,切勿急躁。

言归正传,Modbus就是一个总线通信协议,说白了就是一条线上挂了很多个设备和一个主设备。
在这里插入图片描述

通信的规则是:从机不能主动给主机发送消息,只能主机给从机发消息,从机回应,无论是你想查看某一个从机的数据,还是修改某个从机的数据,都需要通过主机先发送一个消息给从机,然后从机根据主机发过来的数据指令,去做对应的操作,最后将结果回应给主机。

注重说一下,在tcp通信中,主机充当的是客户端的角色,从机充当的是服务端的角色,所有从机用的端口都一样,不同从机用id地址区分(也就是从机号)

modbus tcp主机请求数据

基本讲解

我们说一下主机请求从机需要发送的基本数据
在这里插入图片描述

针对性的讲一下每个参数,先有个映像,后边还会举例说明:

  • 事物标识符:
    就是一个递增的数字,每次发送消息递增一下即可,尽量不重复,因为占用2个字节,所以范围是:0~65535

  • 协议标识符
    这个默认给固定值0,表示modbus协议

  • 长度
    等于协议标识符的长度2+协议数据单元PDU的长度(不固定)

  • 单元标识符
    这个就是从机地址,就是slave id

  • 功能码
    Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,就是上边说的,你要对从机做什么操作,那么就在这里设定好,从机读取到这个数据就知道要做什么啦。
    在这里插入图片描述

  • 数据
    数据对于主机来说就是想要操作从机寄存器里的哪些数据,什么是寄存器?就是从机用来存数据的地方,讲从机的时候具体再将。
    讲完了基本概念,咱们来实操一下,在这之前,咱们需要用到两个工具(Modbus Poll 和 Modbus Slave

Modbus Poll工具简单使用讲解

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
明白这些就可以啦。
现在我们来连接上1号从机。
在这里插入图片描述
连接之后会发现收到了从机的数据了,并且在界面上显示了出来,这里提前给看一下从机的页面(注意不一个软件哈)。
在这里插入图片描述
从图上就知道了,确实,我们收到了从机的数据 ,好,那么我们接下来深入看一下主机到底给从机发送了什么数据?
在这里插入图片描述
006-01 03 00 00 00 06 01 03 00 00 00 0A
其中,因为软件显示的原因,006-01 03这其实就是事物标识符的两个字节,那么来实际看一下,数据到底是不是我们上边讲的?
在这里插入图片描述

006-01 03【事物标识符】00 00【协议标识符】 00 06【长度】01【单元标识符】 03【功能码】 00 00 00 0A【数据】

  • 算一下吧,长度=单元标识符1+PDU(功能码+)5=6;
  • 功能码03代表查询数据,单元标识符01代表从机id号,所有都对应上了,没问题;
    在这里插入图片描述
  • 再看下发送的数据:
    在这里插入图片描述
    其中 00 00代表要查询的寄存器起始位,00 0A(十进制就是10)代表要查询从起始位往后10位,对应工具设置的这里.
    在这里插入图片描述
    当然你也可以把起始位置和查询数量的参数改一下,再去跟发送的内容对比一下,是同步的,另外,显示界面也会变化的,可以多尝试一下。

modbus tcp从机响应数据

参考主机发送数据,一样的道理,毕竟用的都是modbus tcp协议。
在这里插入图片描述
这里就直接实操讲解

Modbus Slave工具简单使用讲解

在这里插入图片描述
这里说明一下,工具上显示的寄存器只有0-9位,但是不代表实际中就只有10位哈。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上边的讲解中可以看出,寄存器是分区的,范围一般是1~465536,工具为了模拟,所以只做了10位。

提示
根据上边的存储区范围可知,范围是1~465536,但是主机再主动发送请求数据的时候,主机并未告诉从机要操作哪个位置的信息,为什么从机知道主机要操作的是哪个数据呢?这个其实是根据功能码来判断的。

在这里插入图片描述
在这里插入图片描述
好了,这两步知道就可以了!
当我们启动这边,主机那边才能连接上,并且发送数据,主机连接上之后,看下发送的数据和收到的数据吧。

在这里插入图片描述
031-08 13 00 00 00 17 01 03 14 03 E8 00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

为了方便讲解,把响应的数据拆成两部分讲解:
031-08 13 00 00 00 17 01
这部分代表报文头,其他参数都没疑问,就是这个17变化了,十六进制的17转化成十进制是23。
这就对了,23=1(单元标识符)+22(下边的PDU)。

03 14 03 E8 00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PDU的变化相对于主机发送的数据来说变长了,那么我们来解释一下:
03:代表功能码(主机那边传递过来的,原封不动返回去)。
14:代表的是数据长度,转换成十进制正好是20,从数据可以看出从14往后数,正好有20位。
03 E8:代表寄存器0号位置的数值,转换成十进制就是1000。
00 0C:代表寄存器1好位置的数据,转换成十进制就是12。
后边的就不一一讲解了吧,都是每个位置对应的值。

再对比下前边的图
在这里插入图片描述
不难理解了吧。

ok,讲解完毕,后边会整合springboot、netty实现一套完成的主机客户端。

猜你喜欢

转载自blog.csdn.net/zwjzone/article/details/131330865