From 602d118cbe5d5a6910766c3e83208f09c0ba0bb6 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期四, 24 八月 2023 21:57:05 +0800
Subject: [PATCH] 增加设置生产总量接口

---
 api/v1/plc.go            |   92 +++++----
 constvar/const.go        |   13 +
 service/plc.go           |   78 +++++++
 model/device_plc.go      |    8 
 model/response/common.go |    1 
 router/index.go          |    1 
 pkg/plc/com.go           |  235 +++++++++++++++++++++++
 docs/swagger.yaml        |   38 +++
 docs/docs.go             |   58 +++++
 docs/swagger.json        |   58 +++++
 10 files changed, 524 insertions(+), 58 deletions(-)

diff --git a/api/v1/plc.go b/api/v1/plc.go
index 3f8238d..c6a98a6 100644
--- a/api/v1/plc.go
+++ b/api/v1/plc.go
@@ -6,18 +6,15 @@
 	_ "apsClient/model/response"
 	"apsClient/pkg/contextx"
 	"apsClient/pkg/ecode"
-	"apsClient/pkg/logx"
-	"apsClient/pkg/plc"
 	"apsClient/service"
-	"encoding/binary"
-	"fmt"
 	"github.com/gin-gonic/gin"
+	"github.com/spf13/cast"
 )
 
 type PlcApi struct{}
 
 // GetProductProgress
-// @Tags      鑾峰彇鍔ㄦ�佹暟鎹�
+// @Tags      鐢熶骇鏁伴噺
 // @Summary   鑾峰彇鐢熶骇杩涘害
 // @Produce   application/json
 // @Success   200   {object}  contextx.Response{data=response.ProductProgress}  "鎴愬姛"
@@ -34,45 +31,56 @@
 		return
 	}
 
-	var startAddress int
-	var valueType string
-	var dataLength int
-	var ipAddr string
-
-	for _, pc := range plcConfig.Details {
-		if pc.FieldName == constvar.PlcStartAddressTypeFinishNumber {
-			startAddress = pc.StartAddress
-			valueType = pc.Type
-			dataLength = pc.Length
-		}
-		ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
+	finishNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeFinishNumber)
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆")
+		return
+	}
+	totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber)
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆")
+		return
 	}
 
 	resp := new(response.ProductProgress)
-	if startAddress == 0 || valueType == "" {
-		ctx.OkWithDetailed(resp)
-		logx.Warnf("璇峰厛閰嶇疆PLC")
-		return
-	}
-	conn, err := plc.NewModbusConnection(ipAddr)
-	if err != nil {
-		ctx.OkWithDetailed(resp)
-		logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error())
-		return
-	}
-	defer conn.Close()
-
-	rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength)
-	if err != nil {
-		ctx.OkWithDetailed(resp)
-		logx.Errorf("GetProductProgress 鑾峰彇plc鏁版嵁澶辫触: %v", err.Error())
-		return
-	}
-	resp.FinishNumber = int(binary.BigEndian.Uint16(rawData))
-	if err != nil {
-		ctx.OkWithDetailed(resp)
-		logx.Errorf("GetProductProgress 鑾峰彇鐢熶骇杩涘害鏁版嵁瑙f瀽澶辫触: %v, data: %v, valueType:%v", err.Error(), rawData, valueType)
-		return
-	}
+	resp.FinishNumber = cast.ToInt(finishNumber)
+	resp.TotalNumber = cast.ToInt(totalNumber)
 	ctx.OkWithDetailed(resp)
 }
