zhangqian
2023-09-16 9d8056d27ce893ed311cd38b7350e9ae7409b7c0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package v1
 
import (
    "apsClient/constvar"
    "apsClient/model/request"
    "apsClient/model/response"
    _ "apsClient/model/response"
    "apsClient/pkg/contextx"
    "apsClient/pkg/ecode"
    "apsClient/pkg/logx"
    "apsClient/pkg/plc/apacheplc4x"
    "apsClient/service"
    "github.com/gin-gonic/gin"
    "github.com/spf13/cast"
)
 
type PlcApi struct{}
 
// GetProductProgress
// @Tags      生产数量
// @Summary   获取生产进度
// @Produce   application/json
// @Param     object  body    request.SendProcessParams true  "查询参数"
// @Success   200   {object}  contextx.Response{data=response.ProductProgress}  "成功"
// @Router    /v1/plc/productProgress [post]
func (slf *PlcApi) GetProductProgress(c *gin.Context) {
    var params request.GetProductProgress
    ctx, ok := contextx.NewContext(c, &params)
    if !ok {
        return
    }
    finishNumber, _ := service.PlcCacheGet(params.Position, constvar.PlcCacheKeyFinishNumber)
    totalNumber, _ := service.PlcCacheGet(params.Position, constvar.PlcCacheKeyTotalNumber)
    resp := new(response.ProductProgress)
    resp.FinishNumber = cast.ToInt(finishNumber)
    resp.TotalNumber = cast.ToInt(totalNumber)
 
    plcStatus := 1 //断开连接
    isConnect := apacheplc4x.IsConnect()
    if isConnect {
        if resp.FinishNumber > 0 { //生产
            plcStatus = 2
        } else { //待机
            plcStatus = 3
        }
    }
    resp.PlcStatus = plcStatus
 
    ctx.OkWithDetailed(resp)
}
 
// SetProductNumber
// @Tags      生产数量
// @Summary   设置生产总量
// @Produce   application/json
// @Success   200   {object}  contextx.Response{}  "成功"
// @Router    /v1/plc/setProductNumber [post]
func (slf *PlcApi) SetProductNumber(c *gin.Context) {
    ctx, ok := contextx.NewContext(c, nil)
    if !ok {
        return
    }
    ctx.Ok()
}
 
// GetProductProgressRealTime
// @Tags      生产数量
// @Summary   实时获取生产进度
// @Produce   application/json
// @Success   200   {object}  contextx.Response{data=response.ProductProgress}  "成功"
// @Router    /v1/plc/productProgressRealTime [post]
func (slf *PlcApi) GetProductProgressRealTime(c *gin.Context) {
    ctx, ok := contextx.NewContext(c, nil)
    if !ok {
        return
    }
    var finishNumber, totalNumber int64
    plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
    if code != ecode.OK {
        return
    }
    for _, addressItem := range plcConfig.Details {
        if addressItem.FieldName == constvar.PlcStartAddressTypeFinishNumber {
            value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type)
            if err != nil {
                logx.Infof("plc read finish number err: %v", err)
                continue
            }
            finishNumber = cast.ToInt64(value)
            logx.Infof("plc read finish number: %v", finishNumber)
            break
        }
    }
 
    for _, addressItem := range plcConfig.Details {
        if addressItem.FieldName == constvar.PlcStartAddressTypeTotalNumber {
            value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type)
            if err != nil {
                logx.Infof("plc read total number err: %v", err)
                continue
            }
            totalNumber = cast.ToInt64(value)
            logx.Infof("plc read total number: %v", totalNumber)
            break
        }
    }
    resp := new(response.ProductProgress)
    resp.FinishNumber = cast.ToInt(finishNumber)
    resp.TotalNumber = cast.ToInt(totalNumber)
 
    plcStatus := 1 //断开连接
    isConnect := apacheplc4x.IsConnect()
    if isConnect {
        if resp.FinishNumber > 0 { //生产
            plcStatus = 2
        } else { //待机
            plcStatus = 3
        }
    }
    resp.PlcStatus = plcStatus
 
    ctx.OkWithDetailed(resp)
}