Go Version License: MIT Go Reference
一个用 Go 语言实现的 Modbus 服务器(从站),支持 TCP 和 RTU(串行)协议。
- 完整的 Modbus 协议支持(功能码 1、2、3、4、5、6、15、16)
- 支持 TCP、TLS 和 RTU(串行)传输层
- 可自定义的内存寄存器(线圈、离散输入、保持寄存器、输入寄存器)
- 可扩展的函数处理器(支持自定义功能码)
- 线程安全,并发处理请求
- 优雅关闭
go get github.com/leijux/mbserver
以下是一个简单的 TCP 服务器示例:
package main import ( "context" "flag" "log/slog" "os/signal" "syscall" "github.com/leijux/mbserver" ) var addr = flag.String("addr", ":8080", "TCP address to listen on") func main() { flag.Parse() ctx, _ := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) s := mbserver.NewServer() err := s.ListenTCP(*addr) if err != nil { slog.Error("listen tcp err", "err", err) return } defer s.Shutdown() go s.Start() <-ctx.Done() }
运行该程序将启动一个监听 :8080 的 Modbus TCP 服务器。
s := mbserver.NewServer()
默认情况下,服务器使用内存寄存器(每个区域 65536 个地址)。你可以提供自己的寄存器实现:
type MyRegister struct { // 实现 mbserver.Register 接口 } mr := &MyRegister{} s := mbserver.NewServer(mbserver.WithRegister(mr))
你可以为特定的功能码注册自定义处理函数:
s := mbserver.NewServer(mbserver.WithRegisterFunction(0x41, myCustomFunction))
err := s.ListenTCP(":502") if err != nil { // 处理错误 }
import "github.com/goburrow/serial" config := &serial.Config{ Address: "/dev/ttyUSB0", BaudRate: 9600, DataBits: 8, StopBits: 1, Parity: "N", } err := s.ListenRTU(config) if err != nil { // 处理错误 }
import "crypto/tls" tlsConfig := &tls.Config{ // 配置 TLS 证书和密钥 } err := s.ListenTLS(":802", tlsConfig) if err != nil { // 处理错误 }
go s.Start()
s.Shutdown()
完整的 API 文档请参阅 pkg.go.dev/github.com/leijux/mbserver。
更多示例请查看 cmd/ 目录和测试文件。
欢迎提交 Issue 和 Pull Request。
本项目基于 MIT 许可证开源,详见 LICENSE 文件。