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,并没有写入成功,这是因为有的寄存器地址存放的数值是动态变化的,写入之后,它又被动态变化的数值给覆盖

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值