使用iot-s7完成通信

This commit is contained in:
2026-02-06 23:52:26 +08:00
parent 6db871f99b
commit a718557762
4 changed files with 154 additions and 55 deletions

View File

@@ -115,6 +115,12 @@
<version>3.1.4.0.6.15</version>
</dependency>
<dependency>
<groupId>com.github.xingshuangs</groupId>
<artifactId>iot-communication</artifactId>
<version>1.5.5</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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机型是1500IP 192.168.0.223rack/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<OpcWriteDataForm> 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<OpcWriteDataForm> 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<OpcWriteDataForm> 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());
}
}
}