Parcourir la source

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui il y a 1 an
Parent
commit
b37861e0d4

+ 6 - 2
control/PDU-AC-COMBINE/App/Key/Key.c

@@ -33,6 +33,10 @@
 #elif((RelaySlaveChaNum <= 4) && (!SUPPORT_TWIN_FIRE))
 		#define DERECTION_GPIO   		GPIOB
 		#define DERECTION_IO_1 			GPIO_PIN_10
+#elif ((RelaySlaveChaNum == 8) && (SUPPORT_2_DETECTION))
+		#define DERECTION_GPIO   		GPIOB
+		#define DERECTION_IO_1 			GPIO_PIN_1
+		#define DERECTION_IO_2 			GPIO_PIN_2
 #else
 		#define DERECTION_GPIO   		GPIOA
 		#define DERECTION_IO_1 			GPIO_PIN_1
@@ -58,7 +62,7 @@ static  void  ConfigKeyGPIO(void)
 	gpio_mode_set(KEY_A_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY4);   //ÅäÖÃPA12ΪÉÏÀ­ÊäÈëK3
 	gpio_mode_set(KEY_B_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY5); 
 #if SUPPORT_DETECTION
-	#if (RelaySlaveChaNum == 6)
+	#if (RelaySlaveChaNum == 6 || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
 		gpio_mode_set(DERECTION_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_1);
 		gpio_mode_set(DERECTION_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_2);
 	#else
@@ -99,7 +103,7 @@ unsigned char get_detection()
 {
 	uint8_t value = 0;
 	int count = 50;
-	#if (RelaySlaveChaNum == 6)			//six  relay board
+	#if ((RelaySlaveChaNum == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))			//six  relay board
 		if(gpio_input_bit_get(DERECTION_GPIO,DERECTION_IO_1)==0)
 			value |=(1<<0);
 		if(gpio_input_bit_get(DERECTION_GPIO,DERECTION_IO_2)==0)

+ 121 - 119
control/PDU-AC-COMBINE/App/Main/Main.c

@@ -146,7 +146,7 @@ unsigned long int 	AC_LINE_Freq_Total;	//
 
 unsigned int Start_Read_Flag;						//开始读取数据标志
 unsigned char Jlink_Sta_Flag = 0;				//Jlink 是否在线的标志位
-unsigned int StaticCur = 30;						//设置每个通道的静态电流
+unsigned int StaticCur = 50;						//设置每个通道的静态电流
 unsigned char No_Load[RelaySlaveChaNum]={0};
 unsigned char test1;
 extern float   F_AC_V;													// 电压有效值
@@ -165,11 +165,12 @@ static  void  Proc2msTask_Start(void);   	//2ms
 static  void  Proc1SecTask(void);   			//1s处理任务
 
 static void over_RelayState(void);
+static void over_RelayState_ch(uint8_t channel);
 static void all_over_RelayState(void);
 void switch_recode();
 #if SUPPORT_SWITCH_REMENBER
 	bool handle_status[RelaySlaveChaNum] = {0};
-	#if (RelaySlaveChaNum == 6)
+	#if ((RelaySlaveChaNum == 6) || (SUPPORT_2_DETECTION && RelaySlaveChaNum == 8))
 			uint8_t handle_detection[2] = {1,1};
 	#else
 			uint8_t handle_detection[1] = {1};
@@ -254,44 +255,27 @@ static  void  Proc100msTask(void)
   { 
 		select_channel(channel);
 		Calculate_HLW8110_MeterData();
-		AC_Ele_ReadReg[0].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[0].ACDC_V_b/1000);
+		//AC_Ele_ReadReg[0].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[0].ACDC_V_b/1000);
 		if((Start_Read_Flag)&&(channel==0x00))		//只有读完数据之后且现在轮询到通道0才会继续更新电压和频率值
 		{
-			AC_Ele_ReadReg[0].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[0].ACDC_V_b/1000);//实际的电压放大1000倍,实际的K,B值要缩小1000倍
+			Start_Read_Flag = 0;
+		}	
+		AC_Ele_ReadReg[channel].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_V_b/1000);//实际的电压放大1000倍,实际的K,B值要缩小1000倍
 			AC_Ele_ReadReg_All.AC_V = AC_Ele_ReadReg[0].AC_V;
