Pārlūkot izejas kodu

增加耗电量复位,超限动作,阈值使能重定义!!!!!

liyi 2 gadi atpakaļ
vecāks
revīzija
ed80249729

+ 207 - 0
control/PDU-AC/App/Main/Main.c

@@ -71,6 +71,28 @@ EE_ACDC_State_struct_ReadRegTrue EE_ACDC_State_ReadRegTrue[RelaySlaveChaNum];
 EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_ThresVal_ReadReg[RelaySlaveChaNum];
 EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_ThresVal_ReadReg[RelaySlaveChaNum];
 EE_ACDC_Coef_struct_ReadReg EE_ACDC_Coef_ReadReg[RelaySlaveChaNum];
 EE_ACDC_Coef_struct_ReadReg EE_ACDC_Coef_ReadReg[RelaySlaveChaNum];
 
 
+EE_ACDC_Total_Consumption  EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
+
+ACDC_Consumer_Clear EE_ACDC_Consumer_Clear[RelaySlaveChaNum] = {0};
+
+
+ACDC_All_Chn_Consumption ACDC_Total_All_Chn_Read_Reg;
+
+ACDC_Over_Func_WriteReg 	ACDC_Over_WriteReg[RelaySlaveChaNum];  
+
+
+uint8_t over_Func_flag[RelaySlaveChaNum] = {0};
+
+
+
+uint32_t read_Total_Consumer[RelaySlaveChaNum] = {0};
+
+uint32_t hlw8100_flash_backup[RelaySlaveChaNum] = {0};
+uint32_t Hlw8110_Flash_value[RelaySlaveChaNum] = {0};
+
+uint32_t write_2_minute_flag = 0;
+
+
 unsigned short int Sort_Onbuf[RelaySlaveChaNum];
 unsigned short int Sort_Onbuf[RelaySlaveChaNum];
 unsigned short int Sort_Offbuf[RelaySlaveChaNum];
 unsigned short int Sort_Offbuf[RelaySlaveChaNum];
 
 
@@ -98,6 +120,13 @@ static  void  InitHardware(void);   			//
 static  void  Proc2msTask_Start(void);   	//2ms处理任务
 static  void  Proc2msTask_Start(void);   	//2ms处理任务
 static  void  Proc1SecTask(void);   			//1s处理任务
 static  void  Proc1SecTask(void);   			//1s处理任务
 
 
+static void over_RelayState(void);
+
+
+
+
+uint8_t consumer_clear_flag = 0;
+
 /*********************************************************************************************************
 /*********************************************************************************************************
 *                                              内部函数实现
 *                                              内部函数实现
 *********************************************************************************************************/
 *********************************************************************************************************/
@@ -115,6 +144,137 @@ static  void  InitSoftware(void)
 	eMBInit(MB_RTU, RelaySlaveAddress, 0, Uart0_Baud, MB_PAR_NONE);		// 初始化modbus为RTU方式,地址RelaySlaveAddress, 波特率Uart0_Baud,无校验
 	eMBInit(MB_RTU, RelaySlaveAddress, 0, Uart0_Baud, MB_PAR_NONE);		// 初始化modbus为RTU方式,地址RelaySlaveAddress, 波特率Uart0_Baud,无校验
 	eMBEnable();																											// 使能modbus协议栈
 	eMBEnable();																											// 使能modbus协议栈
 }
 }
