Modbus通信协议--RTU

2024-06-07 01:44
文章标签 通信协议 modbus rtu

本文主要是介绍Modbus通信协议--RTU,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、RTU介绍

MODBUS协议支持多种功能码,不同的功能码对应不同的操作:

0x01读线圈状态
0x02读离散输入状态
0x03读保持寄存器
0x04读输入寄存器
0x05写单个线圈
0x06写单个保持寄存器
0x0F写多个线圈
0x10写多个保持寄存器

二、实验

1.0x03功能码读单个保持寄存器

1.1 请求帧格式

从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)
0x010x030x000x450x000x01XXXX
  • 0x01:从地址(Slave Address)。这个值表示这是发送给地址为1的从设备。

  • 0x03:功能码(Function Code)。这个值表示这是一个读取保持寄存器(Read Holding Registers)的请求。

  • 0x00 0x45:起始地址(Starting Address)。这两个字节一起表示从哪个寄存器地址开始读取。0x0045等于十进制的69。

  • 0x00 0x01:寄存器数量(Quantity of Registers)。这两个字节一起表示读取的寄存器数量。0x0001等于十进制的1。

  • XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。

总结:这个Modbus数据帧请求读取从地址为1的设备从地址69开始的1个保持寄存器。

同理这个Modbus数据帧请求读取从地址为1的设备从地址66开始的1个保持寄存器。

1.2 应答帧格式

从站地址功能码字节计数字节一(高位)字节一(低位)校验码(低位)校验码(高位)
0x010x030x020x000x00YYYY
  • 0x01:从地址(Slave Address)。这个值表示这是从地址为1的设备发出的响应。

  • 0x03:功能码(Function Code)。这个值表示这是一个读取保持寄存器(Read Holding Registers)的响应。

  • 0x02:字节数(Byte Count)。这个值表示响应的数据部分包含2个字节。

  • 0x00 0x00:数据(Data)。这两个字节表示从指定的寄存器读取到的值。在这个例子中,读取到的值是0x0000,即十进制的0。

  • YY YY:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。

总结:这个数据帧表示从地址为1的设备,从地址69开始响应的数据部分包含2个字节(0x02)。 且从这个指定的寄存器读取到的值是0x0000。

同理从地址69开始响应的数据部分包含2个字节(0x02)。 且从这个指定的寄存器读取到的值是0x0001。

2.0x06功能码写入单个保持寄存器

2.1 请求帧格式

从站地址功能码寄存器高寄存器低写入值高写入值低校验码(低位)校验码(高位)
0x010x060x000x450x330x01XXXX
  • 0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。

  • 0x06:功能码(Function Code)。表示这是一个写单个寄存器的请求。

  • 0x00 0x45:寄存器地址(Register Address)。这两个字节表示要写入的寄存器地址。0x0045等于十进制的69。

  • 0x33 0x01:寄存器值(Register Value)。这两个字节表示要写入寄存器的值。0x3301可以表示为十进制的13057。

  • XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。

在写入之后,可以用0x03功能码读取0x45地址的数据查看是否写入成功,可以从图中验证看到,0x3301成功写入0x45地址。

2.2 应答帧格式

原报文返回。

3.0x10功能码写入多个保持寄存器

3.1 请求帧格式

从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)字节数写入数值校验码(低位)校验码(高位)
0x010x100x000x450x000x020x040x138A
0x1388
XXXX
  • 0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。

  • 0x10:功能码(Function Code)。表示这是一个写多个寄存器的请求。

  • 0x00 0x45:起始地址(Starting Address)。这两个字节表示要写入的第一个寄存器地址。0x0045等于十进制的69。

  • 0x00 0x02:寄存器数量(Quantity of Registers)。这两个字节表示要写入的寄存器数量。0x0002等于十进制的2。

  • 0x04:字节计数(Byte Count)。这个值表示接下来要写入的数据字节数。在这个例子中两个寄存器就是是4个字节。

  • 0x138A 0x1388:寄存器值(Register Values)。表示要写入寄存器的数据。由于有两个寄存器,每个寄存器占两个字节,所以这里总共4个字节:

    • 0x138A
    • 0x1388
  • XX XX:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。

