package service
|
|
import (
|
"apsClient/constvar"
|
"apsClient/model"
|
"apsClient/pkg/logx"
|
"apsClient/pkg/plc"
|
"encoding/binary"
|
"errors"
|
"fmt"
|
"sync"
|
)
|
|
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.GetModbusConnection(ipAddr)
|
if err != nil {
|
logx.Errorf("PlcRead 连接plc失败: %v", err.Error())
|
return
|
}
|
|
rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength)
|
if err != nil {
|
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
|
}
|
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.GetModbusConnection(ipAddr)
|
if err != nil {
|
logx.Errorf("PlcWrite 连接plc失败: %v", err.Error())
|
return
|
}
|
|
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
|
}
|
|
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)
|
}
|