From 2df84cdc7faf29cc8a2512b627a36a3881276b9f Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 26 十月 2023 16:29:15 +0800
Subject: [PATCH] plc4x读写加入长度
---
pkg/plc/apacheplc4x/modbus.go | 20 +
pkg/plc/com.go | 467 ++++++++++++++++++++++++++-------------------------
2 files changed, 249 insertions(+), 238 deletions(-)
diff --git a/pkg/plc/apacheplc4x/modbus.go b/pkg/plc/apacheplc4x/modbus.go
index b289561..3876010 100644
--- a/pkg/plc/apacheplc4x/modbus.go
+++ b/pkg/plc/apacheplc4x/modbus.go
@@ -10,6 +10,7 @@
"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"
)
@@ -53,7 +54,7 @@
func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
tag := fmt.Sprintf("tag:%v", address)
- tagAddress := getTagAddress(address)
+ tagAddress := getTagAddress(address, 1)
// 璇绘ā寮�
readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -83,7 +84,7 @@
func readHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) {
tag := fmt.Sprintf("tag:%v:%v", address, length)
- tagAddress := getTagAddress(address)
+ tagAddress := getTagAddress(address, length)
// 璇绘ā寮�
readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build()
@@ -130,12 +131,16 @@
return readHoldingRegisterSingle(connection, address)
}
-func getTagAddress(address int) string {
+func getTagAddress(address int, length int) string {
intType := conf.Conf.PLC.ModbusIntType
if intType == "" {
intType = "DINT"
}
- return fmt.Sprintf("holding-register:%d:%v", address, intType)
+ 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) {
@@ -146,7 +151,12 @@
}
defer connection.Close()
tag := fmt.Sprintf("tag:%v:w", address)
- tagAddress := getTagAddress(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()
diff --git a/pkg/plc/com.go b/pkg/plc/com.go
index 8905dd6..d5df41a 100644
--- a/pkg/plc/com.go
+++ b/pkg/plc/com.go
@@ -1,235 +1,236 @@
package plc
-import (
- "encoding/hex"
- "errors"
- "fmt"
- "io"
- "strings"
- "time"
-
- "github.com/jacobsa/go-serial/serial"
-)
-
-/*
-瀹氫箟涓插彛瀹㈡埛绔�
-*/
-
-type SerialClient struct {
- readWriter io.ReadWriteCloser
- OutBuffer chan string
- PortName string
- baudRate uint
-}
-
-func NewSerialClient(portName string, baudRate uint) (*SerialClient, error) {
- c := &SerialClient{
- readWriter: nil,
- OutBuffer: make(chan string, 1024),
- PortName: portName,
- baudRate: baudRate,
- }
- r, err := c.open(portName, baudRate)
- if err != nil {
- return nil, err
- }
-
- c.readWriter = r
- return c, nil
-}
-
-func (c *SerialClient) Start() {
- for {
- buf := make([]byte, 1024)
- n, err := c.readWriter.Read(buf)
- if err != nil {
- if err != io.EOF {
- //灏濊瘯閲嶆柊鎵撳紑
- r, err := c.open(c.PortName, c.baudRate)
- if err != nil {
- time.Sleep(2 * time.Second)
- continue
- }
- c.readWriter = r
- }
- continue
- }
-
- buf = buf[:n]
- res := hex.EncodeToString(buf)
- if strings.TrimSpace(res) == "" {
- continue
- }
- fmt.Printf("Rx: %s\n", res)
- c.OutBuffer <- res
- }
-}
-
-func (c *SerialClient) open(portName string, baudRate uint) (io.ReadWriteCloser, error) {
- options := serial.OpenOptions{
- PortName: portName,
- BaudRate: baudRate,
- DataBits: 7,
- StopBits: 1,
- MinimumReadSize: 4,
- ParityMode: serial.PARITY_EVEN,
- }
-
- r, err := serial.Open(options)
- if err != nil {
- return nil, err
- }
-
- c.readWriter = r
-
- return r, err
-}
-
-func (c *SerialClient) Close() {
- if c.readWriter != nil {
- c.readWriter.Close()
- }
-}
-
-func (c *SerialClient) SendMsg(data string) (int, error) {
- if c.readWriter == nil {
- return 0, errors.New("serial port is closed")
- }
-
- bytes, err := hex.DecodeString(data)
- if err != nil {
- return 0, err
- }
-
- return c.readWriter.Write(bytes)
-}
-
-func (c *SerialClient) ReadHoldRegister(addr string) (int, error) {
- if c.readWriter == nil {
- return 0, errors.New("serial port is closed")
- }
-
- // 涓夎彵fn绯诲垪涓插彛鍗忚
- // 02 琛ㄧず寮�濮� + 30 琛ㄧず璇绘暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠�
-
- // 鍏堢粍瑁呮暟鎹�
- // 璇诲彇鐨勫湴鍧�
- dataBytes := append([]byte{0x30}, []byte(addr)...)
-
- // 璇诲彇鐨勯暱搴�
- dataBytes = append(dataBytes, []byte("02")...)
-
- // 鍋滄
- dataBytes = append(dataBytes, []byte{0x03}...)
-
- // 璁$畻鏍¢獙鐮�, 30 + 鍦板潃缂栫爜 + 鏁版嵁闀垮害 + 03 , 鍗佸叚杩涘埗缁撴灉鍙栧悗涓や綅.
- var sum uint8
- for _, d := range dataBytes {
- sum += d
- }
-
- sumStr := fmt.Sprintf("%x", sum)
-
- fmt.Printf("sumStr: %s\n", sumStr)
-
- var checkCode string
- if len(sumStr) < 2 {
- checkCode = "0" + sumStr
- } else {
- checkCode = sumStr[len(sumStr)-2:]
- }
-
- var bytes = []byte{0x02}
- // 娣诲姞鏁版嵁
- bytes = append(bytes, dataBytes...)
- // 娣诲姞鏍¢獙
- bytes = append(bytes, []byte(checkCode)...)
-
- fmt.Printf("Tx: %X \n", bytes)
-
- // 鍐�
- if n, err := c.readWriter.Write(bytes); err != nil {
- return n, err
- } else {
- fmt.Printf("Tx:len:%d\n", n)
- }
-
- // 璇�
- buf := make([]byte, 1024)
- n, err := c.readWriter.Read(buf)
- if err != nil {
- return n, err
- }
-
- buf = buf[:n]
-
- fmt.Printf("Rx: %X\nRx len:%d", buf, n)
- fmt.Printf("value: %d\n", buf[2:6])
-
- return n, nil
-}
-
-func (c *SerialClient) WriteHoldRegister(addr string) (int, error) {
- if c.readWriter == nil {
- return 0, errors.New("serial port is closed")
- }
-
- // 涓夎彵fn绯诲垪涓插彛鍗忚
- // 02 琛ㄧず寮�濮� + 31 琛ㄧず鍐欐暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠�
-
- // 鍏堢粍瑁呮暟鎹�
- // 璇诲彇鐨勫湴鍧�
- dataBytes := append([]byte{0x31}, []byte(addr)...)
-
- // 璇诲彇鐨勯暱搴�
- dataBytes = append(dataBytes, []byte("02")...)
-
- // 鍋滄
- dataBytes = append(dataBytes, []byte{0x03}...)
-
- // 璁$畻鏍¢獙鐮�, 30 + 鍦板潃缂栫爜 + 鏁版嵁闀垮害 + 03 , 鍗佸叚杩涘埗缁撴灉鍙栧悗涓や綅.
- var sum uint8
- for _, d := range dataBytes {
- sum += d
- }
-
- sumStr := fmt.Sprintf("%x", sum)
-
- fmt.Printf("sumStr: %s\n", sumStr)
-
- var checkCode string
- if len(sumStr) < 2 {
- checkCode = "0" + sumStr
- } else {
- checkCode = sumStr[len(sumStr)-2:]
- }
-
- var bytes = []byte{0x02}
- // 娣诲姞鏁版嵁
- bytes = append(bytes, dataBytes...)
- // 娣诲姞鏍¢獙
- bytes = append(bytes, []byte(checkCode)...)
-
- fmt.Printf("Tx: %X \n", bytes)
-
- // 鍐�
- if n, err := c.readWriter.Write(bytes); err != nil {
- return n, err
- } else {
- fmt.Printf("Tx:len:%d\n", n)
- }
-
- // 璇�
- buf := make([]byte, 1024)
- n, err := c.readWriter.Read(buf)
- if err != nil {
- return n, err
- }
-
- buf = buf[:n]
-
- fmt.Printf("Rx: %X\nRx len:%d", buf, n)
- fmt.Printf("value: %d\n", buf[2:6])
-
- return n, nil
-}
+//
+//import (
+// "encoding/hex"
+// "errors"
+// "fmt"
+// "io"
+// "strings"
+// "time"
+//
+// "github.com/jacobsa/go-serial/serial"
+//)
+//
+///*
+//瀹氫箟涓插彛瀹㈡埛绔�
+//*/
+//
+//type SerialClient struct {
+// readWriter io.ReadWriteCloser
+// OutBuffer chan string
+// PortName string
+// baudRate uint
+//}
+//
+//func NewSerialClient(portName string, baudRate uint) (*SerialClient, error) {
+// c := &SerialClient{
+// readWriter: nil,
+// OutBuffer: make(chan string, 1024),
+// PortName: portName,
+// baudRate: baudRate,
+// }
+// r, err := c.open(portName, baudRate)
+// if err != nil {
+// return nil, err
+// }
+//
+// c.readWriter = r
+// return c, nil
+//}
+//
+//func (c *SerialClient) Start() {
+// for {
+// buf := make([]byte, 1024)
+// n, err := c.readWriter.Read(buf)
+// if err != nil {
+// if err != io.EOF {
+// //灏濊瘯閲嶆柊鎵撳紑
+// r, err := c.open(c.PortName, c.baudRate)
+// if err != nil {
+// time.Sleep(2 * time.Second)
+// continue
+// }
+// c.readWriter = r
+// }
+// continue
+// }
+//
+// buf = buf[:n]
+// res := hex.EncodeToString(buf)
+// if strings.TrimSpace(res) == "" {
+// continue
+// }
+// fmt.Printf("Rx: %s\n", res)
+// c.OutBuffer <- res
+// }
+//}
+//
+//func (c *SerialClient) open(portName string, baudRate uint) (io.ReadWriteCloser, error) {
+// options := serial.OpenOptions{
+// PortName: portName,
+// BaudRate: baudRate,
+// DataBits: 7,
+// StopBits: 1,
+// MinimumReadSize: 4,
+// ParityMode: serial.PARITY_EVEN,
+// }
+//
+// r, err := serial.Open(options)
+// if err != nil {
+// return nil, err
+// }
+//
+// c.readWriter = r
+//
+// return r, err
+//}
+//
+//func (c *SerialClient) Close() {
+// if c.readWriter != nil {
+// c.readWriter.Close()
+// }
+//}
+//
+//func (c *SerialClient) SendMsg(data string) (int, error) {
+// if c.readWriter == nil {
+// return 0, errors.New("serial port is closed")
+// }
+//
+// bytes, err := hex.DecodeString(data)
+// if err != nil {
+// return 0, err
+// }
+//
+// return c.readWriter.Write(bytes)
+//}
+//
+//func (c *SerialClient) ReadHoldRegister(addr string) (int, error) {
+// if c.readWriter == nil {
+// return 0, errors.New("serial port is closed")
+// }
+//
+// // 涓夎彵fn绯诲垪涓插彛鍗忚
+// // 02 琛ㄧず寮�濮� + 30 琛ㄧず璇绘暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠�
+//
+// // 鍏堢粍瑁呮暟鎹�
+// // 璇诲彇鐨勫湴鍧�
+// dataBytes := append([]byte{0x30}, []byte(addr)...)
+//
+// // 璇诲彇鐨勯暱搴�
+// dataBytes = append(dataBytes, []byte("02")...)
+//
+// // 鍋滄
+// dataBytes = append(dataBytes, []byte{0x03}...)
+//
+// // 璁$畻鏍¢獙鐮�, 30 + 鍦板潃缂栫爜 + 鏁版嵁闀垮害 + 03 , 鍗佸叚杩涘埗缁撴灉鍙栧悗涓や綅.
+// var sum uint8
+// for _, d := range dataBytes {
+// sum += d
+// }
+//
+// sumStr := fmt.Sprintf("%x", sum)
+//
+// fmt.Printf("sumStr: %s\n", sumStr)
+//
+// var checkCode string
+// if len(sumStr) < 2 {
+// checkCode = "0" + sumStr
+// } else {
+// checkCode = sumStr[len(sumStr)-2:]
+// }
+//
+// var bytes = []byte{0x02}
+// // 娣诲姞鏁版嵁
+// bytes = append(bytes, dataBytes...)
+// // 娣诲姞鏍¢獙
+// bytes = append(bytes, []byte(checkCode)...)
+//
+// fmt.Printf("Tx: %X \n", bytes)
+//
+// // 鍐�
+// if n, err := c.readWriter.Write(bytes); err != nil {
+// return n, err
+// } else {
+// fmt.Printf("Tx:len:%d\n", n)
+// }
+//
+// // 璇�
+// buf := make([]byte, 1024)
+// n, err := c.readWriter.Read(buf)
+// if err != nil {
+// return n, err
+// }
+//
+// buf = buf[:n]
+//
+// fmt.Printf("Rx: %X\nRx len:%d", buf, n)
+// fmt.Printf("value: %d\n", buf[2:6])
+//
+// return n, nil
+//}
+//
+//func (c *SerialClient) WriteHoldRegister(addr string) (int, error) {
+// if c.readWriter == nil {
+// return 0, errors.New("serial port is closed")
+// }
+//
+// // 涓夎彵fn绯诲垪涓插彛鍗忚
+// // 02 琛ㄧず寮�濮� + 31 琛ㄧず鍐欐暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠�
+//
+// // 鍏堢粍瑁呮暟鎹�
+// // 璇诲彇鐨勫湴鍧�
+// dataBytes := append([]byte{0x31}, []byte(addr)...)
+//
+// // 璇诲彇鐨勯暱搴�
+// dataBytes = append(dataBytes, []byte("02")...)
+//
+// // 鍋滄
+// dataBytes = append(dataBytes, []byte{0x03}...)
+//
+// // 璁$畻鏍¢獙鐮�, 30 + 鍦板潃缂栫爜 + 鏁版嵁闀垮害 + 03 , 鍗佸叚杩涘埗缁撴灉鍙栧悗涓や綅.
+// var sum uint8
+// for _, d := range dataBytes {
+// sum += d
+// }
+//
+// sumStr := fmt.Sprintf("%x", sum)
+//
+// fmt.Printf("sumStr: %s\n", sumStr)
+//
+// var checkCode string
+// if len(sumStr) < 2 {
+// checkCode = "0" + sumStr
+// } else {
+// checkCode = sumStr[len(sumStr)-2:]
+// }
+//
+// var bytes = []byte{0x02}
+// // 娣诲姞鏁版嵁
+// bytes = append(bytes, dataBytes...)
+// // 娣诲姞鏍¢獙
+// bytes = append(bytes, []byte(checkCode)...)
+//
+// fmt.Printf("Tx: %X \n", bytes)
+//
+// // 鍐�
+// if n, err := c.readWriter.Write(bytes); err != nil {
+// return n, err
+// } else {
+// fmt.Printf("Tx:len:%d\n", n)
+// }
+//
+// // 璇�
+// buf := make([]byte, 1024)
+// n, err := c.readWriter.Read(buf)
+// if err != nil {
+// return n, err
+// }
+//
+// buf = buf[:n]
+//
+// fmt.Printf("Rx: %X\nRx len:%d", buf, n)
+// fmt.Printf("value: %d\n", buf[2:6])
+//
+// return n, nil
+//}
--
Gitblit v1.8.0