在写入之后,可以用0x03功能码读取0x45地址的数据查看是否写入成功,可以从图中验证看到,0x138A,0x1388成功写入从0x45开始往后的两个寄存器地址。

3.2 应答帧格式

从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)
0x010x100x000x450x000x02YYYY
  • 0x01:从地址(Slave Address)。表示这是从地址为1的从设备发出的响应。

  • 0x10:功能码(Function Code)。表示这是一个写多个寄存器的响应。

  • 0x00 0x45:起始地址(Starting Address)。这两个字节表示写入操作开始的寄存器地址。0x0045等于十进制的69。

  • 0x00 0x02:寄存器数量(Quantity of Registers)。这两个字节表示写入的寄存器数量。0x0002等于十进制的2。

  • YY YY:CRC校验码(CRC Checksum)。这是一个错误检测码,用于验证数据的完整性。实际的值需要根据前面的数据计算得出。

4.0x17功能码写入多个保持寄存器并读

4.1 请求帧格式

  • 0x01:从地址(Slave Address)。表示这是发送给地址为1的从设备。
  • 0x17:功能码(Function Code)。表示这是一个读取/写入多个寄存器的请求。
  • 0x00 0x45:读取起始地址(Read Starting Address)。这两个字节表示要读取的寄存器地址。0x0045等于十进制的69。
  • 0x00 0x02:读取寄存器数量(Quantity of Registers to Read)。这两个字节表示要读取的寄存器数量。0x0002等于十进制的2。
  • 0x00 0x45:写入起始地址(Write Starting Address)。这两个字节表示要写入的寄存器地址。0x0045等于十进制的69。
  • 0x00 0x02:写入寄存器数量(Quantity of Registers to Write)。这两个字节表示要写入的寄存器数量。0x0002等于十进制的2。
  • 0x04:写入字节计数(Write Byte Count)。表示接下来要写入的数据字节数。在这个例子中是4个字节。
  • 0x11 0x22:第一个寄存器的值。表示要写入的值是0x1122。
  • 0x13 0x88:第二个寄存器的值。表示要写入的值是0x1388。
  • 0xA6 0x1C:CRC校验码(CRC Checksum)。用于错误检测。

4.2 应答帧格式

  • 0x01:从地址(Slave Address)。表示这是从地址为1的从设备发出的响应。
  • 0x17:功能码(Function Code)。表示这是一个读/写多个寄存器的响应。
  • 0x04:字节计数(Byte Count)。表示接下来的数据字节数。在这个例子中是4个字节。
  • 0x11 0x22:读取的第一个寄存器的值。表示从请求中读取的值是0x1122。
  • 0x13 0x88:读取的第二个寄存器的值。表示从请求中读取的值是0x1388。
  • 0x51 0x47:CRC校验码(CRC Checksum)。用于错误检测。

4.3 写入数据问题总结

从图中可见,我在0x46地址写入0x1313之后,在应答帧中读取显示0x1310,并没有写入成功,这是因为有的寄存器地址存放的数值是动态变化的,写入之后,它又被动态变化的数值给覆盖

这篇关于Modbus通信协议--RTU的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037833

相关文章

Modbus初学者教程,第三章:modbus寄存器说明

第三章:modbus寄存器说明 寄存器种类 Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。Modbus寄存器是指一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。寄存器的意义如下表所示。 Modbus协议定义了设备间的数据传输方式,包括数据格式和通信规则。Modbus寄存器是协议中用

嵌入式通信协议----Wi-Fi协议详解(二)(基于STM32+有人物联网WIFI模块)