+static bool select_channel(uint8_t ch_x)
+{
+	switch(ch_x)
+	{
+		#if ACSingPhSmaCurr
+			if(channel==0x00)       //011
+			{
+				gpio_bit_reset(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x01) //010
+			{
+				gpio_bit_reset(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x02) //001
+			{
+				gpio_bit_reset(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x03) //000
+			{
+				gpio_bit_reset(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x04) //111
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x05) //110
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x06) //101
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x07) //100
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+		#endif
+		#if ACSingPhHigCurr
+			if(channel==0x00) //100
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x01) //101
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x02) //110
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
+			}
+			else if(channel==0x03) //111
+			{
+				gpio_bit_set(SEL_2_RCU, SEL2);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
+				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
+			}
+		#endif
+	}
+
+	return true;
+}
+
+void channel_reset(unsigned char ch_x)
+{
+	if(select_channel(ch_x) == false)
+		return;
+	Uart_HLW8110_Reset();
+}
+
+void check_channel_reset()
+{
+	if(consumer_clear_flag){
+		for(int i = 0; i < RelaySlaveChaNum;i++)
+		{
+			if(EE_ACDC_Consumer_Clear[i].flag)
+			{
+				if(EE_ACDC_Consumer_Clear[i].value)
+				{
+					
+					int temp = i << 2;
+					uint8_t buff[4] = {0};
+					AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr+temp, buff,4);
+					read_Total_Consumer[i] = 0;
+					channel_reset(i);
+					//EE_ACDC_Consumer_Clear[i].value = 0;
+					
+				}
+				//EE_ACDC_Consumer_Clear[i].flag = 0;
+			}
+		}
+		InitUART1(9600);
+		for(int i = 0; i < RelaySlaveChaNum;i++){
+			if(EE_ACDC_Consumer_Clear[i].flag)
+			{
+				if(EE_ACDC_Consumer_Clear[i].value)
+				{
+					select_channel(i);
+					Init_HLW8110();
+					EE_ACDC_Consumer_Clear[i].value = 0;
+				}
+				EE_ACDC_Consumer_Clear[i].flag = 0;
+			}
+		}
+		consumer_clear_flag = 0;
+	}
+	
+}
+
 /*********************************************************************************************************
 /*********************************************************************************************************
 * 函数名称:Proc100msTask
 * 函数名称:Proc100msTask
 * 函数功能:100ms处理任务 循环读取电能计量芯片的数据
 * 函数功能:100ms处理任务 循环读取电能计量芯片的数据
@@ -261,7 +421,11 @@ static  void  Proc100msTask(void)
 		AC_Ele_ReadReg[channel].AC_E=F_AC_E*1000;																																									 //电能
 		AC_Ele_ReadReg[channel].AC_E=F_AC_E*1000;																																									 //电能
 		AC_Ele_ReadReg[channel].AC_PF=F_AC_PF*1000;																																								 //功率因素
 		AC_Ele_ReadReg[channel].AC_PF=F_AC_PF*1000;																																								 //功率因素
 		
 		
+		EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption = (read_Total_Consumer[channel] + AC_Ele_ReadReg[channel].AC_E);										//total consumer
+		ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
 		WarnState();																																																							//更新状态寄存器的告警阈值
 		WarnState();																																																							//更新状态寄存器的告警阈值
+		over_RelayState();
+		
 		channel=channel+1;
 		channel=channel+1;
 		if(channel>=RelaySlaveChaNum)
 		if(channel>=RelaySlaveChaNum)
 			channel=0;
 			channel=0;
@@ -739,6 +903,28 @@ static  void  Proc1SecTask(void)
   }    
   }    
 }
 }
 
 
+
+
+
+static void over_RelayState(void)
+{
+	for(int i = 0; i < RelaySlaveChaNum;i++)
+	{
+		if(over_Func_flag[i])
+		{
+			if(EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State==true)
+			{
+				RELAY_1_OFF;
+				EE_ACDC_State_ReadRegTrue[i].ACDC_Cha_On_Off_State = false;
+			}
+			over_Func_flag[i] = 0;
+		}
+	}
+	BUFF;
+	LOCK;
+}
+
+
 /*********************************************************************************************************
 /*********************************************************************************************************
 * 函数名称:main
 * 函数名称:main
 * 函数功能:主函数 
 * 函数功能:主函数 
@@ -759,7 +945,28 @@ int main(void)
   {
   {
 		eMBPoll();
 		eMBPoll();
 		Proc100msTask();			//100ms处理任务
 		Proc100msTask();			//100ms处理任务
+		check_channel_reset();
     Proc1SecTask(); 			//1s处理任务   
     Proc1SecTask(); 			//1s处理任务   
+		if(write_2_minute_flag == 1)
+		{
+			write_2_minute_flag = 0;
+			uint8_t buff[4*RelaySlaveChaNum] = {0};
+//			buff[0] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 24;
+//			buff[1] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 16;
+//			buff[2] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 8;
+//			buff[3] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 0;
+			
+			
+			for(int i = 0 ; i < RelaySlaveChaNum;i++)
+			{
+				int temp = i << 2;
+				buff[temp + 0] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 24;
+				buff[temp + 1] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 16;
+				buff[temp + 2] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 8;
+				buff[temp + 3] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 0;
+			}
+			AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr, buff,4*RelaySlaveChaNum);
+		}
   }
   }
 }
 }
 /*freemodbus作者使用了assert,故增加如下代码,同时
 /*freemodbus作者使用了assert,故增加如下代码,同时

+ 102 - 1
control/PDU-AC/App/Main/Main.h

@@ -34,6 +34,17 @@
 #define AC_Sing_State_SmaQua  1*RelaySlaveChaNum
 #define AC_Sing_State_SmaQua  1*RelaySlaveChaNum
 
 
 
 
+#define AC_Sing_Total_Consumer_Addr 4250 								//add by liyi
+#define AC_Sing_Total_ConsumerQua (2*RelaySlaveChaNum)		//add by liyi
+
+
+#define AC_Sing_All_Chn_ConsumerAddr 4300							//add by liyi
+#define AC_Sing_All_Chn_ConsumerQua  2								//add by liyi
+
+#define AC_Sing_Detection_Addr 4310
+#define AC_Sing_Detection_Qua  1
+
+
 #define AC_Sing_Dela_OnSmaAddr 4500
 #define AC_Sing_Dela_OnSmaAddr 4500
 #define AC_Sing_Dela_OnSmaQua  1*RelaySlaveChaNum
 #define AC_Sing_Dela_OnSmaQua  1*RelaySlaveChaNum
 
 
@@ -49,6 +60,20 @@
 #define AC_Sing_Coef_SmaAddr 4867
 #define AC_Sing_Coef_SmaAddr 4867
 #define AC_Sing_Coef_SmaQua  8*RelaySlaveChaNum
 #define AC_Sing_Coef_SmaQua  8*RelaySlaveChaNum
 
 
+
+#define AC_Sing_Channel_Func 5100
+#define AC_Sing_Channel_FuncQua RelaySlaveChaNum
+
+#define AC_Sing_Clear_Consumer 5120
+#define AC_Sing_Clear_ConsumerQua  RelaySlaveChaNum
+
+
+#define AC_Sing_Clear_Consumer_all 5128
+#define AC_Sing_Clear_Consumer_allQua 1
+
+
+
+
 //Eeprom的存储地址和地址下最多能存储多少个字节数据
 //Eeprom的存储地址和地址下最多能存储多少个字节数据
 #define Eepr_AC_Sing_Dela_OnSmaAddr 0
 #define Eepr_AC_Sing_Dela_OnSmaAddr 0
 #define Eepr_AC_Sing_Dela_OnSmaQua  2*RelaySlaveChaNum
 #define Eepr_AC_Sing_Dela_OnSmaQua  2*RelaySlaveChaNum
@@ -65,6 +90,20 @@
 #define Eepr_AC_Sing_Coef_SmaAddr 734
 #define Eepr_AC_Sing_Coef_SmaAddr 734
 #define Eepr_AC_Sing_Coef_SmaQua  16*RelaySlaveChaNum
 #define Eepr_AC_Sing_Coef_SmaQua  16*RelaySlaveChaNum
 
 
+#define Eepr_AC_Sing_Total_Consumer_addr 1000
+#define Eepr_AC_Sing_Total_Consumer_SmaQua (4*RelaySlaveChaNum)
+
+
+
+#define Eepr_AC_Sing_Channel_Func_SmaAddr 1200
+#define Eepr_AC_Sing_Channel_Func_SmaQua  2*RelaySlaveChaNum
+#define Default_Consum_Max   (4000000000)
+#define Default_Voltage_Max  (1000000000)
+#define Default_Current_Max  (1000000000)
+#define Default_Power_Max		 (1000000000)
+
+
+
 //选择设备类型
 //选择设备类型
 #define ACSingPhSmaCurr			1  	//交流单相小电流
 #define ACSingPhSmaCurr			1  	//交流单相小电流
 #define ACSingPhHigCurr   	0		//交流单相大电流
 #define ACSingPhHigCurr   	0		//交流单相大电流
@@ -72,6 +111,11 @@
 #define ACThreePhHigCurr   	0		//交流三相大电流
 #define ACThreePhHigCurr   	0		//交流三相大电流
 #define DCSingCtrlCurr			0		//直流继电器采集
 #define DCSingCtrlCurr			0		//直流继电器采集
 #define DCTotalCtrlCurr   	0		//直流总电流采集
 #define DCTotalCtrlCurr   	0		//直流总电流采集
+#define ACSingPhSmaCurrNew6
+
+
+
+
 
 
 #if ACSingPhSmaCurr
 #if ACSingPhSmaCurr
 	#define RelaySlaveChaNum	8//通道数
 	#define RelaySlaveChaNum	8//通道数
@@ -79,7 +123,7 @@
 #endif
 #endif
 
 
 #if ACSingPhHigCurr
 #if ACSingPhHigCurr
-	#define RelaySlaveChaNum	1		//通道数
+	#define RelaySlaveChaNum	4		//通道数
 	#define ACSingCurrid 2   //设备ID
 	#define ACSingCurrid 2   //设备ID
 #endif
 #endif
 
 
@@ -101,6 +145,20 @@
 	#define DCTotalCtrlCurr   6   //设备ID
 	#define DCTotalCtrlCurr   6   //设备ID
 #endif
 #endif
 
 
+//all channel Total power consumption
+typedef struct EE_ACDC_Total_Consumption{
+	unsigned int ACDC_Consumption;
+}EE_ACDC_Total_Consumption;
+
+typedef struct ACDC_All_Chn_Consumption
+{
+	unsigned int ACDC_All_Consumption;
+}ACDC_All_Chn_Consumption;
+
+
+
+
+
 typedef struct	EE_ACDC_Delay_struct_ReadReg_On
 typedef struct	EE_ACDC_Delay_struct_ReadReg_On
 {
 {
 	unsigned	short int ACDC_Delay;        //读出通道之间的开启延时
 	unsigned	short int ACDC_Delay;        //读出通道之间的开启延时
@@ -189,6 +247,12 @@ typedef struct	AC_Ele_struct_ReadReg
 
 
 extern AC_Ele_struct_ReadReg AC_Ele_ReadReg[RelaySlaveChaNum];
 extern AC_Ele_struct_ReadReg AC_Ele_ReadReg[RelaySlaveChaNum];
 
 
+typedef struct Consumer_clear{
+	unsigned char 			flag;
+	unsigned char       value;
+}ACDC_Consumer_Clear;
+
+
 
 
 typedef struct	DC_Sing_Para_struct_ReadReg
 typedef struct	DC_Sing_Para_struct_ReadReg
 {
 {
@@ -246,7 +310,22 @@ typedef struct	ACDC_ThresVal_struct_WriteReg
 	unsigned long int ACDC_E_DownThres;//设置电能阈值下限 
 	unsigned long int ACDC_E_DownThres;//设置电能阈值下限 
 }ACDC_ThresVal_struct_WriteReg; 
 }ACDC_ThresVal_struct_WriteReg; 
 
 
+
+
+typedef struct ACDC_Over_Func{
+	unsigned short openration;
+}ACDC_Over_Func_WriteReg;
+
+
 extern ACDC_ThresVal_struct_WriteReg ACDC_ThresVal_WriteReg[RelaySlaveChaNum];
 extern ACDC_ThresVal_struct_WriteReg ACDC_ThresVal_WriteReg[RelaySlaveChaNum];
+extern ACDC_Over_Func_WriteReg 	ACDC_Over_WriteReg[RelaySlaveChaNum];
+extern EE_ACDC_Total_Consumption  EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
+
+extern ACDC_All_Chn_Consumption ACDC_Total_All_Chn_Read_Reg;
+
+
+void channel_reset(unsigned char ch_x);
+
 
 
 typedef struct	ACDC_Coef_struct_WriteReg
 typedef struct	ACDC_Coef_struct_WriteReg
 {
 {
@@ -258,11 +337,18 @@ typedef struct	ACDC_Coef_struct_WriteReg
 
 
 extern ACDC_Coef_struct_WriteReg ACDC_Coef_WriteReg[RelaySlaveChaNum];
 extern ACDC_Coef_struct_WriteReg ACDC_Coef_WriteReg[RelaySlaveChaNum];
 
 
+extern unsigned int read_Total_Consumer[RelaySlaveChaNum];
+
+extern unsigned int Hlw8110_Flash_value[RelaySlaveChaNum];
+extern unsigned int hlw8100_flash_backup[RelaySlaveChaNum];
+extern ACDC_Consumer_Clear EE_ACDC_Consumer_Clear[RelaySlaveChaNum];
+
 extern unsigned long int 	AC_V_Total;         //交流电压总结果
 extern unsigned long int 	AC_V_Total;         //交流电压总结果
 extern unsigned long int 	AC_LINE_Freq_Total;	//交流电流总结果
 extern unsigned long int 	AC_LINE_Freq_Total;	//交流电流总结果
 extern unsigned int All_On_Flag;							//继电器全开标志
 extern unsigned int All_On_Flag;							//继电器全开标志
 extern unsigned int All_Off_Flag;							//继电器全关标志 
 extern unsigned int All_Off_Flag;							//继电器全关标志 
 extern unsigned int Start_Read_Flag;					//开始读取数据标志
 extern unsigned int Start_Read_Flag;					//开始读取数据标志
+extern unsigned char consumer_clear_flag;
 /*********************************************************************************************************
 /*********************************************************************************************************
 *                                              枚举结构体
 *                                              枚举结构体
 *********************************************************************************************************/
 *********************************************************************************************************/
