首页 > 其他分享 >ModbusTCP协议报文详细分析

ModbusTCP协议报文详细分析

时间:2024-03-09 15:35:06浏览次数:24  
标签:返回 报文格式 报文 寄存器 地址 线圈 ModbusTCP 详细分析

  ModbusTCP与ModbusUDP的报文格式是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,ModbusTCP与ModbusRtu(ModbusASCII)之间的区别如下图:

  从上图可以看出,ModbusTCP在Modbus串行通信的基础上,去除了校验(由于TCP本身就带有校验和)和设备地址(ModbusTCP弱化了设备地址,用IP地址来取代),再加上MBAP报文头(占7 bytes),下面针对MBAP进行分析说明:

   下面针对具体报文进行分析,Modbus协议在串行链路上的报文格式如下所示:

  有了以上理论基础之后,下面针对各个功能码进行详细分析:

读取输出线圈

  发送报文格式如下:

   发送报文含义:读取服务器1号从站输出线圈,起始地址为0x13=19,对应地址为00020,线圈数量为0x1B=27,即读取1号从站输出线圈,地址从00020-00046,共27个线圈的状态值。

这里值得注意一下,协议中的起始地址指的是索引,后面的地址指的是具体地址,对于任意一个存储区,索引都是从0开始的,但是对应的具体地址,与存储区是相关的,比如输出线圈,0对应00001;输入线圈,0对应10001;输入寄存器,0对应30001;保持寄存器,0对应40001。

  返回报文格式如下:

  返回报文含义:返回服务器1号从站输出线圈00020-00046,共27个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05。

CD=1100 1101 对应 00020-00027

6B=0110 1011 对应 00028-00035

B2=1011 0010 对应 00036-00043

05=0000 0101 对应 00044-00046

读取输入线圈

  发送报文格式如下:

  发送报文含义:读取服务器1号从站输入线圈,起始地址为0xC4=196,对应地址为10197,线圈数量为0x1D=29,即读取1号从站输入线圈,地址从10197-10225,共29个线圈的状态值。

  返回报文格式如下:

  返回报文含义:返回服务器1号从站输入线圈10197-10225,共29个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05。

CD=1100 1101 对应 10197-10204

6B=0110 1011 对应 10205-10212

B2=1011 0010 对应 10213-10220

05=0000 0101 对应 10221-10225

读取保持寄存器

  发送报文格式如下:

  发送报文含义:读取服务器1号从站保持寄存器,起始地址为0x6B=107,对应地址为40108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从40108-40109,共2个寄存器的数值。

  返回报文格式如下:

  返回报文含义:返回服务器1号从站保持寄存器40108-40109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06,40108对应数值为0x022B,40109对应数值为0x0106。

读取输入寄存器

  发送报文格式如下:

  发送报文含义:读取服务器1号从站输入寄存器,起始地址为0x6B=107,对应地址为30108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从30108-30109,共2个寄存器的数值。

  返回报文格式如下:

  返回报文含义:返回服务器1号从站输入寄存器30108-30109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06,30108对应数值为0x022B,30109对应数值为0x0106。

预置单输出线圈

  发送报文格式如下:

  发送报文含义:预置服务器1号从站单个线圈的值,线圈地址为0x00AC=172,对应地址为00173,断通标志0xFF00表示置位,0x000表示复位,即置位1号从站输出线圈00173。

  返回报文格式如下:

  返回报文含义:预置单输出线圈原报文返回。

预置单寄存器

  发送报文格式如下:

  发送报文含义:预置服务器1号从站单个保持寄存器的值,寄存器地址为0x0087=135,对应地址为40136,写入值为0x039E,即预置1号从站保持寄存器40136值为0x039E。

  返回报文格式如下:

  返回报文含义:预置单保持寄存器原报文返回。

