运行策略轮询PCS设备配置读取逻辑修改
This commit is contained in:
@ -1,5 +1,7 @@
|
|||||||
package com.xzzn.quartz.task;
|
package com.xzzn.quartz.task;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.xzzn.common.core.modbus.ModbusProcessor;
|
import com.xzzn.common.core.modbus.ModbusProcessor;
|
||||||
import com.xzzn.common.core.modbus.domain.DeviceConfig;
|
import com.xzzn.common.core.modbus.domain.DeviceConfig;
|
||||||
import com.xzzn.common.core.modbus.domain.WriteTagConfig;
|
import com.xzzn.common.core.modbus.domain.WriteTagConfig;
|
||||||
@ -12,18 +14,15 @@ import com.xzzn.common.utils.StringUtils;
|
|||||||
import com.xzzn.ems.domain.EmsAmmeterData;
|
import com.xzzn.ems.domain.EmsAmmeterData;
|
||||||
import com.xzzn.ems.domain.EmsBatteryStack;
|
import com.xzzn.ems.domain.EmsBatteryStack;
|
||||||
import com.xzzn.ems.domain.EmsDevicesSetting;
|
import com.xzzn.ems.domain.EmsDevicesSetting;
|
||||||
import com.xzzn.ems.domain.EmsPcsData;
|
import com.xzzn.ems.domain.EmsPcsSetting;
|
||||||
import com.xzzn.ems.domain.EmsPointMatch;
|
|
||||||
import com.xzzn.ems.domain.EmsStrategyLog;
|
import com.xzzn.ems.domain.EmsStrategyLog;
|
||||||
import com.xzzn.ems.domain.EmsStrategyTemp;
|
import com.xzzn.ems.domain.EmsStrategyTemp;
|
||||||
import com.xzzn.ems.domain.EmsStrategyTimeConfig;
|
import com.xzzn.ems.domain.EmsStrategyTimeConfig;
|
||||||
import com.xzzn.ems.domain.vo.DeviceUpdateRequest;
|
|
||||||
import com.xzzn.ems.domain.vo.StrategyRunningVo;
|
import com.xzzn.ems.domain.vo.StrategyRunningVo;
|
||||||
import com.xzzn.ems.mapper.EmsAmmeterDataMapper;
|
import com.xzzn.ems.mapper.EmsAmmeterDataMapper;
|
||||||
import com.xzzn.ems.mapper.EmsBatteryStackMapper;
|
import com.xzzn.ems.mapper.EmsBatteryStackMapper;
|
||||||
import com.xzzn.ems.mapper.EmsDevicesSettingMapper;
|
import com.xzzn.ems.mapper.EmsDevicesSettingMapper;
|
||||||
import com.xzzn.ems.mapper.EmsPcsDataMapper;
|
import com.xzzn.ems.mapper.EmsPcsSettingMapper;
|
||||||
import com.xzzn.ems.mapper.EmsPointMatchMapper;
|
|
||||||
import com.xzzn.ems.mapper.EmsStrategyLogMapper;
|
import com.xzzn.ems.mapper.EmsStrategyLogMapper;
|
||||||
import com.xzzn.ems.mapper.EmsStrategyRunningMapper;
|
import com.xzzn.ems.mapper.EmsStrategyRunningMapper;
|
||||||
import com.xzzn.ems.mapper.EmsStrategyTempMapper;
|
import com.xzzn.ems.mapper.EmsStrategyTempMapper;
|
||||||
@ -38,6 +37,7 @@ import java.util.Collections;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
@ -69,11 +69,9 @@ public class StrategyPoller {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryStackMapper emsBatteryStackMapper;
|
private EmsBatteryStackMapper emsBatteryStackMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsPcsDataMapper emsPcsDataMapper;
|
|
||||||
@Autowired
|
|
||||||
private EmsDevicesSettingMapper emsDevicesMapper;
|
private EmsDevicesSettingMapper emsDevicesMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsPointMatchMapper emsPointMatchMapper;
|
private EmsPcsSettingMapper emsPcsSettingMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsAmmeterDataMapper emsAmmeterDataMapper;
|
private EmsAmmeterDataMapper emsAmmeterDataMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -150,32 +148,36 @@ public class StrategyPoller {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 查询PCS设备信息
|
// 查询PCS设备信息
|
||||||
List<EmsPcsData> pcsDataList = emsPcsDataMapper.getSitePcsDataInfo(siteId);
|
EmsDevicesSetting queryDevices = new EmsDevicesSetting();
|
||||||
if (CollectionUtils.isEmpty(pcsDataList)) {
|
queryDevices.setSiteId(siteId);
|
||||||
|
queryDevices.setDeviceCategory(DeviceCategory.PCS.getCode());
|
||||||
|
List<EmsDevicesSetting> pcsDeviceList = emsDevicesMapper.selectEmsDevicesSettingList(queryDevices);
|
||||||
|
if (CollectionUtils.isEmpty(pcsDeviceList)) {
|
||||||
logger.info("当前站点: {} 未配置PCS设备", siteId);
|
logger.info("当前站点: {} 未配置PCS设备", siteId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 判断SOC上限和下限是否在范围内
|
// 判断SOC上限和下限是否在范围内
|
||||||
if (isSocInRange(emsStrategyTemp)) {
|
if (isSocInRange(emsStrategyTemp)) {
|
||||||
BigDecimal avgChargeDischargePower = emsStrategyTemp.getChargeDischargePower().divide(new BigDecimal(pcsDataList.size()));
|
BigDecimal avgChargeDischargePower = emsStrategyTemp.getChargeDischargePower().divide(new BigDecimal(pcsDeviceList.size()));
|
||||||
for (EmsPcsData pcsData : pcsDataList) {
|
for (EmsDevicesSetting pcsDevice : pcsDeviceList) {
|
||||||
if (pcsData.getClusterNum() == null || pcsData.getClusterNum() < 1) {
|
EmsPcsSetting pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(pcsDevice.getId());
|
||||||
logger.info("当前站点: {}, PCS设备: {} 未获取电池簇数量", siteId, pcsData.getDeviceId());
|
if (pcsSetting == null || pcsSetting.getClusterNum() < 1) {
|
||||||
|
logger.info("当前站点: {}, PCS设备: {} 未获取电池簇数量", siteId, pcsDevice.getDeviceId());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 平均功率值,根据电池簇数量进行平均分配
|
// 平均功率值,根据电池簇数量进行平均分配
|
||||||
avgChargeDischargePower = avgChargeDischargePower.divide(new BigDecimal(pcsData.getClusterNum()));
|
avgChargeDischargePower = avgChargeDischargePower.divide(new BigDecimal(pcsSetting.getClusterNum()));
|
||||||
// 根据充电状态,处理数据
|
// 根据充电状态,处理数据
|
||||||
if (ChargeStatus.CHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) {
|
if (ChargeStatus.CHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) {
|
||||||
// 发送Modbus命令控制设备-充电
|
// 发送Modbus命令控制设备-充电
|
||||||
sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.CHARGING, avgChargeDischargePower, emsStrategyTemp, false);
|
sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.CHARGING, avgChargeDischargePower, emsStrategyTemp, false);
|
||||||
} else if (ChargeStatus.DISCHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) {
|
} else if (ChargeStatus.DISCHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) {
|
||||||
// 判断是否需要防逆流,PCS降功率运行
|
// 判断是否需要防逆流,PCS降功率运行
|
||||||
boolean needAntiReverseFlow = isNeedAntiReverseFlow(emsStrategyTemp);
|
boolean needAntiReverseFlow = isNeedAntiReverseFlow(emsStrategyTemp);
|
||||||
if (needAntiReverseFlow) {
|
if (needAntiReverseFlow) {
|
||||||
BigDecimal powerDown = ANTI_REVERSE_POWER_DOWN_PERCENT;
|
BigDecimal powerDown = ANTI_REVERSE_POWER_DOWN_PERCENT;
|
||||||
// 查询站点PCS功率降幅记录,如果有则累加增幅
|
// 查询站点PCS功率降幅记录,如果有则累加增幅
|
||||||
List<EmsStrategyLog> strategyLogList = getStrategyLog(pcsData.getDeviceId(), emsStrategyTemp.getChargeStatus(), emsStrategyTemp, needAntiReverseFlow);
|
List<EmsStrategyLog> strategyLogList = getStrategyLog(pcsDevice.getDeviceId(), emsStrategyTemp.getChargeStatus(), emsStrategyTemp, needAntiReverseFlow);
|
||||||
if (CollectionUtils.isNotEmpty(strategyLogList)) {
|
if (CollectionUtils.isNotEmpty(strategyLogList)) {
|
||||||
// 判断上次防逆流时间是否已经过了15分钟
|
// 判断上次防逆流时间是否已经过了15分钟
|
||||||
if (DateUtils.differentMinutesByMillisecond(strategyLogList.get(0).getExecutionDate(), new Date()) < 15) {
|
if (DateUtils.differentMinutesByMillisecond(strategyLogList.get(0).getExecutionDate(), new Date()) < 15) {
|
||||||
@ -188,19 +190,19 @@ public class StrategyPoller {
|
|||||||
if (BigDecimal.ZERO.compareTo(avgChargeDischargePower) == 0) {
|
if (BigDecimal.ZERO.compareTo(avgChargeDischargePower) == 0) {
|
||||||
// 如果已经降功率到0,则设备直接待机
|
// 如果已经降功率到0,则设备直接待机
|
||||||
// 发送Modbus命令控制设备-待机
|
// 发送Modbus命令控制设备-待机
|
||||||
sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, needAntiReverseFlow);
|
sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, needAntiReverseFlow);
|
||||||
} else {
|
} else {
|
||||||
// 发送Modbus命令控制设备-放电
|
// 发送Modbus命令控制设备-放电
|
||||||
sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.DISCHARGING, avgChargeDischargePower, emsStrategyTemp, needAntiReverseFlow);
|
sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.DISCHARGING, avgChargeDischargePower, emsStrategyTemp, needAntiReverseFlow);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 发送Modbus命令控制设备-待机
|
// 发送Modbus命令控制设备-待机
|
||||||
sendModbusCommand(Collections.singletonList(pcsData), ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false);
|
sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 发送Modbus命令控制设备-待机
|
// 发送Modbus命令控制设备-待机
|
||||||
sendModbusCommand(pcsDataList, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false);
|
sendModbusCommand(pcsDeviceList, null, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,12 +255,14 @@ public class StrategyPoller {
|
|||||||
return emsAmmeterData.getTotalActivePower().compareTo(upperLimit) < 0;
|
return emsAmmeterData.getTotalActivePower().compareTo(upperLimit) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<WriteTagConfig> getWriteTags(List<EmsPointMatch> pointMatchList,
|
public List<WriteTagConfig> getWriteTags(EmsPcsSetting pcsSetting,
|
||||||
ChargeStatus chargeStatus, BigDecimal chargeDischargePower) {
|
ChargeStatus chargeStatus, BigDecimal chargeDischargePower) {
|
||||||
List<WriteTagConfig> writeTags = new ArrayList<>();
|
List<WriteTagConfig> writeTags = new ArrayList<>();
|
||||||
for (EmsPointMatch pointMatch : pointMatchList) {
|
JSONArray array = JSON.parseArray(pcsSetting.getClusterPointAddress());
|
||||||
WriteTagConfig writeTag = new WriteTagConfig();
|
for (int i = 0; i < pcsSetting.getClusterNum(); i++) {
|
||||||
writeTag.setAddress(pointMatch.getIpAddress());
|
Object clusterPointAddress = array.get(i);
|
||||||
|
WriteTagConfig clusterWriteTag = new WriteTagConfig();
|
||||||
|
clusterWriteTag.setAddress(String.valueOf(clusterPointAddress));
|
||||||
// if (ChargeStatus.CHARGING.equals(chargeStatus)) {
|
// if (ChargeStatus.CHARGING.equals(chargeStatus)) {
|
||||||
// writeTag.setValue(chargeDischargePower);
|
// writeTag.setValue(chargeDischargePower);
|
||||||
// } else if (ChargeStatus.DISCHARGING.equals(chargeStatus)) {
|
// } else if (ChargeStatus.DISCHARGING.equals(chargeStatus)) {
|
||||||
@ -267,8 +271,8 @@ public class StrategyPoller {
|
|||||||
// // 待机状态-电池簇PCS有功功率给定置0
|
// // 待机状态-电池簇PCS有功功率给定置0
|
||||||
// writeTag.setValue(chargeDischargePower);
|
// writeTag.setValue(chargeDischargePower);
|
||||||
// }
|
// }
|
||||||
writeTag.setValue(chargeDischargePower);
|
clusterWriteTag.setValue(chargeDischargePower);
|
||||||
writeTags.add(writeTag);
|
writeTags.add(clusterWriteTag);
|
||||||
}
|
}
|
||||||
return writeTags;
|
return writeTags;
|
||||||
}
|
}
|
||||||
@ -282,24 +286,18 @@ public class StrategyPoller {
|
|||||||
return matchFields;
|
return matchFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeviceConfig getDeviceConfig(EmsPcsData pcsData, ChargeStatus chargeStatus, BigDecimal chargeDischargePower) {
|
public DeviceConfig getDeviceConfig(String siteId, String deviceId, EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower) {
|
||||||
EmsDevicesSetting device = emsDevicesMapper.getDeviceBySiteAndDeviceId(pcsData.getDeviceId(), pcsData.getSiteId());
|
EmsDevicesSetting device = emsDevicesMapper.getDeviceBySiteAndDeviceId(deviceId, siteId);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
logger.info("当前站点: {}, PCS设备: {} 未找到对应设备配置信息", pcsData.getSiteId(), pcsData.getDeviceId());
|
logger.info("当前站点: {}, PCS设备: {} 未找到对应设备配置信息", siteId, deviceId);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
DeviceUpdateRequest query = new DeviceUpdateRequest();
|
if (Objects.isNull(pcsSetting)) {
|
||||||
query.setSiteId(device.getSiteId());
|
pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(device.getId());
|
||||||
query.setDeviceId(device.getDeviceId());
|
if (pcsSetting == null) {
|
||||||
query.setMatchFields(getMatchFields(pcsData.getClusterNum()));
|
logger.info("当前站点: {}, PCS设备: {} 未找到对应PCS配置", siteId, deviceId);
|
||||||
query.setDeviceCategory(DeviceCategory.PCS.getCode());
|
|
||||||
List<EmsPointMatch> pointMatchList = emsPointMatchMapper.selectDeviceStatusPoint(query);
|
|
||||||
if (CollectionUtils.isEmpty(pointMatchList)) {
|
|
||||||
logger.info("当前站点: {}, PCS设备: {} 未找到对应设备点位字段配置", pcsData.getSiteId(), pcsData.getDeviceId());
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (pointMatchList.size() != pcsData.getClusterNum()) {
|
|
||||||
logger.info("当前站点: {}, PCS设备: {} 设备点位字段配置数量与电池簇数不一致", pcsData.getSiteId(), pcsData.getDeviceId());
|
|
||||||
}
|
}
|
||||||
DeviceConfig deviceConfig = new DeviceConfig();
|
DeviceConfig deviceConfig = new DeviceConfig();
|
||||||
deviceConfig.setDeviceNumber(device.getDeviceId());
|
deviceConfig.setDeviceNumber(device.getDeviceId());
|
||||||
@ -307,28 +305,30 @@ public class StrategyPoller {
|
|||||||
deviceConfig.setSlaveId(device.getSlaveId().intValue());
|
deviceConfig.setSlaveId(device.getSlaveId().intValue());
|
||||||
deviceConfig.setHost(device.getIpAddress());
|
deviceConfig.setHost(device.getIpAddress());
|
||||||
deviceConfig.setPort(device.getIpPort().intValue());
|
deviceConfig.setPort(device.getIpPort().intValue());
|
||||||
deviceConfig.setWriteTags(getWriteTags(pointMatchList, chargeStatus, chargeDischargePower));
|
deviceConfig.setWriteTags(getWriteTags(pcsSetting, chargeStatus, chargeDischargePower));
|
||||||
return deviceConfig;
|
return deviceConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendModbusCommand(List<EmsPcsData> pcsDataList, ChargeStatus chargeStatus, BigDecimal chargeDischargePower,
|
private void sendModbusCommand(List<EmsDevicesSetting> pcsDeviceList, EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower,
|
||||||
EmsStrategyTemp emsStrategyTemp, boolean needAntiReverseFlow) {
|
EmsStrategyTemp emsStrategyTemp, boolean needAntiReverseFlow) {
|
||||||
for (EmsPcsData pcsData : pcsDataList) {
|
for (EmsDevicesSetting pcsDevice : pcsDeviceList) {
|
||||||
List<EmsStrategyLog> strategyLogList = getStrategyLog(pcsData.getDeviceId(), chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow);
|
String siteId = pcsDevice.getSiteId();
|
||||||
|
String deviceId = pcsDevice.getDeviceId();
|
||||||
|
List<EmsStrategyLog> strategyLogList = getStrategyLog(deviceId, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow);
|
||||||
if (CollectionUtils.isNotEmpty(strategyLogList) && !ChargeStatus.DISCHARGING.equals(chargeStatus) && !needAntiReverseFlow) {
|
if (CollectionUtils.isNotEmpty(strategyLogList) && !ChargeStatus.DISCHARGING.equals(chargeStatus) && !needAntiReverseFlow) {
|
||||||
logger.info("当前站点: {}, PCS设备: {} 当前时间段已存在策略执行记录,不再重复执行", pcsData.getSiteId(), pcsData.getDeviceId());
|
logger.info("当前站点: {}, PCS设备: {} 当前时间段已存在策略执行记录,不再重复执行", siteId, deviceId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
DeviceConfig deviceConfig = getDeviceConfig(pcsData, chargeStatus, chargeDischargePower);
|
DeviceConfig deviceConfig = getDeviceConfig(siteId, deviceId, pcsSetting, chargeStatus, chargeDischargePower);
|
||||||
if (deviceConfig == null) {
|
if (deviceConfig == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean result = modbusProcessor.writeDataToDevice(deviceConfig);
|
boolean result = modbusProcessor.writeDataToDevice(deviceConfig);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", pcsData.getSiteId(), pcsData.getDeviceId(), chargeStatus.getInfo());
|
logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", siteId, deviceId, chargeStatus.getInfo());
|
||||||
}
|
}
|
||||||
// 记录策略执行日志
|
// 记录策略执行日志
|
||||||
saveStrategyLog(pcsData.getDeviceId(), chargeDischargePower, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow);
|
saveStrategyLog(deviceId, chargeDischargePower, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user