@ -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 modbusCommunicate Mapper;
private GetInformationForExcelMapper getInformationForExcel Mapper;
@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 ( ) ;
/ / 处理中断异常
}
}
}
}