@@ -271,4 +357,19 @@ extern unsigned int Start_Read_Flag;					//开始读取数据标志
 *                                              API函数声明
 *                                              API函数声明
 *********************************************************************************************************/
 *********************************************************************************************************/
 
 
+
+
+
+#define Current_Max_Func   	0x01
+#define Voltage_Max_Func		0x02
+#define Voltage_Min_Func    0x04
+#define Power_Max_Func			0x08
+#define Consumer_Max_Func		0x10
+
+
+
+#define THRESHOULD_JUDGMENT    		(50)
+
+
+
 #endif
 #endif

+ 60 - 2
control/PDU-AC/App/Modbus/BARE/port/port.c

@@ -35,7 +35,7 @@
 
 
 //保持寄存器
 //保持寄存器
 #define REG_HOLD_START   4000
 #define REG_HOLD_START   4000
-#define REG_HOLD_NREGS   1000
+#define REG_HOLD_NREGS   1500
 
 
 //线圈
 //线圈
 #define REG_COILS_START  0
 #define REG_COILS_START  0
@@ -188,6 +188,13 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								EE_ACDC_State_ReadRegTrue[chn].ACDC_Ele_Upthr_Warn 		= EE_ACDC_State_ReadReg[chn].ACDC_Ele_Upthr_Warn;
 								EE_ACDC_State_ReadRegTrue[chn].ACDC_Ele_Upthr_Warn 		= EE_ACDC_State_ReadReg[chn].ACDC_Ele_Upthr_Warn;
 							}
 							}
 							memcpy(&usRegHoldBuf[iRegIndex],&EE_ACDC_State_ReadRegTrue[Chal_num],usNRegs*2);
 							memcpy(&usRegHoldBuf[iRegIndex],&EE_ACDC_State_ReadRegTrue[Chal_num],usNRegs*2);
