From 3fb5f541891e3aa69060a1ea9b3808cc42bbbfa8 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期一, 06 十一月 2023 10:51:26 +0800
Subject: [PATCH] add log
---
pkg/plc/apacheplc4x/modbus.go | 63 +++++++++++++++++++++----------
1 files changed, 43 insertions(+), 20 deletions(-)
diff --git a/pkg/plc/apacheplc4x/modbus.go b/pkg/plc/apacheplc4x/modbus.go
index d9ef045..e828403 100644
--- a/pkg/plc/apacheplc4x/modbus.go
+++ b/pkg/plc/apacheplc4x/modbus.go
@@ -1,6 +1,7 @@
package apacheplc4x
import (
+ "apsClient/conf"
"apsClient/pkg/logx"
"context"
"errors"
@@ -9,35 +10,40 @@
"github.com/apache/plc4x/plc4go/pkg/api/drivers"
apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
"github.com/apache/plc4x/plc4go/pkg/api/transports"
+ "github.com/spf13/cast"
"sync/atomic"
"time"
)
+
+var driverManager plc4go.PlcDriverManager
+
+func init() {
+ // 鍒涘缓椹卞姩绠$悊鍣�
+ driverManager = plc4go.NewPlcDriverManager()
+ // 娉ㄥ唽TCP浼犺緭
+ transports.RegisterTcpTransport(driverManager)
+ // 娉ㄥ唽涓插彛浼犺緭
+ transports.RegisterSerialTransport(driverManager)
+ // 娉ㄥ唽椹卞姩
+ drivers.RegisterModbusTcpDriver(driverManager)
+ drivers.RegisterModbusRtuDriver(driverManager)
+}
func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
// 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 3 绉掕秴鏃�
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
- conn, err := newGetModbusConnection(ctx, ipAddr)
+ conn, err := newModbusTCPConnection(ctx, ipAddr)
if err != nil {
logx.Errorf("new modbus connection err: %v", err.Error())
return nil, err
}
return conn, nil
}
-
-func newGetModbusConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) {
- // 鍒涘缓椹卞姩绠$悊鍣�
- driverManager := plc4go.NewPlcDriverManager()
- // 娉ㄥ唽TCP浼犺緭
- transports.RegisterTcpTransport(driverManager)
- // 娉ㄥ唽椹卞姩
- //drivers.RegisterKnxDriver(driverManager)
- drivers.RegisterModbusTcpDriver(driverManager)
-
+func newModbusTCPConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) {
// 閫氳繃TCP杩炴帴PLC璁惧
connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr)
connectionRequestChanel := driverManager.GetConnection(connectionString)
-
// 绛夊緟杩炴帴鍝嶅簲锛屽悓鏃惰�冭檻涓婁笅鏂囩殑瓒呮椂
select {
case connectionResult := <-connectionRequestChanel:
@@ -52,7 +58,7 @@
func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
tag := fmt.Sprintf("tag:%v", address)
- tagAddress := fmt.Sprintf("holding-register:%d:DINT", address)
+ tagAddress := getTagAddress(address, 1)
// 璇绘ā寮�
readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -82,7 +88,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:DINT[%d]", address, length)
+ tagAddress := getTagAddress(address, length)
// 璇绘ā寮�
readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -94,13 +100,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())
}
@@ -129,6 +135,18 @@
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(ipAddr string, address int, value any) (string, error) {
connection, err := GetModbusConnection(ipAddr)
dealErr(err, ipAddr)
@@ -137,25 +155,30 @@
}
defer connection.Close()
tag := fmt.Sprintf("tag:%v:w", address)
- tagAddress := fmt.Sprintf("holding-register:%d:DINT", 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())
}
--
Gitblit v1.8.0