From a7185577628ab1cabfff4acb1ae6a927f97c94de Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Fri, 6 Feb 2026 23:52:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8iot-s7=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/pom.xml | 6 + .../fizz/business/domain/s7/DB35501Data.java | 33 +++++ .../fizz/business/domain/s7/DB35502Data.java | 39 ++++++ .../service/strip/SegmentTrackerService.java | 131 ++++++++++-------- 4 files changed, 154 insertions(+), 55 deletions(-) create mode 100644 business/src/main/java/com/fizz/business/domain/s7/DB35501Data.java create mode 100644 business/src/main/java/com/fizz/business/domain/s7/DB35502Data.java diff --git a/business/pom.xml b/business/pom.xml index d3d546f..2314e84 100644 --- a/business/pom.xml +++ b/business/pom.xml @@ -115,6 +115,12 @@ 3.1.4.0.6.15 + + com.github.xingshuangs + iot-communication + 1.5.5 + + diff --git a/business/src/main/java/com/fizz/business/domain/s7/DB35501Data.java b/business/src/main/java/com/fizz/business/domain/s7/DB35501Data.java new file mode 100644 index 0000000..e221651 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/s7/DB35501Data.java @@ -0,0 +1,33 @@ +package com.fizz.business.domain.s7; + +import com.github.xingshuangs.iot.protocol.s7.enums.EDataType; +import com.github.xingshuangs.iot.protocol.s7.serializer.S7Variable; +import lombok.Data; + +@Data +public class DB35501Data { + @S7Variable(address = "DB35501.0", type = EDataType.STRING, count = 20) + private String coilId; + + @S7Variable(address = "DB35501.30", type = EDataType.REAL) + private float entryCoilWeight; + + @S7Variable(address = "DB35501.34", type = EDataType.REAL) + private float entryCoilLength; + + @S7Variable(address = "DB35501.38", type = EDataType.REAL) + private float entryCoilWidth; + + @S7Variable(address = "DB35501.42", type = EDataType.REAL) + private float entryCoilThick; + + @S7Variable(address = "DB35501.46", type = EDataType.REAL) + private float entryCoilInnerDia; + + @S7Variable(address = "DB35501.50", type = EDataType.REAL) + private float entryCoilOuterDia; + + @S7Variable(address = "DB35501.54", type = EDataType.BYTE) + private byte alloyCode; +} + diff --git a/business/src/main/java/com/fizz/business/domain/s7/DB35502Data.java b/business/src/main/java/com/fizz/business/domain/s7/DB35502Data.java new file mode 100644 index 0000000..f34cd53 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/s7/DB35502Data.java @@ -0,0 +1,39 @@ +package com.fizz.business.domain.s7; + +import com.github.xingshuangs.iot.protocol.s7.enums.EDataType; +import com.github.xingshuangs.iot.protocol.s7.serializer.S7Variable; +import lombok.Data; + +@Data +public class DB35502Data { + @S7Variable(address = "DB35502.114", type = EDataType.REAL) + private float tensionPor1Next; + + @S7Variable(address = "DB35502.122", type = EDataType.REAL) + private float tensionPor2Next; + + @S7Variable(address = "DB35502.130", type = EDataType.REAL) + private float tensionEnLpNext; + + @S7Variable(address = "DB35502.138", type = EDataType.REAL) + private float tensionCleaningNext; + + @S7Variable(address = "DB35502.162", type = EDataType.REAL) + private float tensionGalvanizingCoolNext; + + @S7Variable(address = "DB35502.266", type = EDataType.REAL) + private float tensionExLpNext; + + @S7Variable(address = "DB35502.232", type = EDataType.REAL) + private float tensionTlNext; + + @S7Variable(address = "DB35502.198", type = EDataType.REAL) + private float tensionTmExitNext; + + @S7Variable(address = "DB35502.146", type = EDataType.REAL) + private float tensionFuranceNext; + + @S7Variable(address = "DB35502.274", type = EDataType.REAL) + private float tensionTrNext; +} + diff --git a/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java b/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java index 5683daf..7f96812 100644 --- a/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java +++ b/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java @@ -11,24 +11,27 @@ import com.fizz.business.domain.msg.AppMeasureFurnaceMessage; import com.fizz.business.dto.MatmapDTO; import com.fizz.business.dto.SegValue; import com.fizz.business.dto.SegmentDTO; +import com.fizz.business.domain.s7.DB35501Data; +import com.fizz.business.domain.s7.DB35502Data; import com.fizz.business.form.L1OperateMatForm; -import com.fizz.business.form.OpcBatchWriteDataForm; -import com.fizz.business.form.OpcWriteDataForm; import com.fizz.business.service.CrmPdiPlanService; import com.fizz.business.service.IPdiSetupService; import com.fizz.business.service.LogDataService; -import com.fizz.business.service.OpcDataService; import com.fizz.business.service.ProMatmapService; import com.fizz.business.service.TrackService; import com.fizz.business.service.impl.SegmentService; import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.WebSocketUtil; import com.fizz.business.vo.CrmPdiPlanVO; +import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType; +import com.github.xingshuangs.iot.protocol.s7.service.S7PLC; +import com.github.xingshuangs.iot.protocol.s7.serializer.S7Serializer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -51,7 +54,37 @@ public class SegmentTrackerService { private final CrmPdiPlanService crmPdiPlanService; private final IPdiSetupService pdiSetupService; - private final OpcDataService opcDataService; + + private static final String PLC_IP = "192.168.0.223"; + private static final int COIL_ID_MAX_LEN = 20; + + private S7PLC s7PLC; + private S7Serializer s7Serializer; + + @PostConstruct + public void initS7() { + // PLC机型是1500,IP 192.168.0.223,rack/slot 默认 + this.s7PLC = new S7PLC(EPlcType.S1500, PLC_IP); + this.s7Serializer = S7Serializer.newInstance(s7PLC); + } + + private String trimToLen(String s, int maxLen) { + if (s == null) { + return null; + } + return s.length() <= maxLen ? s : s.substring(0, maxLen); + } + + private float toFloat(BigDecimal v) { + return v == null ? 0.0f : v.floatValue(); + } + + private byte toByte(String s) { + if (s == null || s.isEmpty()) { + return 0; + } + return (byte) s.charAt(0); + } private static final long intervalTime = 10000; // 每 10 秒写一次 private int traceCount = 0; @@ -468,64 +501,52 @@ public class SegmentTrackerService { } /** - * NEW/READY -> ONLINE:下发全线张力“下一设定值”(Next) - */ - private void addDriveTensionNextFields(List dataList, Integer porIdx, PdiSetups setup) { - if (setup == null) { - return; - } - - if (porIdx != null && porIdx == 0) { - dataList.add(buildOpcWrite("tensionPor1Next", setup.getPorTension())); - } else if (porIdx != null && porIdx == 1) { - dataList.add(buildOpcWrite("tensionPor2Next", setup.getPorTension())); - } - - dataList.add(buildOpcWrite("tensionEnLpNext", setup.getCelTension())); - dataList.add(buildOpcWrite("tensionCleaningNext", setup.getCleanTension())); - dataList.add(buildOpcWrite("tensionGalvanizingCoolNext", setup.getPassivationTension())); - dataList.add(buildOpcWrite("tensionExLpNext", setup.getCxlTension())); - dataList.add(buildOpcWrite("tensionTlNext", setup.getLevelerEntryTension())); - dataList.add(buildOpcWrite("tensionTmExitNext", setup.getStraightenerExitTension())); - dataList.add(buildOpcWrite("tensionFuranceNext", setup.getFurTension())); - dataList.add(buildOpcWrite("tensionTrNext", setup.getTrTension())); - } - - private void addEntryPdiFields(List dataList, String coilId, CrmPdiPlanVO plan) { - dataList.add(buildOpcWrite("coilId", coilId)); - dataList.add(buildOpcWrite("entryCoilWeight", plan.getEntryWeight())); - dataList.add(buildOpcWrite("entryCoilLength", plan.getEntryLength())); - dataList.add(buildOpcWrite("entryCoilWidth", plan.getEntryWidth())); - dataList.add(buildOpcWrite("entryCoilThick", plan.getEntryThick())); - dataList.add(buildOpcWrite("entryCoilInnerDia", plan.getEntryInnerDiameter())); - dataList.add(buildOpcWrite("entryCoilOuterDia", plan.getEntryOuterDiameter())); - dataList.add(buildOpcWrite("alloyCode", plan.getSteelGrade())); - } - - /** - * NEW/READY -> ONLINE:入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发 + * NEW/READY -> ONLINE:入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发 (通过 S7 协议直连 PLC) */ public void sendAllPdiOnOnline(String coilId, Integer porIdx) { + try { + CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId); + PdiSetups setup = loadPdiSetup(coilId, plan.getPlanid()); - CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId); + // 1. 组装 DB35501 数据 (入口卷参数) + DB35501Data d35501 = new DB35501Data(); + d35501.setCoilId(trimToLen(coilId, COIL_ID_MAX_LEN)); + d35501.setEntryCoilWeight(toFloat(plan.getEntryWeight())); + d35501.setEntryCoilLength(toFloat(plan.getEntryLength())); + d35501.setEntryCoilWidth(toFloat(plan.getEntryWidth())); + d35501.setEntryCoilThick(toFloat(plan.getEntryThick())); + d35501.setEntryCoilInnerDia(toFloat(plan.getEntryInnerDiameter())); + d35501.setEntryCoilOuterDia(toFloat(plan.getEntryOuterDiameter())); + d35501.setAlloyCode(toByte(plan.getSteelGrade())); - PdiSetups setup = loadPdiSetup(coilId, plan.getPlanid()); - List dataList = new ArrayList<>(); - addEntryPdiFields(dataList, coilId, plan); - addDriveTensionNextFields(dataList, porIdx, setup); - OpcBatchWriteDataForm opcForm = new OpcBatchWriteDataForm(); - opcForm.setDataList(dataList); - boolean ok = opcDataService.batchWriteData(opcForm); - logDataService.logInfo("MATMAP-TRACK", "ONLINE下发完成(入口参数+张力Next), coilId=" + coilId + ", ok=" + ok); + // 2. 组装 DB35502 数据 (全线张力 Next) + DB35502Data d35502 = new DB35502Data(); + if (setup != null) { + if (porIdx != null && porIdx == 0) { + d35502.setTensionPor1Next(toFloat(setup.getPorTension())); + } else if (porIdx != null && porIdx == 1) { + d35502.setTensionPor2Next(toFloat(setup.getPorTension())); + } + d35502.setTensionEnLpNext(toFloat(setup.getCelTension())); + d35502.setTensionCleaningNext(toFloat(setup.getCleanTension())); + d35502.setTensionGalvanizingCoolNext(toFloat(setup.getPassivationTension())); + d35502.setTensionExLpNext(toFloat(setup.getCxlTension())); + d35502.setTensionTlNext(toFloat(setup.getLevelerEntryTension())); + d35502.setTensionTmExitNext(toFloat(setup.getStraightenerExitTension())); + d35502.setTensionFuranceNext(toFloat(setup.getFurTension())); + d35502.setTensionTrNext(toFloat(setup.getTrTension())); + } - } + // 3. 执行 S7 序列化写入 + s7Serializer.write(d35501); + s7Serializer.write(d35502); + logDataService.logInfo("MATMAP-TRACK", "ONLINE S7下发完成(入口参数+张力Next), coilId=" + coilId + ", PLC=" + PLC_IP); - private OpcWriteDataForm buildOpcWrite(String fieldName, Object value) { - OpcWriteDataForm form = new OpcWriteDataForm(); - form.setFieldName(fieldName); - form.setValue(value); - return form; + } catch (Exception e) { + log.error("S7下发异常: {}", e.getMessage(), e); + logDataService.logError("MATMAP-TRACK", "ONLINE S7下发失败, coilId=" + coilId + ", err=" + e.getMessage()); + } } }