From 339ae89408bb2e5ba4428afd9c5f5fb64c04f2ad Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期一, 28 八月 2023 13:32:50 +0800
Subject: [PATCH] 下发任务参数和写入生产数量异步改同步
---
service/plc.go | 16 +++++--
model/device_plc.go | 4 ++
pkg/ecode/code.go | 9 ++--
api/v1/task.go | 59 ++++++++++++++++-------------
4 files changed, 52 insertions(+), 36 deletions(-)
diff --git a/api/v1/task.go b/api/v1/task.go
index 83c199e..f856f31 100644
--- a/api/v1/task.go
+++ b/api/v1/task.go
@@ -12,7 +12,6 @@
"apsClient/pkg/ecode"
"apsClient/pkg/logx"
"apsClient/pkg/plc"
- "apsClient/pkg/safe"
"apsClient/service"
"apsClient/service/plc_address"
"errors"
@@ -230,48 +229,54 @@
})
if err != nil {
logx.Errorf("SendProcessParams update order and procedure status error:%v", err.Error())
- ctx.FailWithMsg(ecode.DBErr, "鏇存敼宸ュ崟鐘舵�佸け璐�")
+ ctx.FailWithMsg(ecode.NeedConfirmedErr, "鏇存敼宸ュ崟鐘舵�佸け璐�")
return
}
-
- safe.Go(func() {
- err = SendParams(result.ParamsMap, 0)
- if err != nil {
- logx.Errorf("SendProcessParams: %v", err.Error())
- return
- }
- plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
- if code != ecode.OK {
- logx.Errorf("get plcConfig err: %v", err.Error())
- return
- }
- _ = service.PlcWrite(plcConfig, constvar.PlcStartAddressTypeTotalNumber, order.Amount.IntPart())
- })
+ plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
+ if code != ecode.OK || plcConfig.Id == 0 {
+ ctx.FailWithMsg(ecode.NeedConfirmedErr, "璇峰厛閰嶇疆PLC")
+ return
+ }
+ plcConfig.MaxTryTimes = 2
+ err = SendParams(result.ParamsMap, plcConfig)
+ if err != nil {
+ logx.Errorf("SendProcessParams: %v", err.Error())
+ ctx.FailWithMsg(ecode.NeedConfirmedErr, "鍐欏叆宸ヨ壓鍙傛暟澶辫触")
+ return
+ }
+ if code != ecode.OK {
+ logx.Errorf("get plcConfig err: %v", err.Error())
+ return
+ }
+ plcConfig.CurrentTryTimes = 0
+ err = service.PlcWrite(plcConfig, constvar.PlcStartAddressTypeTotalNumber, order.Amount.IntPart())
+ if err != nil {
+ ctx.FailWithMsg(ecode.NeedConfirmedErr, "鍐欏叆鐢熶骇鏁伴噺澶辫触")
+ return
+ }
ctx.Ok()
}
-func SendParams(paramsMap map[string]interface{}, tryTimes int) error {
+func SendParams(paramsMap map[string]interface{}, plcConfig *model.DevicePlc) error {
if len(paramsMap) == 0 {
return errors.New("empty params")
}
- if tryTimes > 2 {
- return errors.New("beyond max try time")
- }
- plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
- if code != ecode.OK {
- return errors.New("璇峰厛閰嶇疆PLC")
+ if plcConfig.CurrentTryTimes > plcConfig.MaxTryTimes {
+ return plcConfig.CurrentErr
}
conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port))
if err != nil {
return errors.New(fmt.Sprintf("杩炴帴plc澶辫触: %v", err.Error()))
}
-
- logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------")
+ if plcConfig.CurrentTryTimes == 0 {
+ logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------")
+ }
var failedNumbers int
for k, v := range paramsMap {
if address, ok := plc_address.Get(k); ok {
result, err := plc.WriteHoldingRegister(conn, address, v)
if err != nil {
+ plcConfig.CurrentErr = err
failedNumbers++
logx.Errorf("plc write err:%v, address: %v, key: %v value: %v", err.Error(), address, k, v)
} else {
@@ -283,8 +288,8 @@
}
}
if failedNumbers >= 1 { //鍐欏叆plc澶辫触, 閲嶈瘯
- tryTimes++
- return SendParams(paramsMap, tryTimes)
+ plcConfig.CurrentTryTimes++
+ return SendParams(paramsMap, plcConfig)
}
logx.Info("----------------涓嬪彂宸ヨ壓鍙傛暟瀹屾瘯-----------------")
return nil
diff --git a/model/device_plc.go b/model/device_plc.go
index 0057c46..e02d2a7 100644
--- a/model/device_plc.go
+++ b/model/device_plc.go
@@ -26,6 +26,10 @@
Detail string `gorm:"type:varchar(2048);comment:鏁版嵁璇︽儏" json:"-"`
Details []*DevicePlcAddress `gorm:"-" json:"details"`
+
+ MaxTryTimes int `gorm:"-" json:"-"` //鏈�澶у啓鍏ラ噸璇曟鏁�
+ CurrentTryTimes int `gorm:"-" json:"-"` //褰撳墠鍐欏叆閲嶈瘯娆℃暟
+ CurrentErr error `gorm:"-" json:"-"` //褰撳墠鎶ラ敊
}
DevicePlcAddress struct {
diff --git a/pkg/ecode/code.go b/pkg/ecode/code.go
index 84bfb0d..bfc6b58 100644
--- a/pkg/ecode/code.go
+++ b/pkg/ecode/code.go
@@ -3,8 +3,9 @@
const (
OK = 200
- UnknownErr = 2001 // 鏈煡閿欒
- DBErr = 2002 // db閿欒
- RedisErr = 2003 // redis閿欒
- ParamsErr = 2004 // 璇锋眰鍙傛暟閿欒
+ UnknownErr = 2001 // 鏈煡閿欒
+ DBErr = 2002 // db閿欒
+ RedisErr = 2003 // redis閿欒
+ ParamsErr = 2004 // 璇锋眰鍙傛暟閿欒
+ NeedConfirmedErr = 2005 // 闇�瑕佸脊绐楃‘璁ょ殑閿欒
)
diff --git a/service/plc.go b/service/plc.go
index d5b8126..74ed5dc 100644
--- a/service/plc.go
+++ b/service/plc.go
@@ -59,23 +59,29 @@
ipAddr string
)
+ if plcConfig.CurrentTryTimes > plcConfig.MaxTryTimes {
+ return plcConfig.CurrentErr
+ }
+ plcConfig.CurrentTryTimes++
+
for _, pc := range plcConfig.Details {
if pc.FieldName == fieldType {
startAddress = pc.StartAddress
}
}
ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
-
conn, err := plc.GetModbusConnection(ipAddr)
if err != nil {
- logx.Errorf("PlcWrite 杩炴帴plc澶辫触: %v", err.Error())
- return
+ logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error())
+ plcConfig.CurrentErr = err
+ return PlcWrite(plcConfig, fieldType, value)
}
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.Errorf("plc write failed, address: %v, value: %v, err: %v", startAddress, value, err.Error())
+ plcConfig.CurrentErr = err
+ return PlcWrite(plcConfig, fieldType, value)
}
logx.Infof("plc write ok, address: %v, value: %v, result: %v", startAddress, value, result)
return
--
Gitblit v1.8.0