+
+// SetProductNumber
+// @Tags      鐢熶骇鏁伴噺
+// @Summary   璁剧疆鐢熶骇鎬婚噺
+// @Produce   application/json
+// @Success   200   {object}  contextx.Response{}  "鎴愬姛"
+// @Router    /v1/plc/setProductNumber [post]
+func (slf *PlcApi) SetProductNumber(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	taskData, code := service.NewTaskService().GetTask()
+	if code != ecode.OK {
+		ctx.Fail(code)
+		return
+	}
+
+	if taskData.Order == nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "褰撳墠娌℃湁寰呯敓浜у伐鍗�")
+		return
+	}
+
+	plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
+	if code != ecode.OK {
+		ctx.FailWithMsg(ecode.UnknownErr, "璇峰厛閰嶇疆PLC")
+		return
+	}
+
+	err := service.PlcWrite(plcConfig, constvar.PlcStartAddressTypeFinishNumber, taskData.Order.Amount.IntPart())
+	if err != nil {
+		ctx.FailWithMsg(ecode.UnknownErr, "璁剧疆澶辫触锛岃妫�鏌lc閰嶇疆")
+		return
+	}
+	ctx.Ok()
+}
diff --git a/constvar/const.go b/constvar/const.go
index 087eeb5..dc2f30e 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -8,11 +8,18 @@
 	NsqTopicProcessParamsResponse = "aps.%v.processParams.response"
 )
 
-type PlcStartAddressType string
+type PlcStartAddressType int
 
 const (
-	PlcStartAddressTypeFinishNumber = 1
-	PlcStartAddressTypeTotalNumber  = 2
+	PlcStartAddressTypeFinishNumber PlcStartAddressType = 1
+	PlcStartAddressTypeTotalNumber  PlcStartAddressType = 2
+)
+
+type PlcStartAddressValueType string
+
+const (
+	PlcStartAddressValueTypeString PlcStartAddressValueType = "string"
+	PlcStartAddressValueTypeInt    PlcStartAddressValueType = "int"
 )
 
 const (
diff --git a/docs/docs.go b/docs/docs.go
index 1f4a9ab..aaf2c50 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -158,7 +158,7 @@
                     "application/json"
                 ],
                 "tags": [
-                    "鑾峰彇鍔ㄦ�佹暟鎹�"
+                    "鐢熶骇鏁伴噺"
                 ],
                 "summary": "鑾峰彇鐢熶骇杩涘害",
                 "responses": {
@@ -178,6 +178,25 @@
                                     }
                                 }
                             ]
+                        }
+                    }
+                }
+            }
+        },
+        "/v1/plc/setProductNumber": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鐢熶骇鏁伴噺"
+                ],
+                "summary": "璁剧疆鐢熶骇鎬婚噺",
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -535,6 +554,28 @@
                 "PlcMethodSerial"
             ]
         },
+        "constvar.PlcStartAddressType": {
+            "type": "integer",
+            "enum": [
+                1,
+                2
+            ],
+            "x-enum-varnames": [
+                "PlcStartAddressTypeFinishNumber",
+                "PlcStartAddressTypeTotalNumber"
+            ]
+        },
+        "constvar.PlcStartAddressValueType": {
+            "type": "string",
+            "enum": [
+                "string",
+                "int"
+            ],
+            "x-enum-varnames": [
+                "PlcStartAddressValueTypeString",
+                "PlcStartAddressValueTypeInt"
+            ]
+        },
         "contextx.Response": {
             "type": "object",
             "properties": {
@@ -591,7 +632,11 @@
             "properties": {
                 "fieldName": {
                     "description": "瀵瑰簲绯荤粺瀛楁",
-                    "type": "integer"
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.PlcStartAddressType"
+                        }
+                    ]
                 },
                 "length": {
                     "description": "鏁版嵁闀垮害",
@@ -603,7 +648,11 @@
                 },
                 "type": {
                     "description": "鏁版嵁绫诲瀷",
-                    "type": "string"
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.PlcStartAddressValueType"
+                        }
+                    ]
                 }
             }
         },
@@ -871,6 +920,9 @@
             "properties": {
                 "finishNumber": {
                     "type": "integer"
+                },
+                "totalNumber": {
+                    "type": "integer"
                 }
             }
         },
diff --git a/docs/swagger.json b/docs/swagger.json
index fec7e88..0abdb9c 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -146,7 +146,7 @@
                     "application/json"
                 ],
                 "tags": [
-                    "鑾峰彇鍔ㄦ�佹暟鎹�"
+                    "鐢熶骇鏁伴噺"
                 ],
                 "summary": "鑾峰彇鐢熶骇杩涘害",
                 "responses": {
@@ -166,6 +166,25 @@
                                     }
                                 }
                             ]
