From b62fb0e0cd5f508f03d939c96fd911f81a91012e Mon Sep 17 00:00:00 2001 From: icewint Date: Thu, 22 Jan 2026 15:10:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=B4=E6=8E=A5=E8=AF=BB?= =?UTF-8?q?=E5=8F=96PLC=E5=9C=B0=E5=9D=80=E5=80=BC=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BF=AE=E5=A4=8DBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plc/communication/IPlcCommunication.java | 3 +- .../PlcSiemensCommunication.java | 41 +++++++++++++------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/wcs/src/main/java/org/wcs/plugin/plc/communication/IPlcCommunication.java b/wcs/src/main/java/org/wcs/plugin/plc/communication/IPlcCommunication.java index d30cf8b..e59a00b 100644 --- a/wcs/src/main/java/org/wcs/plugin/plc/communication/IPlcCommunication.java +++ b/wcs/src/main/java/org/wcs/plugin/plc/communication/IPlcCommunication.java @@ -94,7 +94,8 @@ public interface IPlcCommunication { /** * 读取指定名称的值 ---- 仅适用于 Siemens PLC DB表里的数据 * @param name 名称 + * @param clazz 值类型 * @return 值 */ - Tuple2 readWithName(String name); + Tuple2 readWithName(String name, Class clazz); } diff --git a/wcs/src/main/java/org/wcs/plugin/plc/communication/PlcSiemensCommunication.java b/wcs/src/main/java/org/wcs/plugin/plc/communication/PlcSiemensCommunication.java index 242bd1e..f1ce838 100644 --- a/wcs/src/main/java/org/wcs/plugin/plc/communication/PlcSiemensCommunication.java +++ b/wcs/src/main/java/org/wcs/plugin/plc/communication/PlcSiemensCommunication.java @@ -569,12 +569,13 @@ public class PlcSiemensCommunication implements IPlcCommunication { /** * 读取值从指定的DB地址名称 * @param name 数据库名称 + * @param clazz 数据类型 * @return 读取结果 */ @Override - public Tuple2 readWithName(String name) { + public Tuple2 readWithName(String name, Class clazz) { // 获取T类型 - Type[] actualTypeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments(); + Type[] actualTypeArguments = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments(); if(actualTypeArguments.length < 1) { return new Tuple2<>("数据类型异常", null); } @@ -582,51 +583,65 @@ public class PlcSiemensCommunication implements IPlcCommunication { if (!(type instanceof Class)) { return new Tuple2<>("不支持的复杂泛型类型", null); } - @SuppressWarnings("unchecked") - Class tClass = (Class) type; Tuple3 plcData = getDbPlcData(name); if(AppStringUtils.isNotEmpty(plcData.item1)) { return new Tuple2<>(plcData.item1, null); } SiemensS7Net siemensS7Net = plcData.item3; - if(tClass == Integer.class) { + // 直接使用传入的clazz进行类型判断 + if(clazz == Integer.class) { OperateResultExOne operateResult = siemensS7Net.ReadInt32(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } - return new Tuple2<>(null, operateResult.Content); + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } - if(tClass == Long.class) { + if(clazz == Long.class) { OperateResultExOne operateResult = siemensS7Net.ReadInt64(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } - return new Tuple2<>(null, operateResult.Content); + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } - if(tClass == Short.class) { + if(clazz == Short.class) { OperateResultExOne operateResult = siemensS7Net.ReadInt16(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } - return new Tuple2<>(null, operateResult.Content); + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } - if(tClass == Byte.class) { + if(clazz == Byte.class) { OperateResultExOne operateResult = siemensS7Net.ReadByte(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } - if(tClass == Double.class) { + if(clazz == Double.class) { OperateResultExOne operateResult = siemensS7Net.ReadDouble(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } - if(tClass == Float.class) { + if(clazz == Float.class) { OperateResultExOne operateResult = siemensS7Net.ReadFloat(plcData.item2); if(!operateResult.IsSuccess) { return new Tuple2<>(operateResult.Message, null); } + @SuppressWarnings("unchecked") + T result = (T) operateResult.Content; + return new Tuple2<>(null, result); } return new Tuple2<>("不支持的数据类型", null); }