+						}else if((usAddress>=AC_Sing_Total_Consumer_Addr)&&(usAddress<=AC_Sing_Total_Consumer_Addr+AC_Sing_Total_ConsumerQua))
+						{
+							Chal_num = (usAddress-AC_Sing_Total_Consumer_Addr)/2;
+							memcpy(&usRegHoldBuf[iRegIndex],&EE_ACDC_Total_Consum_Read_Reg[Chal_num],usNRegs*2);
+						}else if((usAddress  >= AC_Sing_All_Chn_ConsumerAddr) &&(usAddress <= AC_Sing_All_Chn_ConsumerAddr + AC_Sing_All_Chn_ConsumerQua))
+						{
+							memcpy(&usRegHoldBuf[iRegIndex],&ACDC_Total_All_Chn_Read_Reg,usNRegs*2);
 						}
 						}
             while(usNRegs > 0)
             while(usNRegs > 0)
             {
             {
@@ -238,7 +245,27 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								Chal_num = (usAddress-AC_Sing_State_SmaWAddr);             					 				//设置哪个通道的状态
 								Chal_num = (usAddress-AC_Sing_State_SmaWAddr);             					 				//设置哪个通道的状态
 //								memcpy(&ACDC_State_WriteReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs);	//将接收的数据放入写结构体中
 //								memcpy(&ACDC_State_WriteReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs);	//将接收的数据放入写结构体中
 								memcpy(&EE_ACDC_State_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);//将接收的数据放入读结构体中
 								memcpy(&EE_ACDC_State_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);//将接收的数据放入读结构体中
-								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								   			//将数据由16进制转化为无符号数据存入数组 
+								if(EE_ACDC_ThresVal_ReadReg[Chal_num].ACDC_V_TopThres < THRESHOULD_JUDGMENT)
+								{
+									EE_ACDC_State_ReadReg[Chal_num].ACDC_Vol_Upthr_En = false;
+								}
+								if(EE_ACDC_ThresVal_ReadReg[Chal_num].ACDC_V_DownThres < THRESHOULD_JUDGMENT)
+								{
+									EE_ACDC_State_ReadReg[Chal_num].ACDC_Vol_Downthr_En = false;
+								}
+								if(EE_ACDC_ThresVal_ReadReg[Chal_num].ACDC_I_TopThres < THRESHOULD_JUDGMENT)
+								{
+									EE_ACDC_State_ReadReg[Chal_num].ACDC_Cur_Upthr_En = false;
+								}
+								if(EE_ACDC_ThresVal_ReadReg[Chal_num].ACDC_P_TopThres < THRESHOULD_JUDGMENT)
+								{
+									EE_ACDC_State_ReadReg[Chal_num].ACDC_Pow_Upthr_En = false;
+								}
+								if(EE_ACDC_ThresVal_ReadReg[Chal_num].ACDC_E_TopThres < THRESHOULD_JUDGMENT)
+								{
+									EE_ACDC_State_ReadReg[Chal_num].ACDC_Ele_Upthr_En = false;
+								}
+								memcpy(&Eeprom_Wbuf,&EE_ACDC_State_ReadReg[Chal_num],WusNRegs*2);								   			//将数据由16进制转化为无符号数据存入数组 
 								AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2); //将数据写入到eeprom中
 								AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2); //将数据写入到eeprom中
 							  if((WusNRegs==RelaySlaveChaNum)&&(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)&&(EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State==true))//通过下发的通道数和开关状态可以判断为全开
 							  if((WusNRegs==RelaySlaveChaNum)&&(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)&&(EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State==true))//通过下发的通道数和开关状态可以判断为全开
 								{
 								{
@@ -263,6 +290,8 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								Chal_num = (usAddress-AC_Sing_Thr_SmaAddr)/16;              						 				//设置哪个通道的阈值
 								Chal_num = (usAddress-AC_Sing_Thr_SmaAddr)/16;              						 				//设置哪个通道的阈值
 //								memcpy(&ACDC_ThresVal_WriteReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);		//将接收的数据放入写结构体中
 //								memcpy(&ACDC_ThresVal_WriteReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);		//将接收的数据放入写结构体中
 								memcpy(&EE_ACDC_ThresVal_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);	//将接收的数据放入读结构体中
 								memcpy(&EE_ACDC_ThresVal_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);	//将接收的数据放入读结构体中
+								
+							
 								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								 		  //将数据由16进制转化为无符号数据存入数组 
 								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								 		  //将数据由16进制转化为无符号数据存入数组 
 								AT24CxxWrite(Eepr_AC_Sing_Thr_SmaAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2);      //将数据写入到eeprom中
 								AT24CxxWrite(Eepr_AC_Sing_Thr_SmaAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2);      //将数据写入到eeprom中
 						}
 						}
