| | |
| | | if !ok { |
| | | return |
| | | } |
| | | |
| | | plcConfig, code := service.NewDevicePlcService().GetDevicePlc() |
| | | if code != ecode.OK { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "请先配置PLC") |
| | | return |
| | | } |
| | | |
| | | finishNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeFinishNumber) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "读取数据失败,请检查plc配置") |
| | | return |
| | | } |
| | | totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber) |
| | | if err != nil { |
| | | ctx.FailWithMsg(ecode.UnknownErr, "读取数据失败,请检查plc配置") |
| | | return |
| | | } |
| | | |
| | | finishNumber, _ := service.PlcCacheGet(constvar.PlcCacheKeyFinishNumber) |
| | | totalNumber, _ := service.PlcCacheGet(constvar.PlcCacheKeyTotalNumber) |
| | | resp := new(response.ProductProgress) |
| | | resp.FinishNumber = cast.ToInt(finishNumber) |
| | | resp.TotalNumber = cast.ToInt(totalNumber) |
| | |
| | | func (slf PlcMethod) Valid() bool { |
| | | return slf == PlcMethodModbusTCP || slf == PlcMethodSerial |
| | | } |
| | | |
| | | const ( |
| | | PlcCacheKeyFinishNumber = "finish_number" |
| | | PlcCacheKeyTotalNumber = "total_number" |
| | | ) |
New file |
| | |
| | | package crontask |
| | | |
| | | import ( |
| | | "apsClient/constvar" |
| | | "apsClient/pkg/ecode" |
| | | "apsClient/service" |
| | | "github.com/go-co-op/gocron" |
| | | "time" |
| | | ) |
| | | |
| | | func InitTask() error { |
| | | s := gocron.NewScheduler(time.UTC) |
| | | _, err := s.Every(2).Seconds().StartImmediately().Do(func() { |
| | | plcConfig, code := service.NewDevicePlcService().GetDevicePlc() |
| | | if code != ecode.OK { |
| | | return |
| | | } |
| | | finishNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeFinishNumber) |
| | | if err == nil { |
| | | service.PlcCacheSet(constvar.PlcCacheKeyFinishNumber, finishNumber) |
| | | } |
| | | |
| | | }) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | |
| | | s.Every(1).Minutes().StartImmediately().Do(func() { |
| | | plcConfig, code := service.NewDevicePlcService().GetDevicePlc() |
| | | if code != ecode.OK { |
| | | return |
| | | } |
| | | totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber) |
| | | if err == nil { |
| | | service.PlcCacheSet(constvar.PlcCacheKeyTotalNumber, totalNumber) |
| | | } |
| | | }) |
| | | |
| | | s.StartAsync() |
| | | return nil |
| | | } |
| | |
| | | github.com/fsnotify/fsnotify v1.6.0 // indirect |
| | | github.com/gabriel-vasile/mimetype v1.4.2 // indirect |
| | | github.com/gin-contrib/sse v0.1.0 // indirect |
| | | github.com/go-co-op/gocron v1.32.1 // indirect |
| | | github.com/go-openapi/jsonpointer v0.19.6 // indirect |
| | | github.com/go-openapi/jsonreference v0.20.1 // indirect |
| | | github.com/go-openapi/spec v0.20.4 // indirect |
| | |
| | | github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= |
| | | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= |
| | | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= |
| | | github.com/go-co-op/gocron v1.32.1 h1:h+StA6Qzlv+ImlCaLfA26rLN9eS/l4sO7oWmPUbRVIY= |
| | | github.com/go-co-op/gocron v1.32.1/go.mod h1:UGz2oYvVS6PsqlwuOdo5L1Djsg/cQjxJ6T5ntkhp9Bg= |
| | | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= |
| | | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= |
| | | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= |
| | |
| | | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= |
| | | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= |
| | | github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= |
| | | github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= |
| | | github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= |
| | | github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= |
| | | github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= |
| | |
| | | |
| | | import ( |
| | | "apsClient/conf" |
| | | "apsClient/crontask" |
| | | "apsClient/model" |
| | | "apsClient/nsq" |
| | | "apsClient/pkg/logx" |
| | |
| | | return |
| | | } |
| | | |
| | | if err := crontask.InitTask(); err != nil { |
| | | logx.Errorf("crontab task Init err:%v", err) |
| | | return |
| | | } |
| | | |
| | | go shutdown() |
| | | logx.Infof("apsClient start serve...") |
| | | server := &http.Server{ |
| | |
| | | "encoding/binary" |
| | | "errors" |
| | | "fmt" |
| | | "sync" |
| | | ) |
| | | |
| | | func PlcRead(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType) (val interface{}, err error) { |
| | |
| | | |
| | | conn, err := plc.GetModbusConnection(ipAddr) |
| | | if err != nil { |
| | | logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error()) |
| | | logx.Errorf("PlcRead 连接plc失败: %v", err.Error()) |
| | | return |
| | | } |
| | | |
| | | 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 { |
| | |
| | | |
| | | conn, err := plc.GetModbusConnection(ipAddr) |
| | | if err != nil { |
| | | logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error()) |
| | | logx.Errorf("PlcWrite 连接plc失败: %v", 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) |
| | | } |