fix
zhangqian
2023-08-27 8dfb8feb32bb5e4e460e23dcde42612a26fa2bcb
service/plc.go
@@ -8,6 +8,7 @@
   "encoding/binary"
   "errors"
   "fmt"
   "sync"
)
func PlcRead(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType) (val interface{}, err error) {
@@ -24,26 +25,30 @@
         valueType = pc.Type
         dataLength = pc.Length
      }
      ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
   }
   ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
   conn, err := plc.NewModbusConnection(ipAddr)
   conn, err := plc.GetModbusConnection(ipAddr)
   if err != nil {
      logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error())
      logx.Errorf("PlcRead 连接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())
      logx.Errorf("PlcRead 获取plc数据失败: %v", err.Error())
      return
   }
   switch valueType {
   case constvar.PlcStartAddressValueTypeString:
      return string(rawData), nil
   case constvar.PlcStartAddressValueTypeInt:
      return int(binary.BigEndian.Uint16(rawData)), nil
      if len(rawData) == 2 {
         return int(binary.BigEndian.Uint16(rawData)), nil
      } else {
         logx.Errorf("plc read get an unknown int value: %v, address:%v", rawData, startAddress)
         return nil, errors.New(fmt.Sprintf("unknown int value:%v", rawData))
      }
   }
   return nil, errors.New("undefined value type")
}
@@ -58,15 +63,14 @@
      if pc.FieldName == fieldType {
         startAddress = pc.StartAddress
      }
      ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
   }
   ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
   conn, err := plc.NewModbusConnection(ipAddr)
   conn, err := plc.GetModbusConnection(ipAddr)
   if err != nil {
      logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error())
      logx.Errorf("PlcWrite 连接plc失败: %v", err.Error())
      return
   }
   defer conn.Close()
   result, err := plc.WriteHoldingRegister(conn, startAddress, value)
   if err != nil {
@@ -76,3 +80,41 @@
   logx.Infof("plc write ok, address: %v, value: %v, result: %v", startAddress, value, result)
   return
}
type CacheStore struct {
   cache map[string]interface{}
   mu    sync.Mutex
}
var defaultCacheStore *CacheStore
func init() {
   defaultCacheStore = newCacheManager()
}
func newCacheManager() *CacheStore {
   return &CacheStore{
      cache: make(map[string]interface{}),
   }
}
func (cm *CacheStore) Get(key string) (interface{}, bool) {
   cm.mu.Lock()
   defer cm.mu.Unlock()
   conn, ok := cm.cache[key]
   return conn, ok
}
func (cm *CacheStore) Add(key string, value interface{}) {
   cm.mu.Lock()
   defer cm.mu.Unlock()
   cm.cache[key] = value
}
func PlcCacheGet(key string) (interface{}, bool) {
   return defaultCacheStore.Get(key)
}
func PlcCacheSet(key string, value interface{}) {
   defaultCacheStore.Add(key, value)
}