+                        }
+                    }
+                }
+            }
+        },
+        "/v1/plc/setProductNumber": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鐢熶骇鏁伴噺"
+                ],
+                "summary": "璁剧疆鐢熶骇鎬婚噺",
+                "responses": {
+                    "200": {
+                        "description": "鎴愬姛",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
                         }
                     }
                 }
@@ -523,6 +542,28 @@
                 "PlcMethodSerial"
             ]
         },
+        "constvar.PlcStartAddressType": {
+            "type": "integer",
+            "enum": [
+                1,
+                2
+            ],
+            "x-enum-varnames": [
+                "PlcStartAddressTypeFinishNumber",
+                "PlcStartAddressTypeTotalNumber"
+            ]
+        },
+        "constvar.PlcStartAddressValueType": {
+            "type": "string",
+            "enum": [
+                "string",
+                "int"
+            ],
+            "x-enum-varnames": [
+                "PlcStartAddressValueTypeString",
+                "PlcStartAddressValueTypeInt"
+            ]
+        },
         "contextx.Response": {
             "type": "object",
             "properties": {
@@ -579,7 +620,11 @@
             "properties": {
                 "fieldName": {
                     "description": "瀵瑰簲绯荤粺瀛楁",
-                    "type": "integer"
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.PlcStartAddressType"
+                        }
+                    ]
                 },
                 "length": {
                     "description": "鏁版嵁闀垮害",
@@ -591,7 +636,11 @@
                 },
                 "type": {
                     "description": "鏁版嵁绫诲瀷",
-                    "type": "string"
+                    "allOf": [
+                        {
+                            "$ref": "#/definitions/constvar.PlcStartAddressValueType"
+                        }
+                    ]
                 }
             }
         },
@@ -859,6 +908,9 @@
             "properties": {
                 "finishNumber": {
                     "type": "integer"
+                },
+                "totalNumber": {
+                    "type": "integer"
                 }
             }
         },
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 260f74c..87e7cfd 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -67,6 +67,22 @@
     x-enum-varnames:
     - PlcMethodModbusTCP
     - PlcMethodSerial
+  constvar.PlcStartAddressType:
+    enum:
+    - 1
+    - 2
+    type: integer
+    x-enum-varnames:
+    - PlcStartAddressTypeFinishNumber
+    - PlcStartAddressTypeTotalNumber
+  constvar.PlcStartAddressValueType:
+    enum:
+    - string
+    - int
+    type: string
+    x-enum-varnames:
+    - PlcStartAddressValueTypeString
+    - PlcStartAddressValueTypeInt
   contextx.Response:
     properties:
       code:
@@ -107,8 +123,9 @@
   model.DevicePlcAddress:
     properties:
       fieldName:
+        allOf:
+        - $ref: '#/definitions/constvar.PlcStartAddressType'
         description: 瀵瑰簲绯荤粺瀛楁
-        type: integer
       length:
         description: 鏁版嵁闀垮害
         type: integer
@@ -116,8 +133,9 @@
         description: 鏁版嵁璧峰鍦板潃
         type: integer
       type:
+        allOf:
+        - $ref: '#/definitions/constvar.PlcStartAddressValueType'
         description: 鏁版嵁绫诲瀷
-        type: string
     type: object
   model.NetConfig:
     properties:
@@ -299,6 +317,8 @@
     properties:
       finishNumber:
         type: integer
+      totalNumber:
+        type: integer
     type: object
   response.TaskData:
     properties:
@@ -409,7 +429,19 @@
               type: object
       summary: 鑾峰彇鐢熶骇杩涘害
       tags:
-      - 鑾峰彇鍔ㄦ�佹暟鎹�
+      - 鐢熶骇鏁伴噺
+  /v1/plc/setProductNumber:
+    post:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: 鎴愬姛
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 璁剧疆鐢熶骇鎬婚噺
+      tags:
+      - 鐢熶骇鏁伴噺
   /v1/plcBrand/add:
     post:
       parameters:
