modbus TCP协议讲解及实操

具体讲解

  • 前言
  • 正文
  • modbus tcp主机请求数据
    • 基本讲解
    • Modbus Poll工具简单使用讲解
  • modbus tcp从机响应数据
    • Modbus Slave工具简单使用讲解

前言

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

正文

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

言归正传,Modbus就是一个总线通信协议,说白了就是一条线上挂了很多个设备和一个主设备。
modbus TCP协议讲解及实操_第1张图片

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

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

modbus tcp主机请求数据

基本讲解

我们说一下主机请求从机需要发送的基本数据
modbus TCP协议讲解及实操_第2张图片

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

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

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

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

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

  • 功能码
    Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,就是上边说的,你要对从机做什么操作,那么就在这里设定好,从机读取到这个数据就知道要做什么啦。
    modbus TCP协议讲解及实操_第3张图片

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

Modbus Poll工具简单使用讲解

modbus TCP协议讲解及实操_第4张图片
modbus TCP协议讲解及实操_第5张图片

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

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

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

modbus tcp从机响应数据

参考主机发送数据,一样的道理,毕竟用的都是modbus tcp协议。
modbus TCP协议讲解及实操_第13张图片
这里就直接实操讲解

Modbus Slave工具简单使用讲解

modbus TCP协议讲解及实操_第14张图片
这里说明一下,工具上显示的寄存器只有0-9位,但是不代表实际中就只有10位哈。

modbus TCP协议讲解及实操_第15张图片
从上边的讲解中可以看出,寄存器是分区的,范围一般是0~49999,工具为了模拟,所以只做了10位。
modbus TCP协议讲解及实操_第16张图片
modbus TCP协议讲解及实操_第17张图片
好了,这两步知道就可以了!
当我们启动这边,主机那边才能连接上,并且发送数据,主机连接上之后,看下发送的数据和收到的数据吧。

modbus TCP协议讲解及实操_第18张图片
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。
后边的就不一一讲解了吧,都是每个位置对应的值。

再对比下前边的图
modbus TCP协议讲解及实操_第19张图片
不难理解了吧。

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

你可能感兴趣的:(传输协议,tcp/ip,网络,网络协议)