Modbus是PLC常用的通讯协议,经常用于与HMI通信。通过对此协议的分析,可以如同三菱MC协议一样,利用来与PC结合,发挥更大的作用。
若有精力,则从底层弄起,否则之前也看到有go的现成库可以使用。大致浏览了一下协议及相关文章,看起来不复杂。
先存储一下可能需要到的几个网址:
https://blog.csdn.net/liubing8609/article/details/78828686
C#ModBus Tcp 报文解析 https://blog.csdn.net/weixin_30699831/article/details/99182927
modbus TCP 示例报文 https://blog.csdn.net/qq_36132599/article/details/89055249
ModbusTCP协议学习笔记 https://blog.csdn.net/iknow_nothing/article/details/84292914
MODBUS TCP/IP协议规范详细介绍 https://blog.csdn.net/weixin_30568591/article/details/98575601
Modbus TCP指令格式说明 https://blog.csdn.net/m0_37549050/article/details/71794584
初识Modbus TCP/IP————-C#编写Modbus TCP客户端程序(一) https://blog.csdn.net/thebestleo/article/details/52269999
MODBUS功能码简述
代码 | 中文名称 | 寄存器PLC地址 | 位操作/字操作 | 操作数量 |
---|---|---|---|---|
01 | 读线圈状态 | 00001-09999 | 位操作 | 单个或多个 |
02 | 读离散输入状态 | 10001-19999 | 位操作 | 单个或多个 |
03 | 读保持寄存器 | 40001-49999 | 字操作 | 单个或多个 |
04 | 读输入寄存器 | 30001-39999 | 字操作 | 单个或多个 |
05 | 写单个线圈 | 00001-09999 | 位操作 | 单个 |
06 | 写单个保持寄存器 | 40001-49999 | 字操作 | 单个 |
15 | 写多个线圈 | 00001-09999 | 位操作 | 多个 |
16 | 写多个保持寄存器 | 40001-49999 | 字操作 | 多个 |
Modbus TCP数据帧
Modbus TCP数据帧包含报文头、功能代码和数据3部分
MBAP报文头(MBAP、Modbus Application Protocol、Modbus应用协议)分4个域,共7个字节。
Modbus功能代码
共有3种类型分别为:
(1)公共功能代码(如表4所示):已定义好的功能码,保证其唯一性,由Modbus.org认可;
(2)用户自定义功能代码有两组,分别为65~72和100~110,无需认可,但不保证代码使用的唯一性。如变为公共代码,需交RFC认可;(3)保留的功能代码,由某些公司使用在某些传统设备的代码,不可作为公共用途。
Modbus应用举例
用Connect()命令建立目标设备TCP 502端口的连接数据通信的过程:
- 准备Modbus报文,包括7个字节的MBAP在内的请求;
- 使用send()命令发送;
- 在同一连接等待应答;
- 同recv()读报文,完成一次数据交换过程。
- 当通信任务结束时,关闭TCP连接,使服务器可以为其他服务。