通信协议详解——ModBusRTU
为方便理解,直接举例子说明。
例子: 假设,有一款流量计,本身有六个通道。 第一通道的瞬时流量,单输入寄存器,寄存器地址为1。 第二通道的瞬时流量,单输入寄存器,寄存器地址为2。 第三通道的瞬时流量,单输入寄存器,寄存器地址为3。 第四通道的瞬时流量,单输入寄存器,寄存器地址为4。 第五通道的瞬时流量,单输入寄存器,寄存器地址为5。 第六通道的瞬时流量,单输入寄存器,寄存器地址为6。 流量计每个通道的累计流量,双输入寄存器,寄存器地址为1001和1002。 流量计的使用模式,单保持寄存器,寄存器地址为11,寄存器16位数据中的第二位。 流量计的流量重置,单保持寄存器,寄存器地址位21,向该寄存器写16。
- 想要读取第三通道的瞬时流量
- 想要读取流量计第四通道的累计流量
- 想要修改第五通道的使用模式为设置模式(0——使用模式,1——设置模式)
写某个位的情况需要在程序中进行一些数据处理,如移位,或操作,与操作。因为写的时候是按照字节写,若想操作字节中的某一位,必须保证其他位不变,因此需要先读目前数据,然后把对应位修改,组成新的数据进行写操作。 读: 写: - 把第五通道的流量值重置
功能码: 一般情况下,支持ModBusRTU的硬件说明书中,都会对所使用的通信协议进行详细的说明,列举一些常见的:
- 0x01:读取线圈寄存器。
- 0x02:读取离散输入寄存器。
- 0x03:读取保持寄存器。
- 0x04:读取输入寄存器。
- 0x05:写入单个线圈寄存器。
- 0x06:写入单个保持寄存器。
- 0x0f:写入多个线圈寄存器。
- 0x10:写入多个保持寄存器。
- 至于数据格式细节可参照对应硬件说明书。
PS ModBusTCP和ModBusRTU相近,最大的区别是ModBusTCP在协议前面多了点东西。 有两个字节的事务处理标识,一般为00H 00H。 有两个字节的协议标识,一般为00H 00H。 还有两个字节的协议长度(为SlaveID之后),根据实际情况可为00H 06H,00H 09H以及其他。
如果对工业控制有兴趣,有问题需要交流,或者有项目需要合作,可扫描二维码进行详细沟通。
|