zhangqian
2023-10-26 07db2029d66a028a2d2256d2c158693c3a42b5f8
update
2个文件已修改
80 ■■■■ 已修改文件
pkg/plc/plc4x.go 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/plc.go 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pkg/plc/plc4x.go
@@ -1,12 +1,15 @@
package plc
import (
    "apsClient/conf"
    "apsClient/pkg/logx"
    "context"
    "errors"
    "fmt"
    apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
    "github.com/spf13/cast"
    "sync"
    "sync/atomic"
    "time"
    plc4go "github.com/apache/plc4x/plc4go/pkg/api"
@@ -107,7 +110,7 @@
func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
    tag := fmt.Sprintf("tag:%v", address)
    tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
    tagAddress := getTagAddress(address, 1)
    // 读模式
    readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -137,7 +140,7 @@
func readHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) {
    tag := fmt.Sprintf("tag:%v:%v", address, length)
    tagAddress := fmt.Sprintf("holding-register:%d:UINT[%d]", address, length)
    tagAddress := getTagAddress(address, length)
    // 读模式
    readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -149,13 +152,13 @@
    // 执行
    readResult := <-readRequest.Execute()
    if err := readResult.GetErr(); err != nil {
        logx.Errorf("execting read-request:%s\n", err.Error())
        logx.Errorf("plc4x execute read-request:%s\n", err.Error())
        return nil, err
    }
    // 判断响应码是否正确
    if readResult.GetResponse().GetResponseCode(tag) != apiModel.PlcResponseCode_OK {
        logx.Errorf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode(tag).GetName())
        logx.Errorf("plc4x response error code: %s", readResult.GetResponse().GetResponseCode(tag).GetName())
        return nil, errors.New("error  code: " + readResult.GetResponse().GetResponseCode(tag).GetName())
    }
@@ -178,27 +181,44 @@
    return readHoldingRegisterSingle(connection, address)
}
func getTagAddress(address int, length int) string {
    intType := conf.Conf.PLC.ModbusIntType
    if intType == "" {
        intType = "DINT"
    }
    if length == 1 {
        return fmt.Sprintf("holding-register:%d:%v", address, intType)
    } else {
        return fmt.Sprintf("holding-register:%d:%v[%d]", address, intType, length)
    }
}
func WriteHoldingRegister(connection plc4go.PlcConnection, address int, value any) (string, error) {
    tag := fmt.Sprintf("tag:%v:w", address)
    tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
    var tagAddress string
    if cast.ToInt32(value) > 2<<16 {
        tagAddress = getTagAddress(address, 2)
    } else {
        tagAddress = getTagAddress(address, 1)
    }
    // 写模式
    writeRequest, err := connection.WriteRequestBuilder().AddTagAddress(tag, tagAddress, value).Build()
    if err != nil {
        logx.Errorf("preparing read-request:%s\n", err.Error())
        logx.Errorf("plc4x preparing read-request:%s\n", err.Error())
        return "", err
    }
    // 执行
    writeResult := <-writeRequest.Execute()
    if err := writeResult.GetErr(); err != nil {
        logx.Errorf("execting read-request:%s\n", err.Error())
        logx.Errorf("plc4x execute write-request:%s\n", err.Error())
        return "", err
    }
    // 判断响应码是否正确
    if writeResult.GetResponse().GetResponseCode(tag) != apiModel.PlcResponseCode_OK {
        logx.Errorf("error an non-ok return code: %s", writeResult.GetResponse().GetResponseCode(tag).GetName())
        logx.Errorf("plc4x  response error code: %s", writeResult.GetResponse().GetResponseCode(tag).GetName())
        return "", errors.New("error  code: " + writeResult.GetResponse().GetResponseCode(tag).GetName())
    }
@@ -206,3 +226,41 @@
    return result, nil
}
func dealErr(err error, ipAddr string) {
    if err != nil {
        FailureRemainingOpportunitiesDecr() //减少失败剩余机会
    } else {
        FailureRemainingOpportunitiesReset() //重置失败剩余机会
    }
}
var connectionStatus atomic.Bool
var failureRemainingOpportunities atomic.Int64
const (
    defaultFailureRemainingOpportunities = 20
)
func IsConnect() bool {
    return connectionStatus.Load()
}
func FailureRemainingOpportunitiesDecr() {
    newValue := failureRemainingOpportunities.Add(-1)
    if newValue <= 0 {
        connectionStatus.Store(false)
    }
    return
}
func FailureRemainingOpportunitiesReset() {
    if failureRemainingOpportunities.Load() < defaultFailureRemainingOpportunities {
        failureRemainingOpportunities.Store(defaultFailureRemainingOpportunities)
    }
    if connectionStatus.Load() == false {
        connectionStatus.Store(true)
    }
    return
}
service/plc.go
@@ -130,7 +130,11 @@
        if err != nil {
            return nil, err
        }
        return plc.ReadHoldingRegister(conn, address, length)
        newLength := length / 2
        if newLength == 0 {
            newLength = 1
        }
        return plc.ReadHoldingRegister(conn, address, newLength)
    } else {
        return modbusx.Read(ipAddr, uint16(address), uint16(length))
    }