Browse Source

PH设备读取

java8
wenkuan.shi 2 years ago
parent
commit
3da4eec606
  1. 12
      src/main/java/com/xujie/sys/common/utils/TaskUtils.java
  2. 2
      src/main/java/com/xujie/sys/modules/reader/entity/EquipmentDataDetail.java
  3. 2
      src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java
  4. 124
      src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java
  5. 2
      src/main/resources/application-dev.yml
  6. 5
      src/main/resources/mapper/reader/GetInformationForExcelMapper.xml

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

@ -30,15 +30,17 @@ public class TaskUtils {
eamService.eamWorkPlanTask();
}
//添加定時任務
// 添加定時任務
@Scheduled(cron = "${task.data.getExcelInformation}" ) //每五秒执行 读取文件数据
public void getExcel(){
getInformationForExcelService.saveByExcel();
}
//添加定時任務
// @Scheduled(cron = "${task.data.modbusCommunicate}" ) //每五秒执行 读取文件数据
// public void getModbus(){
// modbusCommunicateService.getInfoByModbus();
// }
@Scheduled(cron = "${task.data.modbusCommunicate}" ) //每五秒执行 读取文件数据
public void getModbus(){
modbusCommunicateService.getInfoByModbus();
}
}

2
src/main/java/com/xujie/sys/modules/reader/entity/EquipmentDataDetail.java

@ -40,4 +40,6 @@ public class EquipmentDataDetail {
private String fileValue1;
//第几住数据
private int groupValue;
private String inspectionNo;
}

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