@@ -274,6 +303,35 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								memcpy(&EE_ACDC_Coef_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);	//将接收的数据放入读结构体中
 								memcpy(&EE_ACDC_Coef_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);	//将接收的数据放入读结构体中
 								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								 	//将数据由16进制转化为无符号数据存入数组 
 								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								 	//将数据由16进制转化为无符号数据存入数组 
 								AT24CxxWrite(Eepr_AC_Sing_Coef_SmaAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2); //将数据写入到eeprom中
 								AT24CxxWrite(Eepr_AC_Sing_Coef_SmaAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2); //将数据写入到eeprom中
+						}else if((usAddress>=AC_Sing_Channel_Func)&&(usAddress<=(AC_Sing_Channel_Func+AC_Sing_Channel_FuncQua)))
+						{
+							WeeiRegIndex = (int)(usAddress - AC_Sing_Channel_Func);
+							memcpy(&ACDC_Over_WriteReg,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+							memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+							AT24CxxWrite(Eepr_AC_Sing_Channel_Func_SmaAddr+WeeiRegIndex*2,Eeprom_Wbuf, WusNRegs*2);
+						}else if(usAddress >= AC_Sing_Clear_Consumer && usAddress <= AC_Sing_Clear_Consumer+ AC_Sing_Clear_ConsumerQua)
+						{
+							//WeeiRegIndex = (int)(usAddress - AC_Sing_Clear_Consumer);
+							Chal_num = usAddress-AC_Sing_Clear_Consumer;
+							//AT24CxxRead(Eepr_AC_Sing_Total_Consumer_addr, Eeprom_Rbuf, Eepr_AC_Sing_Total_Consumer_SmaQua);
+							
+							uint16_t recive = 0;
+							memcpy(&recive,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+							EE_ACDC_Consumer_Clear[Chal_num].flag = 1;
+							EE_ACDC_Consumer_Clear[Chal_num].value = recive;
+							consumer_clear_flag = 1;
+							
+							
+						}else if(usAddress == AC_Sing_Clear_Consumer_all)
+						{
+							uint16_t recive = 0;
+							memcpy(&recive,&usRegHoldBuf[WiRegIndex],WusNRegs*2);
+							consumer_clear_flag = 1;
+							for(int i = 0; i < RelaySlaveChaNum;i++)
+							{
+								EE_ACDC_Consumer_Clear[i].flag = 1;
+								EE_ACDC_Consumer_Clear[i].value = recive;
+							}
 						}
 						}
         }
         }
     }
     }

