zhangqian
2023-08-25 35d15855172bb559fc6817745dee672f5e9b8d80
2秒钟请求一次完成量并存储
1个文件已添加
6个文件已修改
121 ■■■■ 已修改文件
api/v1/plc.go 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
constvar/const.go 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
crontask/cron_task.go 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.mod 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.sum 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/plc.go 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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, "读取数据失败,请检查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)
constvar/const.go
@@ -38,3 +38,8 @@
func (slf PlcMethod) Valid() bool {
    return slf == PlcMethodModbusTCP || slf == PlcMethodSerial
}
const (
    PlcCacheKeyFinishNumber = "finish_number"
    PlcCacheKeyTotalNumber  = "total_number"
)
crontask/cron_task.go
New file
@@ -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
}
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
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=
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{
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)
}