通信数据修正

This commit is contained in:
2026-02-03 14:48:29 +08:00
parent 82cffb7ea3
commit 6db871f99b
6 changed files with 64 additions and 117 deletions

View File

@@ -4,6 +4,7 @@ import com.fizz.business.domain.msg.OpcMessage;
import com.fizz.business.domain.msg.PdiSetup;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import com.fizz.business.service.LogDataService;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
@@ -25,6 +26,9 @@ public class OpcMessageSend {
@Resource
private MiloService miloService;
@Resource
private LogDataService logDataService;
private void sendPdiSetup(PdiSetup pdiSetup) {
try {
List<ReadWriteEntity> entities = getWriteEntities(pdiSetup, pdiSetupIds);
@@ -111,43 +115,6 @@ public class OpcMessageSend {
}
}
/**
* 批量写数据方法:通过字段名向多个点位写入数据
* @param fieldDataMap 字段名和值的映射key 为 fieldNamevalue 为要写入的值
* @return 是否全部写入成功
*/
public boolean batchWriteDataByFieldName(Map<String, Object> fieldDataMap) {
try {
if (fieldDataMap == null || fieldDataMap.isEmpty()) {
log.warn("批量写数据:数据映射为空,跳过写入");
return false;
}
List<ReadWriteEntity> entities = new ArrayList<>();
for (Map.Entry<String, Object> entry : fieldDataMap.entrySet()) {
String fieldName = entry.getKey();
String identifier = findIdentifierByFieldName(fieldName);
if (identifier == null) {
log.warn("未找到字段名对应的 OPC 节点路径fieldName={},跳过该字段", fieldName);
continue;
}
entities.add(ReadWriteEntity.builder()
.identifier(identifier)
.value(entry.getValue())
.build());
}
if (entities.isEmpty()) {
log.warn("批量写数据:没有有效的字段映射,跳过写入");
return false;
}
miloService.writeToOpcUa(entities);
log.info("批量写入 OPC 数据成功,共 {} 个点位", entities.size());
return true;
} catch (Exception e) {
log.error("批量写入 OPC 数据失败,原因:{}", e.getMessage(), e);
return false;
}
}
/**
* 批量写数据方法:向多个点位写入数据(直接使用节点路径)
* @param dataMap 点位标识符和值的映射key 为 identifiervalue 为要写入的值
@@ -155,10 +122,6 @@ public class OpcMessageSend {
*/
public boolean batchWriteData(Map<String, Object> dataMap) {
try {
if (dataMap == null || dataMap.isEmpty()) {
log.warn("批量写数据:数据映射为空,跳过写入");
return false;
}
List<ReadWriteEntity> entities = new ArrayList<>();
for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
entities.add(ReadWriteEntity.builder()
@@ -167,10 +130,10 @@ public class OpcMessageSend {
.build());
}
miloService.writeToOpcUa(entities);
log.info("批量写入 OPC 数据成功,共 {} 个点位", entities.size());
logDataService.logInfo("WRITE","批量写入 OPC 数据成功,共"+ entities.size()+ "个点位");
return true;
} catch (Exception e) {
log.error("批量写入 OPC 数据失败,原因:{}", e.getMessage(), e);
logDataService.logInfo("WRITE","批量写入 OPC 数据失败,原因:"+ e.getMessage()+","+ e);
return false;
}
}

View File

@@ -10,6 +10,7 @@ import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.comm.OPC.OpcMessageSend;
import com.fizz.business.service.client.RedisCacheManager;
import com.fizz.business.service.impl.BeanFactory;
import com.fizz.business.service.strip.SegmentTrackerService;
import com.fizz.business.utils.MatmapUtil;
import com.fizz.business.utils.WebSocketUtil;
import com.fizz.business.vo.CrmPdiPlanVO;
@@ -40,6 +41,14 @@ public enum L1OperateMatEnum implements IEnum<String>, IOperateMat<L1OperateMatF
MatmapUtil.setMatmap(form.getPorIdx(), form.getEntryMatId(), form.getPlanId(), form.getPlanNo());
// 钢卷上线时, 缓存工艺规程
// BeanFactory.getBean(RedisCacheManager.class).setCoilSetup(form.getPlanId());
// ONLINE 时同步下发入口参数 + 张力下一设定值
try {
BeanFactory.getBean(SegmentTrackerService.class)
.sendAllPdiOnOnline(form.getEntryMatId(), form.getPorIdx());
} catch (Exception e) {
BeanFactory.getBean(com.fizz.business.service.LogDataService.class)
.logWarn("L1-ONLINE", "ONLINE下发异常, coilId={}, porIdx={}, err={}", form.getEntryMatId(), form.getPorIdx(), e.toString());
}
WebSocketUtil.sendSignalMsg(form);
WebSocketUtil.sendMatmapMsg();
}

View File

@@ -77,9 +77,6 @@ public class LogDataServiceImpl extends ServiceImpl<LogDataMapper, LogData> impl
@Override
public void logInfo(String module, String content, Object... args) {
try {
if (args.length > 0) {
content = formatMessage(content, args);
}
saveLogData("INFORMATION", module, content);
} catch (Exception e) {
log.error("没存进去,没事,{}",e);
@@ -88,9 +85,6 @@ public class LogDataServiceImpl extends ServiceImpl<LogDataMapper, LogData> impl
@Override
public void logWarn(String module, String content, Object... args) {
if (args.length > 0) {
content = formatMessage(content, args);
}
saveLogData("WARN", module, content);
}
@@ -105,34 +99,4 @@ public class LogDataServiceImpl extends ServiceImpl<LogDataMapper, LogData> impl
save(logData);
}
private String formatMessage(String pattern, Object[] arguments) {
if (pattern == null) {
return null;
}
if (arguments == null || arguments.length == 0) {
return pattern;
}
StringBuilder sb = new StringBuilder();
int argIndex = 0;
int i = 0;
while (i < pattern.length()) {
char c = pattern.charAt(i);
if (c == '{' && i + 1 < pattern.length() && pattern.charAt(i + 1) == '}') {
if (argIndex < arguments.length) {
sb.append(String.valueOf(arguments[argIndex++]));
} else {
sb.append("{}");
}
i += 2;
} else {
sb.append(c);
i++;
}
}
return sb.toString();
}
}

View File

@@ -3,6 +3,7 @@ package com.fizz.business.service.impl;
import com.fizz.business.comm.OPC.OpcMessageSend;
import com.fizz.business.form.OpcBatchWriteDataForm;
import com.fizz.business.form.OpcWriteDataForm;
import com.fizz.business.service.LogDataService;
import com.fizz.business.service.OpcDataService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -22,6 +23,7 @@ import java.util.stream.Collectors;
public class OpcDataServiceImpl implements OpcDataService {
private final OpcMessageSend opcMessageSend;
private final LogDataService logDataService;
@Override
public boolean writeData(OpcWriteDataForm form) {
@@ -36,13 +38,44 @@ public class OpcDataServiceImpl implements OpcDataService {
@Override
public boolean batchWriteData(OpcBatchWriteDataForm form) {
try {
int rawSize = form.getDataList().size();
int nullItemCount = 0;
int nullFieldNameCount = 0;
int nullValueCount = 0;
StringBuilder nullValueFields = new StringBuilder();
for (int i = 0; i < form.getDataList().size(); i++) {
OpcWriteDataForm d = form.getDataList().get(i);
if (d == null) {
nullItemCount++;
continue;
}
if (d.getFieldName() == null) {
nullFieldNameCount++;
continue;
}
if (d.getValue() == null) {
nullValueCount++;
if (nullValueFields.length() < 1500) {
if (nullValueFields.length() > 0) {
nullValueFields.append(",");
}
nullValueFields.append(d.getFieldName());
}
}
}
Map<String, Object> fieldDataMap = form.getDataList().stream()
.filter(d -> d != null && d.getFieldName() != null)
.collect(Collectors.toMap(
OpcWriteDataForm::getFieldName,
OpcWriteDataForm::getValue,
(v1, v2) -> v2 // 如果有重复的 key保留后面的值
));
return opcMessageSend.batchWriteDataByFieldName(fieldDataMap);
return opcMessageSend.batchWriteData(fieldDataMap);
} catch (Exception e) {
log.error("批量写入 OPC 数据异常", e);
return false;

View File

@@ -73,16 +73,6 @@ public class TrackServiceImpl implements TrackService {
public void l1OperateMat(L1OperateMatForm form) {
log.info("l1 operate mat: {}", JSON.toJSONString(form));
// NEW/READY -> ONLINE下发张力下一设定值
if (form.getOperation() == com.fizz.business.constants.enums.L1OperateMatEnum.ONLINE) {
try {
segmentTrackerService.sendAllPdiOnOnline(form.getEntryMatId(), form.getPorIdx());
} catch (Exception e) {
log.error("张力Next下发异常, coilId={} err={}", form.getEntryMatId(), e.toString(), e);
}
}
form.getOperation().operate(form);
proMatmapService.flushMatmap();
}

View File

@@ -3,6 +3,7 @@ package com.fizz.business.service.strip;
import cn.hutool.json.JSONUtil;
import com.fizz.business.constants.enums.DeviceEnum;
import com.fizz.business.constants.enums.L1OperateMatEnum;
import com.fizz.business.domain.PdiSetups;
import com.fizz.business.domain.msg.AppMeasureCoatMessage;
import com.fizz.business.domain.msg.AppMeasureEntryMessage;
import com.fizz.business.domain.msg.AppMeasureExitMessage;
@@ -22,6 +23,7 @@ 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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
@@ -454,22 +456,21 @@ public class SegmentTrackerService {
}
private com.fizz.business.domain.PdiSetups loadPdiSetup(String coilId, String planId) {
private PdiSetups loadPdiSetup(String coilId, String planId) {
if (planId == null) {
return null;
}
com.fizz.business.domain.PdiSetups query = new com.fizz.business.domain.PdiSetups();
query.setCoilid(coilId);
query.setPlanid(planId);
java.util.List<com.fizz.business.domain.PdiSetups> setups = pdiSetupService.selectPdiSetupList(query);
List<com.fizz.business.domain.PdiSetups> setups = pdiSetupService.selectPdiSetupList(query);
return (setups != null && !setups.isEmpty()) ? setups.get(0) : null;
}
/**
* NEW/READY -> ONLINE下发全线张力“下一设定值”(Next)
*/
private void addDriveTensionNextFields(java.util.List<OpcWriteDataForm> dataList, Integer porIdx, com.fizz.business.domain.PdiSetups setup) {
private void addDriveTensionNextFields(List<OpcWriteDataForm> dataList, Integer porIdx, PdiSetups setup) {
if (setup == null) {
return;
}
@@ -490,7 +491,7 @@ public class SegmentTrackerService {
dataList.add(buildOpcWrite("tensionTrNext", setup.getTrTension()));
}
private void addEntryPdiFields(java.util.List<OpcWriteDataForm> dataList, String coilId, com.fizz.business.vo.CrmPdiPlanVO plan) {
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()));
@@ -499,37 +500,24 @@ public class SegmentTrackerService {
dataList.add(buildOpcWrite("entryCoilInnerDia", plan.getEntryInnerDiameter()));
dataList.add(buildOpcWrite("entryCoilOuterDia", plan.getEntryOuterDiameter()));
dataList.add(buildOpcWrite("alloyCode", plan.getSteelGrade()));
dataList.add(buildOpcWrite("splitNum", plan.getSplitNum()));
}
/**
* NEW/READY -> ONLINE入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发
*/
public void sendAllPdiOnOnline(String coilId, Integer porIdx) {
try {
com.fizz.business.vo.CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId);
if (plan == null) {
logDataService.logWarn("MATMAP-TRACK", "ONLINE下发跳过未找到计划信息, coilId=" + coilId);
return;
}
com.fizz.business.domain.PdiSetups setup = loadPdiSetup(coilId, plan.getPlanid());
if (setup == null) {
logDataService.logWarn("MATMAP-TRACK", "ONLINE下发跳过未找到pdi_setup, coilId=" + coilId);
return;
}
CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId);
java.util.List<OpcWriteDataForm> dataList = new java.util.ArrayList<>();
addEntryPdiFields(dataList, coilId, plan);
addDriveTensionNextFields(dataList, porIdx, setup);
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);
OpcBatchWriteDataForm opcForm = new OpcBatchWriteDataForm();
opcForm.setDataList(dataList);
boolean ok = opcDataService.batchWriteData(opcForm);
logDataService.logInfo("MATMAP-TRACK", "ONLINE下发完成(入口参数+张力Next), coilId=" + coilId + ", ok=" + ok);
} catch (Exception ex) {
logDataService.logWarn("MATMAP-TRACK", "ONLINE下发异常(入口参数+张力Next), coilId=" + coilId + ", err=" + String.valueOf(ex));
}
}