go之goburrow/modbus 学习

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,请确保串口参数(波特率、数据位、校验位、停止位)与设备匹配。
相关推荐
潜心一志4 小时前
图像预处理—— 图像的变换与校正(理论)
学习·计算机视觉
nmjkhome4 小时前
26 疲劳的几个重要概念(第51课)-solid works simulation
学习
程序猿乐锅4 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
燕落南枝4 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
一次旅行5 小时前
DeepSeek‑V4.1‑Flash‑1017完整解读:模型升级+Search/Fetch搜索API开放,Agent开发者要注意哪些坑
前端·网络·人工智能
.Bryce.5 小时前
你了解 Blackboard(黑板系统)吗?听说过基于黑板系统实现的智能体吗?
java·网络·gpt·php·agent·codex·黑板系统
银河技术6 小时前
从脚本到 Operator:用 Go 构建可靠的微服务自动扩缩容控制器
开发语言·微服务·golang
草莓熊Lotso8 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Chenyu_31013 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存
徐同保13 小时前
免费ssl证书全流程AI配置(含七牛云cdn)
网络·网络协议·ssl