-			if(AC_Ele_ReadReg[0].AC_V <= 10000)			//小于10V频率为0
+			if(AC_Ele_ReadReg[channel].AC_V <= 10000)			//小于10V频率为0
 			{
-				AC_Ele_ReadReg[0].AC_LINE_Freq=0;
-				AC_Ele_ReadReg[0].AC_V = 0;
+				AC_Ele_ReadReg[channel].AC_LINE_Freq=0;
+				AC_Ele_ReadReg[channel].AC_V = 0;
 			}
 			else
 			{
-				AC_Ele_ReadReg[0].AC_LINE_Freq=F_AC_LINE_Freq*1000;
-			}
-			for(chal_num=1;chal_num<RelaySlaveChaNum;chal_num++)
-			{
-				AC_Ele_ReadReg[chal_num].AC_V=AC_Ele_ReadReg[0].AC_V;
-				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=AC_Ele_ReadReg[0].AC_LINE_Freq;
+				AC_Ele_ReadReg[channel].AC_LINE_Freq=F_AC_LINE_Freq*1000;
 			}
-			Start_Read_Flag = 0;
-		}	
-//		if((channel==0x00)&&(Start_Read_Flag==0x00))		//只有读完数据之后才会继续更新电压和频率值
-//		{
-//			AC_Ele_ReadReg[channel].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[channel].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_V_b/1000);//实际的电压放大1000倍,实际的K,B值要缩小1000倍
-//			if(AC_Ele_ReadReg[channel].AC_V <= 10000)			//小于10V频率为0
-//				AC_Ele_ReadReg[channel].AC_LINE_Freq=0;
-//			else
-//				AC_Ele_ReadReg[channel].AC_LINE_Freq=F_AC_LINE_Freq*1000;
-//		}	
-//		else
-//		{
-//			for(chal_num=1;chal_num<RelaySlaveChaNum;chal_num++)
-//			{
-//				AC_Ele_ReadReg[chal_num].AC_V=AC_Ele_ReadReg[0].AC_V;
-//				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=AC_Ele_ReadReg[0].AC_LINE_Freq;
-//			}
-//		}
 		AC_Ele_ReadReg[channel].AC_I=(F_AC_I*EE_ACDC_Coef_ReadReg[channel].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_I_b/1000);//实际的电流放大1000倍,实际的K,B值要缩小1000倍
+		if((AC_Ele_ReadReg[channel].AC_I)<=No_Load[channel])
+		{
+			AC_Ele_ReadReg[channel].AC_I = 0;
+		}
 		if((AC_Ele_ReadReg[channel].AC_I)<=No_Load[channel])
 			AC_Ele_ReadReg[channel].AC_P=0;                                                                                //有功功率
 		else
@@ -310,9 +294,9 @@ static  void  Proc100msTask(void)
 	//	ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
 		all_val += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
 		AC_Ele_ReadReg_All.AC_E += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
-		WarnState();																																																							//更新状态寄存器的告警阈值
-		over_RelayState();
-		
+		WarnState_ch(channel);																																																							//更新状态寄存器的告警阈值
+		//over_RelayState();
+		over_RelayState_ch(channel);
 		channel=channel+1;
 		if(channel>=RelaySlaveChaNum){
 			ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption = all_val;
@@ -373,7 +357,11 @@ static  void  InitHardware(void)
 		}
 	}
 	InitAT24Cxx();			 //初始化24C64模块	
-
+#if SURPPORT_2_2
+	solid_on();
+	BUFF;
+	LOCK;
+#endif
 	ReadEeprom();
 	Delay_Ms_1 = 0;
 #if SUPPORT_DETECTION
