Explorar o código

Merge remote-tracking branch 'origin/master'

malijun hai 1 ano
pai
achega
7a9ddcb928

+ 1 - 0
state/cause/README.md

@@ -17,6 +17,7 @@
         是否受累--全站故障或者离线
         故障
 
+青山华创风机在停机的状态下应该算故障损失
 
 
 

+ 14 - 1
state/cause/src/main/java/com/gyee/gaia/cause/config/AppConfig.java

@@ -19,8 +19,21 @@ public class AppConfig {
      */
     private Map<String, String> uniformcode;
     private Map<String, String> uniformcodeBoost;
-    private int faulttime;
+    private Map<String, Integer> time;
+    private Map<String, Long> longTime;
+
+    public Map<String, Long> getLongTime() {
+        if(longTime==null){
+            time.forEach((k,v)->{
+                longTime.put(k, (v * 1000L));
+            });
+        }
+        return longTime;
+    }
 
+    public void setLongTime(Map<String, Long> longTime) {
+        this.longTime = longTime;
+    }
 
     @Override
     public String toString() {

+ 77 - 36
state/cause/src/main/java/com/gyee/gaia/cause/service/CalculateService.java

@@ -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;
     }
 }

+ 7 - 2
state/cause/src/main/resources/bootstrap.yaml

@@ -47,8 +47,13 @@ meter:
   stations: MHS_FDC,NSS_FDC
   adapter-url: http://192.168.10.18:8011
   sharding-url: http://192.168.10.18:8075
-  #多长时间计算故障损失,单位分钟
-  faulttime: 3
+  time:
+    #小于多长时间的故障不计算在内,单位秒
+    fault-min: 180
+    #限电跳变,2次限电间隔多长时间认为是同一次限电,单位秒
+    ration: 180
+    #小于多长时间的限电不计算在内,单位秒
+    ration-min: 180
   uniformcode:
     #8种状态
     state8: FJZT8