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());
+ }
}
}