diff --git a/model/device_plc.go b/model/device_plc.go
index 785ab8e..0057c46 100644
--- a/model/device_plc.go
+++ b/model/device_plc.go
@@ -29,10 +29,10 @@
 	}
 
 	DevicePlcAddress struct {
-		StartAddress int    `json:"startAddress"` // 鏁版嵁璧峰鍦板潃
-		Length       int    `json:"length"`       // 鏁版嵁闀垮害
-		Type         string `json:"type"`         // 鏁版嵁绫诲瀷
-		FieldName    int    `json:"fieldName"`    // 瀵瑰簲绯荤粺瀛楁
+		StartAddress int                               `json:"startAddress"` // 鏁版嵁璧峰鍦板潃
+		Length       int                               `json:"length"`       // 鏁版嵁闀垮害
+		Type         constvar.PlcStartAddressValueType `json:"type"`         // 鏁版嵁绫诲瀷
+		FieldName    constvar.PlcStartAddressType      `json:"fieldName"`    // 瀵瑰簲绯荤粺瀛楁
 	}
 
 	DevicePlcSearch struct {
diff --git a/model/response/common.go b/model/response/common.go
index c7ebad6..c5e203e 100644
--- a/model/response/common.go
+++ b/model/response/common.go
@@ -41,4 +41,5 @@
 
 type ProductProgress struct {
 	FinishNumber int `json:"finishNumber"`
+	TotalNumber  int `json:"totalNumber"`
 }
diff --git a/pkg/plc/com.go b/pkg/plc/com.go
new file mode 100644
index 0000000..8905dd6
--- /dev/null
+++ b/pkg/plc/com.go
@@ -0,0 +1,235 @@
+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
+}
diff --git a/router/index.go b/router/index.go
index f84d9a1..68c1125 100644
--- a/router/index.go
+++ b/router/index.go
@@ -54,6 +54,7 @@
 	plcGroup := v1Group.Group("plc")
 	{
 		plcGroup.GET("productProgress", plcApi.GetProductProgress) // 鑾峰彇缃戠粶閰嶇疆
+		plcGroup.POST("setProductNumber", plcApi.SetProductNumber) // 涓嬪彂鐢熶骇鎬婚噺
 	}
 
 	InitPlcBrandRouter(v1Group)
diff --git a/service/plc.go b/service/plc.go
new file mode 100644
index 0000000..00fa70f
--- /dev/null
+++ b/service/plc.go
@@ -0,0 +1,78 @@
+package service
+
+import (
+	"apsClient/constvar"
+	"apsClient/model"
+	"apsClient/pkg/logx"
+	"apsClient/pkg/plc"
+	"encoding/binary"
+	"errors"
+	"fmt"
+)
+
+func PlcRead(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType) (val interface{}, err error) {
+	var (
+		startAddress int
+		valueType    constvar.PlcStartAddressValueType
+		dataLength   int
+		ipAddr       string
+	)
+
+	for _, pc := range plcConfig.Details {
+		if pc.FieldName == fieldType {
+			startAddress = pc.StartAddress
+			valueType = pc.Type
+			dataLength = pc.Length
+		}
+		ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
+	}
+
+	conn, err := plc.NewModbusConnection(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 {
+		logx.Errorf("GetProductProgress 鑾峰彇plc鏁版嵁澶辫触: %v", err.Error())
+		return
+	}
+	switch valueType {
+	case constvar.PlcStartAddressValueTypeString:
+		return string(rawData), nil
+	case constvar.PlcStartAddressValueTypeInt:
+		return int(binary.BigEndian.Uint16(rawData)), nil
+	}
+	return nil, errors.New("undefined value type")
+}
+
+func PlcWrite(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType, value interface{}) (err error) {
+	var (
+		startAddress int
+		ipAddr       string
+	)
+
+	for _, pc := range plcConfig.Details {
+		if pc.FieldName == fieldType {
+			startAddress = pc.StartAddress
+		}
+		ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
+	}
+
+	conn, err := plc.NewModbusConnection(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 {
+		logx.Infof("plc write failed, address: %v, value: %v, err: %v", startAddress, value, err.Error())
+		return
+	}
+	logx.Infof("plc write ok, address: %v, value: %v, result: %v", startAddress, value, result)
+	return
+}

--
Gitblit v1.8.0