From 35d15855172bb559fc6817745dee672f5e9b8d80 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 25 八月 2023 21:05:26 +0800 Subject: [PATCH] 2秒钟请求一次完成量并存储 --- api/v1/plc.go | 20 ------ constvar/const.go | 5 + service/plc.go | 45 ++++++++++++++- go.sum | 3 + go.mod | 1 main.go | 6 ++ crontask/cron_task.go | 41 +++++++++++++ 7 files changed, 100 insertions(+), 21 deletions(-) diff --git a/api/v1/plc.go b/api/v1/plc.go index c6a98a6..69e6fda 100644 --- a/api/v1/plc.go +++ b/api/v1/plc.go @@ -24,24 +24,8 @@ 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, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆") - return - } - totalNumber, err := service.PlcRead(plcConfig, constvar.PlcStartAddressTypeTotalNumber) - if err != nil { - ctx.FailWithMsg(ecode.UnknownErr, "璇诲彇鏁版嵁澶辫触锛岃妫�鏌lc閰嶇疆") - 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) diff --git a/constvar/const.go b/constvar/const.go index dc2f30e..2ec69ac 100644 --- a/constvar/const.go +++ b/constvar/const.go @@ -38,3 +38,8 @@ func (slf PlcMethod) Valid() bool { return slf == PlcMethodModbusTCP || slf == PlcMethodSerial } + +const ( + PlcCacheKeyFinishNumber = "finish_number" + PlcCacheKeyTotalNumber = "total_number" +) diff --git a/crontask/cron_task.go b/crontask/cron_task.go new file mode 100644 index 0000000..c8702b8 --- /dev/null +++ b/crontask/cron_task.go @@ -0,0 +1,41 @@ +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 +} diff --git a/go.mod b/go.mod index 3260abf..1cd151b 100644 --- a/go.mod +++ b/go.mod @@ -45,6 +45,7 @@ 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 diff --git a/go.sum b/go.sum index 25033f8..e9b182b 100644 --- a/go.sum +++ b/go.sum @@ -130,6 +130,8 @@ 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= @@ -423,6 +425,7 @@ 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= diff --git a/main.go b/main.go index 54c673f..97abfeb 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ import ( "apsClient/conf" + "apsClient/crontask" "apsClient/model" "apsClient/nsq" "apsClient/pkg/logx" @@ -29,6 +30,11 @@ 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{ diff --git a/service/plc.go b/service/plc.go index 582f0f3..73e8f33 100644 --- a/service/plc.go +++ b/service/plc.go @@ -8,6 +8,7 @@ "encoding/binary" "errors" "fmt" + "sync" ) func PlcRead(plcConfig *model.DevicePlc, fieldType constvar.PlcStartAddressType) (val interface{}, err error) { @@ -29,13 +30,13 @@ 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 { @@ -62,7 +63,7 @@ conn, err := plc.GetModbusConnection(ipAddr) if err != nil { - logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error()) + logx.Errorf("PlcWrite 杩炴帴plc澶辫触: %v", err.Error()) return } @@ -74,3 +75,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) +} -- Gitblit v1.8.0