@@ -464,72 +452,57 @@ int check_or_control_detection(void)
 
 void switch_recode()
 {
+	
+#if SUPPORT_DETECTION
 #if SUPPORT_SWITCH_REMENBER
-#if (RelaySlaveChaNum == 6)
+#if ((RelaySlaveChaNum == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
 		if((detection_value & 1) == 0)
-		{
-				if(handle_detection[0] == 1)
+			{
+					if(handle_detection[0] == 1)
+					{
+						for(uint8_t k = 0; k < (RelaySlaveChaNum/2);k++)
+							handle_status[k] = EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State;
+					}
+					handle_detection[0] = 0;
+					for(uint8_t k = 0; k < (RelaySlaveChaNum/2);k++)
+						EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=false;
+					for(uint8_t k = 0; k < (RelaySlaveChaNum/2);k++)
+						RelayState_ch(k);
+			}else
+			{
+				if(handle_detection[0] == 0)
 				{
-						handle_status[0] = EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State;
-						handle_status[1] = EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State;
-						handle_status[2] = EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State;
+					handle_detection[0] = 1;
+					for(uint8_t k = 0; k < (RelaySlaveChaNum/2);k++)
+						EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=handle_status[k];
+					for(uint8_t k = 0; k < (RelaySlaveChaNum/2);k++)
+						RelayState_ch(k);
 				}
-				handle_detection[0] = 0;
-				EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=false;
-				EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State=false;
-				EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State=false;
-				Relay1State();
-				Relay2State();
-				Relay3State();
-				BUFF;
-				LOCK;
-		}else
-		{
-			if(handle_detection[0] == 0)
-			{
-				handle_detection[0] = 1;
-				EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=handle_status[0];
-				EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State=handle_status[1];
-				EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State=handle_status[2];
-				Relay1State();
-				Relay2State();
-				Relay3State();
-				BUFF;
-				LOCK;
 			}
-		}
-		if((detection_value & 2) == 0)
-		{
-			if(handle_detection[1] == 1)
+			if((detection_value & 2) == 0)
 			{
-					handle_status[3] = EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State;
-					handle_status[4] = EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State;
-					handle_status[5] = EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State;
-			}
-			handle_detection[1] = 0;
-			EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State=false;
-			EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State=false;
-			EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State=false;
-			Relay4State();
-			Relay5State();
-			Relay6State();
-				BUFF;
-				LOCK;
-		}else
-		{
-			if(handle_detection[1] == 0)
+				if(handle_detection[1] == 1)
+				{
+					for(uint8_t k = (RelaySlaveChaNum/2); k < RelaySlaveChaNum;k++)
+						handle_status[k] = EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State;
+				}
+				handle_detection[1] = 0;
+				for(uint8_t k = (RelaySlaveChaNum/2); k < RelaySlaveChaNum;k++)
+					EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=false;
+				
+				for(uint8_t k = (RelaySlaveChaNum/2); k < RelaySlaveChaNum;k++)
+					RelayState_ch(k);
+			}else
 			{
-				handle_detection[1] = 1;
-				EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State=handle_status[3];
-				EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State=handle_status[4];
-				EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State=handle_status[5];
-				Relay4State();
-				Relay5State();
-				Relay6State();
-				BUFF;
-				LOCK;
+				if(handle_detection[1] == 0)
+				{
+					handle_detection[1] = 1;
+					for(uint8_t k = (RelaySlaveChaNum/2); k < RelaySlaveChaNum;k++)
+						EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=handle_status[k];
+					for(uint8_t k = (RelaySlaveChaNum/2); k < RelaySlaveChaNum;k++)
+						RelayState_ch(k);
+				}
 			}
-		}
 #else
 		if(detection_value == 0)
 		{
@@ -552,37 +525,38 @@ void switch_recode()
 				RelayState();
 			}
 		}
-#endif
+	#endif
 #else
