通信数据修正
This commit is contained in:
@@ -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 为 fieldName,value 为要写入的值
|
||||
* @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 为 identifier,value 为要写入的值
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user