From e77e66d681cd2676675d194211f171744e23b479 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期四, 14 九月 2023 19:05:54 +0800 Subject: [PATCH] 从云端获取plc配置和plc地址 --- nsq/msg_handler.go | 67 +++++++++++++++++++++------------ model/common/common.go | 34 +++++++++++++++-- model/device_plc.go | 1 3 files changed, 73 insertions(+), 29 deletions(-) diff --git a/model/common/common.go b/model/common/common.go index 8a8783a..5eafc0d 100644 --- a/model/common/common.go +++ b/model/common/common.go @@ -1,6 +1,9 @@ package common -import "github.com/shopspring/decimal" +import ( + "apsClient/constvar" + "github.com/shopspring/decimal" +) // 鎺掔▼浠诲姟涓嬪彂 type ( @@ -62,9 +65,32 @@ DeviceId string } ResponsePlcAddress struct { - KeyData []byte - AddressData []byte - DeviceId string + KeyData []byte + AddressData []byte + DeviceId string + PlcAddressList []*PlcAddress + PlcConfig PlcConfig + } + + PlcConfig struct { + Brand string `gorm:"type:varchar(191);comment:PLC鍝佺墝" json:"brand"` + Method constvar.PlcMethod `gorm:"type:varchar(191);comment:鎺ュ彛鏂瑰紡" json:"method"` + Address string `gorm:"type:varchar(191);comment:PLC鍦板潃" json:"address"` //plc ip鍦板潃锛� method = modbusTCP鐢� + Port int `gorm:"type:int(11);comment:绔彛" json:"port"` //plc 绔彛鍙凤紝 method = modbusTCP鐢� + BaudRate int `gorm:"type:int(11);comment:娉㈢壒鐜�" json:"baudRate"` //涓插彛娉㈢壒鐜囷紝 method = serial鏃� 鐢� + SerialName string `gorm:"type:int(11);comment:涓插彛鍚嶇О" json:"serialName"` //涓插彛鍚嶇О锛宮ethod = serial鏃� 鐢� + IsOpen bool `gorm:"type:tinyint(1);comment:鏄惁寮�鍚�" json:"isOpen"` + Detail string `gorm:"type:varchar(2048);comment:鏁版嵁璇︽儏" json:"-"` + Details []*PlcAddress `gorm:"-" json:"details"` + } + + PlcAddress struct { + DeviceID string `json:"deviceID"` // 璁惧id + Position int `json:"position"` // 鐢熶骇浣嶇疆锛屼竴涓満鍣ㄥ彲鑳芥湁澶氫釜鏈轰綅锛岄渶瑕佸垎鍒厤缃畃lc鍦板潃 + StartAddress int `json:"startAddress"` // 鏁版嵁璧峰鍦板潃 + Length int `json:"length"` // 鏁版嵁闀垮害 + Type string `json:"type"` // 鏁版嵁绫诲瀷 + FieldName constvar.PlcStartAddressType `json:"fieldName"` // 瀵瑰簲绯荤粺瀛楁锛屽畬鎴愰噺鎴栨�婚噺 } ) diff --git a/model/device_plc.go b/model/device_plc.go index e02d2a7..d2690ea 100644 --- a/model/device_plc.go +++ b/model/device_plc.go @@ -33,6 +33,7 @@ } DevicePlcAddress struct { + Position int `json:"position"` // 鏁版嵁璧峰鍦板潃 StartAddress int `json:"startAddress"` // 鏁版嵁璧峰鍦板潃 Length int `json:"length"` // 鏁版嵁闀垮害 Type constvar.PlcStartAddressValueType `json:"type"` // 鏁版嵁绫诲瀷 diff --git a/nsq/msg_handler.go b/nsq/msg_handler.go index 36b5b9a..5237309 100644 --- a/nsq/msg_handler.go +++ b/nsq/msg_handler.go @@ -11,6 +11,7 @@ "apsClient/utils/file" "encoding/json" "fmt" + "github.com/mitchellh/mapstructure" "github.com/spf13/cast" "gorm.io/gorm" "strings" @@ -123,33 +124,49 @@ Topic: slf.Topic, Message: data, } - if len(resp.KeyData) == 0 || len(resp.AddressData) == 0 { - return nil - } - //鍐欏叆鍒版枃浠� - err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataKeyFileName), resp.KeyData) - if err != nil { - return err - } - err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataValueFileName), resp.AddressData) - if err != nil { - return err - } - //鍐欏叆鍒板唴瀛� - keyString := string(resp.KeyData) - addressString := string(resp.AddressData) + if len(resp.KeyData) != 0 && len(resp.AddressData) != 0 { + //鍐欏叆鍒版枃浠� + err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataKeyFileName), resp.KeyData) + if err != nil { + return err + } + err = file.WriteFile(fmt.Sprintf("%s%s", constvar.PlcAddressDataPath, constvar.PlcAddressDataValueFileName), resp.AddressData) + if err != nil { + return err + } + //鍐欏叆鍒板唴瀛� + keyString := string(resp.KeyData) + addressString := string(resp.AddressData) - keys := strings.Split(keyString, "\n") - addresses := strings.Split(addressString, "\n") - if len(keys) != len(addresses) { - logx.Error("plc address message error: key length not equal address length") - return nil + keys := strings.Split(keyString, "\n") + addresses := strings.Split(addressString, "\n") + if len(keys) != len(addresses) { + logx.Error("plc address message error: key length not equal address length") + return nil + } + for i := 0; i < len(keys); i++ { + key := strings.ReplaceAll(keys[i], "\r", "") + address := cast.ToInt(strings.ReplaceAll(addresses[i], "\r", "")) + plc_address.Set(key, address) + logx.Infof("plc address set ok: key:%v, address:%v", key, address) + } } - for i := 0; i < len(keys); i++ { - key := strings.ReplaceAll(keys[i], "\r", "") - address := cast.ToInt(strings.ReplaceAll(addresses[i], "\r", "")) - plc_address.Set(key, address) - logx.Infof("plc address set ok: key:%v, address:%v", key, address) + + var record model.DevicePlc + err = mapstructure.Decode(resp.PlcConfig, &record) + if err != nil { + logx.Infof("decode from PlcAddressList to DevicePlc Details err:%v", err) + } + err = mapstructure.Decode(resp.PlcAddressList, &record.Details) + if err != nil { + logx.Infof("decode from PlcAddressList to DevicePlc Details err:%v", err) + } + detail, err := json.Marshal(record.Details) + record.Detail = string(detail) + record.Id = 1 + err = model.NewDevicePlcSearch().SetId(record.Id).Save(&record) + if err != nil { + return err } return nil } -- Gitblit v1.8.0