+ 11 - 6
control/PDU-AC/App/Modbus/BARE/port/portserial.c

@@ -88,7 +88,7 @@ xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity e
 	//配置TX_RX的切换
 	//配置TX_RX的切换
   gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);           //设置GPIO模式
   gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_11);           //设置GPIO模式
   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); //设置GPIO输出模式及速度
   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); //设置GPIO输出模式及速度
-
+	gpio_bit_reset(GPIOA, GPIO_PIN_11);		
   //配置USART的参数
   //配置USART的参数
   rcu_periph_clock_enable(RCU_USART0);                  //使能串口时钟
   rcu_periph_clock_enable(RCU_USART0);                  //使能串口时钟
   usart_deinit(USART0);                                 //RCU配置恢复默认值
   usart_deinit(USART0);                                 //RCU配置恢复默认值
@@ -131,11 +131,16 @@ void USART0_IRQHandler(void)
 		prvvUARTRxISR();		
 		prvvUARTRxISR();		
     usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);  //清除USART1中断挂起                                                                                     
     usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);  //清除USART1中断挂起                                                                                     
   }                                                         
   }                                                         
-  if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_ERR_ORERR) == SET) //溢出错误标志为1
-  {    
-		prvvUARTRxISR();
-    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_ERR_ORERR);       //清除溢出错误标志
-  }                                                          
+//  if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_ERR_ORERR) == SET) //溢出错误标志为1
+//  {    
+//		prvvUARTRxISR();
+//    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_ERR_ORERR);       //清除溢出错误标志
+//  }         
+  if(usart_flag_get(USART0, USART_FLAG_ORERR) == SET) //溢出错误标志为1
+  {                                                         
+    usart_flag_clear(USART0, USART_FLAG_ORERR);       //清除溢出错误标志
+     prvvUARTRxISR();
+  }                                                    
 //  if(usart_flag_get(USART0, USART_FLAG_ORERR) == SET) //溢出错误标志为1
 //  if(usart_flag_get(USART0, USART_FLAG_ORERR) == SET) //溢出错误标志为1
 //  {                                                         
 //  {                                                         
 //    usart_flag_clear(USART0, USART_FLAG_ORERR);       //清除溢出错误标志
 //    usart_flag_clear(USART0, USART_FLAG_ORERR);       //清除溢出错误标志

