From e76f0739e647fe8a7e0e2618914e2faff554b1b7 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 17 十一月 2025 17:33:23 +0800
Subject: [PATCH] 解决冲突
---
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 215 insertions(+), 0 deletions(-)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
new file mode 100644
index 0000000..2a1b439
--- /dev/null
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
@@ -0,0 +1,215 @@
+package com.mes.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.xingshuangs.iot.common.enums.EDataType;
+import com.github.xingshuangs.iot.protocol.s7.serializer.S7Parameter;
+import com.mes.entity.PlcAddress;
+import com.mes.s7.enhanced.EnhancedS7Serializer;
+import com.mes.service.PlcDynamicDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * PLC鍔ㄦ�佹暟鎹鍐欐湇鍔″疄鐜�
+ * 閫氳繃PlcAddress涓殑addressMapping閰嶇疆鍔ㄦ�佽鍐欎换鎰忓瓧娈电粍鍚�
+ *
+ * @author huang
+ * @date 2025/11/05
+ */
+@Slf4j
+@Service
+public class PlcDynamicDataServiceImpl implements PlcDynamicDataService {
+
+ /**
+ * 鏍规嵁PlcAddress閰嶇疆鍜屽瓧娈靛悕绉拌鍙朠LC鏁版嵁
+ *
+ * @param config PLC鍦板潃鏄犲皠閰嶇疆
+ * @param fieldNames 瑕佽鍙栫殑瀛楁鍚嶇О鍒楄〃
+ * @param s7Serializer S7搴忓垪鍖栧櫒
+ * @return 瀛楁鍚�->鍊� 鐨凪ap
+ */
+ @Override
+ public Map<String, Object> readPlcData(PlcAddress config, List<String> fieldNames, EnhancedS7Serializer s7Serializer) {
+ if (config == null || config.getAddressMapping() == null) {
+ throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
+ }
+
+ try {
+ // 瑙f瀽addressMapping JSON閰嶇疆
+ JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
+
+ // 鏋勫缓S7Parameter鍒楄〃
+ List<S7Parameter> parameters = buildS7Parameters(config, addressMapping, fieldNames);
+
+ // 浠嶱LC璇诲彇鏁版嵁
+ List<S7Parameter> results = s7Serializer.read(parameters);
+
+ // 灏嗙粨鏋滆浆鎹负Map
+ Map<String, Object> resultMap = new HashMap<>();
+ for (int i = 0; i < fieldNames.size() && i < results.size(); i++) {
+ String fieldName = fieldNames.get(i);
+ Object value = results.get(i).getValue();
+ resultMap.put(fieldName, value);
+ }
+
+ return resultMap;
+ } catch (Exception e) {
+ log.error("璇诲彇PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宮odule: {}, 璇︾粏閿欒: {}",
+ config.getPlcIp(), config.getModule(), e.getMessage(), e);
+ return new HashMap<>();
+ }
+ }
+
+ /**
+ * 鏍规嵁PlcAddress閰嶇疆鍜屾暟鎹甅ap鍐欏叆PLC
+ *
+ * @param config PLC鍦板潃鏄犲皠閰嶇疆
+ * @param dataMap 瀛楁鍚�->鍊� 鐨凪ap
+ * @param s7Serializer S7搴忓垪鍖栧櫒
+ */
+ @Override
+ public void writePlcData(PlcAddress config, Map<String, Object> dataMap, EnhancedS7Serializer s7Serializer) {
+ if (config == null || config.getAddressMapping() == null) {
+ throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
+ }
+
+ try {
+ // 瑙f瀽addressMapping JSON閰嶇疆
+ JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
+
+ // 鏋勫缓S7Parameter鍒楄〃锛屽苟濉厖鍊�
+ List<S7Parameter> parameters = buildS7ParametersWithValues(config, addressMapping, dataMap);
+
+ // 鍐欏叆PLC
+ s7Serializer.write(parameters);
+ } catch (Exception e) {
+ log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宮odule: {}, 璇︾粏閿欒: {}",
+ config.getPlcIp(), config.getModule(), e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 璇诲彇PLC鎵�鏈夊瓧娈�
+ *
+ * @param config PLC鍦板潃鏄犲皠閰嶇疆
+ * @param s7Serializer S7搴忓垪鍖栧櫒
+ * @return 鎵�鏈夊瓧娈电殑鍊�
+ */
+ @Override
+ public Map<String, Object> readAllPlcData(PlcAddress config, EnhancedS7Serializer s7Serializer) {
+ if (config == null || config.getAddressMapping() == null) {
+ throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
+ }
+
+ // 鑾峰彇鎵�鏈夊瓧娈靛悕
+ JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
+ List<String> allFields = new ArrayList<>(addressMapping.keySet());
+
+ // 璇诲彇鎵�鏈夊瓧娈�
+ return readPlcData(config, allFields, s7Serializer);
+ }
+
+ /**
+ * 璇诲彇鍗曚釜瀛楁
+ *
+ * @param config PLC鍦板潃鏄犲皠閰嶇疆
+ * @param fieldName 瀛楁鍚�
+ * @param s7Serializer S7搴忓垪鍖栧櫒
+ * @return 瀛楁鍊�
+ */
+ @Override
+ public Object readPlcField(PlcAddress config, String fieldName, EnhancedS7Serializer s7Serializer) {
+ List<String> fields = new ArrayList<>();
+ fields.add(fieldName);
+
+ Map<String, Object> result = readPlcData(config, fields, s7Serializer);
+ return result.get(fieldName);
+ }
+
+ /**
+ * 鍐欏叆鍗曚釜瀛楁
+ *
+ * @param config PLC鍦板潃鏄犲皠閰嶇疆
+ * @param fieldName 瀛楁鍚�
+ * @param value 瀛楁鍊�
+ * @param s7Serializer S7搴忓垪鍖栧櫒
+ */
+ @Override
+ public void writePlcField(PlcAddress config, String fieldName, Object value, EnhancedS7Serializer s7Serializer) {
+ Map<String, Object> dataMap = new HashMap<>();
+ dataMap.put(fieldName, value);
+
+ writePlcData(config, dataMap, s7Serializer);
+ }
+
+ /**
+ * 鏋勫缓S7Parameter鍒楄〃锛堜笉鍖呭惈鍊硷級
+ *
+ * @param config PLC鍦板潃閰嶇疆
+ * @param addressMapping 鍦板潃鏄犲皠
+ * @param fieldNames 瀛楁鍚嶅垪琛�
+ * @return S7Parameter鍒楄〃
+ */
+ private List<S7Parameter> buildS7Parameters(PlcAddress config, JSONObject addressMapping, List<String> fieldNames) {
+ List<S7Parameter> parameters = new ArrayList<>();
+
+ for (String fieldName : fieldNames) {
+ if (!addressMapping.containsKey(fieldName)) {
+ log.warn("瀛楁 {} 鍦╝ddressMapping涓笉瀛樺湪锛岃烦杩�", fieldName);
+ continue;
+ }
+
+ // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
+ int offset = addressMapping.getInteger(fieldName);
+
+ // 鏋勫缓瀹屾暣鍦板潃锛歞bArea + offset锛堝锛欴B12.2锛�
+ String fullAddress = config.getDbArea() + "." + offset;
+
+ // 鍒涘缓S7Parameter锛岄粯璁や娇鐢║INT16绫诲瀷锛�16浣嶆棤绗﹀彿鏁存暟锛�
+ S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+ parameters.add(parameter);
+ }
+
+ return parameters;
+ }
+
+ /**
+ * 鏋勫缓S7Parameter鍒楄〃锛堝寘鍚�硷級
+ *
+ * @param config PLC鍦板潃閰嶇疆
+ * @param addressMapping 鍦板潃鏄犲皠
+ * @param dataMap 瀛楁鍚�->鍊� 鐨凪ap
+ * @return S7Parameter鍒楄〃
+ */
+ private List<S7Parameter> buildS7ParametersWithValues(PlcAddress config, JSONObject addressMapping, Map<String, Object> dataMap) {
+ List<S7Parameter> parameters = new ArrayList<>();
+
+ for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
+ String fieldName = entry.getKey();
+ Object value = entry.getValue();
+
+ if (!addressMapping.containsKey(fieldName)) {
+ log.warn("瀛楁 {} 鍦╝ddressMapping涓笉瀛樺湪锛岃烦杩�", fieldName);
+ continue;
+ }
+
+ // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
+ int offset = addressMapping.getInteger(fieldName);
+
+ // 鏋勫缓瀹屾暣鍦板潃
+ String fullAddress = config.getDbArea() + "." + offset;
+
+ // 鍒涘缓S7Parameter锛岃缃��
+ S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+ parameter.setValue(value);
+ parameters.add(parameter);
+ }
+
+ return parameters;
+ }
+}
--
Gitblit v1.8.0