@ -525,7 +525,7 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
//超过一百条数据做线程池新增新增
private void saveInformation(List<EquipmentDataDetail> equipmentDataDetails) {
//如果需要新增的数量小于一百就直接新增,大于一百就做线程池新增
if (equipmentDataDetails.size() < 100) {
if (equipmentDataDetails.size() < 80) {
//批量新增
getInformationForExcelMapper.saveByExcels(equipmentDataDetails);
} else {

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

@ -5,30 +5,45 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersRequest;
import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersResponse;
import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest;
import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
import com.ghgande.j2mod.modbus.procimg.InputRegister;
import com.ghgande.j2mod.modbus.procimg.Register;
import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
import com.xujie.sys.modules.reader.dao.GetInformationForExcelMapper;
import com.xujie.sys.modules.reader.dao.ModbusCommunicateMapper;
import com.xujie.sys.modules.reader.entity.EquipmentDataDetail;
import com.xujie.sys.modules.reader.entity.EquipmentFolderLocation;
import com.xujie.sys.modules.reader.entity.ModbusCommunicateEntity;
import com.xujie.sys.modules.reader.service.EquipmentFolderLocationService;
import com.xujie.sys.modules.reader.service.GetInformationForExcelService;
import com.xujie.sys.modules.reader.service.ModbusCommunicateService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateMapper,ModbusCommunicateEntity> implements ModbusCommunicateService {
@Autowired
private ModbusCommunicateMapper modbusCommunicateMapper;
private GetInformationForExcelMapper getInformationForExcelMapper;
@Autowired
private EquipmentFolderLocationService equipmentFolderLocationService;
@Autowired
private GetInformationForExcelService getInformationForExcelService;
@Override
@ -37,7 +52,6 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
LambdaQueryWrapper<EquipmentFolderLocation> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(EquipmentFolderLocation::getSuffix, "PLC");
EquipmentFolderLocation folderLocation = equipmentFolderLocationService.getOne(queryWrapper);
ModbusCommunicateEntity one = this.getOne(new LambdaQueryWrapper<>());
if (one == null) {
log.info("设备信息未填");
@ -55,12 +69,54 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
//获取单号
String inspectionOrderNumber = getInspectionOrderNumber(modbusIp, modbusPort, registerAddressInspection, registerNumInspection, unitId);
log.info("最终获取的检验单号是: {}" ,inspectionOrderNumber);
if (StringUtils.isEmpty(inspectionOrderNumber)|| inspectionOrderNumber.trim().equals("")){//判断是空或者是寄存器是零的话就返回
log.info("没有值或者已被清零");
return;
}
List<Float> floatValue = getValue(modbusIp, modbusPort, registerAddress, registerNum, unitId);
log.info("最终获取的数据是: {}" ,floatValue);
//判断这个批次号应该是多少
LambdaQueryWrapper<EquipmentDataDetail> query = new LambdaQueryWrapper<>();
query.eq(EquipmentDataDetail::getBuNo, folderLocation.getBuNo());
query.eq(EquipmentDataDetail::getSite, folderLocation.getSite());
query.eq(EquipmentDataDetail::getFileNo, folderLocation.getEquipmentNo())
.orderByAsc(EquipmentDataDetail::getBatchNo);
List<EquipmentDataDetail> equipments = getInformationForExcelService.list(query);
Integer batchNo;
if (CollectionUtils.isEmpty(equipments)) {
batchNo = 1;
} else {
Date createDate = equipments.get(equipments.size() - 1).getCreateDate();//获取最近新增一条信息的时间
Date date = new Date();
if (StringUtils.isEmpty(folderLocation.getBatchDate())) {
folderLocation.setBatchDate("1");
}
int time = Integer.parseInt(folderLocation.getBatchDate());
Long finalTime = date.getTime() - createDate.getTime();
if (finalTime / 1000 > time) {
batchNo = equipments.get(equipments.size() - 1).getBatchNo() + 1;
} else {
batchNo = equipments.get(equipments.size() - 1).getBatchNo();
}
}
List<Float> value = getValue(modbusIp, modbusPort, registerAddress, registerNum, unitId);
log.info("最终获取的数据是: {}" ,value);
List<EquipmentDataDetail> detailList = new ArrayList<>();
for (Float aFloat : floatValue) {
EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail();
equipmentDataDetail.setInspectionNo(inspectionOrderNumber);
equipmentDataDetail.setValue0(aFloat.toString());
equipmentDataDetail.setCreateDate(new Date());
equipmentDataDetail.setSite(folderLocation.getSite());
equipmentDataDetail.setEquipmentNo(folderLocation.getEquipmentNo());
equipmentDataDetail.setBuNo(folderLocation.getBuNo());
equipmentDataDetail.setBatchNo(batchNo);
detailList.add(equipmentDataDetail);
}
saveInformation(detailList);
}
//获取具体值
@Transactional
public List<Float> getValue(String modbusIp, int modbusPort, int registerAddress, int registerNum, int unitId) {
log.info("modbus请求开始解析");
// String modbusIp = "172.26.58.222";
@ -110,6 +166,17 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
floats.add(floatValue);
log.info("最终值是: {}" ,floatValue);
}
// 准备写入的寄存器数组
Register[] writeRegisters = new Register[registerNum];
for (int i = 0; i < registerNum; i++) {
writeRegisters[i] = new SimpleRegister(0); // 设置为0或者其他你需要写入的值
}
WriteMultipleRegistersRequest writeRequest = new WriteMultipleRegistersRequest(registerAddress, writeRegisters);
writeRequest.setUnitID(unitId);
ModbusTCPTransaction writeTransaction = new ModbusTCPTransaction(connection);
writeTransaction.setRequest(writeRequest);
writeTransaction.execute();
log.info("寄存器已清零");
} else {
log.info("处理数据出现异常");
}
@ -124,6 +191,7 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
}
//获取检验单号
@Transactional
public String getInspectionOrderNumber(String modbusIp, int modbusPort,int registerAddress,int registerNum,int unitId){
log.info("modbus请求开始解析");
// String modbusIp = "172.26.58.222";
@ -180,6 +248,18 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
finalString = stringBuilder.toString();
log.info("转换后的字符串: {}", finalString);
// 准备写入的寄存器数组
Register[] writeRegisters = new Register[registerNum];
for (int i = 0; i < registerNum; i++) {
writeRegisters[i] = new SimpleRegister(0); // 设置为0或者其他你需要写入的值
}
WriteMultipleRegistersRequest writeRequest = new WriteMultipleRegistersRequest(registerAddress, writeRegisters);
writeRequest.setUnitID(unitId);
ModbusTCPTransaction writeTransaction = new ModbusTCPTransaction(connection);
writeTransaction.setRequest(writeRequest);
writeTransaction.execute();
log.info("寄存器已清零");
} else {
log.info("处理数据出现异常");
}
@ -193,4 +273,40 @@ public class ModbusCommunicateServiceImpl extends ServiceImpl<ModbusCommunicateM
return finalString;
}
//超过一百条数据做线程池新增新增
private void saveInformation(List<EquipmentDataDetail> equipmentDataDetails) {
//如果需要新增的数量小于一百就直接新增,大于一百就做线程池新增
if (equipmentDataDetails.size() < 80) {
//批量新增
getInformationForExcelMapper.saveByExcels(equipmentDataDetails);
} else {
// 创建一个固定大小的线程池这里假设有10个线程
ExecutorService executor = Executors.newFixedThreadPool(equipmentDataDetails.size() / 80);
int startList = 0;
int endList = 80;
for (int i = startList; i < equipmentDataDetails.size(); i = startList) {
if (endList > equipmentDataDetails.size()) {
endList = equipmentDataDetails.size();
}
List<EquipmentDataDetail> details = equipmentDataDetails.subList(startList, endList);
executor.execute(() -> {
//批量新增
getInformationForExcelMapper.saveByExcels(details);
});
startList = startList + 80;
endList = endList + 80;
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有任务完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// 处理中断异常
}
}
}
}

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

