From 915253f87d4ef04d886bebb50135d75082ae0eee Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 15 九月 2023 13:37:22 +0800 Subject: [PATCH] 换一种方式检查plc连接 --- api/v1/plc.go | 4 service/plc.go | 20 +++++- pkg/plc/plc4x.go | 35 ++++++++++- service/progress.go | 30 +++++---- datafile/plc_address_value | 6 +- docs/swagger.yaml | 6 + crontask/cron_task.go | 16 ++++- docs/docs.go | 10 ++- api/v1/task.go | 16 ++++ docs/swagger.json | 10 ++- 10 files changed, 112 insertions(+), 41 deletions(-) diff --git a/api/v1/plc.go b/api/v1/plc.go index a837e7a..782e28c 100644 --- a/api/v1/plc.go +++ b/api/v1/plc.go @@ -42,8 +42,8 @@ plcStatus := 1 //鏂紑杩炴帴 ipAddr := fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port) - conn, err := plc.GetModbusConnection(ipAddr) - if err == nil && conn.IsConnected() { + _, err := plc.GetModbusConnection(ipAddr) + if err == nil { if resp.FinishNumber > 0 { //鐢熶骇 plcStatus = 2 } else { //寰呮満 diff --git a/api/v1/task.go b/api/v1/task.go index 0552884..bbb328d 100644 --- a/api/v1/task.go +++ b/api/v1/task.go @@ -187,7 +187,7 @@ // @Produce application/json // @Param object body request.SendProcessParams true "鏌ヨ鍙傛暟" // @Success 200 {object} contextx.Response{service.GetProcessModel} "鎴愬姛" -// @Router /v1/task/sendProcessParams/{id} [post] +// @Router /v1/task/sendProcessParams [post] func (slf *TaskApi) TaskStart(c *gin.Context) { var params request.SendProcessParams ctx, ok := contextx.NewContext(c, ¶ms) @@ -227,7 +227,7 @@ if err != nil { return err } - return service.NewProgressService().AddProgress(db, procedure, order) + return service.NewProgressService().Upsert(db, procedure, order) }) if err != nil { logx.Errorf("SendProcessParams update order and procedure status error:%v", err.Error()) @@ -243,6 +243,18 @@ err = SendParams(processModel.ParamsMap, plcConfig) if err != nil { logx.Errorf("SendProcessParams: %v", err.Error()) + err = model.WithTransaction(func(db *gorm.DB) error { + err = taskService.UpdateProcedureStatusAndPosition(db, params.ProcedureId, model.ProcedureStatusWaitProcess, params.Position) + if err != nil { + return err + } + procedure.Position = params.Position + err = taskService.UpdateOrderStatus(db, order.ID, model.OrderStatusWaitProcess) + if err != nil { + return err + } + return nil + }) ctx.FailWithMsg(ecode.NeedConfirmedErr, "绯熺硶锛屽伐鑹轰笅鍙戝け璐ャ��") return } diff --git a/crontask/cron_task.go b/crontask/cron_task.go index 505156d..968abfc 100644 --- a/crontask/cron_task.go +++ b/crontask/cron_task.go @@ -31,8 +31,12 @@ } for _, addressItem := range plcConfig.Details { if addressItem.FieldName == constvar.PlcStartAddressTypeFinishNumber { - finishNumber, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Position) - if err == nil && finishNumber != 0 { + value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type) + if err != nil { + continue + } + finishNumber := cast.ToInt64(value) + if finishNumber != 0 { service.PlcCacheSet(addressItem.Position, constvar.PlcCacheKeyFinishNumber, finishNumber) _ = service.NewProgressService().UpdateProgress(addressItem.Position, cast.ToInt64(finishNumber)) } @@ -52,8 +56,12 @@ } for _, addressItem := range plcConfig.Details { if addressItem.FieldName == constvar.PlcStartAddressTypeTotalNumber { - totalNumber, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Position) - if err == nil && totalNumber != 0 { + value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type) + if err != nil { + continue + } + totalNumber := cast.ToInt64(value) + if totalNumber != 0 { service.PlcCacheSet(addressItem.Position, constvar.PlcCacheKeyTotalNumber, totalNumber) _ = service.NewProgressService().UpdateProgress(addressItem.Position, cast.ToInt64(totalNumber)) } diff --git a/datafile/plc_address_value b/datafile/plc_address_value index 3a9e4ec..b6d91da 100644 --- a/datafile/plc_address_value +++ b/datafile/plc_address_value @@ -1,3 +1,3 @@ -1000 -1001 -1002 \ No newline at end of file +2000 +2001 +2002 \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go index dc275bb..2f9b1f7 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -439,7 +439,7 @@ } } }, - "/v1/task/sendProcessParams/{id}": { + "/v1/task/sendProcessParams": { "post": { "produces": [ "application/json" @@ -612,11 +612,15 @@ "type": "string", "enum": [ "modbusTCP", - "serial" + "serial", + "缃戠粶", + "涓插彛" ], "x-enum-varnames": [ "PlcMethodModbusTCP", - "PlcMethodSerial" + "PlcMethodSerial", + "PlcMethodModbusTCPChinese", + "PlcMethodSerialChinese" ] }, "constvar.PlcStartAddressType": { diff --git a/docs/swagger.json b/docs/swagger.json index 3566fd0..47b9642 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -427,7 +427,7 @@ } } }, - "/v1/task/sendProcessParams/{id}": { + "/v1/task/sendProcessParams": { "post": { "produces": [ "application/json" @@ -600,11 +600,15 @@ "type": "string", "enum": [ "modbusTCP", - "serial" + "serial", + "缃戠粶", + "涓插彛" ], "x-enum-varnames": [ "PlcMethodModbusTCP", - "PlcMethodSerial" + "PlcMethodSerial", + "PlcMethodModbusTCPChinese", + "PlcMethodSerialChinese" ] }, "constvar.PlcStartAddressType": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index fa76802..4f651d1 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -68,10 +68,14 @@ enum: - modbusTCP - serial + - 缃戠粶 + - 涓插彛 type: string x-enum-varnames: - PlcMethodModbusTCP - PlcMethodSerial + - PlcMethodModbusTCPChinese + - PlcMethodSerialChinese constvar.PlcStartAddressType: enum: - 1 @@ -632,7 +636,7 @@ summary: 鑾峰彇浠诲姟 tags: - Task - /v1/task/sendProcessParams/{id}: + /v1/task/sendProcessParams: post: parameters: - description: 鏌ヨ鍙傛暟 diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go index 529c516..06f6c8e 100644 --- a/pkg/plc/plc4x.go +++ b/pkg/plc/plc4x.go @@ -30,7 +30,18 @@ defer cm.mu.Unlock() conn, ok := cm.connections[address] - return conn, ok + if !ok { + return nil, false + } + connOK, err := cm.CheckConnect(conn, time.Second*1) + if err != nil { + logx.Errorf("ping plc err:%v", err.Error()) + return nil, false + } + if connOK { + return conn, ok + } + return nil, false } var connectionManager = newPlcConnectionManager() @@ -41,14 +52,28 @@ cm.connections[address] = connection } + +func (cm *ConnectionManager) CheckConnect(conn plc4go.PlcConnection, timeout time.Duration) (bool, error) { + pingCh := conn.Ping() + timer := time.NewTimer(timeout) + + select { + case err := <-pingCh: + if err == nil { + return true, nil + } + return false, err.GetErr() + case <-timer.C: + return false, fmt.Errorf("connection timed out after %s", timeout) + } +} + func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { if conn, ok := connectionManager.GetConnection(ipAddr); ok { - if conn.IsConnected() { - return conn, nil - } + return conn, nil } // 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 3 绉掕秴鏃� - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() conn, err := newGetModbusConnection(ctx, ipAddr) if err != nil { diff --git a/service/plc.go b/service/plc.go index 0e5e49f..48292b2 100644 --- a/service/plc.go +++ b/service/plc.go @@ -145,12 +145,13 @@ return } -func PlcReadDirect(plcConfig *model.DevicePlc, address int, dataLength int) (val interface{}, err error) { +func PlcReadDirect(plcConfig *model.DevicePlc, address int, dataLength int, valueType constvar.PlcStartAddressValueType) (val interface{}, err error) { var ( ipAddr string ) if plcConfig.CurrentTryTimes > plcConfig.MaxTryTimes { + logx.Errorf("plc read try time beyond max try times, err:%v", plcConfig.CurrentErr) return nil, plcConfig.CurrentErr } plcConfig.CurrentTryTimes++ @@ -158,15 +159,24 @@ ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port) conn, err := plc.GetModbusConnection(ipAddr) if err != nil { - logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error()) plcConfig.CurrentErr = err - return PlcReadDirect(plcConfig, address, dataLength) + return PlcReadDirect(plcConfig, address, dataLength, valueType) } value, err := plc.ReadHoldingRegister(conn, address, dataLength) if err != nil { - logx.Errorf("plc read failed, address: %v, err: %v", address, err.Error()) plcConfig.CurrentErr = err - return PlcReadDirect(plcConfig, address, dataLength) + return PlcReadDirect(plcConfig, address, dataLength, valueType) + } + switch valueType { + case constvar.PlcStartAddressValueTypeString: + return string(value), nil + case constvar.PlcStartAddressValueTypeInt: + if len(value) == 2 { + return int(binary.BigEndian.Uint16(value)), nil + } else { + logx.Errorf("plc read get an unknown int value: %v, address:%v", value, address) + return nil, errors.New(fmt.Sprintf("unknown int value锛�%v", value)) + } } logx.Infof("plc read ok, address: %v, result: %v", address, value) } else if plcConfig.Method == constvar.PlcMethodSerial { diff --git a/service/progress.go b/service/progress.go index 972a248..7d39cfa 100644 --- a/service/progress.go +++ b/service/progress.go @@ -13,20 +13,24 @@ return &ProgressService{} } -func (slf ProgressService) AddProgress(db *gorm.DB, procedure *model.Procedures, order *model.Order) error { - progress := &model.ProductionProgress{ - WorkOrderID: procedure.WorkOrderID, - OrderID: procedure.OrderID, - ProcedureID: procedure.ProceduresInfo.ProcedureID, - DeviceID: procedure.DeviceID, - TotalQuantity: order.Amount.IntPart(), - Position: procedure.Position, +func (slf ProgressService) Upsert(db *gorm.DB, procedure *model.Procedures, order *model.Order) error { + _, err := model.NewProductionProgressSearch(db).SetProcedureId(procedure.ProcedureID).SetWorkOrderId(procedure.WorkOrderID).First() + if err == gorm.ErrRecordNotFound { + progress := &model.ProductionProgress{ + WorkOrderID: procedure.WorkOrderID, + OrderID: procedure.OrderID, + ProcedureID: procedure.ProceduresInfo.ProcedureID, + DeviceID: procedure.DeviceID, + TotalQuantity: order.Amount.IntPart(), + Position: procedure.Position, + } + err := model.NewProductionProgressSearch(db).Create(progress) + if err != nil { + return err + } + ProgressCacheSet(procedure.Position, progress) } - err := model.NewProductionProgressSearch(db).Create(progress) - if err != nil { - return err - } - ProgressCacheSet(procedure.Position, progress) + return nil } -- Gitblit v1.8.0