+ 108 - 3
control/PDU-AC/App/ReadEeprom/ReadEeprom.c

@@ -37,6 +37,10 @@
 *********************************************************************************************************/
 *********************************************************************************************************/
 unsigned char Eeprom_Rbuf[200]={0};
 unsigned char Eeprom_Rbuf[200]={0};
 unsigned char Chal_Num;
 unsigned char Chal_Num;
+
+extern EE_ACDC_Total_Consumption  EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
+extern uint32_t read_Total_Consumer[RelaySlaveChaNum];
+extern uint8_t over_Func_flag[RelaySlaveChaNum];
 /*********************************************************************************************************
 /*********************************************************************************************************
 *                                              内部函数声明
 *                                              内部函数声明
 *********************************************************************************************************/
 *********************************************************************************************************/
@@ -71,6 +75,51 @@ void  ReadEeprom(void)
 	AT24CxxRead(Eepr_AC_Sing_Thr_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Thr_SmaQua);			//从eeprom中读出通道阈值数据
 	AT24CxxRead(Eepr_AC_Sing_Thr_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Thr_SmaQua);			//从eeprom中读出通道阈值数据
 	memcpy(&EE_ACDC_ThresVal_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Thr_SmaQua);						//将数据拷贝到指定的结构体,可能需要注意大小端问题
 	memcpy(&EE_ACDC_ThresVal_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Thr_SmaQua);						//将数据拷贝到指定的结构体,可能需要注意大小端问题
 	
 	
+	//check is 
+	for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++) 
+	{
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres > Default_Voltage_Max)
+		{
+			EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres = 0;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres > Default_Voltage_Max)
+		{
+			EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres = 0;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres > Default_Power_Max)
+		{
+			EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres = 0;
+		}	
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres > Default_Current_Max)
+		{
+			EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres = 0;
+		}		
+	}
+	
+	for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++) 
+	{
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres < THRESHOULD_JUDGMENT)
+		{
+			EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Upthr_En = false;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres < THRESHOULD_JUDGMENT)
+		{
+			EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Downthr_En = false;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres < THRESHOULD_JUDGMENT)
+		{
+			EE_ACDC_State_ReadReg[Chal_Num].ACDC_Cur_Upthr_En = false;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres < THRESHOULD_JUDGMENT)
+		{
+			EE_ACDC_State_ReadReg[Chal_Num].ACDC_Pow_Upthr_En = false;
+		}
+		if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_E_TopThres < THRESHOULD_JUDGMENT)
+		{
+			EE_ACDC_State_ReadReg[Chal_Num].ACDC_Ele_Upthr_En = false;
+		}
+	}
+	
 	AT24CxxRead(Eepr_AC_Sing_Coef_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Coef_SmaQua);		//从eeprom中读出通道的系数
 	AT24CxxRead(Eepr_AC_Sing_Coef_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Coef_SmaQua);		//从eeprom中读出通道的系数
 	memcpy(&EE_ACDC_Coef_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Coef_SmaQua);							//将数据拷贝到指定的结构体,可能需要注意大小端问题
 	memcpy(&EE_ACDC_Coef_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Coef_SmaQua);							//将数据拷贝到指定的结构体,可能需要注意大小端问题
 	for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)                              //如果eeprom中没有存入数据设置默认值
 	for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)                              //如果eeprom中没有存入数据设置默认值