预置多线圈

  发送报文格式如下:

  发送报文含义:预置服务器1号从站多个线圈的值,线圈地址为0x0013=19,对应地址为00020,线圈数为0x0A=10,写入值为0xCD00,即预置1号从站线圈00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。

  返回报文格式如下:

  返回报文含义:预置多输出线圈返回报文是在原报文基础上除去字节数及具体字节后返回。

预置多寄存器

  发送报文格式如下:

  发送报文含义:预置服务器1号从站多个寄存器的值,寄存器地址为0x0087=135,起始地址为40136,寄存器数量为0x02=2,结束地址为40137,写入值为0xCD00和0x0A10,即预置1号从站寄存器40136=0x0105,40137=0x0A10。

  返回报文格式如下:

   返回报文含义:预置多保持寄存器返回报文是在原报文基础上除去字节数及具体字节后返回。

标签:返回,报文格式,报文,寄存器,地址,线圈,ModbusTCP,详细分析
From: https://www.cnblogs.com/ybqjymy/p/18062760

相关文章

  • Qt 基于QTcpSocket的ModbusTCP协议
    一、编写缘由1.发现问题最近项目上要把之前的modbusRTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbuss......
  • springboot集成报文验证组件validation
    1.引入validation的依赖jar<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.2.3</version></dependency>2.请求报文增加字段的校验规则packa......
  • Qt 解决PLC与QModbusTcpClient通信自动断开
    项目场景:提示:这里简述项目相关背景:例如:项目场景:QModbusTcpClient通信问题描述提示:这里描述项目中遇到的问题:QModbusTcpClient连接后,稍微停一段时间,就会出现QModbusDevice::UnconnectedState原因分析:提示:这里填写问题的分析:1.网络原因2.服务器原因......
  • 如何将流量报文按照协议类型分组?Scapy
    遇到一个困扰了很久的问题:一个pcap文件中包含了各种类型的报文(比如DNP3、DHCP、DNS、TCP、IP、MQTT、MODBUS等等)需要将这个文件中的报文按照协议类型进行分组,将属于同一个协议的报文分在一起。我之前遇到这种情况都是通过wireshark按类型导出就可以了。但是现在这个pcap文件......
  • modbusTCP协议和TCP协议
    TCP最主要的特点TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错......
  • Qt QModbus相关类实现ModbusTcpServer总结
    在疫情环境下催生出了很多的无人或者减少人员接触的项目,比如无人智慧餐厅项目中的无人送餐项目,主要是由送餐小车和一个中控屏和部分协助发餐的设备组成,由于餐厅一般的范围不会很大,考虑到Wi-Fi通信可能比较麻烦,我们前期组网协议使用的是zigbee,这样的话小车可以无网络运行且待......
  • 学习之请求报文
    3.2.2请求报文客户端发给服务端的报文请求报文格式请求首行(请求行);GET/POST资源路径?参数HTTP/1.1(默认是通过GET请求获取服务器信息)(通常表单提交信息到服务器用POST请求)请求头信息(请求头);空行;请求体;POST请求才有请求体浏览器f12网络下查看请求数据包......
  • ModbusTCP从站建立
    背景根据网络安全策略要求,无法程序作为主站进行PLC的读取解决方案:PLC作为主站,程序作为从站进行被动的数据火获取,后续根据数据变化值进行建立解决方案使用NModbus4组件构建从站在同个程序中开启不同的端口区分不同的PLC信号写入从站开启监听代码IPEndPointiPEn......
  • 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求
    要使用正则和状态机来解析HTTP请求报文,首先需要理解HTTP请求报文的基本结构。一个典型的HTTP请求报文如下:GET/index.htmlHTTP/1.1Host:www.example.comUser-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110......
  • postman获取响应报文中的token值,并增加到下个请求的请求头,使用场景
    一、获取token登陆之后才能获取token,所以在断言中写脚本第一步:重点就是解析响应报文,然后自己看响应的json中的key取值,我的token值的key是datavarjsondata=JSON.parse(responseBody)varloginToken1=jsondata.data打印下就是console.log(loginToken1)第二步:赋值给全局变......