-#if (RelaySlaveChaNum == 6)
-	if((detection_value & 1) == 0)
-	{
-			for(int i = 0; i < 3;i++)
-			{
-				set_channel_status(i,0);
-			}
-			RelayState();
-	}
-	if((detection_value & 2) == 0)
-	{
-			for(int i = 3; i < RelaySlaveChaNum;i++)
-			{
-				set_channel_status(i,0);
-			}
-			RelayState();
-	}
-#endif
-#if SUPPORT_DETECTION
-	if(detection_value == 0)
-	{
+#if (RelaySlaveChaNum == 6 || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
+		if((detection_value & 1) == 0)
+		{
+				for(int i = 0; i < (RelaySlaveChaNum)/2;i++)
+				{
+					set_channel_status(i,0);
+				}
+				RelayState();
+		}
+		if((detection_value & 2) == 0)
+		{
+				for(int i = (RelaySlaveChaNum)/2; i < RelaySlaveChaNum;i++)
+				{
+					set_channel_status(i,0);
+				}
+				RelayState();
+		}
+#else
+		if(detection_value == 0)
+		{
 			for(int i = 0; i < RelaySlaveChaNum;i++)
 			{
 				set_channel_status(i,0);
 			}
 			RelayState();
 		}
+#endif	
 #endif
 #endif
+	
 }
 
 /*********************************************************************************************************
@@ -605,6 +579,20 @@ static  void  Proc2msTask_Start(void)
 			 Clr2msFlag();
 			return;
 		}
+//#if ((RelaySlaveChaNum  == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
+//				if((detection_value & 0x1) == 0)
+//				{
+//						uint8_t k = 0;
+//					  for(k=0;k <(RelaySlaveChaNum)/2;k++)
+//							EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+//				}
+//				if((detection_value & 0x2) == 0)
+//				{
+//						uint8_t k = 0;
+//						for(k=(RelaySlaveChaNum)/2;k <RelaySlaveChaNum;k++)
+//							EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+//				}									
+//#endif		
 #endif
 		
 		Delay_Ms_1 = Delay_Ms_1 +1;
@@ -740,6 +728,15 @@ static void over_RelayState(void)
 
 }
 
+static void over_RelayState_ch(uint8_t channel)
+{
+	if(over_Func_flag[channel])
+		{
+			set_channel_status(channel,0);
+			RelayState_ch(channel);
+			over_Func_flag[channel] = 0;
+		}
+}
 
 #if SUPPORT_ALL_ON_OFF
 void check_or_controll_all()
@@ -753,11 +750,15 @@ void check_or_controll_all()
 		if(rst != test)
 		{
 			uint8_t buff[20]= {0};
+			timer_disable(TIMER14);
 			if(rst)
 			{
-				while(All_On_Flag == 1)
-					DelayNms(5);
+//				while(All_On_Flag == 1)
+//					DelayNms(5);
+				
 				All_Off_Flag = 1;																										//全关标志置1
+				All_On_Flag = 0;
+				Delay_Ms_2 = 0;
 				EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=false;
 				EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
 				for(int i =0; i < RelaySlaveChaNum;i++){
@@ -766,8 +767,9 @@ void check_or_controll_all()
 			}
 			else
 			{
-				while(All_Off_Flag == 1)
-					DelayNms(5);
+//				while(All_Off_Flag == 1)
+//					DelayNms(5);
+				All_Off_Flag =0;
 				All_On_Flag = 1;																										//全关标志置1
 				EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=true;
 				EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;

+ 17 - 1
control/PDU-AC-COMBINE/App/Main/board_cfg.h

@@ -11,7 +11,9 @@
 #define   PRJ_1_ALL_O_ALL_C         0
 #define   PRJ_1_SELF_LOCK_SWITCH    0
 #define   PRJ_TWIN_FIRE             0
-#define 	PRJ_ITK_8_CHANNEL					1
+#define 	PRJ_ITK_8_CHANNEL					0
+#define   PRJ_2_2_BASE              1
+#define   PRJ_8_NEW									0
 
 
 
@@ -22,6 +24,7 @@
 	#define 	ACSingCurrid 							2 
 #elif PRJ_4_ALL_O_ALL_C
 	#define 	RelaySlaveChaNum 					4
+	#define   SUPPORT_SWITCH_REMENBER   1
 	#define 	SUPPORT_ALL_ON_OFF        1
 	#define 	SUPPORT_JLINK							1
 	#define   SUPPORT_DETECTION         1
@@ -68,6 +71,19 @@
 	#define   SUPPORT_DETECTION         0
 	#define 	ACSingCurrid 							1 
 	#define 	SUPPORT_DETECTION_SWITCH  0
+#elif 	PRJ_2_2_BASE
+	#define 	RelaySlaveChaNum 					2
+	#define 	SURPPORT_2_2							1
+	#define   SUPPORT_DETECTION         1
+	#define   SUPPORT_SWITCH_REMENBER   1
+	#define 	SUPPORT_ALL_ON_OFF        1
+	#define 	ACSingCurrid 							2 
+#elif    PRJ_8_NEW					
+	#define 	RelaySlaveChaNum 					8
+	#define 	SUPPORT_2_DETECTION       1
+	#define 	SUPPORT_SWITCH_REMENBER		1
+	#define   SUPPORT_DETECTION         1
+	#define 	ACSingCurrid 							1 
 #endif
 
 

+ 41 - 22
control/PDU-AC-COMBINE/App/Modbus/BARE/port/port.c

@@ -271,49 +271,68 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								Chal_num = (usAddress-AC_Sing_State_SmaWAddr);             					 				//设置哪个通道的状态
 //								memcpy(&ACDC_State_WriteReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs);	//将接收的数据放入写结构体中
 								memcpy(&EE_ACDC_State_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);//将接收的数据放入读结构体中
-							for(int i =0; i < RelaySlaveChaNum;i++)
-							{
-								if(EE_ACDC_ThresVal_ReadReg[i].ACDC_V_TopThres <= THRESHOULD_JUDGMENT)
-								{
-									EE_ACDC_State_ReadReg[i].ACDC_Vol_Upthr_En = false;
-								}
-								if(EE_ACDC_ThresVal_ReadReg[i].ACDC_V_DownThres <= THRESHOULD_JUDGMENT)
+								for(int i =0; i < RelaySlaveChaNum;i++)
 								{
-									EE_ACDC_State_ReadReg[i].ACDC_Vol_Downthr_En = false;
+									if(EE_ACDC_ThresVal_ReadReg[i].ACDC_V_TopThres <= THRESHOULD_JUDGMENT)
+									{
+										EE_ACDC_State_ReadReg[i].ACDC_Vol_Upthr_En = false;
+									}
+									if(EE_ACDC_ThresVal_ReadReg[i].ACDC_V_DownThres <= THRESHOULD_JUDGMENT)
+									{
+										EE_ACDC_State_ReadReg[i].ACDC_Vol_Downthr_En = false;
+									}
+									if(EE_ACDC_ThresVal_ReadReg[i].ACDC_I_TopThres <= THRESHOULD_JUDGMENT)
+									{
+										EE_ACDC_State_ReadReg[i].ACDC_Cur_Upthr_En = false;
+									}
+									if(EE_ACDC_ThresVal_ReadReg[i].ACDC_P_TopThres <= THRESHOULD_JUDGMENT)
+									{
+										EE_ACDC_State_ReadReg[i].ACDC_Pow_Upthr_En = false;
+									}
+									if(EE_ACDC_ThresVal_ReadReg[i].ACDC_E_TopThres <= THRESHOULD_JUDGMENT)
+									{
+										EE_ACDC_State_ReadReg[i].ACDC_Ele_Upthr_En = false;
+									}
 								}
-								if(EE_ACDC_ThresVal_ReadReg[i].ACDC_I_TopThres <= THRESHOULD_JUDGMENT)
-								{
-									EE_ACDC_State_ReadReg[i].ACDC_Cur_Upthr_En = false;
-								}
-								if(EE_ACDC_ThresVal_ReadReg[i].ACDC_P_TopThres <= THRESHOULD_JUDGMENT)
-								{
-									EE_ACDC_State_ReadReg[i].ACDC_Pow_Upthr_En = false;
-								}
-								if(EE_ACDC_ThresVal_ReadReg[i].ACDC_E_TopThres <= THRESHOULD_JUDGMENT)
-								{
-									EE_ACDC_State_ReadReg[i].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中
 							  if((WusNRegs==RelaySlaveChaNum)&&(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)&&(EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State==true))//通过下发的通道数和开关状态可以判断为全开
 								{
 										All_On_Flag = 1;																										//全开标志置1
+										All_Off_Flag = 0;	
 										timer_enable(TIMER14);
 										Delay_Ms_2 = 0;
 								}
 								else if((WusNRegs==RelaySlaveChaNum)&&(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==false)&&(EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State==true))//通过下发的通道数和开关状态可以判断为全关
 								{
 										All_Off_Flag = 1;																										//全关标志置1
+										All_On_Flag = 0;	
 										timer_enable(TIMER14);
 										Delay_Ms_2 = 0;
 								}
 								else 
 								{
 #if SUPPORT_DETECTION
+									
+#if ((RelaySlaveChaNum  == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
+									if((detection_value & 0x1) == 0)
+									{
+											uint8_t k = 0;
+											for(k=0;k <(RelaySlaveChaNum)/2;k++)
+												EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+									}
+									if((detection_value & 0x2) == 0)
+									{
+											uint8_t k = 0;
+											for(k=(RelaySlaveChaNum)/2;k <RelaySlaveChaNum;k++)
+												EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+									}										
+#else									
 									if(detection_value != 0)
 #endif
-										RelayState();
+#endif
+										//RelayState();	
+										RelayState_ch(Chal_num);
 								}
 						}
 						else if((usAddress>=AC_Sing_Thr_SmaAddr)&&(usAddress<=AC_Sing_Thr_SmaAddr+AC_Sing_Thr_SmaQua))//设置通道的阈值

+ 108 - 0
control/PDU-AC-COMBINE/App/ReadEeprom/ReadEeprom.c

@@ -430,6 +430,9 @@ void Relay8State(void)
 }
 #endif
 
+
+
+
 void RelayState(void)
 {
 	BUFF;
@@ -543,6 +546,25 @@ void WarnVolUpthrState(void)
 			EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
 	}
 }
+
+void WarnVolUpthrState_ch(uint8_t channel)
+{
+	if(EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_En)
+	{
+		if(AC_Ele_ReadReg[channel].AC_V>EE_ACDC_ThresVal_ReadReg[channel].ACDC_V_TopThres)
+		{
+ 			EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = true;
+			if(ACDC_Over_WriteReg[channel].openration & Voltage_Max_Func)
+			{
+				over_Func_flag[channel] = 1;
+			}
+		}
+		else 
+			EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = false;
+	}
+	else 
+		EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = false;
+}
 /*********************************************************************************************************
 * 函数名称:WarnVolDownthrState
 * 函数功能:根据读取的数据判断是否触发阈值
@@ -575,6 +597,25 @@ void WarnVolDownthrState(void)
 			EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
 	}
 }
+
+void WarnVolDownthrState_ch(uint8_t channel)
+{
+	if(EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_En)
+	{
+		if(AC_Ele_ReadReg[channel].AC_V < EE_ACDC_ThresVal_ReadReg[channel].ACDC_V_DownThres)
+		{
+			EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = true;
+			if(ACDC_Over_WriteReg[channel].openration & Voltage_Min_Func)
+			{
+				over_Func_flag[channel] = 1;
+			}
+		}
+		else 
+			EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = false;
+	}
+	else 
+		EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = false;	
+}
 /*********************************************************************************************************
 * 函数名称:WarnCurUpthrState
 * 函数功能:根据读取的数据判断是否触发阈值
@@ -607,6 +648,26 @@ void WarnCurUpthrState(void)
 			EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
 	}
 }
+
+void WarnCurUpthrState_ch(uint8_t channel)
+{
+	if(EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_En)
+	{
+		if(AC_Ele_ReadReg[channel].AC_I>EE_ACDC_ThresVal_ReadReg[channel].ACDC_I_TopThres)
+		{
+			EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = true;
+			if(ACDC_Over_WriteReg[channel].openration & Current_Max_Func)
+			{
+				over_Func_flag[channel] = 1;
+			}
+		}
+		else 
+			EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = false;
+	}
+	else 
+		EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = false;
+	
+}
 /*********************************************************************************************************
 * 函数名称:WarnPowUpthrState
 * 函数功能:根据读取的数据判断是否触发阈值
@@ -638,7 +699,25 @@ void WarnPowUpthrState(void)
 			EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
 	}
 }
+void WarnPowUpthrState_ch(uint8_t channel)
+{
 
+	if(EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_En)
+	{
+		if(AC_Ele_ReadReg[channel].AC_P>EE_ACDC_ThresVal_ReadReg[channel].ACDC_P_TopThres){
+			EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = true;
+			if(ACDC_Over_WriteReg[channel].openration & Power_Max_Func)
+			{
+				over_Func_flag[channel] = 1;
+			}
+		}
+		else 
+			EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = false;
+	}
+	else 
+		EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = false;
+	
+}
 /*********************************************************************************************************
 * 函数名称:WarnEleUpthrState
 * 函数功能:根据读取的数据判断是否触发阈值
@@ -671,6 +750,26 @@ void WarnEleUpthrState(void)
 			EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
 	}
 }
+
+void WarnEleUpthrState_ch(uint8_t channel)
+{
+	if(EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_En)
+	{
+		if(AC_Ele_ReadReg[channel].AC_E>EE_ACDC_ThresVal_ReadReg[channel].ACDC_E_TopThres)
+		{
+			EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = true;
+			if(ACDC_Over_WriteReg[channel].openration & Consumer_Max_Func)
+			{
+				over_Func_flag[channel] = 1;
+			}
+		}
+		else 
+			EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = false;
+	}
+	else 
+		EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = false;
+}
+
 /*********************************************************************************************************
 * 函数名称:WarnState
 * 函数功能:根据读取的数据判断是否触发阈值
@@ -690,6 +789,15 @@ void WarnState(void)
 	WarnEleUpthrState();
 }
 
+void WarnState_ch(uint8_t channel)
+{
+	WarnVolUpthrState_ch(channel);
+	WarnVolDownthrState_ch(channel);
+	WarnCurUpthrState_ch(channel);
+	WarnPowUpthrState_ch(channel);
+	WarnEleUpthrState_ch(channel);
+}
+
 void All_Warn_State(void)
 {
 	

+ 1 - 0
control/PDU-AC-COMBINE/App/ReadEeprom/ReadEeprom.h

@@ -49,4 +49,5 @@ void WarnState(void);
 void Bubble_Sort(unsigned short int arr[], unsigned short int len);
 void All_Warn_State(void);
 void RelayState_ch(unsigned char chx);
+void WarnState_ch(unsigned char channel);
 #endif

+ 10 - 0
control/PDU-AC-COMBINE/App/Relay/Relay.c

@@ -111,3 +111,13 @@ void InitRelay(void)
   ConfigRelayGPIO();  
 }
 
+#if SURPPORT_2_2
+
+void solid_on()
+{
+	gpio_bit_set(RELAY_2_4_RCU, RELAY_3); 
+	gpio_bit_set(RELAY_2_4_RCU, RELAY_4); 
+}
+
+
+#endif

+ 3 - 0
control/PDU-AC-COMBINE/App/Relay/Relay.h

@@ -122,5 +122,8 @@
 
 void InitRelay(void);                   	//³õʼ»¯RelayÄ£¿é
 
+#if SURPPORT_2_2
+void solid_on();
+#endif
 
 #endif

+ 18 - 4
control/PDU-AC-COMBINE/HW/Timer/Timer.c

@@ -240,7 +240,7 @@ void TIMER14_IRQHandler(void)
 		s_i2msFlag = 1;
 		if(All_Off_Flag)
 		{
-#if SUPPORT_DETECTION_SWITCH
+#if SUPPORT_DETECTION
 			if(detection_value == 0)			// no elect
 			{
 					timer_disable(TIMER14);																																							//关闭定时器
@@ -323,7 +323,7 @@ void TIMER14_IRQHandler(void)
 				
 		}else if(All_On_Flag)
 		{
-#if SUPPORT_DETECTION_SWITCH
+#if SUPPORT_DETECTION
 				if(detection_value == 0)			// no elect
 				{
 						timer_disable(TIMER14);																																							//关闭定时器
@@ -331,7 +331,21 @@ void TIMER14_IRQHandler(void)
 						All_On_Flag = 0;
 						All_Off_Flag = 0;
 						return;
-				}		
+				}	
+#if ((RelaySlaveChaNum  == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
+				if((detection_value & 0x1) == 0)
+				{
+						uint8_t k = 0;
+					  for(k=0;k <(RelaySlaveChaNum)/2;k++)
+							EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+				}
+				if((detection_value & 0x2) == 0)
+				{
+						uint8_t k = 0;
+						for(k=(RelaySlaveChaNum)/2;k <RelaySlaveChaNum;k++)
+							EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
+				}									
+#endif				
 #endif
 #if (RelaySlaveChaNum >= 1)
 				if((EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==Delay_Ms_2)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
@@ -465,7 +479,7 @@ void TIMER16_IRQHandler(void)
     s_iCnt1000 = 0;       //重置1000ms计数器的计数值为0
     s_i1secFlag = 1;      //将1s标志位的值设置为1
   } 
-	if(cnt == 60000)
+	if(cnt == 30000)
 	{
 		write_2_minute_flag = 1;
 		cnt = 0;

+ 29 - 12
control/PDU-Triphasic_IO/App/Main/Main.c

@@ -527,7 +527,7 @@ static void  check_jlink()
 			{
 				for(int i = 0; i < Output_ChN_default;i++)
 				{
-					AC3PPDU_RL_time[i + CH1_out].LT_state = 0;
+					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
 					orderFlag[i]=true;
 				}
 			}else
@@ -539,14 +539,15 @@ static void  check_jlink()
 					{
 						for(int k = 0; k < Output_ChN_default;k++)
 						{
-							AC3PPDU_RL_time[k + CH1_out].LT_state = 0;
+							AC3PPDU_RL_time[k + CH1_out].LT_state &= 0xffffff7e;
 							orderFlag[k]=true;
 						}
 					}else
 					{
 						for(int k = 0; k < Output_ChN_default;k++)
 						{
-							AC3PPDU_RL_time[k + CH1_out].LT_state = 1;
+							AC3PPDU_RL_time[k + CH1_out].LT_state &= 0xffffffbf;
+							AC3PPDU_RL_time[k + CH1_out].LT_state |= 0x00000001;
 							orderFlag[k]=true;
 						}
 						
@@ -682,7 +683,7 @@ static void  check_jlink()
 							default:
 								return;
 						}
-						AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i]  = (AC3PPDU_RL_time[i + CH1_out].LT_state & 0xfe);
+						AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i]  = (AC3PPDU_RL_time[i + CH1_out].LT_state & 0xfffffffe);
 						AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)]  = AC3PPDU_RL_time[i + CH1_out].LT_state & 0xfffffffe;					
 					}else
 					{
@@ -900,7 +901,8 @@ static void RL_Over_Func()
 //		DB_Out3_L;
 		for(int i = 0; i < Output_ChN_default;i++)
 		{
-			AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
+			AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xffffff3e;
+			orderFlag[i]=true;
 //			RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
 //			if(RL_now_state[i] != RL_last_state[i])
 //			{
@@ -940,7 +942,8 @@ static void RL_Over_Func()
 //				default:
 //					break;
 //			}
-			AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
+			AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xffffff3e;
+			orderFlag[i]=true;
 //			RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
 //			if(RL_now_state[i] != RL_last_state[i])
 //			{
@@ -1262,8 +1265,11 @@ static void MODbus_CMD_New(void)
 					if(AC3PPDU_Modbus_Reg[base_addr] <= THRESHOULD_JUDGMENT)
 					{
 						AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Vmax_Threshould_Disable);
-						LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
+					}else
+					{
+						AC3PPDU_RL_time[value + CH1_out].LT_state |= Shield_Vmax_Threshould_enable;
 					}
+					LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 				}
 				break;
@@ -1281,8 +1287,10 @@ static void MODbus_CMD_New(void)
 					if(AC3PPDU_Modbus_Reg[base_addr] <= THRESHOULD_JUDGMENT)
 					{
 						AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Vmin_Threshould_Disable);
-						LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
+					}else{
+						AC3PPDU_RL_time[value + CH1_out].LT_state |= (Shield_Vmin_Threshould_enable);
 					}
+					LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
@@ -1300,8 +1308,11 @@ static void MODbus_CMD_New(void)
 					if(AC3PPDU_Modbus_Reg[base_addr] <= THRESHOULD_JUDGMENT)
 					{
 						AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Imax_Threshould_Disable);
-						LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
+					}else
+					{
+						AC3PPDU_RL_time[value + CH1_out].LT_state |= (Shield_Imax_Threshould_enable);
 					}
+					LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
@@ -1319,8 +1330,11 @@ static void MODbus_CMD_New(void)
 					if(AC3PPDU_Modbus_Reg[base_addr] <= THRESHOULD_JUDGMENT)
 					{
 						AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Wmax_Threshould_Disable);
-						LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
+					}else
+					{
+						AC3PPDU_RL_time[value + CH1_out].LT_state |= (Shield_Wmax_Threshould_enable);
 					}
+					LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
@@ -1338,9 +1352,12 @@ static void MODbus_CMD_New(void)
 						if(AC3PPDU_Modbus_Reg[base_addr] <= THRESHOULD_JUDGMENT)
 						{
 							AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Kwhmax_Threshould_Disable);
-							LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
+							
+						}else
+						{
+							AC3PPDU_RL_time[value + CH1_out].LT_state |= (Shield_kWhmax_Threshould_enable);
 						}
-				
+						LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
 						AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;