@@ -92,7 +141,34 @@ void  ReadEeprom(void)
 			EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b = 0;
 			EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b = 0;
 		}
 		}
 	}
 	}
+	//read total consumer
+  AT24CxxRead(Eepr_AC_Sing_Total_Consumer_addr, Eeprom_Rbuf, Eepr_AC_Sing_Total_Consumer_SmaQua);	
+	for(int i = 0; i < RelaySlaveChaNum;i++){
+		int temp = i << 2;
+		read_Total_Consumer[i] += Eeprom_Rbuf[temp + 0] << 24;
+		read_Total_Consumer[i] += Eeprom_Rbuf[temp + 1] << 16;
+		read_Total_Consumer[i] += Eeprom_Rbuf[temp + 2] << 8;
+		read_Total_Consumer[i] += Eeprom_Rbuf[temp + 3] << 0;
+		
+		if(read_Total_Consumer[i] > Default_Consum_Max)
+		{
+			read_Total_Consumer[i] = 0;
+		}
+	}
+	
+	//read wanning func 
+	AT24CxxRead(Eepr_AC_Sing_Channel_Func_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Channel_Func_SmaQua);	
+	memcmp(ACDC_Over_WriteReg,Eeprom_Rbuf,Eepr_AC_Sing_Channel_Func_SmaQua);
+	for(int i=0; i < RelaySlaveChaNum;i++)
+	{
+		if(ACDC_Over_WriteReg[i].openration > 0x003f)
+		{
+			ACDC_Over_WriteReg[i].openration = 0;
+		}
+	}
 }
 }
+
+
 #if ACSingPhSmaCurr
 #if ACSingPhSmaCurr
 /*********************************************************************************************************
 /*********************************************************************************************************
 *                                              API函数实现
 *                                              API函数实现
@@ -461,7 +537,13 @@ void WarnVolUpthrState(void)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
 		{
 		{
 			if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
 			if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
+			{
  				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
  				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
+				if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Max_Func)
+				{
+					over_Func_flag[chn_num] = 1;
+				}
+			}
 			else 
 			else 
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
 		}
 		}
@@ -486,8 +568,14 @@ void WarnVolDownthrState(void)
 	{
 	{
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
 		{
 		{
-			if(AC_Ele_ReadReg[chn_num].AC_V<EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
+			if(AC_Ele_ReadReg[chn_num].AC_V < EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
+			{
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
+				if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Min_Func)
+				{
+					over_Func_flag[chn_num] = 1;
+				}
+			}
 			else 
 			else 
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
 		}
 		}
@@ -513,7 +601,13 @@ void WarnCurUpthrState(void)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
 		{
 		{
 			if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
 			if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
+			{
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
+				if(ACDC_Over_WriteReg[chn_num].openration & Current_Max_Func)
+				{
+					over_Func_flag[chn_num] = 1;
+				}
+			}
 			else 
 			else 
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
 		}
 		}
@@ -538,8 +632,13 @@ void WarnPowUpthrState(void)
 	{
 	{
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_En)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_En)
 		{
 		{
-			if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_P_TopThres)
+			if(AC_Ele_ReadReg[chn_num].AC_P>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_P_TopThres){
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = true;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = true;
+				if(ACDC_Over_WriteReg[chn_num].openration & Power_Max_Func)
+				{
+					over_Func_flag[chn_num] = 1;
+				}
+			}
 			else 
 			else 
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
 		}
 		}
@@ -565,8 +664,14 @@ void WarnEleUpthrState(void)
 	{
 	{
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
 		if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
 		{
 		{
-			if(AC_Ele_ReadReg[chn_num].AC_P>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
+			if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
+			{
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
+				if(ACDC_Over_WriteReg[chn_num].openration & Consumer_Max_Func)
+				{
+					over_Func_flag[chn_num] = 1;
+				}
+			}
 			else 
 			else 
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
 				EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
 		}
 		}

+ 4 - 0
control/PDU-AC/App/Relay/Relay.h

@@ -23,6 +23,10 @@
 /*********************************************************************************************************
 /*********************************************************************************************************
 *                                              şęś¨Ňĺ
 *                                              şęś¨Ňĺ
 *********************************************************************************************************/
 *********************************************************************************************************/
+
+
+
+
 #if ACSingPhSmaCurr
 #if ACSingPhSmaCurr
 #define RELAY_8_RCU GPIOA
 #define RELAY_8_RCU GPIOA
 #define RELAY_1_7_RCU GPIOB
 #define RELAY_1_7_RCU GPIOB