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