首页 > 其他分享 >Modbus Tcp数据通讯实测

Modbus Tcp数据通讯实测

时间:2024-08-13 17:22:45浏览次数:12  
标签:00 01 数据通讯 Tcp Modbus 地址 寄存器 MBAP

Modbus TCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU。

报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

 



 



帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

功能码

Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

 



根据对象的不同,Modbus的功能码有:

 



说明更详细的表:

 



PDU详细结构

0x01:读线圈

在从站中读1~2000个连续线圈状态,ON=1,OFF=0


  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)


  • 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)


  • 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
    00 01 00 00 00 06 01 01 00 02 00 08


  • 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
    00 01 00 00 00 04 01 01 01 01


0x05:写单个线圈

将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF。


  • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)


  • 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)


  • 如:将地址为0x0003的线圈设为ON
    00 01 00 00 00 06 01 05 00 03 FF 00


  • 回:写入成功
    00 01 00 00 00 06 01 05 00 03 FF 00


0x0F:写多个线圈

将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF。


  • 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L


  • 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L


0x02:读离散量输入

从一个从站中读1~2000个连续的离散量输入状态。


  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)


  • 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))


  • 如:从地址0x0000开始读0x0012个离散量输入
    00 01 00 00 00 06 01 02 00 00 00 12


  • 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
    00 01 00 00 00 06 01 02 03 01 04 00


0x04:读输入寄存器

从一个远程设备中读1~2000个连续输入寄存器。


  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)


  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)


  • 如:读起始地址为0x0002,数量为0x0005的寄存器数据
    00 01 00 00 00 06 01 04 00 02 00 05


  • 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
    00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00


0x03:读保持寄存器

从远程设备中读保持寄存器连续块的内容。


  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)


  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)


  • 如:起始地址是0x0000,寄存器数量是 0x0003
    00 01 00 00 00 06 01 03 00 00 00 03


  • 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
    00 01 00 00 00 09 01 03 06 00 21 00 00 00 00


0x06:写单个保持寄存器

在一个远程设备中写一个保持寄存器。


  • 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)


  • 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)


  • 如:向地址是0x0000的寄存器写入数据0x000A
    00 01 00 00 00 06 01 06 00 00 00 0A


  • 回:写入成功
    00 01 00 00 00 06 01 06 00 00 00 0A


0x10:写多个保持寄存器

在一个远程设备中写连续寄存器块(1~123个寄存器)。


  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)


  • 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)


  • 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
    00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F


  • 回:写入成功
    00 01 00 00 00 06 01 10 00 00 00 01



Modbus TCP示例报文

ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域可以参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。

 



 



 



 



功能码 0x10:写多个保持寄存器,上面2个图片都写错了。

Modbus TCP通信

通信方式

Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。


  • 主站请求:功能码+数据


  • 从站正常响应:请求功能码+响应数据


  • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型


  • 注意:需要超时管理机制,避免无期限的等待可能不出现的应答


IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

通信过程


  • connect 建立TCP连接


  • 准备Modbus报文


  • 使用send命令发送报文


  • 在同一连接下等待应答


  • 使用recv命令读取报文,完成一次数据交换


  • 通信任务结束时,关闭TCP连接



仿真软件
 


  • Modbus poll 和Modbus slave是一组Modbus仿真软件,可以实现Modbus RTU、TCP、串口仿真等。


  • 仿真软件网址:https://modbustools.com/download.html


  • 在ModbusTCP中,Modbus poll 作为客户端请求数据,Modbus slave 作为服务器端处理请求。


  • 使用c语言编写客户端连接Modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。


  • 使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。
    – slave ID:从站编号(事务标识符)
    – function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作
    – address:开始地址
    – quantity:寄存器/线圈/离散量 的数量



一些概念

在工业自动化控制中,经常会遇到开关量,数字量,模拟量,离散量,脉冲量等各种概念,而人们在实际应用中,对于这些概念又很容易混淆。现将各种概念罗列如下:

1.开关量

一般指的是触点的“开”与“关”的状态,一般在计算机设备中也会用“0”或“1”来表示开关量的状态。

开关量分为有源开关量信号和无源开关量信号,有源开关量信号指的是“开”与“关”的状态是带电源的信号,专业叫法为跃阶信号,可以理解为脉冲量;

一般的都有220VAC, 110VAC,24VDC,12VDC等信号,无源开关量信号指的是“开”和“关”的状态时不带电源的信号,一般又称之为干接点。电阻测试法为电阻0或无穷大。

2.数字量

很多人会将数字量与开关量混淆,也将其与模拟量混淆。数字量在时间和数量上都是离散的物理量,其表示的信号则为数字信号。数字量是由0和1组成的信号,经过编码形成有规律的信号,量化后的模拟量就是数字量。

3.模拟量

模拟量的概念与数字量相对应,但是经过量化之后又可以转化为数字量。模拟量是在时间和数量上都是连续的物理量,其表示的信号则为模拟信号。模拟量在连续的变化过程中任何一个取值都是一个具体有意义的物理量,如温度,电压,电流等。

4.离散量

离散量是将模拟量离散化之后得到的物理量。即任何仪器设备对于模拟量都不可能有个完全精确的表示,因为他们都有一个采样周期,在该采样周期内,其物理量的数值都是不变的,而实际上的模拟量则是变化的。这样就将模拟量离散化,成为了离散量。

