修改直接读取PLC地址值的实现方法,修复BUG

This commit is contained in:
葛林强 2026-01-22 15:10:07 +08:00
parent b29d950d1e
commit b62fb0e0cd
2 changed files with 30 additions and 14 deletions

View File

@ -94,7 +94,8 @@ public interface IPlcCommunication {
/** /**
* 读取指定名称的值 ---- 仅适用于 Siemens PLC DB表里的数据 * 读取指定名称的值 ---- 仅适用于 Siemens PLC DB表里的数据
* @param name 名称 * @param name 名称
* @param clazz 值类型
* @return * @return
*/ */
<T> Tuple2<String, Object> readWithName(String name); <T> Tuple2<String, T> readWithName(String name, Class<T> clazz);
} }

View File

@ -569,12 +569,13 @@ public class PlcSiemensCommunication implements IPlcCommunication {
/** /**
* 读取值从指定的DB地址名称 * 读取值从指定的DB地址名称
* @param name 数据库名称 * @param name 数据库名称
* @param clazz 数据类型
* @return 读取结果 * @return 读取结果
*/ */
@Override @Override
public <T> Tuple2<String, Object> readWithName(String name) { public <T> Tuple2<String, T> readWithName(String name, Class<T> clazz) {
// 获取T类型 // 获取T类型
Type[] actualTypeArguments = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments(); Type[] actualTypeArguments = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments();
if(actualTypeArguments.length < 1) { if(actualTypeArguments.length < 1) {
return new Tuple2<>("数据类型异常", null); return new Tuple2<>("数据类型异常", null);
} }
@ -582,51 +583,65 @@ public class PlcSiemensCommunication implements IPlcCommunication {
if (!(type instanceof Class)) { if (!(type instanceof Class)) {
return new Tuple2<>("不支持的复杂泛型类型", null); return new Tuple2<>("不支持的复杂泛型类型", null);
} }
@SuppressWarnings("unchecked")
Class<T> tClass = (Class<T>) type;
Tuple3<String, String, SiemensS7Net> plcData = getDbPlcData(name); Tuple3<String, String, SiemensS7Net> plcData = getDbPlcData(name);
if(AppStringUtils.isNotEmpty(plcData.item1)) { if(AppStringUtils.isNotEmpty(plcData.item1)) {
return new Tuple2<>(plcData.item1, null); return new Tuple2<>(plcData.item1, null);
} }
SiemensS7Net siemensS7Net = plcData.item3; SiemensS7Net siemensS7Net = plcData.item3;
if(tClass == Integer.class) { // 直接使用传入的clazz进行类型判断
if(clazz == Integer.class) {
OperateResultExOne<Integer> operateResult = siemensS7Net.ReadInt32(plcData.item2); OperateResultExOne<Integer> operateResult = siemensS7Net.ReadInt32(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); 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<Long> operateResult = siemensS7Net.ReadInt64(plcData.item2); OperateResultExOne<Long> operateResult = siemensS7Net.ReadInt64(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); 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<Short> operateResult = siemensS7Net.ReadInt16(plcData.item2); OperateResultExOne<Short> operateResult = siemensS7Net.ReadInt16(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); 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<Byte> operateResult = siemensS7Net.ReadByte(plcData.item2); OperateResultExOne<Byte> operateResult = siemensS7Net.ReadByte(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); 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<Double> operateResult = siemensS7Net.ReadDouble(plcData.item2); OperateResultExOne<Double> operateResult = siemensS7Net.ReadDouble(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); 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<Float> operateResult = siemensS7Net.ReadFloat(plcData.item2); OperateResultExOne<Float> operateResult = siemensS7Net.ReadFloat(plcData.item2);
if(!operateResult.IsSuccess) { if(!operateResult.IsSuccess) {
return new Tuple2<>(operateResult.Message, null); return new Tuple2<>(operateResult.Message, null);
} }
@SuppressWarnings("unchecked")
T result = (T) operateResult.Content;
return new Tuple2<>(null, result);
} }
return new Tuple2<>("不支持的数据类型", null); return new Tuple2<>("不支持的数据类型", null);
} }