Ver código fonte

解决 4路 1路自锁控制板,按键没有按下去的时候出现的 频繁写EEPROM的问题。

liyi 1 ano atrás
pai
commit
1ebd75b541

+ 72 - 46
control/PDU-AC-COMBINE/App/Main/Main.c

@@ -375,6 +375,18 @@ static  void  Proc100msTask(void)
     Clr100msFlag();   //清除100ms标志
   }
 }
+
+void set_channel_status(uint8_t channel,uint8_t status)
+{
+	if(status)
+	{	
+		EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State 			= true;	
+	}else
+	{
+		EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State 			= false;	
+	}
+}
+
 /*********************************************************************************************************
 * 函数名称:InitHardware
 * 函数功能:所有的硬件相关的模块初始化函数都放在此函数中
@@ -395,8 +407,8 @@ static  void  InitHardware(void)
 		No_Load[i] = StaticCur; 
 	InitSysTick();       //初始化SysTick模块
 	Init74Lvc();				 //初始化74lvc573锁存器
-	if(gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))	//更新程序后没有及时的拔掉下载器则置标志位,不用等到程序进入主循环LED闪烁左右判断依据
-		Jlink_Sta_Flag = 1;
+//	if(gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))	//更新程序后没有及时的拔掉下载器则置标志位,不用等到程序进入主循环LED闪烁左右判断依据
+//		Jlink_Sta_Flag = 1;
   InitLED();           //初始化LED模块
 	InitKey();           //初始化Key模块
 	InitRelay();				 //初始化Relay模块
@@ -439,38 +451,50 @@ static  void  InitHardware(void)
 		key_2 = get_key_io_2();
 		key_3 = get_key_io_3();
 		key_4 = get_key_io_4();
+#if (RelaySlaveChaNum >= 1)
 		if(key_1  == false)
 		{
 			handle_k_1_status = 0;
+			set_channel_status(0,0);
 		}
+#endif
+#if (RelaySlaveChaNum >= 2)
 		if(key_2  == false)
 		{
 			handle_k_2_status = 0;
+			set_channel_status(1,0);
 		}
+#endif
+#if (RelaySlaveChaNum >= 3)
 		if(key_3  == false)
 		{
 			handle_k_3_status = 0;
+			set_channel_status(2,0);
 		}
+#endif
+#if (RelaySlaveChaNum >= 4)
 		if(key_4  == false)
 		{
 			handle_k_4_status = 0;
+			set_channel_status(3,0);
 		}
+#endif
 #endif
 	while(1)
 	{
 		eMBPoll();
 		//Proc100msTask();									//100ms处理任务  
 		//Proc1SecTask(); 									//1s处理任务 
-		if((gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))||(Jlink_Sta_Flag==0x01))	//如果有jlink接入,则不会动作继电器,直接跳出进入主函数
-		{
-			//补上电平,让IO输出电平,有一个起始状态,但不会动作,锁存器起作用
-			RelayState();
-			Delay_Ms_1 = 0;		
-			Delay_End_flag = 0;	
-			Jlink_Sta_Flag = 0;
-			timer_disable(TIMER14);	 		
-			break;
-		}
+//		if((gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))||(Jlink_Sta_Flag==0x01))	//如果有jlink接入,则不会动作继电器,直接跳出进入主函数
+//		{
+//			//补上电平,让IO输出电平,有一个起始状态,但不会动作,锁存器起作用
+//			RelayState();
+//			Delay_Ms_1 = 0;		
+//			Delay_End_flag = 0;	
+//			Jlink_Sta_Flag = 0;
+//			timer_disable(TIMER14);	 		
+//			break;
+//		}
 		Proc2msTask_Start();    																							//2ms处理任务完成后才初始化modbus。
 		if(Delay_End_flag)
 		{
@@ -484,17 +508,7 @@ static  void  InitHardware(void)
 
 
 
-void set_channel_status(uint8_t channel,uint8_t status)
-{
-	
-	if(status)
-	{	
-		EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State 			= true;	
-	}else
-	{
-		EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State 			= false;	
-	}
-}
+
 
 
 void switch_recode()
@@ -920,12 +934,15 @@ void sub_control()
 #if (RelaySlaveChaNum >= 1)
 		if(key_1  == false)				//not in line
 		{
-			set_channel_status(0,0);
-			Relay1State();
-			BUFF;
-			LOCK;
-			AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr,(uint8_t*)&(EE_ACDC_State_ReadReg[0]),2);
-			handle_k_1_status = 0;
+			if(handle_k_1_status == 1)
+			{
+				set_channel_status(0,0);
+				Relay1State();
+				BUFF;
+				LOCK;
+				AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr,(uint8_t*)&(EE_ACDC_State_ReadReg[0]),2);
+				handle_k_1_status = 0;
+			}
 		}else
 		{
 			if(handle_k_1_status == 0)
@@ -942,12 +959,15 @@ void sub_control()
 #if (RelaySlaveChaNum >= 2)
 		if(key_2  == false)
 		{
-			set_channel_status(1,0);
-			Relay2State();
-			BUFF;
-			LOCK;
-			AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+2,(uint8_t*)&(EE_ACDC_State_ReadReg[1]),2);
-			handle_k_2_status = 0;
+			if(handle_k_2_status == 1)
+			{
+				set_channel_status(1,0);
+				Relay2State();
+				BUFF;
+				LOCK;
+				AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+2,(uint8_t*)&(EE_ACDC_State_ReadReg[1]),2);
+				handle_k_2_status = 0;
+			}
 		}else
 		{
 			if(handle_k_2_status == 0)
@@ -964,12 +984,15 @@ void sub_control()
 #if (RelaySlaveChaNum >= 3)
 		if(key_3 == false)
 		{
-			set_channel_status(2,0);
-			Relay3State();
-			BUFF;
-			LOCK;
-			AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+4,(uint8_t*)&(EE_ACDC_State_ReadReg[2]),2);
-			handle_k_3_status = 0;
+			if(handle_k_3_status == 1)
+			{
+				set_channel_status(2,0);
+				Relay3State();
+				BUFF;
+				LOCK;
+				AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+4,(uint8_t*)&(EE_ACDC_State_ReadReg[2]),2);
+				handle_k_3_status = 0;
+			}
 		}else
 		{
 			if(handle_k_3_status == 0)
@@ -986,11 +1009,14 @@ void sub_control()
 #if (RelaySlaveChaNum >= 4)
 		if(key_4 == false)
 		{
-			set_channel_status(3,0);
-			Relay4State();
-			BUFF;
-			LOCK;
-			AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+6,(uint8_t*)&(EE_ACDC_State_ReadReg[3]),2);
+			if(handle_k_4_status == 1)
+			{
+				set_channel_status(3,0);
+				Relay4State();
+				BUFF;
+				LOCK;
+				AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+6,(uint8_t*)&(EE_ACDC_State_ReadReg[3]),2);
+			}
 			handle_k_4_status = 0;
 		}else
 		{

+ 4 - 2
control/PDU-AC-COMBINE/App/Main/board_cfg.h

@@ -9,8 +9,8 @@
 #define 	PRJ_6_BASE								0
 #define 	PRJ_8_BASE								0
 #define   PRJ_1_ALL_O_ALL_C         0
-#define   PRJ_1_SELF_LOCK_SWITCH    0
-#define   PRJ_TWIN_FIRE             1
+#define   PRJ_1_SELF_LOCK_SWITCH    1
+#define   PRJ_TWIN_FIRE             0
 #define 	PRJ_ITK_8_CHANNEL					0
 #define   PRJ_2_2_BASE              0
 #define   PRJ_8_NEW									0
@@ -33,6 +33,7 @@
 #elif PRJ_4_SELF_LOCK_SWITCH
 	#define 	RelaySlaveChaNum 					4
 	#define 	SUPPORT_SWITCH_REMENBER		1
+	#define   SUPPORT_FALLING_DETECTED  1
 	#define 	SUPPORT_SELF_LOCK         1
 	#define   SUPPORT_DETECTION         1
 	#define 	ACSingCurrid 							2 
@@ -55,6 +56,7 @@
 #elif PRJ_1_SELF_LOCK_SWITCH
 	#define 	RelaySlaveChaNum 					1
 	#define 	SUPPORT_SELF_LOCK         1
+	#define   SUPPORT_FALLING_DETECTED  1
 	#define 	SUPPORT_SWITCH_REMENBER		1
 	#define   SUPPORT_DETECTION         1
 	#define 	ACSingCurrid 							2 

+ 34 - 0
control/PDU-AC-COMBINE/App/Modbus/BARE/port/port.c

@@ -153,6 +153,13 @@ extern ACDC_Over_Func_WriteReg 	ACDC_Over_AllWriteReg;
 extern ACDC_Wann_Read_Reg_t ACDC_Wann_All;
 extern AC_Ele_struct_ReadReg AC_Ele_ReadReg_All;
 
+#if SUPPORT_SELF_LOCK
+ extern	uint8_t handle_k_1_status;
+ extern	uint8_t handle_k_2_status;
+ extern	uint8_t handle_k_3_status;
+ extern	uint8_t handle_k_4_status;
+#endif
+
 eMBErrorCode
 eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
 {
@@ -294,6 +301,33 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 										EE_ACDC_State_ReadReg[i].ACDC_Ele_Upthr_En = false;
 									}
 								}
+#if SUPPORT_SELF_LOCK
+		#if (RelaySlaveChaNum >= 1)
+				if(handle_k_1_status == 0)
+				{
+					EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State = 0;
+				}
+		#endif
+		#if (RelaySlaveChaNum >= 2)
+				if(handle_k_2_status == 0)
+				{
+					EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State = 0;
+				}
+		#endif
+		#if (RelaySlaveChaNum >= 3)
+				if(handle_k_3_status == 0)
+				{
+					EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State = 0;
+				}
+		#endif	
+		#if (RelaySlaveChaNum >= 4)
+				if(handle_k_4_status == 0)
+				{
+					EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State = 0;
+				}
+		#endif				
+								
+#endif
 								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))//通过下发的通道数和开关状态可以判断为全开