Przeglądaj źródła

低配3相进3相出后台

liyi 3 miesięcy temu
rodzic
commit
84e913ffc3
2 zmienionych plików z 466 dodań i 4 usunięć
  1. 16 1
      f427/applications/datadef.h
  2. 450 3
      f427/applications/power.c

+ 16 - 1
f427/applications/datadef.h

@@ -6,7 +6,7 @@
 
 
 
-#define VERSION_SMART              "V1.0.0"
+#define VERSION_SMART              "V1.1.0"
 
 #define POWER_CH_MAX                12
 #define POWER_BOARD_MAX             32
@@ -456,6 +456,21 @@ typedef struct
 	uint32_t 								   :			5;						//预留 		
 }alarm_all_t; 
 
+typedef struct{
+	uint8_t l_v_upper          :      1;
+	uint8_t l_v_lower          :      1;
+	uint8_t l_c_upper          :      1;
+	uint8_t l_p_upper          :      1;
+	uint8_t l_w_upper          :      1;
+	uint8_t 								   :			3;						//预留 	
+}alar_t;
+
+typedef union{
+	alar_t      ala[4];
+	alarm_all_t ala_all;
+}p_alar_t;
+
+
 
 typedef struct {
     uint8_t             ch;

+ 450 - 3
f427/applications/power.c

@@ -1024,36 +1024,483 @@ static void b_dc_set_all_consumer_clear(uint8_t addr)
 
 static void b_3_3_ac_power_get(uint8_t addr)
 {
-	
+		power_handle_new_t *h = &pwr_Handle;
+	  power_t *pwr=NULL,power={0};
+    uint16_t offset,tmp[144]={0};
+    power_ch_new_t *pch=NULL;
+		alarm_all_t alarm_stat = {0};
+		int r = 0;
+		offset = POWER_AC3_OUT_INFO;
+		uint32_t val = 0;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*3*16);
+		if (r== 0) {
+			for(int k = 0; k < h->board[addr].board_new.cnt;k++)
+			{
+       for (int i=0; i < 3; i++) {
+				 
+				 int idx = i*16;
+				 pwr = &h->board[addr].board_new.p_ch[k].power[i];
+				 
+				 val = (tmp[1 + idx] << 16) | tmp[0 + idx];
+         pwr->voltage = val / 1000.0;
+                    
+         val = (tmp[3 + idx] << 16) | tmp[2 + idx];
+         pwr->current = val / 1000.0;
+                    
+         val = (tmp[5 + idx] << 16) | tmp[4 + idx];
+         pwr->power = val / 1000.0;
+
+         val = (tmp[11 + idx] << 16) | tmp[10 + idx];
+         pwr->freq = val / 1000.0;
+                    
+         val = (tmp[13 + idx] << 16) | tmp[13 + idx];
+         pwr->consump = val / 1000.0;
+                    
+         val = (tmp[15 + idx] << 16) | tmp[14 + idx];
+         pwr->factor = val / 1000.0;
+				 if(pwr->factor >0.01)
+				 {
+					 pwr->app_power =  pwr->power / pwr->factor;
+				 }else
+				 {
+					 pwr->app_power = pwr->power;
+				 }
+
+				 if(pwr->factor >0.01)
+				 {
+					 float app_power2 = pwr->app_power * pwr->app_power;
+					 float power2 = pwr->power * pwr->power;
+					 
+					 double f = (double)(app_power2) - power2;
+					 if(f < 0.0)
+							pwr->reactive_power = 0;
+					 else
+							pwr->reactive_power = (float)sqrt(f);
+				 }else
+				 {
+					 pwr->reactive_power = 0;
+				 }
+				pwr->power /= 1000.0;
+				pwr->app_power /= 1000.0;
+				pwr->reactive_power /= 1000.0;
+			 }
+		 }
+    }else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		offset = POWER_AC3_OUT_ENABLE;
+		memset(tmp,0,sizeof(tmp));
+    r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if (r== 0) {
+			for(int k = 0;k <  h->board[addr].board_new.cnt;k++)
+			{
+				pch = &h->board[addr].board_new.p_ch[k];
+				for (int i=0; i < 3; i++) {
+					int index = i * 2;
+					pch->info.status = (tmp[0+index] & BIT(0)) ? 1 : 0;
+				}
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		
+		offset = POWER_AC3_OUT_ERROR;
+		memset(tmp,0,sizeof(tmp));
+    r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		p_alar_t alarm = {0};
+		p_alar_t alarm_old = {0};
+		if (r== 0) {
+			for(int k = 0;k <  h->board[addr].board_new.cnt;k++)
+			{
+				alarm_old.ala_all = h->board[addr].board_new.p_ch[k].info.alarm;
+				for (int i=0; i < 3; i++) {
+					int index = i * 2;
+					alarm.ala[i].l_v_upper = (tmp[0+index] & BIT(0))?1:0;
+					alarm.ala[i].l_v_lower = (tmp[0+index] & BIT(1))?1:0;
+					alarm.ala[i].l_c_upper = (tmp[0+index] & BIT(2))?1:0;
+					alarm.ala[i].l_p_upper = (tmp[0+index] & BIT(3))?1:0;
+					alarm.ala[i].l_w_upper = (tmp[0+index] & BIT(4))?1:0;
+					op_wanning_info info={0};
+					info.ph_info = (i+1);
+					if(!alarm_old.ala[i].l_v_upper && alarm.ala[i].l_v_upper)
+					{	
+							info.ele_info = STR_POWER_ID_VOL;
+							info.max_min  = STR_POWER_ID_MAXS;
+							info.over = STR_POWER_ID_OVER;
+							wanning_operation(&info,pch->info.name);
+					}
+										
+					if(!alarm_old.ala[i].l_v_lower && alarm.ala[i].l_v_lower)
+					{
+							info.ele_info = STR_POWER_ID_VOL;
+							info.max_min  = STR_POWER_ID_MIN;
+							info.over = STR_POWER_ID_LOW;
+							wanning_operation(&info,pch->info.name);
+					}									
+										
+						if(!alarm_old.ala[i].l_c_upper &&  alarm.ala[i].l_c_upper)
+						{
+							info.ele_info = STR_POWER_ID_CUR;
+							info.max_min  = STR_POWER_ID_MAXS;
+							info.over     = STR_POWER_ID_OVER;
+							wanning_operation(&info,pch->info.name);
+						}										
+						if(!alarm_old.ala[i].l_p_upper &&  alarm.ala[i].l_p_upper)
+						{
+							info.ele_info = STR_POWER_ID_POWER;
+							info.max_min  = STR_POWER_ID_MAXS;
+							info.over     = STR_POWER_ID_OVER;
+							wanning_operation(&info,pch->info.name);
+						}				
+						if(!alarm_old.ala[i].l_w_upper &&  alarm.ala[i].l_w_upper)
+						{
+							info.ele_info = STR_POWER_ID_CONSUMER;
+							info.max_min  = STR_POWER_ID_MAXS;
+							info.over     = STR_POWER_ID_OVER;
+							wanning_operation(&info,pch->info.name);
+						}							
+				}
+				h->board[addr].board_new.p_ch[k].info.alarm =  alarm.ala_all;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}		
+		
+		offset = POWER_AC3_ALARM_MISSING_PH;
+		memset(tmp,0,sizeof(tmp));
+    r = read_reg(NULL, addr, offset, tmp, 6);
+		
+		if(r == 0)
+		{  
+			for(int k = 0;k <  h->board[addr].board_new.cnt;k++)
+			{
+				int value[3] = {0};
+				for(int i = 0; i < 3; i++)
+				{
+					 if(tmp[i * 2]>0)
+					 {
+							value[i]=1;
+					 }
+				}
+				alarm.ala[3].l_v_upper = value[0];				//lost 1 phase
+				alarm.ala[3].l_v_lower = value[1];				//lost 2 phase
+				alarm.ala[3].l_c_upper = value[2];				//lost 3 phase
+				op_wanning_info info={0};
+
+				if(!alarm_old.ala[3].l_v_upper && alarm.ala[3].l_v_upper)
+				{	
+					lose_operation(pch->info.name,1,1);
+				}
+											
+				if(!alarm_old.ala[3].l_v_lower && alarm.ala[3].l_v_lower)
+				{
+					lose_operation(pch->info.name,2,2);
+				}									
+											
+				if(!alarm_old.ala[3].l_c_upper &&  alarm.ala[3].l_c_upper)
+				{
+						lose_operation(pch->info.name,3,3);
+				}		
+				h->board[addr].board_new.p_ch[k].info.alarm =  alarm.ala_all;	
+			}				
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
 }
 
+
 static void b_3_3_ac_delay_get(uint8_t addr)
 {
-	
+	power_handle_new_t *h = &pwr_Handle;
+	power_t *pwr=NULL,power={0};
+  uint16_t offset,tmp[20]={0};
+  power_ch_new_t *pch=NULL;
+	int r = 0;	
+	offset = POWER_AC3_OPEN_DELAY_TIME;
+	uint32_t val = 0;
+	r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+	if(r == 0)
+	{
+		for(int i = 0; i <  h->board[addr].board_new.cnt;i++)
+		{
+			pch =  &h->board[addr].board_new.p_ch[i];
+			int index = i * 2 * 3;
+			val = (tmp[1+index] << 16) | tmp[0+index];
+			pch->info.open_delay = val / 1000.0;
+		}
+	}else
+	{
+		LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+	}
+	offset = POWER_AC3_CLOSE_DELAY_TIME;
+	r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+	if(r == 0)
+	{
+		for(int i = 0; i <  h->board[addr].board_new.cnt;i++)
+		{
+			pch =  &h->board[addr].board_new.p_ch[i];
+			int index = i * 2 * 3;
+			val = (tmp[1+index] << 16) | tmp[0+index];
+			pch->info.close_delay = val / 1000.0;
+		}
+	}else
+	{
+		LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+	}
 }
 
 static void b_3_3_ac_thr_get(uint8_t addr)
 {
-	
+		power_handle_new_t *h = &pwr_Handle;
+	  power_t *pwr=NULL,power={0};
+    uint16_t offset,tmp[144]={0};
+    power_ch_new_t *pch=NULL;
+		int r = 0;
+		offset = POWER_AC3_THRESHOLD_VOL_MAX;
+		uint32_t val = 0;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if(r == 0)
+		{
+			for( int i = 0; i < h->board[addr].board_new.cnt;i++)
+			{
+				int index = i*2*3;
+				pch = &h->board[addr].board_new.p_ch[i];
+				val = tmp[1+ index] << 16 | tmp[0+index] ;
+				pch->thr.v_upper = val / 1000.0;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		offset = POWER_AC3_THRESHOLD_VOL_MIN;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if(r == 0)
+		{
+			for( int i = 0; i < h->board[addr].board_new.cnt;i++)
+			{
+				int index = i*2*3;
+				pch = &h->board[addr].board_new.p_ch[i];
+				val = tmp[1+ index] << 16 | tmp[0+index];
+				pch->thr.v_lower = val / 1000.0;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		offset = POWER_AC3_THRESHOLD_CUR_MAX;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if(r == 0)
+		{
+			for( int i = 0; i < h->board[addr].board_new.cnt;i++)
+			{
+				int index = i*2*3;
+				pch = &h->board[addr].board_new.p_ch[i];
+				val = tmp[1+ index] << 16 | tmp[0+index];
+				pch->thr.c_upper = val / 1000.0;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		
+		offset = POWER_AC3_THRESHOLD_PWR_MAX;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if(r == 0)
+		{
+			for( int i = 0; i < h->board[addr].board_new.cnt;i++)
+			{
+				int index = i*2*3;
+				pch = &h->board[addr].board_new.p_ch[i];
+				val = tmp[1+ index] << 16 | tmp[0+index];
+				pch->thr.p_upper = val / 1000.0;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}
+		
+		offset = POWER_AC3_THRESHOLD_PWRCON_MAX;
+		r = read_reg(NULL, addr, offset, tmp, h->board[addr].board_new.cnt*2*3);
+		if(r == 0)
+		{
+			for( int i = 0; i < h->board[addr].board_new.cnt;i++)
+			{
+				int index = i*2*3;
+				pch = &h->board[addr].board_new.p_ch[i];
+				val = tmp[1+ index] << 16 | tmp[0+index];
+				pch->thr.w_upper = val / 1000.0;
+			}
+		}else
+		{
+			LOGE("read_reg failed, addr:%d reg:0x%04x/%d cnt:%d\n", addr, offset, offset,  h->board[addr].board_new.cnt);
+		}		
+		
+			
 }
 
 static void b_3_3_ac_set_delay(uint8_t addr,uint8_t b_addr,uint16_t delay_open, uint16_t delay_close)
 {
+		power_handle_new_t *h = &pwr_Handle;
+	  power_t *pwr=NULL,power={0};
+    uint16_t offset,tmp[6]={0};
+    power_ch_new_t *pch=NULL;
+		int r = 0;
+		offset = POWER_AC3_OPEN_DELAY_TIME;
+		pch = &h->board[addr].board_new.p_ch[b_addr];
+		uint32_t delay = delay_open * 1000;
+		
+		tmp[0] = delay & 0xFFFF;
+		tmp[1] = (delay >> 16) & 0xFFFF;
+		
+		tmp[2] = delay & 0xFFFF;
+		tmp[3] = (delay >> 16) & 0xFFFF;
+		
+		tmp[4] = delay & 0xFFFF;
+		tmp[5] = (delay >> 16) & 0xFFFF;
+		
+		r = write_reg(NULL, addr, offset, tmp, 6);
+		
+		offset = POWER_AC3_CLOSE_DELAY_TIME;
+		delay = delay_close * 1000;
+		
+		tmp[0] = delay & 0xFFFF;
+		tmp[1] = (delay >> 16) & 0xFFFF;
+		
+		tmp[2] = delay & 0xFFFF;
+		tmp[3] = (delay >> 16) & 0xFFFF;
+		
+		tmp[4] = delay & 0xFFFF;
+		tmp[5] = (delay >> 16) & 0xFFFF;
+		
+		r = write_reg(NULL, addr, offset, tmp, 6);		
+		
+		pch->info.open_delay = delay_open;
+		pch->info.close_delay = delay_close;
+		
 }
 static void b_3_3_ac_set_thr(uint8_t addr,uint8_t b_addr,thr_t *th)
 {
+	power_handle_new_t *h = &pwr_Handle;
+	power_t *pwr=NULL,power={0};
+  uint16_t offset,tmp[6]={0};
+  power_ch_new_t *pch=NULL;
+	int r = 0;	
+	offset = POWER_AC3_THRESHOLD_VOL_MAX+(b_addr * 3);
+	pch = &h->board[addr].board_new.p_ch[b_addr];
+	uint32_t value = th->v_upper * 1000;
+	tmp[0] = value & 0xffff;
+	tmp[1] = (value >> 16) & 0xffff;
+	
+	tmp[2] = value & 0xffff;
+	tmp[3] = (value >> 16) & 0xffff;
+	
+	tmp[4] = value & 0xffff;
+	tmp[5] = (value >> 16) & 0xffff;
+	
+	r = write_reg(NULL, addr, offset, tmp, 6);	
+	
+	offset = POWER_AC3_THRESHOLD_VOL_MIN+(b_addr * 3);
+	value = th->v_lower * 1000;
+	tmp[0] = value & 0xffff;
+	tmp[1] = (value >> 16) & 0xffff;
+	
+	tmp[2] = value & 0xffff;
+	tmp[3] = (value >> 16) & 0xffff;
+	
+	tmp[4] = value & 0xffff;
+	tmp[5] = (value >> 16) & 0xffff;
+	
+	r = write_reg(NULL, addr, offset, tmp, 6);	
+	
+	
+	offset = POWER_AC3_THRESHOLD_CUR_MAX+(b_addr * 3);
+	value = th->c_upper * 1000;
+	tmp[0] = value & 0xffff;
+	tmp[1] = (value >> 16) & 0xffff;
+	
+	tmp[2] = value & 0xffff;
+	tmp[3] = (value >> 16) & 0xffff;
+	
+	tmp[4] = value & 0xffff;
+	tmp[5] = (value >> 16) & 0xffff;
+	
+	r = write_reg(NULL, addr, offset, tmp, 6);	
+
+	offset = POWER_AC3_THRESHOLD_PWR_MAX+(b_addr * 3);
+	value = th->p_upper * 1000;
+	tmp[0] = value & 0xffff;
+	tmp[1] = (value >> 16) & 0xffff;
+	
+	tmp[2] = value & 0xffff;
+	tmp[3] = (value >> 16) & 0xffff;
+	
+	tmp[4] = value & 0xffff;
+	tmp[5] = (value >> 16) & 0xffff;
+	
+	r = write_reg(NULL, addr, offset, tmp, 6);		
+	
+	offset = POWER_AC3_THRESHOLD_PWRCON_MAX+(b_addr * 3);
+	value = th->w_upper * 1000;
+	tmp[0] = value & 0xffff;
+	tmp[1] = (value >> 16) & 0xffff;
+	
+	tmp[2] = value & 0xffff;
+	tmp[3] = (value >> 16) & 0xffff;
+	
+	tmp[4] = value & 0xffff;
+	tmp[5] = (value >> 16) & 0xffff;
+	
+	r = write_reg(NULL, addr, offset, tmp, 6);		
+	
+	pch->thr = *th;
 }
 static void b_3_3_ac_set_status(uint8_t addr,uint8_t b_addr,uint8_t status)
 {
+  uint16_t offset,tmp[6]={0};
+	int r = 0;	
+	tmp[0] = status;
+	tmp[1] = status;
+	tmp[2] = status;
+	offset = POWER_AC3_CH_OUT_ENABLE + (b_addr*3);
+	r = write_reg(NULL, addr, offset, tmp, 3);
 }
 static void b_3_3_ac_set_consumer_clear(uint8_t addr,uint8_t b_addr)
 {
+		uint16_t offset,tmp[6]={0};
+		int r = 0;	
+		offset = POWER_AC3_RESET_CONSUMP + (b_addr*3);
+		tmp[0] = 1;
+		tmp[1] = 1;
+		tmp[2] = 1;
+		r = write_reg(NULL, addr, offset, tmp, 3);
 }
 static void b_3_3_ac_set_all_status(uint8_t status)
 {
+		power_handle_new_t *h = &pwr_Handle;
+		power_t *pwr=NULL,power={0};
+		uint16_t offset,tmp[6]={0};
+		power_ch_new_t *pch=NULL;
+		int r = 0;	
+		tmp[0] = 1;
+		if(status)
+			offset = POWER_AC3_ALL_OPEN_INFO;
+		else
+			offset = POWER_AC3_ALL_CLOSE_INFO;
+		r = write_reg(NULL, 0, offset, tmp, 1);
+		r = write_reg(NULL, 0, offset, tmp, 1);
 }
 static void b_3_3_ac_set_all_consumer_clear(uint8_t addr)
 {
+		uint16_t offset,tmp[6]={0};
+		int r = 0;	
+		tmp[0] = 1;
+		offset = POWER_AC3_RESET_CONSUMP_ALL;
+		r = write_reg(NULL, 0, offset, tmp, 1);
+		r = write_reg(NULL, 0, offset, tmp, 1);
 }
 
 static void b_3_2_ac_power_get(uint8_t addr)