zhangqian
2023-08-19 aab066ab2d90d235848f67d4aac3b15c8f778b3c
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
package v1
 
import (
    "apsClient/constvar"
    "apsClient/model/response"
    _ "apsClient/model/response"
    "apsClient/pkg/contextx"
    "apsClient/pkg/ecode"
    "apsClient/pkg/logx"
    "apsClient/pkg/plc"
    "apsClient/service"
    "encoding/json"
    "github.com/gin-gonic/gin"
)
 
type PlcApi struct{}
 
// GetProductProgress
// @Tags      获取动态数据
// @Summary   获取生产进度
// @Produce   application/json
// @Success   200   {object}  contextx.Response{data=response.ProductProgress}  "成功"
// @Router    /v1/plc/productProgress [get]
func (slf *PlcApi) GetProductProgress(c *gin.Context) {
    ctx, ok := contextx.NewContext(c, nil)
    if !ok {
        return
    }
 
    plcConfig, code := service.NewDevicePlcService().GetDevicePlc()
    if code != ecode.OK {
        ctx.FailWithMsg(ecode.UnknownErr, "请先配置PLC")
        return
    }
 
    var startAddress int
    var valueType string
    var dataLength int
    var ipAddr string
 
    for _, pc := range plcConfig.Details {
        if pc.FieldName == constvar.PlcStartAddressTypeFinishNumber {
            startAddress = pc.StartAddress
            valueType = pc.Type
            dataLength = pc.Length
        }
        ipAddr = plcConfig.Address
    }
 
    if startAddress == 0 || valueType == "" {
        ctx.FailWithMsg(ecode.UnknownErr, "请先配置PLC")
        return
    }
 
    conn, err := plc.NewModbusConnection(ipAddr)
    defer conn.Close()
    if err != nil {
        ctx.FailWithMsg(ecode.UnknownErr, "连接plc失败")
        logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error())
        return
    }
 
    raw, err := plc.ReadHoldingRegister(conn, startAddress, dataLength)
    if err != nil {
        ctx.FailWithMsg(ecode.UnknownErr, "获取plc数据失败")
        logx.Errorf("GetProductProgress 获取plc数据失败: %v", err.Error())
        return
    }
    var finishNumber int
    err = json.Unmarshal(raw, &finishNumber)
    if err != nil {
        ctx.FailWithMsg(ecode.UnknownErr, "获取生产进度数据解析失败")
        logx.Errorf("GetProductProgress 获取生产进度数据解析失败: %v, data: %v, valueType:%v", err.Error(), raw, valueType)
        return
    }
    resp := response.ProductProgress{
        FinishNumber: finishNumber,
    }
    ctx.OkWithDetailed(resp)
}