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/binary" "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 } resp := new(response.ProductProgress) if startAddress == 0 || valueType == "" { ctx.OkWithDetailed(resp) logx.Warnf("请先配置PLC") return } conn, err := plc.NewModbusConnection(ipAddr) if err != nil { ctx.OkWithDetailed(resp) logx.Errorf("GetProductProgress 连接plc失败: %v", err.Error()) return } defer conn.Close() rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength) if err != nil { ctx.OkWithDetailed(resp) logx.Errorf("GetProductProgress 获取plc数据失败: %v", err.Error()) return } resp.FinishNumber = int(binary.BigEndian.Uint16(rawData)) if err != nil { ctx.OkWithDetailed(resp) logx.Errorf("GetProductProgress 获取生产进度数据解析失败: %v, data: %v, valueType:%v", err.Error(), rawData, valueType) return } ctx.OkWithDetailed(resp) }