@ -47,7 +47,7 @@ task:
site: 2,3 #事业部
eamWorkPlanTime: 0 0 0 * * ? #点检、维保计划自动生成,每天0点执行
getExcelInformation: 0/30 * * * * ? #每三十秒读取一次文件
modbusCommunicate: 0/10 * * * * ? #获取modbus数据
modbusCommunicate: 0/30 * * * * ? #获取modbus数据
#--------------------------------------------接口地址和开关控制-------------------------------------------------

5
src/main/resources/mapper/reader/GetInformationForExcelMapper.xml

@ -24,12 +24,13 @@
<result column="num" jdbcType="INTEGER" property="num" />
<result column="file_value1" jdbcType="INTEGER" property="fileValue1" />
<result column="group_value" jdbcType="INTEGER" property="groupValue" />
<result column="inspection_no" jdbcType="INTEGER" property="inspectionNo" />
</resultMap>
<insert id="saveByExcels" parameterType="com.xujie.sys.modules.reader.entity.EquipmentDataDetail">
insert into Equipment_data_detail(site,bu_no,equipment_no,item_no,value0,value1,value2,value3,value4,value5,value6,value7,value8,value9,create_date,create_by,batch_no,file_no,photo_value1,num,file_value1,group_value)
insert into Equipment_data_detail(site,bu_no,equipment_no,item_no,value0,value1,value2,value3,value4,value5,value6,value7,value8,value9,create_date,create_by,batch_no,file_no,photo_value1,num,file_value1,group_value,inspection_no)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.site},#{item.buNo},#{item.equipmentNo},#{item.itemNo},#{item.value0},#{item.value1},#{item.value2},#{item.value3},#{item.value4},#{item.value5},#{item.value6},#{item.value7},#{item.value8},#{item.value9},#{item.createDate},#{item.createBy},#{item.batchNo},#{item.fileNo},#{item.photoValue1},#{item.num},#{item.fileValue1},#{item.groupValue})
(#{item.site},#{item.buNo},#{item.equipmentNo},#{item.itemNo},#{item.value0},#{item.value1},#{item.value2},#{item.value3},#{item.value4},#{item.value5},#{item.value6},#{item.value7},#{item.value8},#{item.value9},#{item.createDate},#{item.createBy},#{item.batchNo},#{item.fileNo},#{item.photoValue1},#{item.num},#{item.fileValue1},#{item.groupValue},#{item.inspectionNo})
</foreach>
</insert>
</mapper>
Loading…
Cancel
Save