Browse Source

20240830

java8
qiezi 2 years ago
parent
commit
e324633ddb
  1. 4
      src/main/java/com/xujie/sys/common/utils/TaskUtils.java
  2. 3
      src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java
  3. 55
      src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java
  4. 174
      src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java
  5. 43
      src/main/java/com/xujie/sys/modules/reader/util/CollectUtil.java
  6. 1
      src/main/resources/application-dev.yml

4
src/main/java/com/xujie/sys/common/utils/TaskUtils.java

@ -59,5 +59,9 @@ public class TaskUtils {
modbusCommunicateService.getInfoByModbus();
}
@Scheduled(cron = "${task.data.readPerSecond}")
public void readPerSecond(){
modbusCommunicateService.readPerSecond();
}
}

3
src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java

@ -3,4 +3,7 @@ package com.xujie.sys.modules.reader.service;
public interface ModbusCommunicateService {
void getInfoByModbus();
void readPerSecond();
}

55
src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java

@ -1,5 +1,6 @@
package com.xujie.sys.modules.reader.service.impl;
import cn.hutool.core.io.FileTypeUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -19,11 +20,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.imageio.ImageIO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -80,6 +84,45 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
}
}
private void saveFileList(EquipmentFolderLocation location){
//获取文件夹下所有文件
//创建本地文件夹路径
File fileInfo = new File(location.getFolderPath());
//获取本地文件夹下所有文件
File[] files = fileInfo.listFiles();
//如果文件夹下面的文件是空,则退出
if (files == null ||files.length==0) {
return;
}
Map<String, List<File>> map = new HashMap<>();
for (File file : files) {
String fileName = file.getName();
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index + 1);
if (!map.containsKey(fileType)){
List<File> list = new ArrayList<>();
list.add(file);
map.put(fileType, list);
} else {
map.get(fileType).add(file);
}
}
for (String fileType : map.keySet()) {
if (!location.getSuffix().contains(fileType)){
continue;
}
List<File> fileList = map.get(fileType);
for (File file : fileList) {
//处理文件
// 拷贝文件
// 删除文件
}
}
}
private void saveInformation(EquipmentFolderLocation equipmentFolderLocation) throws Exception {
String folderFiler = equipmentFolderLocation.getFolderPath();
//获取文件夹下所有文件
@ -186,7 +229,17 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
}
//将图片改成复制后的名字路径
List<EquipmentDataDetail> equipmentDataDetails = saveImage(list, equipmentFolderLocation, batchNo);
getInformationForExcelMapper.saveByExcels(equipmentDataDetails);
int count = 50;
for (int i = 0; i < equipmentDataDetails.size() / count; i++) {
List<EquipmentDataDetail> details = new ArrayList<>();
for (int j = 0; j < count; j++) {
details.add(equipmentDataDetails.get(i*count+j));
}
baseMapper.saveByExcels(details);
}
if (equipmentDataDetails.size() % count!= 0){
baseMapper.saveByExcels(equipmentDataDetails.subList(equipmentDataDetails.size() - (equipmentDataDetails.size() % count), equipmentDataDetails.size()));
}
for (String s : imageFiles) {
int index = 1;
// 创建源文件对象和目标文件夹对象

174
src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java

@ -12,10 +12,9 @@ import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
import com.xujie.sys.modules.reader.dao.GetInformationForExcelMapper;
import com.xujie.sys.modules.reader.entity.EquipmentDataDetail;
import com.xujie.sys.modules.reader.entity.EquipmentFolderLocation;
import com.xujie.sys.modules.reader.service.EquipmentFolderLocationService;
import com.xujie.sys.modules.reader.service.EquipmentFolderSortService;
import com.xujie.sys.modules.reader.service.GetInformationForExcelService;
import com.xujie.sys.modules.reader.service.ModbusCommunicateService;
import com.xujie.sys.modules.reader.entity.EquipmentFolderSortEntity;
import com.xujie.sys.modules.reader.service.*;
import com.xujie.sys.modules.reader.util.CollectUtil;
import com.xujie.sys.modules.report.dao.ProcedureDao;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -24,11 +23,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.sound.sampled.Port;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@ -42,6 +44,8 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService {
@Autowired
private EquipmentFolderLocationService equipmentFolderLocationService;
@Autowired
private EquipmentDataDetailService equipmentDataDetailService;
@Autowired
private GetInformationForExcelService getInformationForExcelService;
@Autowired
@ -55,31 +59,33 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService {
public void getInfoByModbus() {
log.info("modbus请求开始解析");
long startTime = System.nanoTime();
EquipmentFolderLocation folderLocation = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").one();
if (folderLocation == null) {
List<EquipmentFolderLocation> list = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").list();
if (list.isEmpty()){
log.error("设备消息未维护");
return;
}
final String MODBUS_IP = folderLocation.getIp();
if (StringUtils.isEmpty(MODBUS_IP) || "127.0.0.1".equals(MODBUS_IP)) {
return;
}
final int MODBUS_PORT = folderLocation.getPort();
int registerAddress = folderLocation.getRegisterAddress();
int registerNum = folderLocation.getRegisterNum();
int unitId = folderLocation.getUnitId();
int registerAddressInspection = folderLocation.getRegisterAddressInspection();
int registerNumInspection = folderLocation.getRegisterNumInspection();
//获取单号
String inspectionOrderNumber = getInspectionOrderNumber(MODBUS_IP, MODBUS_PORT, registerAddressInspection, registerNumInspection, unitId).trim();
if (StringUtils.isEmpty(inspectionOrderNumber)) {//判断是空或者是寄存器是零的话就返回
return;
}
for (EquipmentFolderLocation folderLocation : list) {
//EquipmentFolderLocation folderLocation = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").one();
final String MODBUS_IP = folderLocation.getIp();
if (StringUtils.isEmpty(MODBUS_IP) || "127.0.0.1".equals(MODBUS_IP)) {
return;
}
final int MODBUS_PORT = folderLocation.getPort();
int registerAddress = folderLocation.getRegisterAddress();
int registerNum = folderLocation.getRegisterNum();
int unitId = folderLocation.getUnitId();
int registerAddressInspection = folderLocation.getRegisterAddressInspection();
int registerNumInspection = folderLocation.getRegisterNumInspection();
//获取单号
String inspectionOrderNumber = getInspectionOrderNumber(MODBUS_IP, MODBUS_PORT, registerAddressInspection, registerNumInspection, unitId).trim();
if (StringUtils.isEmpty(inspectionOrderNumber)) {//判断是空或者是寄存器是零的话就返回
return;
}
//获取对应检验单号的值
List<List<Float>> floatValues = getValue(MODBUS_IP, MODBUS_PORT, registerAddress, registerNum, unitId);
//获取对应检验单号的值
List<List<Float>> floatValues = getValue(MODBUS_IP, MODBUS_PORT, registerAddress, registerNum, unitId);
//获取对应的batchNo
//获取对应的batchNo
// LambdaQueryWrapper<EquipmentFolderSortEntity> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(EquipmentFolderSortEntity::getSite,folderLocation.getSite());
// wrapper.eq(EquipmentFolderSortEntity::getBuNo,folderLocation.getBuNo());
@ -118,29 +124,107 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService {
// }
// }
int num = 1;
List<EquipmentDataDetail> detailList = new ArrayList<>();
for (List<Float> aFloat : floatValues) {
for (Float aFloat1 : aFloat) {
EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail();
equipmentDataDetail.setInspectionNo(inspectionOrderNumber);
equipmentDataDetail.setValue0(aFloat1.toString());
equipmentDataDetail.setCreateDate(new Date());
equipmentDataDetail.setSite(folderLocation.getSite());
equipmentDataDetail.setEquipmentNo(folderLocation.getEquipmentNo());
equipmentDataDetail.setBuNo(folderLocation.getBuNo());
equipmentDataDetail.setBatchNo(1);
equipmentDataDetail.setNum(num);
detailList.add(equipmentDataDetail);
num++;
int num = 1;
List<EquipmentDataDetail> detailList = new ArrayList<>();
for (List<Float> aFloat : floatValues) {
for (Float aFloat1 : aFloat) {
EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail();
equipmentDataDetail.setInspectionNo(inspectionOrderNumber);
equipmentDataDetail.setValue0(aFloat1.toString());
equipmentDataDetail.setCreateDate(new Date());
equipmentDataDetail.setSite(folderLocation.getSite());
equipmentDataDetail.setEquipmentNo(folderLocation.getEquipmentNo());
equipmentDataDetail.setBuNo(folderLocation.getBuNo());
equipmentDataDetail.setBatchNo(1);
equipmentDataDetail.setNum(num);
detailList.add(equipmentDataDetail);
num++;
}
}
long endTime = System.nanoTime();
long elapsedTimeInNanos = endTime - startTime;
double elapsedTimeInSeconds = (double) elapsedTimeInNanos / 1_000_000_000.0;
log.info("总时间: {}", elapsedTimeInSeconds);
log.info("num: {}", num);
saveInformation(detailList);
}
}
@Override
@Transactional
public void readPerSecond() {
List<EquipmentFolderLocation> list = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "RS232/RS485").list();
if (list.isEmpty()){
log.info("没有维护RS232/RS485的设备信息");
return;
}
for (EquipmentFolderLocation device : list) {
String IP = device.getIp();//IP
int PORT = device.getPort();//端口
int unitId = device.getUnitId();// 从站ID
int ref = device.getRegisterAddress();// 开始地址
int count = device.getRegisterNum();//数量
int size = device.getRegisterAddressInspection();// 记录条数所在寄存器地址
String type = device.getRegisterNumColumntype();// 类型
EquipmentFolderSortEntity sort = equipmentFolderSortService.lambdaQuery()
.eq(EquipmentFolderSortEntity::getSite, device.getSite())
.eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo())
.eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo())
.one();
log.info("IP:{},Port:{}",IP, PORT);
Integer value = CollectUtil.getValue(IP, PORT, unitId, size-1);
if (Objects.isNull(sort) || value == null) {
continue;
}else if (Integer.valueOf(sort.getBatchNo()).equals(value)){
continue;
}else if (value.equals(0)){
equipmentFolderSortService.lambdaUpdate()
.eq(EquipmentFolderSortEntity::getSite, device.getSite())
.eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo())
.eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo())
.set(EquipmentFolderSortEntity::getBatchNo,value)
.update();
continue;
}
List<Integer> values = CollectUtil.getValues(IP, PORT, unitId, ref-1, count);
List<EquipmentDataDetail> details = new ArrayList<>();
Date createDate = new Date();
if ("float".equals(type) && count % 2 == 0){
for (int i = 0; i < values.size(); i+=2) {
EquipmentDataDetail detail = new EquipmentDataDetail();
detail.setSite(device.getSite());
detail.setBuNo(device.getBuNo());
detail.setFileNo(device.getFileNo());
detail.setValue0(values.get(i)+"."+values.get(i+1));
detail.setNum(value);
detail.setCreateDate(createDate);
detail.setEquipmentNo(device.getEquipmentNo());
details.add(detail);
}
}else if ("int".equals(type)){
for (int i = 0; i < values.size(); i++) {
EquipmentDataDetail detail = new EquipmentDataDetail();
detail.setSite(device.getSite());
detail.setBuNo(device.getBuNo());
detail.setFileNo(device.getFileNo());
detail.setValue0(values.get(i).toString());
detail.setNum(value);
detail.setCreateDate(createDate);
detail.setEquipmentNo(device.getEquipmentNo());
details.add(detail);
}
}
for (EquipmentDataDetail detail : details) {
equipmentDataDetailService.save(detail);
}
equipmentFolderSortService.lambdaUpdate()
.eq(EquipmentFolderSortEntity::getSite, device.getSite())
.eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo())
.eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo())
.set(EquipmentFolderSortEntity::getBatchNo,value)
.update();
}
long endTime = System.nanoTime();
long elapsedTimeInNanos = endTime - startTime;
double elapsedTimeInSeconds = (double) elapsedTimeInNanos / 1_000_000_000.0;
log.info("总时间: {}", elapsedTimeInSeconds);
log.info("num: {}", num);
saveInformation(detailList);
}
//应为modbus 寄存器每次最大请求一百多个 这里一次连接多次分多次请求

