From 5220cfff6d68f24875c5ce832bbe4541b9fe6639 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 08 十二月 2023 10:26:38 +0800
Subject: [PATCH] 使用雪花算法生成表id,解决数据同步表相同记录id不一致问题
---
pkg/plc/modbusx/connection_manager.go | 46 +++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/pkg/plc/modbusx/connection_manager.go b/pkg/plc/modbusx/connection_manager.go
index 0aef49b..b8b83ad 100644
--- a/pkg/plc/modbusx/connection_manager.go
+++ b/pkg/plc/modbusx/connection_manager.go
@@ -2,6 +2,7 @@
import (
"apsClient/conf"
+ "apsClient/model/common"
"github.com/goburrow/modbus"
"sync"
"time"
@@ -11,6 +12,8 @@
connections map[string]modbus.Client
mu sync.Mutex
}
+
+var handler *modbus.TCPClientHandler
func newPlcConnectionManager() *ConnectionManager {
return &ConnectionManager{
@@ -47,7 +50,7 @@
if conn, ok := connectionManager.GetConnection(ipAddr); ok {
return conn
}
- conn := newGetModbusConnection(ipAddr)
+ conn := newModbusConnection(ipAddr)
connectionManager.AddConnection(ipAddr, conn)
return conn
}
@@ -58,11 +61,48 @@
return
}
connectionManager.RemoveConnection(ipAddr)
+ if handler != nil {
+ handler.Close()
+ }
}
-func newGetModbusConnection(ipAddr string) modbus.Client {
- handler := modbus.NewTCPClientHandler(ipAddr)
+func newModbusConnection(ipAddr string) modbus.Client {
+ handler = modbus.NewTCPClientHandler(ipAddr)
handler.Timeout = 10 * time.Second
handler.SlaveId = byte(conf.Conf.PLC.SlaveId)
return modbus.NewClient(handler)
}
+
+var rtuHandler *modbus.RTUClientHandler
+
+func getModbusRTUConnection(c *common.RTUConfig) modbus.Client {
+ if conn, ok := connectionManager.GetConnection(c.SerialName); ok {
+ return conn
+ }
+ conn := newModbusRTUConnection(c)
+ connectionManager.AddConnection(c.SerialName, conn)
+ return conn
+}
+
+func unsetModbusRTUConnection(serialName string) {
+ _, ok := connectionManager.GetConnection(serialName)
+ if !ok {
+ return
+ }
+ connectionManager.RemoveConnection(serialName)
+ if handler != nil {
+ handler.Close()
+ }
+}
+
+func newModbusRTUConnection(c *common.RTUConfig) modbus.Client {
+ // Modbus RTU/ASCII
+ rtuHandler = modbus.NewRTUClientHandler(c.SerialName)
+ rtuHandler.BaudRate = c.BaudRate
+ rtuHandler.DataBits = c.DataBit
+ rtuHandler.Parity = c.Parity.ToString()
+ rtuHandler.StopBits = c.StopBit
+ rtuHandler.SlaveId = 1
+ rtuHandler.Timeout = 5 * time.Second
+ return modbus.NewClient(rtuHandler)
+}
--
Gitblit v1.8.0