zhangqian
2023-08-25 48ef530180aeec4f91517e2b86ef75745c28241c
plc连接加入连接池并设置连接超时为5秒
5个文件已修改
64 ■■■■ 已修改文件
api/v1/task.go 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
datafile/plc_address_key 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
datafile/plc_address_value 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pkg/plc/plc4x.go 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/plc.go 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/task.go
@@ -265,11 +265,10 @@
    if code != ecode.OK {
        return errors.New("请先配置PLC")
    }
    conn, err := plc.NewModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
    conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
    if err != nil {
        return errors.New(fmt.Sprintf("连接plc失败: %v", err.Error()))
    }
    defer conn.Close()
    logx.Info("----------------开始下发工艺参数-----------------")
    for k, v := range paramsMap {
@@ -297,11 +296,10 @@
    if code != ecode.OK {
        return errors.New("请先配置PLC")
    }
    conn, err := plc.NewModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
    conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
    if err != nil {
        return errors.New(fmt.Sprintf("连接plc失败: %v", err.Error()))
    }
    defer conn.Close()
    logx.Info("----------------开始下发工艺参数-----------------")
    var missNumbers int
datafile/plc_address_key
@@ -1,3 +0,0 @@
压强
时间
温度
datafile/plc_address_value
@@ -1,3 +0,0 @@
1000
1001
1002
pkg/plc/plc4x.go
@@ -4,16 +4,52 @@
    "errors"
    "fmt"
    apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
    "github.com/apache/plc4x/plc4go/spi/options"
    "sync"
    "time"
    plc4go "github.com/apache/plc4x/plc4go/pkg/api"
    "github.com/apache/plc4x/plc4go/pkg/api/drivers"
    "github.com/apache/plc4x/plc4go/pkg/api/transports"
)
func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
    // 创建驱动管理器
    driverManager := plc4go.NewPlcDriverManager()
type ConnectionManager struct {
    connections map[string]plc4go.PlcConnection
    mu          sync.Mutex
}
func NewPlcConnectionManager() *ConnectionManager {
    return &ConnectionManager{
        connections: make(map[string]plc4go.PlcConnection),
    }
}
func (cm *ConnectionManager) GetConnection(address string) (plc4go.PlcConnection, bool) {
    cm.mu.Lock()
    defer cm.mu.Unlock()
    conn, ok := cm.connections[address]
    return conn, ok
}
var connectionManager = NewPlcConnectionManager()
func (cm *ConnectionManager) AddConnection(address string, connection plc4go.PlcConnection) {
    cm.mu.Lock()
    defer cm.mu.Unlock()
    cm.connections[address] = connection
}
func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
    if conn, ok := connectionManager.GetConnection(ipAddr); ok {
        if conn.IsConnected() {
            return conn, nil
        }
    }
    // 创建驱动管理器
    option := options.WithReceiveTimeout(time.Second * 5) //五秒超时
    driverManager := plc4go.NewPlcDriverManager(option)
    // 注册TCP传输
    transports.RegisterTcpTransport(driverManager)
@@ -33,7 +69,9 @@
        return nil, err
    }
    return connectionResult.GetConnection(), nil
    conn := connectionResult.GetConnection()
    connectionManager.AddConnection(ipAddr, conn)
    return conn, nil
}
func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
    tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
service/plc.go
@@ -27,12 +27,11 @@
    }
    ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
    conn, err := plc.NewModbusConnection(ipAddr)
    conn, err := plc.GetModbusConnection(ipAddr)
    if err != nil {
        logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error())
        return
    }
    defer conn.Close()
    rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength)
    if err != nil {
@@ -61,12 +60,11 @@
    }
    ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
    conn, err := plc.NewModbusConnection(ipAddr)
    conn, err := plc.GetModbusConnection(ipAddr)
    if err != nil {
        logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error())
        return
    }
    defer conn.Close()
    result, err := plc.WriteHoldingRegister(conn, startAddress, value)
    if err != nil {