goburrow/modbus
是一个用Go语言实现的Modbus协议库,提供了Modbus主机(Master)和从机(Slave)的实现,支持两种主要的Modbus传输模式:Modbus TCP和Modbus RTU。
功能介绍
1. 支持的传输模式
-
Modbus TCP : 这是基于TCP/IP的Modbus通信协议,通常用于以太网或Wi-Fi连接的设备。
goburrow/modbus
库通过TCPClientHandler
来处理Modbus TCP通信。 -
Modbus RTU : 这是基于串行通信(如RS-232、RS-485)的Modbus协议,通常用于工业自动化环境中的设备。
goburrow/modbus
库通过RTUClientHandler
来处理Modbus RTU通信。
2. Modbus主机功能(Master)
作为Modbus主机,goburrow/modbus
库支持多种Modbus功能码,让你能够与Modbus从机设备进行读写操作:
- 读写寄存器和线圈
ReadCoils(address, quantity)
- 读取线圈状态(功能码01)ReadDiscreteInputs(address, quantity)
- 读取离散输入状态(功能码02)ReadHoldingRegisters(address, quantity)
- 读取保持寄存器值(功能码03)ReadInputRegisters(address, quantity)
- 读取输入寄存器值(功能码04)WriteSingleCoil(address, value)
- 写单个线圈状态(功能码05)WriteSingleRegister(address, value)
- 写单个保持寄存器值(功能码06)WriteMultipleCoils(address, quantity, value)
- 写多个线圈状态(功能码15)WriteMultipleRegisters(address, quantity, value)
- 写多个保持寄存器值(功能码16)
3. Modbus从机功能(Slave)
goburrow/modbus
库主要提供Modbus主机功能,默认并不包含从机功能的实现。要实现从机功能,通常需要手动处理Modbus请求并响应。虽然goburrow/modbus
没有直接的从机实现,但可以通过使用底层的TCP或串口库自行处理从机请求。
4. 错误处理
goburrow/modbus
提供了基本的错误处理机制。如果在发送Modbus请求或接收响应时出现错误,会返回一个带有错误信息的error
对象。
5. 连接管理
- 连接管理 :提供了
Connect()
和Close()
方法,用于与Modbus设备的连接和断开连接。 - 自动重连:通过控制连接的生命周期,支持在连接断开时重新连接的逻辑。
6. 高级功能
- 超时设置 :允许通过
Timeout
参数设置读写操作的超时时间。 - 从机ID配置 :在Modbus通信中,
SlaveId
用来指定目标从机的ID。每次操作时可以指定不同的从机ID。 - 数据帧自定义 :
goburrow/modbus
允许你构建自定义的Modbus数据帧,并直接发送/接收原始帧数据。
7、示例
使用Modbus TCP客户端
以下是一个简单的Modbus TCP客户端示例,用于读取从站设备的保持寄存器值:
go
package main
import (
"fmt"
"github.com/goburrow/modbus"
)
func main() {
// 创建Modbus TCP客户端
handler := modbus.NewTCPClientHandler("192.168.1.1:502")
handler.Timeout = 10 * time.Second
handler.SlaveId = 1
// 连接到Modbus服务器
err := handler.Connect()
if err != nil {
panic(err)
}
defer handler.Close()
client := modbus.NewClient(handler)
// 读取保持寄存器(功能码03),从寄存器地址0开始,读取2个寄存器
results, err := client.ReadHoldingRegisters(0, 2)
if err != nil {
panic(err)
}
fmt.Printf("Received: %x\n", results)
}
使用Modbus RTU客户端
如果你使用的是Modbus RTU(通常通过串口通信),可以使用如下代码:
go
package main
import (
"fmt"
"github.com/goburrow/modbus"
"time"
)
func main() {
// 创建Modbus RTU客户端
handler := modbus.NewRTUClientHandler("/dev/ttyUSB0")
handler.BaudRate = 19200
handler.DataBits = 8
handler.Parity = "N"
handler.StopBits = 1
handler.SlaveId = 1
handler.Timeout = 10 * time.Second
// 打开串口连接
err := handler.Connect()
if err != nil {
panic(err)
}
defer handler.Close()
client := modbus.NewClient(handler)
// 读取保持寄存器(功能码03),从寄存器地址0开始,读取2个寄存器
results, err := client.ReadHoldingRegisters(0, 2)
if err != nil {
panic(err)
}
fmt.Printf("Received: %x\n", results)
}
注意事项
- 超时设置 :
handler.Timeout
参数设置的是连接和读写操作的超时时间,根据实际网络情况调整。 - 串口参数配置: 如果使用Modbus RTU,请确保串口参数(波特率、数据位、校验位、停止位)与设备匹配。