diff --git a/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java b/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java index 13bdea77..281f50e9 100644 --- a/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java @@ -36,7 +36,7 @@ import java.util.concurrent.TimeUnit; @Service @Slf4j -public class ModbusCommunicateServiceImpl extends ServiceImpl implements ModbusCommunicateService { +public class ModbusCommunicateServiceImpl extends ServiceImpl implements ModbusCommunicateService { @Autowired private GetInformationForExcelMapper getInformationForExcelMapper; @@ -49,55 +49,66 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(EquipmentFolderLocation::getSuffix, "PLC"); EquipmentFolderLocation folderLocation = equipmentFolderLocationService.getOne(queryWrapper); - ModbusCommunicateEntity one = this.getOne(new LambdaQueryWrapper<>()); - if (one == null) { + if (folderLocation == null) { log.info("设备信息未填"); return; } String modbusIp = folderLocation.getIp(); - if (StringUtils.equals(modbusIp,"127.0.0.1") || StringUtils.isEmpty(modbusIp)){ + if (StringUtils.equals(modbusIp, "127.0.0.1") || StringUtils.isEmpty(modbusIp)) { return; } int modbusPort = folderLocation.getPort(); int registerAddress = folderLocation.getRegisterAddress(); int registerNum = folderLocation.getRegisterNum(); int unitId = folderLocation.getUnitId(); - - - int registerAddressInspection=folderLocation.getRegisterAddressInspection(); - int registerNumInspection=folderLocation.getRegisterNumInspection(); + int registerAddressInspection = folderLocation.getRegisterAddressInspection(); + int registerNumInspection = folderLocation.getRegisterNumInspection(); //获取单号 - String inspectionOrderNumber = getInspectionOrderNumber(modbusIp, modbusPort, registerAddressInspection, registerNumInspection, unitId); - log.info("最终获取的检验单号是: {}" ,inspectionOrderNumber); - if (StringUtils.isEmpty(inspectionOrderNumber)|| inspectionOrderNumber.trim().equals("")){//判断是空或者是寄存器是零的话就返回 - log.info("没有值或者已被清零"); + String inspectionOrderNumber = getInspectionOrderNumber(modbusIp, modbusPort, registerAddressInspection, registerNumInspection, unitId).trim(); + if (StringUtils.isEmpty(inspectionOrderNumber) || inspectionOrderNumber.trim().equals("")) {//判断是空或者是寄存器是零的话就返回 return; } - //应为modbus每次取值都是有一个固定范围,所以这里如果超过固定范围就要做处理 - int number=100; - int divisor=registerNum/100; - int remainder=registerNum % 100; - List> floatValues=new ArrayList<>(); - if (remainder!=0){ - for (int i = 1; i <= (divisor + 1); i++) { - //获取值 - List floatValue = getValue(modbusIp, modbusPort, registerAddress, number, unitId); - floatValues.add(floatValue); - if (i==divisor + 1){ - number=remainder; - } - registerAddress=registerAddress+number; - } - }else { - for (int i = 1; i <= divisor ; i++) { - List floatValue = getValue(modbusIp, modbusPort, registerAddress, number, unitId); - floatValues.add(floatValue); - registerAddress=registerAddress+number; - } - } + + //获取对应检验单号的值 + List> floatValues = getValue(modbusIp, modbusPort, registerAddress, registerNum, unitId); +// int number=100; +// int divisor=registerNum/100; +// int remainder=registerNum % 100; +// List> floatValues=new ArrayList<>(); +// long startTime1 = System.nanoTime(); +// if (remainder!=0){ +// for (int i = 1; i <= (divisor + 1); i++) { +// //获取值 +//// List floatValue = getValue(modbusIp, modbusPort, registerAddress, number, unitId); +// //如果有值那么在获取值之后清零 +// if (CollectionUtils.isNotEmpty(floatValue)){ +//// deleteForModbus(modbusIp, modbusPort, registerAddress, number, unitId); +// } +// floatValues.add(floatValue); +// if (i==divisor + 1){ +// number=remainder; +// } +// registerAddress=registerAddress+number; +// } +// }else { +// for (int i = 1; i <= divisor ; i++) { +// List floatValue = getValue(modbusIp, modbusPort, registerAddress, number, unitId); +// //如果有值那么在获取值之后清零 +// if (CollectionUtils.isNotEmpty(floatValue)){ +//// deleteForModbus(modbusIp, modbusPort, registerAddress, number, unitId); +// } +// floatValues.add(floatValue); +// registerAddress=registerAddress+number; +// } +// long endTime1= System.nanoTime(); +// long elapsedTimeInNanos1 =endTime1-startTime1; +// double elapsedTimeInSeconds1 = (double) elapsedTimeInNanos1 / 1_000_000_000.0; +// log.info("值获取/清零时间: {}", elapsedTimeInSeconds1); +// } //判断这个批次号应该是多少 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); @@ -123,7 +134,7 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl detailList = new ArrayList<>(); for (List aFloat : floatValues) { @@ -141,13 +152,18 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl getValue(String modbusIp, int modbusPort, int registerAddress, int registerNum, int unitId) { + public List> getValue(String modbusIp, int modbusPort, int registerAddress, int registerNum, int unitId) { log.info("modbus请求开始解析"); // String modbusIp = "172.26.58.222"; // int modbusPort = 502; @@ -155,14 +171,56 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl floats = new ArrayList(); + List> floatValues = new ArrayList<>(); try { InetAddress ipAddress = InetAddress.getByName(modbusIp); // 连接到Modbus设备 TCPMasterConnection connection = new TCPMasterConnection(ipAddress); connection.setPort(modbusPort); connection.connect(); + //应为modbus每次取值都是有一个固定范围,所以这里如果超过固定范围就要做处理 + int number = 100; + int divisor = registerNum / 100; + int remainder = registerNum % 100; + if (remainder != 0) { + for (int i = 1; i <= (divisor + 1); i++) { + //获取值 + List floatValue = getResponseMessage(registerAddress, number, unitId, connection); + //如果有值那么在获取值之后清零 + if (CollectionUtils.isNotEmpty(floatValue)) { + deleteForModbus(registerAddress, number, unitId, connection); + } + floatValues.add(floatValue); + if (i == divisor + 1) { + number = remainder; + } + registerAddress = registerAddress + number; + } + } else { + for (int i = 1; i <= divisor; i++) { + List floatValue = getResponseMessage(registerAddress, number, unitId, connection); + //如果有值那么在获取值之后清零 + if (CollectionUtils.isNotEmpty(floatValue)) { + deleteForModbus(registerAddress, number, unitId, connection); + } + floatValues.add(floatValue); + registerAddress = registerAddress + number; + } + } + // 关闭连接 + connection.close(); + log.info("关闭连接"); + } catch (Exception e) { + log.error("连接Modbus设备时出现异常: {}", e.getMessage()); + e.printStackTrace(); + } + return floatValues; + } + //获取值(请求modbus获取) + public List getResponseMessage(int registerAddress, int registerNum, int unitId, TCPMasterConnection connection) { + ArrayList floats = new ArrayList(); + try { // 创建一个Modbus TCP请求 ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(registerAddress, registerNum); request.setUnitID(unitId); // 设置Modbus设备的Unit ID @@ -184,34 +242,20 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl hex = new ArrayList<>(); InputRegister[] registers = response.getRegisters(); for (InputRegister register : registers) { - short value = register.toShort(); + short value = register.toShort(); int hexValue = value & 0xFFFF; - log.info("获取的值是: {},value: {}",hexValue,value); + log.info("获取的值是: {},value: {}", hexValue, value); hex.add(hexValue); } - for (int i = 0; i < hex.size(); i+=2) { - int hexI= (hex.get(i) << 16 ) | ( hex.get(i+1)& 0xFFFF); + for (int i = 0; i < hex.size(); i += 2) { + int hexI = (hex.get(i) << 16) | (hex.get(i + 1) & 0xFFFF); float floatValue = Float.intBitsToFloat(hexI); floats.add(floatValue); - log.info("最终值是: {}" ,floatValue); - } - // 准备写入的寄存器数组 - Register[] writeRegisters = new Register[registerNum]; - for (int i = 0; i < registerNum; i++) { - writeRegisters[i] = new SimpleRegister(0); // 设置为0或者其他你需要写入的值 + log.info("最终值是: {}", floatValue); } - WriteMultipleRegistersRequest writeRequest = new WriteMultipleRegistersRequest(registerAddress, writeRegisters); - writeRequest.setUnitID(unitId); - ModbusTCPTransaction writeTransaction = new ModbusTCPTransaction(connection); - writeTransaction.setRequest(writeRequest); - writeTransaction.execute(); - log.info("寄存器已清零"); } else { log.info("处理数据出现异常"); } - // 关闭连接 - connection.close(); - log.info("关闭连接"); } catch (Exception e) { log.error("连接Modbus设备时出现异常: {}", e.getMessage()); e.printStackTrace(); @@ -221,7 +265,7 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl byteArrayList = new ArrayList(); for (InputRegister register : registers) { - short value = register.toShort(); - log.info("short类型: {}",value); + short value = register.toShort(); + log.info("short类型: {}", value); // 创建一个长度为 2 的字节数组 byte[] byteArray = new byte[2]; // 将 short 值转换成字节数组 @@ -277,18 +328,12 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl