|
@@ -35,7 +35,7 @@ public class CalculateService {
|
|
|
/**
|
|
|
* 设备id,状态点列表
|
|
|
*/
|
|
|
- private Map<String, List<PointData>> stateDatas=new HashMap<>();
|
|
|
+ private final Map<String, List<PointData>> stateDatas=new HashMap<>();
|
|
|
Map<Double, String> stateMap;
|
|
|
|
|
|
public void refresh(long starttime, long endtime){
|
|
@@ -69,9 +69,20 @@ public class CalculateService {
|
|
|
//判断事前状态
|
|
|
if(advanceState==4){
|
|
|
//计算限电
|
|
|
- calcElectricityRation(stateCauseList,thingId,advanceTime,ts,doubleValue);
|
|
|
+ LinkedHashMap<Long, Long> map = calcElectricityRation(thingId, advanceTime, ts);
|
|
|
+ StateCause cause;
|
|
|
+ for (Map.Entry<Long, Long> entry : map.entrySet()) {
|
|
|
+ if(entry.getKey().equals(doubleValue)){
|
|
|
+ cause = new StateCause(thingId2StationId(thingId), thingId, stateMap.get(8.0),new Date(entry.getKey()),
|
|
|
+ new Date(entry.getValue()), stateMap.get(4.0), stateMap.get(doubleValue), entry.getValue() - entry.getKey());
|
|
|
+ }else {
|
|
|
+ cause = new StateCause(thingId2StationId(thingId), thingId, stateMap.get(8.0),new Date(entry.getKey()),
|
|
|
+ new Date(entry.getValue()), stateMap.get(4.0), stateMap.get(4.0), entry.getValue() - entry.getKey());
|
|
|
+ }
|
|
|
+ stateCauseList.add(cause);
|
|
|
+ }
|
|
|
}else if(advanceState==2){
|
|
|
- if(judgmentStop(stateCauseList,thingId,advanceTime,ts)){
|
|
|
+ if(judgmentStop(thingId,advanceTime,ts)){
|
|
|
StateCause cause = new StateCause(thingId2StationId(thingId),thingId, stateMap.get(8.0),
|
|
|
new Date(advanceTime),new Date(ts), stateMap.get(2.0),stateMap.get(doubleValue),ts -advanceTime);
|
|
|
stateCauseList.add(cause);
|
|
@@ -93,15 +104,16 @@ public class CalculateService {
|
|
|
stateCauseList.add(cause);
|
|
|
}
|
|
|
}else if(advanceState==5){
|
|
|
- if(ts-advanceTime<appConfig.getFaulttime()* 60000L) continue;
|
|
|
+ if(ts-advanceTime<appConfig.getLongTime().get("fault-min")) continue;
|
|
|
//计算受累、故障
|
|
|
calcBurdened(stateCauseList,thingId,advanceTime, ts,5,doubleValue);
|
|
|
}else if(advanceState==7){
|
|
|
//计算受累、故障、计划检修
|
|
|
calcBurdened(stateCauseList,thingId,advanceTime, ts,7,doubleValue);
|
|
|
}else if(advanceState==0){
|
|
|
- StateCause cause = new StateCause(thingId2StationId(thingId),thingId, stateMap.get(0.0),
|
|
|
- new Date(advanceTime),new Date(ts), stateMap.get(2.0),stateMap.get(doubleValue),ts -advanceTime);
|
|
|
+ if(ts-advanceTime<appConfig.getLongTime().get("fault-min")) continue;
|
|
|
+ StateCause cause = new StateCause(thingId2StationId(thingId),thingId, stateMap.get(5.0),
|
|
|
+ new Date(advanceTime),new Date(ts), stateMap.get(0.0),stateMap.get(doubleValue),ts -advanceTime);
|
|
|
stateCauseList.add(cause);
|
|
|
}
|
|
|
|
|
@@ -115,7 +127,7 @@ public class CalculateService {
|
|
|
/**
|
|
|
* 判断限停
|
|
|
*/
|
|
|
- private boolean judgmentStop(List<StateCause> stateCauseList, String thingId, long start, long end) {
|
|
|
+ private boolean judgmentStop(String thingId, long start, long end) {
|
|
|
if(isHasFaultEvent(thingId,start,end)) return false;
|
|
|
Booststation boostStation = thingId2BoostStation(thingId);
|
|
|
TestingPoint apsTp = CacheContext.pointMapMap.get("active-power-set").get(boostStation.getId());
|
|
@@ -153,13 +165,13 @@ public class CalculateService {
|
|
|
|
|
|
//有功设定小于应发的70% 并且 出线功率大于有功设定80% 并且 当前场站限电台数大于等于3
|
|
|
String stationid = thingId2StationId(thingId);
|
|
|
- return apsDouble <= apDouble * 0.7 && opDouble >= apsDouble * 0.8 && electricityRationCount(stationid, end) >= 3;
|
|
|
+ return apsDouble <= apDouble * 0.7 && opDouble >= apsDouble * 0.8 && electricityRationCount(stationid, start,end) >= 3;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 计算风电场当前时刻限电台数
|
|
|
*/
|
|
|
- private int electricityRationCount(String stationid, long end) {
|
|
|
+ private int electricityRationCount(String stationid, long start, long end) {
|
|
|
int count = 0;
|
|
|
for (Equipment equipment : CacheContext.stationMap.get(stationid)) {
|
|
|
//满发功率和满发最小风速
|
|
@@ -168,21 +180,25 @@ public class CalculateService {
|
|
|
String speedStr = CacheContext.pointMapMap.get("speed").get(equipment.getId()).getCode();
|
|
|
String bladeAngleStr = CacheContext.pointMapMap.get("blade-angle").get(equipment.getId()).getCode();
|
|
|
String activePowerStr = CacheContext.pointMapMap.get("active-power").get(equipment.getId()).getCode();
|
|
|
- String s = new StringBuilder().append(speedStr).append(",").append(bladeAngleStr).append(",").append(activePowerStr).toString();
|
|
|
- Map<String, PointData> historySection = adapterApi.getHistorySection(s, end);
|
|
|
-
|
|
|
- if(historySection.size()<3) continue;
|
|
|
- double speed = historySection.get(speedStr).getDoubleValue();
|
|
|
- double bladeAngle = historySection.get(bladeAngleStr).getDoubleValue();
|
|
|
- double activePower = historySection.get(activePowerStr).getDoubleValue();
|
|
|
+ //String s = new StringBuilder().append(speedStr).append(",").append(bladeAngleStr).append(",").append(activePowerStr).toString();
|
|
|
+ //Map<String, PointData> historySection = adapterApi.getHistorySection(s, end);
|
|
|
+ List<PointData> speedPdl = adapterApi.getValuesByKey(speedStr, start, end,30);
|
|
|
+ List<PointData> bladeAnglePdl = adapterApi.getValuesByKey(bladeAngleStr, start, end,30);
|
|
|
+ List<PointData> activePowerPdl = adapterApi.getValuesByKey(activePowerStr, start, end,30);
|
|
|
+ if(bladeAnglePdl.size()<speedPdl.size()||activePowerPdl.size()<speedPdl.size()) continue;
|
|
|
|
|
|
- //风速小于11并且桨叶角度大于2
|
|
|
- if (speed <= modelPower.getSpeed() && bladeAngle > 2) {
|
|
|
- count++;
|
|
|
- //风速大于11并且有功功率小于满发功率减100
|
|
|
- } else if (speed > modelPower.getSpeed() && activePower < modelPower.getTheoryPower()-100) {
|
|
|
- count++;
|
|
|
+ int incount = 0;
|
|
|
+ for (int i = 0; i < speedPdl.size(); i++) {
|
|
|
+ //风速小于11并且桨叶角度大于2
|
|
|
+ if (speedPdl.get(i).getDoubleValue() <= modelPower.getSpeed() && bladeAnglePdl.get(i).getDoubleValue() > 2) {
|
|
|
+ incount++;
|
|
|
+ //风速大于11并且有功功率小于满发功率减100
|
|
|
+ } else if (speedPdl.get(i).getDoubleValue() > modelPower.getSpeed() && activePowerPdl.get(i).getDoubleValue() < modelPower.getTheoryPower()-100) {
|
|
|
+ incount++;
|
|
|
+ }
|
|
|
}
|
|
|
+ if(incount/speedPdl.size()>0.5) count++;
|
|
|
+
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
@@ -293,30 +309,33 @@ public class CalculateService {
|
|
|
* @param equipment 设备id
|
|
|
* @param start 并网开始时间
|
|
|
* @param end 并网结束时间
|
|
|
- * @param endeventstate 事后状态
|
|
|
*/
|
|
|
- private void calcElectricityRation(List<StateCause> stateCauseList, String equipment, long start, long end, double endeventstate) {
|
|
|
+ private LinkedHashMap<Long, Long> calcElectricityRation(String equipment, long start, long end) {
|
|
|
//满发功率和满发最小风速
|
|
|
ModelPower modelPower = CacheContext.fullSpeeds.get(CacheContext.equipMap.get(equipment).getModelId());
|
|
|
//并网时间内的风速列表
|
|
|
- List<PointData> speedList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("speed").get(equipment).getCode(), start, end, 30);
|
|
|
- List<PointData> bladeAngleList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("blade-angle").get(equipment).getCode(), start, end, 30);
|
|
|
- List<PointData> activePowerList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("active-power").get(equipment).getCode(), start, end, 30);
|
|
|
+ List<PointData> speedList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("speed").get(equipment).getCode(), start, end, 5);
|
|
|
+ List<PointData> bladeAngleList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("blade-angle").get(equipment).getCode(), start, end, 5);
|
|
|
+ List<PointData> activePowerList = adapterApi.getValuesByKey(CacheContext.pointMapMap.get("active-power").get(equipment).getCode(), start, end, 5);
|
|
|
+ if(bladeAngleList.size()<speedList.size()||activePowerList.size()<speedList.size()) return new LinkedHashMap<>();
|
|
|
//是否限电
|
|
|
boolean isElectricityRation = false;
|
|
|
//限电开始时间
|
|
|
long t1 = 0;
|
|
|
|
|
|
+ long ts;
|
|
|
+ double speedPd;
|
|
|
+ double bladeAnglePd;
|
|
|
+ double activePowerPd;
|
|
|
+ //记录限电的开始时间和结束时间
|
|
|
+ LinkedHashMap<Long, Long> llm = new LinkedHashMap<>();
|
|
|
for (int i = 0; i < speedList.size(); i++) {
|
|
|
- long ts = speedList.get(i).getTs();
|
|
|
- double speedPd = speedList.get(i).getDoubleValue();
|
|
|
+ ts = speedList.get(i).getTs();
|
|
|
+ speedPd = speedList.get(i).getDoubleValue();
|
|
|
//当前时间戳的桨叶角度
|
|
|
- if(bladeAngleList==null||bladeAngleList.size()<speedList.size()||bladeAngleList.get(i)==null){
|
|
|
- System.out.println(CacheContext.pointMapMap.get("blade-angle").get(equipment).getCode());
|
|
|
- }
|
|
|
- double bladeAnglePd = bladeAngleList.get(i).getDoubleValue();
|
|
|
+ bladeAnglePd = bladeAngleList.get(i).getDoubleValue();
|
|
|
//当前时间戳的有功功率
|
|
|
- double activePowerPd = activePowerList.get(i).getDoubleValue();
|
|
|
+ activePowerPd = activePowerList.get(i).getDoubleValue();
|
|
|
|
|
|
//风速小于11并且桨叶角度大于2
|
|
|
if (speedPd <= modelPower.getSpeed() && bladeAnglePd > 2) {
|
|
@@ -333,7 +352,9 @@ public class CalculateService {
|
|
|
}
|
|
|
isElectricityRation = true;
|
|
|
}else if(isElectricityRation){
|
|
|
- StateCause cause;
|
|
|
+ //记录限电
|
|
|
+ llm.put(t1, ts);
|
|
|
+ /*StateCause cause;
|
|
|
if(i==speedList.size()-1) {
|
|
|
cause = new StateCause(thingId2StationId(equipment), equipment, stateMap.get(8.0),
|
|
|
new Date(t1), new Date(ts), stateMap.get(4.0), stateMap.get(endeventstate), ts - t1);
|
|
@@ -341,9 +362,29 @@ public class CalculateService {
|
|
|
cause = new StateCause(thingId2StationId(equipment), equipment, stateMap.get(8.0),
|
|
|
new Date(t1), new Date(ts), stateMap.get(4.0), stateMap.get(4.0), ts - t1);
|
|
|
}
|
|
|
- stateCauseList.add(cause);
|
|
|
+ stateCauseList.add(cause);*/
|
|
|
isElectricityRation = false;
|
|
|
}
|
|
|
}
|
|
|
+ //限电跳变处理
|
|
|
+ long t0 = Long.MAX_VALUE;
|
|
|
+ long tstart = 0;
|
|
|
+ long tend = 0;
|
|
|
+ LinkedHashMap<Long, Long> llm2 = new LinkedHashMap<>();
|
|
|
+ //限电列表key2-key1小于3分钟,记录为一个限电,大于3分钟,记录为另一个限电
|
|
|
+ for (Map.Entry<Long, Long> entry : llm.entrySet()) {
|
|
|
+ t1 = entry.getKey();
|
|
|
+ if (t1 - t0 < appConfig.getLongTime().get("ration")) {
|
|
|
+ tend = llm.get(t0);
|
|
|
+ }else {
|
|
|
+ //3分钟内的限电忽略
|
|
|
+ if(t0!=Long.MAX_VALUE&&(tend-tstart)>appConfig.getLongTime().get("ration-min")){
|
|
|
+ llm2.put(tstart, tend);
|
|
|
+ }
|
|
|
+ tstart = t1;
|
|
|
+ }
|
|
|
+ t0 = t1;
|
|
|
+ }
|
|
|
+ return llm2;
|
|
|
}
|
|
|
}
|