|
@@ -91,7 +91,7 @@ public class CalculateService {
|
|
|
LinkedHashMap<Long, Long> map = calcElectricityRation(thingId, advanceTime, ts);
|
|
|
StateCause cause;
|
|
|
for (Map.Entry<Long, Long> entry : map.entrySet()) {
|
|
|
- if (ts==entry.getKey()) {
|
|
|
+ if (ts == entry.getKey()) {
|
|
|
cause = new StateCause(CacheContext.scEquipTbMap.get(thingId), stateMap.get(8.0), new Timestamp(entry.getKey()),
|
|
|
new Timestamp(entry.getValue()), stateMap.get(4.0), stateMap.get(doubleValue), entry.getValue() - entry.getKey());
|
|
|
} else {
|
|
@@ -126,7 +126,6 @@ public class CalculateService {
|
|
|
stateCauseList.add(cause);
|
|
|
}
|
|
|
} else if (advanceState == 5) {
|
|
|
- if (ts - advanceTime < 30000) continue;
|
|
|
if (ts - advanceTime < appConfig.getLongTime().get("fault-min")) continue;
|
|
|
//计算受累、故障
|
|
|
calcBurdened(stateCauseList, thingId, advanceTime, ts, 5, doubleValue);
|
|
@@ -187,13 +186,144 @@ public class CalculateService {
|
|
|
//List<StateCause> collect = stateCauseList.stream().filter(sc -> stationid.equals(sc.getStationId()) && stateMap.get(8.0).equals(sc.getEvent())
|
|
|
// && sc.getStartTime().getTime() >= start && sc.getEndTime().getTime() <= end).collect(Collectors.toList());
|
|
|
|
|
|
- //有功设定小于应发的70% 并且 出线功率大于有功设定80% 并且 当前场站限电台数大于等于3
|
|
|
+ //有功设定小于应发的75% 并且 出线功率大于有功设定85% 并且 当前场站限电台数大于等于5
|
|
|
String stationid = thingId2StationId(thingId);
|
|
|
- return apsDouble <= apDouble * 0.7 && opDouble >= apsDouble * 0.8 && electricityRationCount(stationid, start, end) >= 3;
|
|
|
+ return apsDouble <= apDouble * 0.75 && opDouble >= apsDouble * 0.85 && electricityRationCount(stationid, start, end) > 4;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 计算风电场当前时刻限电台数--大于3返回优化计算速度
|
|
|
+ * 计算限电
|
|
|
+ *
|
|
|
+ * @param equipment 设备id
|
|
|
+ * @param start 并网开始时间
|
|
|
+ * @param end 并网结束时间
|
|
|
+ */
|
|
|
+ private LinkedHashMap<Long, Long> calcElectricityRation(String equipment, long start, long end) {
|
|
|
+ Booststation boostStation = thingId2BoostStation(equipment);
|
|
|
+ TestingPoint apsTp = CacheContext.pointMapMap.get("active-power-set").get(boostStation.getId());
|
|
|
+ List<PointData> apsRbk = adapterApi.getValuesByKey(apsTp.getCode(), start, end, 30);
|
|
|
+ TestingPoint apTp = CacheContext.pointMapMap.get("apparent-power").get(boostStation.getId());
|
|
|
+ List<PointData> apRbk = adapterApi.getValuesByKey(apTp.getCode(), start, end, 30);
|
|
|
+ TestingPoint opTp = CacheContext.pointMapMap.get("output-power").get(boostStation.getId());
|
|
|
+ List<PointData> opRbk = adapterApi.getValuesByKey(opTp.getCode(), start, end, 30);
|
|
|
+ //有功设定
|
|
|
+ double apsDouble = 0;
|
|
|
+ if (apsRbk.size() > 0)
|
|
|
+ apsDouble = apsRbk.stream().mapToDouble(PointData::getDoubleValue).average().getAsDouble() * (apsTp.getRate() == null ? 1 : apsTp.getRate());
|
|
|
+ //应发功率
|
|
|
+ double apDouble = 0;
|
|
|
+ if (apRbk.size() > 0) {
|
|
|
+ if (boostStation.getId().contains("QS")) {
|
|
|
+ TestingPoint apTp2 = CacheContext.pointMapMap.get("apparent-power").get(boostStation.getId() + "2");
|
|
|
+ List<PointData> apRbk2 = adapterApi.getValuesByKey(apTp2.getCode(), start, end, 30);
|
|
|
+ apDouble = apRbk.stream().mapToDouble(PointData::getDoubleValue).average().getAsDouble() * (apTp.getRate() == null ? 1 : apTp.getRate());
|
|
|
+
|
|
|
+ if (apRbk2.size() > 0)
|
|
|
+ apDouble += apRbk2.stream().mapToDouble(PointData::getDoubleValue).average().getAsDouble() * (apTp.getRate() == null ? 1 : apTp.getRate());
|
|
|
+
|
|
|
+ } else {
|
|
|
+ apDouble = apRbk.stream().mapToDouble(PointData::getDoubleValue).average().getAsDouble() * (apTp.getRate() == null ? 1 : apTp.getRate());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //出线功率
|
|
|
+ double opDouble = 0;
|
|
|
+ if (opRbk.size() > 0)
|
|
|
+ opDouble = opRbk.stream().mapToDouble(PointData::getDoubleValue).average().getAsDouble() * (opTp.getRate() == null ? 1 : opTp.getRate());
|
|
|
+
|
|
|
+ //满发功率和满发最小风速
|
|
|
+ ModelPower modelPower = CacheContext.fullSpeeds.get(CacheContext.equipMap.get(equipment).getModelId());
|
|
|
+ //并网时间内的风速列表
|
|
|
+ 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 ts1 = 0;
|
|
|
+
|
|
|
+ long ts;
|
|
|
+ double speedPd;
|
|
|
+ double bladeAnglePd;
|
|
|
+ double activePowerPd;
|
|
|
+ //记录限电的开始时间和结束时间
|
|
|
+ LinkedHashMap<Long, Long> llm = new LinkedHashMap<>();
|
|
|
+ for (int i = 0; i < speedList.size(); i++) {
|
|
|
+ ts = speedList.get(i).getTs();
|
|
|
+ speedPd = speedList.get(i).getDoubleValue();
|
|
|
+ //当前时间戳的桨叶角度
|
|
|
+ bladeAnglePd = bladeAngleList.get(i).getDoubleValue();
|
|
|
+ //当前时间戳的有功功率
|
|
|
+ activePowerPd = activePowerList.get(i).getDoubleValue();
|
|
|
+
|
|
|
+ //有功设定小于应发的75% 并且 出线功率大于有功设定85%
|
|
|
+ if (apsDouble <= apDouble * 0.75 && opDouble >= apsDouble * 0.85) {
|
|
|
+ //风速小于11并且桨叶角度大于2
|
|
|
+ if (speedPd <= modelPower.getSpeed() && bladeAnglePd > 2) {
|
|
|
+ //限电首次时间
|
|
|
+ if (!isElectricityRation) {
|
|
|
+ ts1 = ts;
|
|
|
+ }
|
|
|
+ isElectricityRation = true;
|
|
|
+ //风速大于11并且有功功率小于满发功率减100
|
|
|
+ } else if (speedPd > modelPower.getSpeed() && activePowerPd < modelPower.getTheoryPower() - 100) {
|
|
|
+ //限电首次时间
|
|
|
+ if (!isElectricityRation) {
|
|
|
+ ts1 = ts;
|
|
|
+ }
|
|
|
+ isElectricityRation = true;
|
|
|
+ } else if (isElectricityRation) {
|
|
|
+ //记录限电
|
|
|
+ llm.put(ts1, 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);
|
|
|
+ }else {
|
|
|
+ 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);*/
|
|
|
+ isElectricityRation = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //限电跳变处理
|
|
|
+ long t0 = 0;
|
|
|
+ long t1;
|
|
|
+ long tstart = 0;
|
|
|
+ long tend = 0;
|
|
|
+ LinkedHashMap<Long, Long> llm2 = new LinkedHashMap<>();
|
|
|
+ //限电列表key2-key1小于3分钟,记录为一个限电,大于3分钟,记录为另一个限电
|
|
|
+ for (Map.Entry<Long, Long> entry : llm.entrySet()) {
|
|
|
+ if (t0 == 0) {
|
|
|
+ t0 = entry.getKey();
|
|
|
+ tstart = entry.getKey();
|
|
|
+ tend = llm.get(t0);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ t1 = entry.getKey();
|
|
|
+ if (t1 - t0 < appConfig.getLongTime().get("ration")) {
|
|
|
+ tend = llm.get(t1);
|
|
|
+ } else {
|
|
|
+ //3分钟内的限电忽略
|
|
|
+ if (tend - tstart > appConfig.getLongTime().get("ration-min")) {
|
|
|
+ llm2.put(tstart, tend);
|
|
|
+ }
|
|
|
+ tend = llm.get(t1);
|
|
|
+ tstart = t1;
|
|
|
+ }
|
|
|
+ t0 = t1;
|
|
|
+ }
|
|
|
+ if (tend - tstart > appConfig.getLongTime().get("ration-min")) {
|
|
|
+ llm2.put(tstart, tend);
|
|
|
+ }
|
|
|
+ return llm2;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算风电场当前时刻限电台数--大于等于5返回优化计算速度
|
|
|
*/
|
|
|
private int electricityRationCount(String stationid, long start, long end) {
|
|
|
int count = 0;
|
|
@@ -222,7 +352,7 @@ public class CalculateService {
|
|
|
}
|
|
|
}
|
|
|
if (incount / speedPdl.size() > 0.5) count++;
|
|
|
- if (count > 3) return count;
|
|
|
+ if (count > 4) return count;
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
@@ -369,101 +499,4 @@ public class CalculateService {
|
|
|
stateCauseList.add(cause);
|
|
|
}*/
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * 计算限电
|
|
|
- *
|
|
|
- * @param equipment 设备id
|
|
|
- * @param start 并网开始时间
|
|
|
- * @param end 并网结束时间
|
|
|
- */
|
|
|
- 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, 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 ts1 = 0;
|
|
|
-
|
|
|
- long ts;
|
|
|
- double speedPd;
|
|
|
- double bladeAnglePd;
|
|
|
- double activePowerPd;
|
|
|
- //记录限电的开始时间和结束时间
|
|
|
- LinkedHashMap<Long, Long> llm = new LinkedHashMap<>();
|
|
|
- for (int i = 0; i < speedList.size(); i++) {
|
|
|
- ts = speedList.get(i).getTs();
|
|
|
- speedPd = speedList.get(i).getDoubleValue();
|
|
|
- //当前时间戳的桨叶角度
|
|
|
- bladeAnglePd = bladeAngleList.get(i).getDoubleValue();
|
|
|
- //当前时间戳的有功功率
|
|
|
- activePowerPd = activePowerList.get(i).getDoubleValue();
|
|
|
-
|
|
|
- //风速小于11并且桨叶角度大于2
|
|
|
- if (speedPd <= modelPower.getSpeed() && bladeAnglePd > 2) {
|
|
|
- //限电首次时间
|
|
|
- if (!isElectricityRation) {
|
|
|
- ts1 = ts;
|
|
|
- }
|
|
|
- isElectricityRation = true;
|
|
|
- //风速大于11并且有功功率小于满发功率减100
|
|
|
- } else if (speedPd > modelPower.getSpeed() && activePowerPd < modelPower.getTheoryPower() - 100) {
|
|
|
- //限电首次时间
|
|
|
- if (!isElectricityRation) {
|
|
|
- ts1 = ts;
|
|
|
- }
|
|
|
- isElectricityRation = true;
|
|
|
- } else if (isElectricityRation) {
|
|
|
- //记录限电
|
|
|
- llm.put(ts1, 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);
|
|
|
- }else {
|
|
|
- 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);*/
|
|
|
- isElectricityRation = false;
|
|
|
- }
|
|
|
- }
|
|
|
- //限电跳变处理
|
|
|
- long t0 = 0;
|
|
|
- long t1;
|
|
|
- long tstart = 0;
|
|
|
- long tend = 0;
|
|
|
- LinkedHashMap<Long, Long> llm2 = new LinkedHashMap<>();
|
|
|
- //限电列表key2-key1小于3分钟,记录为一个限电,大于3分钟,记录为另一个限电
|
|
|
- for (Map.Entry<Long, Long> entry : llm.entrySet()) {
|
|
|
- if (t0 == 0) {
|
|
|
- t0 = entry.getKey();
|
|
|
- tstart = entry.getKey();
|
|
|
- tend = llm.get(t0);
|
|
|
- continue;
|
|
|
- }
|
|
|
- t1 = entry.getKey();
|
|
|
- if (t1 - t0 < appConfig.getLongTime().get("ration")) {
|
|
|
- tend = llm.get(t1);
|
|
|
- } else {
|
|
|
- //3分钟内的限电忽略
|
|
|
- if (tend - tstart > appConfig.getLongTime().get("ration-min")) {
|
|
|
- llm2.put(tstart, tend);
|
|
|
- }
|
|
|
- tend = llm.get(t1);
|
|
|
- tstart = t1;
|
|
|
- }
|
|
|
- t0 = t1;
|
|
|
- }
|
|
|
- if (tend - tstart > appConfig.getLongTime().get("ration-min")) {
|
|
|
- llm2.put(tstart, tend);
|
|
|
- }
|
|
|
- return llm2;
|
|
|
- }
|
|
|
}
|