通信协议详解——ModBusRTU

通信协议详解——ModBusRTU

为方便理解,直接举例子说明。

例子:
假设,有一款流量计,本身有六个通道。
第一通道的瞬时流量,单输入寄存器,寄存器地址为1。
第二通道的瞬时流量,单输入寄存器,寄存器地址为2。
第三通道的瞬时流量,单输入寄存器,寄存器地址为3。
第四通道的瞬时流量,单输入寄存器,寄存器地址为4。
第五通道的瞬时流量,单输入寄存器,寄存器地址为5。
第六通道的瞬时流量,单输入寄存器,寄存器地址为6。
流量计每个通道的累计流量,双输入寄存器,寄存器地址为1001和1002。
流量计的使用模式,单保持寄存器,寄存器地址为11,寄存器16位数据中的第二位。
流量计的流量重置,单保持寄存器,寄存器地址位21,向该寄存器写16。

  1. 想要读取第三通道的瞬时流量
    在这里插入图片描述
  2. 想要读取流量计第四通道的累计流量
    在这里插入图片描述
  3. 想要修改第五通道的使用模式为设置模式(0——使用模式,1——设置模式)
    写某个位的情况需要在程序中进行一些数据处理,如移位,或操作,与操作。因为写的时候是按照字节写,若想操作字节中的某一位,必须保证其他位不变,因此需要先读目前数据,然后把对应位修改,组成新的数据进行写操作。
    读:
    在这里插入图片描述
    写:
    在这里插入图片描述
  4. 把第五通道的流量值重置
    在这里插入图片描述

功能码
一般情况下,支持ModBusRTU的硬件说明书中,都会对所使用的通信协议进行详细的说明,列举一些常见的:

  • 0x01:读取线圈寄存器。
  • 0x02:读取离散输入寄存器。
  • 0x03:读取保持寄存器。
  • 0x04:读取输入寄存器。
  • 0x05:写入单个线圈寄存器。
  • 0x06:写入单个保持寄存器。
  • 0x0f:写入多个线圈寄存器。
  • 0x10:写入多个保持寄存器。
  • 至于数据格式细节可参照对应硬件说明书。

PS
ModBusTCP和ModBusRTU相近,最大的区别是ModBusTCP在协议前面多了点东西。
有两个字节的事务处理标识,一般为00H 00H。
有两个字节的协议标识,一般为00H 00H。
还有两个字节的协议长度(为SlaveID之后),根据实际情况可为00H 06H,00H 09H以及其他。

如果对工业控制有兴趣,有问题需要交流,或者有项目需要合作,可扫描二维码进行详细沟通。

你可能感兴趣的:(驱动开发)