Modbus协议学习笔记
之前也有写过基于 Modbus 通讯协议的控制远程监控程序,但是由于当时时间赶、人手少(软硬件前后台都是在下一人😂),所以也就没系统的去学习,只是在串口通讯的基础上自己解析串口数据。并且那是 lua 语言实现的。
现在的项目,想要用 Python 写个桌面端的 Modbus 测试用程序,于是,重拾 Modbus 协议的学习。
简介
Modbus 是一种串行通信协议,于1979年为使用PLC(可编程逻辑控制器)通信而发表,现在已经成为工业领域通信协议的业界标准,是现在工业电子设备之间常用的通信连接方式。
Modbus 允许多个(240)设备连接在同一个网络中进行通信。通常在数据采集与监视控制系统(SCADA)中被广泛使用。
协议版本
Modbus 协议目前存在用于串口、以太网以及其他支持互联网协议的网络版本。
本文主要讨论 Modbus RTU(串口)和 Modbus TCP(网口)版本。
通讯和设备
Modbus 协议是一个 master/slave 架构的协议。采用主从机通讯模式。Modbus 协议网络中,有一个 master 节点,以及多个 slave 节点。在 Modbus 网络中,只有被指定为 master 节点的节点可以启动一个指令(任何一个设备都可以发送一个 Modbus 指令,但是通常只有 master 节点设备启动指令)。
上段内容什么意思呢?
简而言之:
- Modbus 是主从通讯模式,需要有一个 master(发起端)和多个 slave(响应端)
- Modbus 网络中,只有发起端可以发起指令,由响应端响应。
一个 Modbus 命令包含了打算执行的设备的 Modbus 地址。所有的设备都会受到命令,但只有指定的设备会执行及回应指令。(地址0除外,指令地址为0的命令是广播地址,所有收到指令的设备都会执行,但是不回应指令)。
所有的 Modbus 命令包含了检查码,以确定到达的命令没有被破坏。基本的 Modbus 指令能控制一个 RTU(远程终端控制系统)改变它的寄存器的某个值,控制或者读取一个 I/O 端口,以及指挥设备回送一个或者多个其寄存器中的数据。
干货介绍
上面的内容取材自 Modbus 通信协议 的度娘百科内容。可能没接触过的老铁会看的一头雾水。
再简而言之,Modbus 是串口通信的一种协议方式。也就是一次性发送多个字节的串口数据。
软件测试
工欲善其事,必先利其器。在研究如何写代码,如何理解 Modbus 协议理论之前,我们可以使用 Modbus Tools 模拟 Modbus 通讯过程,并分析报文。
1. 03 命令 (Read Holding Register)读取保持寄存器
2. 04 命令 (Read Input Register)读取输入寄存器
3. 06 命令(写单一寄存器)
4. 16 命令 (写多个寄存器)