Browse Source

继续添加总功率计算

guohui 1 year ago
parent
commit
d3134ef099
3 changed files with 81 additions and 66 deletions
  1. 5 5
      f407/applications/datadef.h
  2. 69 53
      f407/applications/power.c
  3. 7 8
      f407/tools/web/data.js

+ 5 - 5
f407/applications/datadef.h

@@ -226,7 +226,7 @@ typedef struct power_data{
     float               current;                //电流
     float               power;                  //功率(视在)
     float               freq;                   //频率
-    float               factor;                 //功率因素
+    float               factor;                 //功率因数
     float               consump;                //耗电量consumption
 
     float               active;                 //有功功率
@@ -273,7 +273,7 @@ typedef struct {
     uint8_t             sch;                     //该通道在其所在的板上的序号,程序始于0,用户始于1
     uint8_t             ph_id;                   //phase id, 0:L1相 1:L2相 2:L3相
     
-    uint8_t             ph_val;                  //三相输出值,1:单相  0:三相
+    uint8_t             ph_val;                  //三相输出设置,0:单相  1:三相
     uint32_t            start_delay;
     uint32_t            stop_delay;
 }info_t;
@@ -318,13 +318,13 @@ typedef struct board_data {
 typedef struct {
     float               voltage;                //电压
     float               current;                //电流
-    float               power;                  //功率
+    float               power;                  //视在功率
     float               freq;                   //频率
+    float               factor;                 //功率因数
     float               consump;                //耗电量
     
     float               active;                 //有功功率
     float               reactive;               //无功功率
-    float               apparent;               //视在功率
 }total_t;
 typedef struct {
     uint8_t             type;
@@ -364,7 +364,7 @@ typedef struct cascade_saddr{
 
 
 typedef struct cascade_data{
-    slave_info_t *c_s[BRD_MAX];                        //从机最多个数
+    slave_info_t *c_s[BRD_MAX];                 //从机最多个数
 }cascade_data_t;
 
 

+ 69 - 53
f407/applications/power.c

@@ -185,23 +185,6 @@ static int reset_consump(power_handle_t *h, int type, int addr)
 
 
 //////////////////////////////////////////////////////////////////
-static board_data_t* board_next(power_handle_t *h)
-{
-    uint8_t addr=h->cur_addr;
-    while(1) {
-        h->cur_addr++;
-        if(h->cur_addr>h->brd_max) {
-            h->cur_addr = 1;
-        }
-        else if(h->cur_addr==addr) {
-            return h->pbrd[h->cur_addr];
-        }
-        if(h->pbrd[h->cur_addr]) {
-            return h->pbrd[h->cur_addr];
-        }
-    }
-    return NULL;
-}
 static uint8_t get_ch_idx(board_data_t *pbrd, uint8_t sch)
 {
     uint8_t ch=0;
@@ -229,17 +212,22 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
         pch = &pbrd->pch[i];
         if(h->prod->pwr_type==PDU_AC_I3O3) {
             times = 3;
+            
+            //设置为输出三相且三相有缺失则报警
+            if(pch->info.ph_val && pbrd->ph_loss) {
+                //trigger alarm event here ...
+            }
         }
         
         for(j=0; j<times; j++) {
             if(pch->thr.v_upper.en) {
-                if(pch->power[i].voltage>pch->thr.v_upper.val) {
+                if(pch->power[j].voltage>pch->thr.v_upper.val) {
                     if(pch->alarm.v_upper==0) {
                         pch->alarm.v_upper = 1;
                         //trigger alarm event here ...
                     }
                 }
-                else if(pch->power[i].voltage<pch->thr.v_lower.val) {
+                else if(pch->power[j].voltage<pch->thr.v_lower.val) {
                     if(pch->alarm.v_lower==0) {
                         pch->alarm.v_lower = 1;
                         //trigger alarm event here ...
@@ -252,7 +240,7 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
             }
             
             if(pch->thr.c_upper.en) {
-                if(pch->power[i].current>pch->thr.c_upper.val) {
+                if(pch->power[j].current>pch->thr.c_upper.val) {
                     if(pch->alarm.c_upper==0) {
                         pch->alarm.c_upper = 1;
                         //trigger alarm event here ...
@@ -264,7 +252,7 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
             }
             
             if(pch->thr.p_upper.en) {
-                if(pch->power[i].power>pch->thr.p_upper.val) {
+                if(pch->power[j].power>pch->thr.p_upper.val) {
                     if(pch->alarm.p_upper==0) {
                         pch->alarm.p_upper = 1;
                         //trigger alarm event here ...
@@ -276,7 +264,7 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
             }
             
             if(pch->thr.w_upper.en) {
-                if(pch->power[i].current>pch->thr.w_upper.val) {
+                if(pch->power[j].current>pch->thr.w_upper.val) {
                     if(pch->alarm.w_upper==0) {
                         pch->alarm.w_upper = 1;
                         //trigger alarm event here ...
@@ -291,30 +279,54 @@ static int threshold_proc(power_handle_t *h, board_data_t *pbrd)
     
     return 0;
 }
-static int total_proc(power_handle_t *h, board_data_t *pbrd)
+static int total_proc(power_handle_t *h)
 {
-    int i,j,r=-1,times=1;
+    total_t tmp[3]={0};
+    int i,j,k,r=-1,times=1;
     power_ch_t *pch=NULL;
+    board_data_t *pbrd=NULL;
     
-    for (i=0; i<pbrd->chs; i++) {
-        pch = &pbrd->pch[i];
-        if(h->prod->pwr_type==PDU_AC_I3O3) {
-            times = 3;
+    lock_d_hold(h->lck);
+    if(h->prod->pwr_type==PDU_AC_I3O3) times = 3;
+    for(i=0; i<h->brd_max; i++) {
+        if(h->pbrd[i]) {
+            for (j=0; i<h->pbrd[i]->chs; i++) {
+                pch = &h->pbrd[i]->pch[j];
+                for(k=0; k<times; k++) {
+                    tmp[k].voltage = pch->power[j].voltage;
+                    tmp[k].current += pch->power[j].current;
+                    tmp[k].power   += pch->power[j].power;
+                    tmp[k].freq    = pch->power[j].freq;
+                    tmp[k].consump += pch->power[j].consump;
+                    tmp[k].active  = pch->power[j].active;
+                    tmp[k].reactive = pch->power[j].reactive;
+                }
+            }
         }
-        
-        
-        
-        
-        
     }
+    for(k=0; k<times; k++) {
+        h->ttl.total[k].voltage = tmp[k].voltage;
+        h->ttl.total[k].current = tmp[k].current;
+        h->ttl.total[k].power = tmp[k].power;
+        h->ttl.total[k].freq = tmp[k].freq;
+        h->ttl.total[k].consump = tmp[k].consump;
+        h->ttl.total[k].factor = tmp[k].active/tmp[k].power;
+        h->ttl.total[k].active  = tmp[k].active;
+        h->ttl.total[k].reactive = tmp[k].reactive;
+    }
+    
+    h->ttl.type = h->prod->pwr_type;
+    memcpy(h->ttl.total, tmp, sizeof(tmp));
+    lock_d_release(h->lck);
+    
+    return 0;
 }
-
-
 static int board_read(power_handle_t *h, board_data_t *pbrd)
 {
     int i,j,r=-1;
     power_t *pwr,power;
     uint16_t offset,tmp[144];
+    power_ch_t *pch=NULL;
     
     lock_d_hold(h->lck);
     if(pbrd) {
@@ -359,13 +371,14 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 }
  
                 for (i=0; i<pbrd->chs; i++) {
-                    pbrd->pch[i].power[0].status = tmp[i] & (0x01);
-                    pbrd->pch[i].alarm.v_upper   = tmp[i] & ALARM_V_UPPER;
-                    pbrd->pch[i].alarm.v_lower   = tmp[i] & ALARM_V_LOWER;
-                    pbrd->pch[i].alarm.c_upper   = tmp[i] & ALARM_C_UPPER;
-                    pbrd->pch[i].alarm.p_upper   = tmp[i] & ALARM_P_UPPER;
-                    pbrd->pch[i].alarm.w_upper   = tmp[i] & ALARM_W_UPPER;
-                    pbrd->pch[i].alarm.ph_loss   = 0;
+                    pch = &pbrd->pch[i];
+                    pch->power[0].status = tmp[i] & (0x01);
+                    pch->alarm.v_upper   = tmp[i] & ALARM_V_UPPER;
+                    pch->alarm.v_lower   = tmp[i] & ALARM_V_LOWER;
+                    pch->alarm.c_upper   = tmp[i] & ALARM_C_UPPER;
+                    pch->alarm.p_upper   = tmp[i] & ALARM_P_UPPER;
+                    pch->alarm.w_upper   = tmp[i] & ALARM_W_UPPER;
+                    pch->alarm.ph_loss   = 0;
                 }
             }
             break;
@@ -423,11 +436,12 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 
                 for (i = 0; i < pbrd->chs; i++) {
                     int Index = i * 2;
-                    pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
-                    pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
-                    pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
-                    pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
-                    pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
+                    pch = &pbrd->pch[i];
+                    pch->alarm.v_upper = tmp[0+Index] & BIT(0);
+                    pch->alarm.v_lower = tmp[0+Index] & BIT(1);
+                    pch->alarm.c_upper = tmp[0+Index] & BIT(2);
+                    pch->alarm.p_upper = tmp[0+Index] & BIT(3);
+                    pch->alarm.w_upper = tmp[0+Index] & BIT(4);
                 }
             }
             break;
@@ -507,11 +521,12 @@ static int board_read(power_handle_t *h, board_data_t *pbrd)
                 }
                 for (i=0; i<pbrd->chs; i++) {
                     int Index = i * 2;
-                    pbrd->pch[i].alarm.v_upper = tmp[0+Index] & BIT(0);
-                    pbrd->pch[i].alarm.v_lower = tmp[0+Index] & BIT(1);
-                    pbrd->pch[i].alarm.c_upper = tmp[0+Index] & BIT(2);
-                    pbrd->pch[i].alarm.p_upper = tmp[0+Index] & BIT(3);
-                    pbrd->pch[i].alarm.w_upper = tmp[0+Index] & BIT(4);
+                    pch = &pbrd->pch[i];
+                    pch->alarm.v_upper = tmp[0+Index] & BIT(0);
+                    pch->alarm.v_lower = tmp[0+Index] & BIT(1);
+                    pch->alarm.c_upper = tmp[0+Index] & BIT(2);
+                    pch->alarm.p_upper = tmp[0+Index] & BIT(3);
+                    pch->alarm.w_upper = tmp[0+Index] & BIT(4);
                 }
                 
                 offset = POWER_AC3_ALARM_MISSING_PH;
@@ -555,6 +570,7 @@ static int board_query(power_handle_t *h)
     for(i=0; i<h->brd_max; i++) {
         r = board_read(h, h->pbrd[i]);
     }
+    total_proc(h);
     
     return r;
 }
@@ -858,7 +874,7 @@ int power_reset(void)
                         break;
                     }
                     
-                    for (i = 0; i < pbrd->chs; i++) {
+                    for (i=0; i<pbrd->chs; i++) {
                         memset(data_temp, 0, sizeof(data_temp));
                         offset = POWER_AC3_OUT_ENABLE + i;
                         data_temp[0] = pbrd->pch[i].power[0].status;

+ 7 - 8
f407/tools/web/data.js

@@ -188,6 +188,10 @@ function bin_to_power(bin) {
     this.consump = tmp.getFloat32(0,true);
     length += 4;
     
+    tmp = new DataView(bin, length);
+    this.factor = tmp.getFloat32(0,true);
+    length += 4;
+    
     tmp = new DataView(bin, length);
     this.active = tmp.getFloat32(0,true);
     length += 4;
@@ -341,10 +345,6 @@ function bin_to_total(bin) {
     tmp = new DataView(bin, length);
     this.reactive = tmp.getFloat32(0,true);
     length += 4;
-
-    tmp = new DataView(bin, length);
-    this.apparent = tmp.getFloat32(0,true);
-    length += 4;
     
     this.len = length;
 }
@@ -619,17 +619,16 @@ function total_to_bin(js) {
     tmp.setFloat32(0,js.consump,true);
     length += 4;
     
-    ///
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.active,true);
+    tmp.setFloat32(0,js.factor,true);
     length += 4;
     
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.reactive,true);
+    tmp.setFloat32(0,js.active,true);
     length += 4;
     
     tmp = new DataView(buffer, length);
-    tmp.setFloat32(0,js.apparent,true);
+    tmp.setFloat32(0,js.reactive,true);
     length += 4;
 
     return buffer;