四、有人WIFI模块 1.模块介绍         Wi-Fi 模块用于实现串口到 Wi-Fi 数据包的双向透明转发,模块内部完成协议转换,通 过该模块,客户可以将物理设备连接到 Wi-Fi 网络上,从而实现物联网的控制与管理。     2.模块参数   Wi-Fi 模块的出厂默认参数如图所示: 基本参数如下图所示:         Wi-Fi 无线模块有三种 Wi-Fi

钡铼BL110在智慧气象站实现Modbus转MQTT无线接入主流云

随着物联网(IoT)技术的发展,各行各业都在积极探索将智能设备与云平台相结合,以提升系统的智能化和自动化水平。智慧气象站作为其中重要的一环,通过实时监测环境数据,为农业、交通、航空等行业提供精准的气象服务。 1. 硬件接口的灵活适配 钡铼BL110智能网关拥有丰富的硬件接口,包括2路或6路RS485/RS232串口、网口以及4G/WiFi接口。这些接口使得BL110能够灵活适配各种气象设备,如

Modbus协议转Profibus协议网关模块连PLC与激光发射器通讯

一、概述 在PLC控制系统中,从站设备通常以Modbus协议,ModbusTCP协议,Profinet协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议等。本文将重点探讨PLC连接Modbus协议转Profibus协议网关模块(XD-MDPB100)与激光发射器通讯的相关内容,为您详细解析这一过程的原理与操作步骤。 二、PLC连接Modbus

STM32---SPI通信协议(小白入、含源码)

写在前面:在单片机的学习过程中,各种通信协议的学习是必不可少的,在前面我们学习了串口通信、IIC通信,本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是SPI? 1.2SPI结构框图 1.3SPI工作模式  1.4SPI工作寄存器 二、NORFLASH介绍 2.1NOR FLASH简介

汇川h3U用modbus配置扩展IO

扩展IO模块为4个艾莫迅RTU简易版,16输入,16输出。物理连接为RS485,A B两根线。 下面为H3Umodbus配置,关键是协议选择为:MODBUS主站配置。协议配置:和从站保持一致 通过下图的程序及配置,已经可以获得扩展模块的各个模块输入点信号: 从站1的16点输入映射M1200-M1215 ,对应通信缓存区是D180。  从站2的16点输入映射M1220-M1235 ,对应

FQC外检机使用Profibus转Modbus网关提升工作效率

一、简介 控制器通过Profibus转Modbus网关(XD-MDPB100)与视觉传感器实现通讯,在FQC外检机的应用为生产流程的自动化和优化提供了重要支持。在工业自动化领域,PLC常被用作控制器,通过采用在PLC与执行设备中间添加Profibus转Modbus网关,可省去过多为协议不同而烦心的焦虑。 二、案例 本文将探讨如何利用PLC通过Profibus转Modbus网关与视觉传感器

php实现modbus CRC校验

一:计算CRC校验函数 function calculateCRC16Modbus($string){$crcBytes = [];for ($i = 0; $i < strlen($string); $i += 2) {$crcBytes[] = hexdec(substr($string, $i, 2));}$crc = 0xFFFF;$polynomial = 0xA001; // T

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用,是因为它提供了标准化的通信协议,确保了不同设备间的兼容性。它支持多种通信方式,易于实现,并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据,如温度、压力、流量等,帮助实现远程监控和自动化控制,同时降低开发和部署成本。 1. Modbus是什么 Modbus是一种应用层协议,广泛用于工业自动化

modbus流量计数据解析(4个字节与float的换算)

通过modbus协议从流量计中读取数据后,需要将获得的字节数据合成float类型。以天信流量计为例: 如何将字节数据合并成float类型呢?这里总结了三种方法。 以温度值41 A0 00 00为例 目录 1、使用char*逐字节解析2、使用memcpy转换2、使用联合体union转换 1、使用char*逐字节解析 float为4个字节,将这4个字节依次解析用获取的温度值数据进