43
src/main/java/com/xujie/sys/modules/reader/util/CollectUtil.java

@ -0,0 +1,43 @@
package com.xujie.sys.modules.reader.util;
import com.ghgande.j2mod.modbus.ModbusException;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.ghgande.j2mod.modbus.procimg.Register;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class CollectUtil {
public static Integer getValue(String IP, int port,int unitId,int ref){
ModbusTCPMaster master = new ModbusTCPMaster(IP, port);
try {
master.connect();
Register[] read = master.readMultipleRegisters(unitId,ref,1);
return read[0].getValue();
} catch (Exception e) {
log.error("连接失败", e);
}finally {
master.disconnect();
}
return null;
}
public static List<Integer> getValues(String IP, int port,int unitId,int ref,int count){
ModbusTCPMaster master = new ModbusTCPMaster(IP, port);
try {
master.connect();
Register[] read = master.readMultipleRegisters(unitId,ref,count);
return Arrays.stream(read).map(Register::getValue).collect(Collectors.toList());
} catch (Exception e) {
log.error("连接失败", e);
}finally {
master.disconnect();
}
return new ArrayList<>();
}
}

1
src/main/resources/application-dev.yml

@ -46,6 +46,7 @@ task:
eamWorkPlanTime: 0 0 0 * * ? #点检、维保计划自动生成,每天0点执行
getExcelInformation: 0/30 * * * * ? #每三十秒读取一次文件
modbusCommunicate: 0/30 * * * * ? #获取modbus数据
readPerSecond: 0 0/1 * * * ? #每分钟执行一次
#发送邮件,每天中午12点执行一次
# sendEmail: 0 0 12 * * ?
# sendEmail: 0 0/1 * * * ? #每分钟执行一次

Loading…
Cancel
Save