5.脉冲量

脉冲量就是瞬间电压或电流由某一值跃变到另一值的信号量。在量化后,其变化持续有规律就是数字量,如果其由0变成某一固定值并保持不变,其就是开关量。

综上所述,模拟量就是在某个过程中时间和数量连续变化的物理量,由于在实际的应用中,所有的仪器设备对于外界数据的采集都有一个采样周期,其采集的数据只有在下一个采样周期开始时才有变动,采样周期内其数值并不随模拟量的变化而变动。

这样就将模拟量离散化了,例如:某设备的采样周期为1秒,其在第五秒的时间采集的温度为35度,而第六秒的温度为36度,该设备就只能标称第五秒时间温度35度,第六秒时间温度36度,而第五点五秒的时间其标称也只是35度,但是其实际的模拟量是35.5度。这样就将模拟信号离散化。其采集的数据就是离散化了,不再是连续的模拟量信号。

由于计算机只识别0和1两个信号,即开关量信号,用其来表示数值都是使用数字串来表示,由于计算能力的问题,其数字串不能无限长,即其表达的精度也是有限的,同样的以温度为例,由于数字串限制,其表达温度的精度只能达到0.1度,小于该单位的数值则不能被标称,这样就必须将离散量进行量化,将其变为数字量。即35.68度的温度则表示为35.6度。

标签:00,01,数据通讯,Tcp,Modbus,地址,寄存器,MBAP
From: https://blog.csdn.net/ljklxlj/article/details/141139305

相关文章

  • springboot集成integration-ip搭建TCP Client
    1、创建客户端属性类tcp:client:host:127.0.0.1port:5001@Data@ConfigurationProperties("tcp.client")publicclassTcpClientProperties{privateStringhost;privateIntegerport;}2、集成integration-ip配置@Slf4j@Configuration@......
  • 带你全新理解TCP/IP协议
       协议规定了双方互相沟通时遵守的规则:一方是否主动握手,鞠躬多深,谁先从门口走过,在路的哪一侧行驶,等等。虽然有些协议是法律强制规定的,比如在路的哪一边行驶,但生活中的大多数协议都不太正式。与之形成鲜明对比的是,网络协议是非常精确地进行规范的。   互联网有很多......
  • docker之pull失败。error pulling image configuration: download failed after attem
    一、问题描述docker部署完成后,想pull项目,但是就是报错:errorpullingimageconfiguration:downloadfailedafterattempts=6:dialtcp108.160.170.26:443:connect:connectionrefused, 更奇葩的是执行dockersearchhello-world是可以的。二、解决问题1)问题分析:看报......
  • Profibus DP主站转Modbus RTU协议网关(通讯配置详解)
    作者的许多朋友均对如何实现ProfibusDP网络和ModbusRTU网络的连接互通感到十分困扰,现在为大家统一作出解释。事实上,远创智控YC-DPM-RTU此款设备能够完美地解决这一问题。接下来,作者将会给各位全面且详尽地阐述该设备的功能、参数以及配置的方法。一,产品主要功能远创智控YC-......
  • 记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优
    记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优原创 国文 三七互娱技术团队  2024年07月08日18:00 广东 听全文01问题现象A云主机公网访问B云游戏服的一个接口出现偶发超时的问题。02问题原因经抓包定位到B云游戏服接口未响应请求报文导致,具体......
  • UDP/TCP网络调试助手 NetAssist【调试工具】下载
    链接:https://pan.baidu.com/s/1QgL4XZdKNW39nFe18feBbw?pwd=1122提取码:1122–来自百度网盘超级会员V3的分享接收设置ASCII:以ASCII格式显示接收到的数据。ASCII是一种字符编码标准,用于表示文本数据。HEX:以十六进制格式显示接收到的数据。十六进制显示更适合查看和调试......
  • 【计算机网络】彻底搞懂TCP 的三次握手和四次挥手(超详细,带案例,带图解,带面试题)
    在计算机网络中,TCP(传输控制协议)是一种可靠、有序的数据传输协议。TCP使用三次握手建立连接,四次挥手关闭连接。理解这两个过程对于网络编程和网络协议非常重要。本文将通过详细的文字解析和生动的图示,帮助你彻底搞懂TCP的三次握手和四次挥手。......
  • Modbus_RTU
    本文主要记录串口通信,主要记录modbus的默认通信协议modbus_RTU,当然modbus还包含modbus_TCP(网口)和modbus_ASCII(串口)。一、基础知识串口和网口串口:串口是一种物理接口,通常用于连接计算机和外部设备,如打印机、鼠标等。它使用一根线缆进行数据传输,常见的接口有RS-232、RS-485......
  • select多路复用(tcp通信)
    文章目录项目名称项目结构项目名称io_demo1项目结构$tree.├──build├──CMakeLists.txt├──debug.gdb├──include│├──mysocket.h│├──tcp_client.h│└──tcp_server.h├──sources│└──server.cpp└──sr......
  • 在Modbus协议中,传输一个float类型的数值
    假设你想传输的浮点数是123.456,其在内存中的二进制表示为CDABEF12(这是假设为大端序的情况,即最高有效字节先出现)。为了将其发送给Modbus设备,你需要将这32位拆分为两个16位的寄存器值CDAB和EF12。#include<stdint.h>voidfloat_to_modbus_regs(floatf,uint16_t*reg_high......