Kaynağa Gözat

双火线新程序控制

liyi 1 yıl önce
ebeveyn
işleme
e6a3f5b518

+ 10 - 0
truing_control/PDU-3-ADA/common/common.c

@@ -66,6 +66,14 @@ void read_config_from_eeprom(void)
 			}
 #else
 
+		for(uint8_t i = 0; i < PT_SUB_COUNT;i++)
+		{
+			board->md_data.rw_data.delay_on	[i  ]  = 	i+1;
+			board->md_data.rw_data.delay_off[i  ]  =  i+1;
+			board->md_data.rw_data.delay_on	[i+4]  = 	i+1;
+			board->md_data.rw_data.delay_off[i+4]  =  i+1;
+		}
+
 #endif			
 			board->write_eeprom_page(EEPROM_OTHER_ADDR,(uint8_t *)&board->md_data.rw_data.delay_on[0], sizeof(rw_3_data_t));
 			iic_data chache={0};
@@ -104,6 +112,8 @@ void read_config_from_eeprom(void)
 
 			#if (AC_3_3 || AC_3_4)
 					board->check_threshold(THRESHOLD_IN,0);
+			#else
+					board->check_threshold(THRESHOLD_IN,0);
 			#endif			
 
 			for(uint8_t i = 0 ; i < RelaySlaveChaNum;i++)

+ 4 - 0
truing_control/PDU-3-ADA/common/common.h

@@ -623,6 +623,10 @@ typedef struct {
 	uint8_t   detection_1_value;
 	uint32_t  detection_1_count;
 	queue_t    q_cache;
+#if SURPPORT_2_PT
+	uint8_t   detection_2_value;
+	uint32_t  detection_2_count;
+#endif
 #if SUPPORT_RELAY_REMENBER
 	uint8_t handle_status[MAX_CHANNEL];  						/* Save the state before the power failure  */
 	#if SUPPORT_ZERO_CRTL

+ 178 - 3
truing_control/PDU-3-ADA/hardware/detection/detection.c

@@ -86,6 +86,7 @@ void detection_init(void)
 board = get_board();
 #if SUPPORT_DETECTION
 	
+	board = get_board();
 	rcu_periph_clock_enable(RCU_CFGCMP);
 	rcu_periph_clock_enable(RCU_GPIOA);
 	#if SURPPORT_2_PT
@@ -95,7 +96,17 @@ board = get_board();
 	#if SURPPORT_2_PT
 		gpio_mode_set(DERECTION_GPIO_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_2);
 	#endif
+	nvic_irq_enable(EXTI4_15_IRQn,2);
+	syscfg_exti_line_config(DERECTION_IO_1_RCU,DERECTION_IO_1_SOURCE);
+	exti_init(DERECTION_IO_1_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
+	exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);	
 
+	#if SURPPORT_2_PT
+		nvic_irq_enable(EXTI2_3_IRQn,2);
+		syscfg_exti_line_config(DERECTION_IO_2_RCU,DERECTION_IO_2_SOURCE);
+		exti_init(DERECTION_IO_2_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
+		exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
+	#endif	
 	board->detection = get_detection;
 	board->opt_detection = detection_opt;
 #endif
@@ -152,6 +163,16 @@ void EXTI4_15_IRQHandler(void){
 	}
 #endif
 
+	if(RESET != exti_interrupt_flag_get(DERECTION_IO_1_EXIT))
+	{
+		if(board)
+		{
+			board->detection_1_value = 1;
+			board->detection_1_count = 0;
+		}
+		exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);
+	}
+
 }
 
 
@@ -209,6 +230,17 @@ void EXTI2_3_IRQHandler(void)
 		}
 	}
 #endif	
+#if SURPPORT_2_PT
+	if(RESET != exti_interrupt_flag_get(DERECTION_IO_2_EXIT))
+	{
+		if(board)
+		{
+			board->detection_2_value = 1;
+			board->detection_2_count = 0;
+		}
+		exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
+	}	
+#endif
 }
 
 static void get_detection()
@@ -217,12 +249,12 @@ static void get_detection()
 	if(board)
 	{
 		uint16_t data = 0;
-		if(gpio_input_bit_get(GPIOA,GPIO_PIN_11)==0)
+		if(board->detection_1_value > 0)
 		{
 			data  |= (1 << 0);
 		}
 #if SURPPORT_2_PT
-		if(gpio_input_bit_get(GPIOB,GPIO_PIN_3)==0)
+		if(board->detection_2_value > 0)
 		{
 			data  |= (1 << 1);
 		}		
@@ -231,7 +263,6 @@ static void get_detection()
 	}
 #endif
 }
-
 static void detection_opt(void)
 {
 	if(board)
@@ -286,6 +317,150 @@ static void detection_opt(void)
 						}
 					}
 	#endif
+#else
+	#if SUPPORT_RELAY_REMENBER
+		uint8_t sync_buff[PT_SUB_COUNT] = {0};
+		if(board->md_data.r_data.detection != 0x3)
+		{
+			if((board->md_data.r_data.detection & 0x1) == 0)
+			{
+				if(board->handle_input_pt[0] == 1)
+				{
+					da.method = PROMPT_CTRL;
+					da.status = RELAY_CLOSE;
+					for(int i= 0; i < PT_SUB_COUNT;i++)
+					{
+						if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+						{
+							board->handle_status[i] = board->md_data.r_data.status[i];
+							board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
+				
+							da.channel =i;
+							da.reg = &board->relay_staging_staus[i];							
+							set_relay_sta_async(&da);
+					
+							da.channel = i + PT_SUB_COUNT;
+							da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+							set_relay_sta_async(&da);
+							sync_buff[i] = 1;
+						}else
+						{
+							if(board->md_data.rw_data.channel_ctrl[i] == 0)
+							{
+								board->handle_status[i] = board->md_data.r_data.status[i];
+								da.channel =i;
+								da.reg = &board->relay_staging_staus[i];
+								set_relay_sta_async(&da);
+							}
+						}
+					}
+				}
+				board->handle_input_pt[0]  = 0;
+			}
+			
+			if((board->md_data.r_data.detection & 0x2) == 0)
+			{
+				if(board->handle_input_pt[1] == 1)
+				{
+					da.method = PROMPT_CTRL;
+					da.status = RELAY_CLOSE;
+					for(int i= 0; i < PT_SUB_COUNT;i++)
+					{
+						if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+						{
+							if(!sync_buff[i])
+							{
+								board->handle_status[i] = board->md_data.r_data.status[i];
+								board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
+				
+								da.channel =i;
+								da.reg = &board->relay_staging_staus[i];							
+								set_relay_sta_async(&da);
+					
+								da.channel = i + PT_SUB_COUNT;
+								da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+								set_relay_sta_async(&da);								
+							}
+						}else
+						{
+							if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+							{
+								board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
+								da.channel =i + PT_SUB_COUNT;
+								da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+								set_relay_sta_async(&da);								
+							}
+						}
+					}
+					board->handle_input_pt[1] = 0;
+				}
+			}
+		}else
+		{
+			if(board->handle_input_pt[0] == 0)
+			{
+				board->handle_input_pt[0] = 1;
+				for(int i= 0; i < PT_SUB_COUNT;i++)
+				{
+					da.status = 	board->handle_status[i];
+					da.method = DELAY_CTRL;
+					if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+					{
+						if(!sync_buff[i])
+						{
+							da.channel =i;
+							da.reg = &board->relay_staging_staus[i];							
+							set_relay_sta_async(&da);
+							
+							da.status = 	board->handle_status[i + PT_SUB_COUNT];
+							da.channel = i + PT_SUB_COUNT;
+							da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+							set_relay_sta_async(&da);			
+						}
+					}else
+					{
+							if(board->md_data.rw_data.channel_ctrl[i] == 0)
+							{
+								da.channel =i;
+								da.reg = &board->relay_staging_staus[i];
+								set_relay_sta_async(&da);
+							}						
+					}
+				}
+			}
+			
+			if(board->handle_input_pt[1] == 0)
+			{
+				board->handle_input_pt[1] = 1;
+				for(int i= 0; i < PT_SUB_COUNT;i++)
+				{
+					da.status = 	board->handle_status[i];
+					da.method = DELAY_CTRL;
+					if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+					{
+							da.channel =i;
+							da.reg = &board->relay_staging_staus[i];							
+							set_relay_sta_async(&da);
+					
+							da.status = 	board->handle_status[i + PT_SUB_COUNT];
+							da.channel = i + PT_SUB_COUNT;
+							da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+							set_relay_sta_async(&da);
+							sync_buff[i] = 1;					
+					}else
+					{
+							if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+							{
+								da.status = 	board->handle_status[i + PT_SUB_COUNT];
+								da.channel =i + PT_SUB_COUNT;
+								da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
+								set_relay_sta_async(&da);
+							}						
+					}
+				}
+			}			
+		}
+	#endif
 #endif		
 	}
 }

+ 142 - 36
truing_control/PDU-3-ADA/hardware/electricity/electricity.c

@@ -92,35 +92,124 @@ static void check_wanning(uint8_t in_out,uint8_t channel)
 	if(in_out == ELE_INPUT)
 	{
 #if (AC_3_3 || AC_3_4)
-		uint32_t sort_buff[3] = {0};
+		
+		board->md_data.r_data.i_voltage[A] = board->md_data.r_data.output[A].voltage;
+		board->md_data.r_data.i_voltage[B] = board->md_data.r_data.output[B].voltage;
+		board->md_data.r_data.i_voltage[C] = board->md_data.r_data.output[C].voltage;
+		
+		board->md_data.r_data.i_current[A] = board->md_data.r_data.output[A].current;
+		board->md_data.r_data.i_current[B] = board->md_data.r_data.output[B].current;
+		board->md_data.r_data.i_current[C] = board->md_data.r_data.output[C].current;	
+
+		board->md_data.r_data.i_power[A] 	 = board->md_data.r_data.output[A].power;
+		board->md_data.r_data.i_power[B]   = board->md_data.r_data.output[B].power;
+		board->md_data.r_data.i_power[C]   = board->md_data.r_data.output[C].power;			
+		
+		
+		board->md_data.r_data.i_consumer[A] 	= board->md_data.r_data.output[A].consumer;
+		board->md_data.r_data.i_consumer[B]   = board->md_data.r_data.output[B].consumer;
+		board->md_data.r_data.i_consumer[C]   = board->md_data.r_data.output[C].consumer;			
+#else
+		//voltage
+		uint32_t _data = 0;
+		for(int i = 0 ; i < PT_SUB_COUNT;i++)
+		{
+			_data = (board->md_data.r_data.output[i].voltage > _data)  ?  board->md_data.r_data.output[i].voltage : _data;
+		}
+		board->md_data.r_data.i_voltage[A] = _data;
+		
+		_data = 0;
+		for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
+		{
+			_data = (board->md_data.r_data.output[i].voltage > _data)  ?  board->md_data.r_data.output[i].voltage : _data;
+		}		
+		board->md_data.r_data.i_voltage[B] = _data;
+		//current
+		_data = 0;
+		for(int i = 0 ; i < PT_SUB_COUNT;i++)
+		{
+			_data += board->md_data.r_data.output[i].current;
+		}
+		board->md_data.r_data.i_current[A] = _data;
+
+		_data = 0;
+		for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
+		{
+			_data += board->md_data.r_data.output[i].current;
+		}
+		board->md_data.r_data.i_current[B] = _data;
+		//power
+		_data = 0;
+		for(int i = 0 ; i < PT_SUB_COUNT;i++)
+		{
+			_data += board->md_data.r_data.output[i].power;
+		}
+		board->md_data.r_data.i_power[A] = _data;
+
+		_data = 0;
+		for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
+		{
+			_data += board->md_data.r_data.output[i].power;
+		}
+		board->md_data.r_data.i_power[B] = _data;		
+		//consumer
+		_data = 0;
+		for(int i = 0 ; i < PT_SUB_COUNT;i++)
+		{
+			_data += board->md_data.r_data.output[i].consumer;
+		}
+		board->md_data.r_data.i_consumer[A] = _data;
+
+		_data = 0;
+		for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
+		{
+			_data += board->md_data.r_data.output[i].consumer;
+		}
+		board->md_data.r_data.i_consumer[B] = _data;			
+		
+#endif
+
+		
 		uint32_t Vmax = 0;
-		uint32_t Vmin = 0;	
-		sort_buff[0] = board->md_data.r_data.i_voltage[0];
-		sort_buff[1] = board->md_data.r_data.i_voltage[1];
-		sort_buff[2] = board->md_data.r_data.i_voltage[2];
+		uint32_t Vmin = 0;
+		uint32_t sort_buff[3] = {0};	
+		sort_buff[0] = board->md_data.r_data.i_voltage[A];
+		sort_buff[1] = board->md_data.r_data.i_voltage[B];		
+#if (AC_3_3 || AC_3_4)
+		
+		sort_buff[2] = board->md_data.r_data.i_voltage[C];
 		Vmax = (sort_buff[0] >= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
 		Vmax = (Vmax >= sort_buff[2]) ? Vmax : sort_buff[2];
 			
 		Vmin = (sort_buff[0] <= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
-		Vmin = (Vmin <= sort_buff[2]) ? Vmin : sort_buff[2];		
+		Vmin = (Vmin <= sort_buff[2]) ? Vmin : sort_buff[2];	
+#else
+		
+		Vmax = sort_buff[0] >sort_buff[1] ? sort_buff[0] : sort_buff[1];
+		Vmin = sort_buff[0] >sort_buff[1] ? sort_buff[1] : sort_buff[2];
+		
+
+#endif
 		if((Vmin < AC3PPDU_Lack_Voltage) && (Vmax != 0) && (Vmax > (AC3PPDU_Lack_Voltage*2)))
 		{
 			uint32_t v_mid = AC3PPDU_Lack_Voltage *2;
 			count ++;
 			if(count == 2)
 			{
-				if(board->md_data.r_data.i_voltage[0] < v_mid)
+				if(board->md_data.r_data.i_voltage[A] < v_mid)
 				{
 					board->md_data.r_data.Lack_A = WANNING_SET;
 				}
-				if(board->md_data.r_data.i_voltage[1] < v_mid)
+				if(board->md_data.r_data.i_voltage[B] < v_mid)
 				{
 					board->md_data.r_data.Lack_B = WANNING_SET;
 				}
-				if(board->md_data.r_data.i_voltage[2] < v_mid)
+#if(AC_3_3 || AC_3_4)
+				if(board->md_data.r_data.i_voltage[C] < v_mid)
 				{
 					board->md_data.r_data.Lack_C = WANNING_SET;
 				}		
+#endif
 				count = 0;				
 			}
 			
@@ -128,51 +217,40 @@ static void check_wanning(uint8_t in_out,uint8_t channel)
 		{
 			board->md_data.r_data.Lack_A = WANNING_UNSET;
 			board->md_data.r_data.Lack_B = WANNING_UNSET;
+#if(AC_3_3 || AC_3_4)
 			board->md_data.r_data.Lack_C = WANNING_UNSET;
+#endif
 			count = 0;
 		}
 		
-		board->md_data.r_data.i_voltage[A] = board->md_data.r_data.output[A].voltage;
-		board->md_data.r_data.i_voltage[B] = board->md_data.r_data.output[B].voltage;
-		board->md_data.r_data.i_voltage[C] = board->md_data.r_data.output[C].voltage;
-		
-		board->md_data.r_data.i_current[A] = board->md_data.r_data.output[A].current;
-		board->md_data.r_data.i_current[B] = board->md_data.r_data.output[B].current;
-		board->md_data.r_data.i_current[C] = board->md_data.r_data.output[C].current;	
 
-		board->md_data.r_data.i_power[A] 	 = board->md_data.r_data.output[A].power;
-		board->md_data.r_data.i_power[B]   = board->md_data.r_data.output[B].power;
-		board->md_data.r_data.i_power[C]   = board->md_data.r_data.output[C].power;			
-		
-		
-		board->md_data.r_data.i_consumer[A] 	= board->md_data.r_data.output[A].consumer;
-		board->md_data.r_data.i_consumer[B]   = board->md_data.r_data.output[B].consumer;
-		board->md_data.r_data.i_consumer[C]   = board->md_data.r_data.output[C].consumer;			
 		
 		board->md_data.r_data.w_input.v_A_up  =	(board->md_data.r_data.i_voltage[A]  > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.v_B_up  =	(board->md_data.r_data.i_voltage[B]  > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
-		board->md_data.r_data.w_input.v_C_up  =	(board->md_data.r_data.i_voltage[C]  > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
-
 		board->md_data.r_data.w_input.v_A_low =	(board->md_data.r_data.i_voltage[A]  < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.v_B_low =	(board->md_data.r_data.i_voltage[B]  < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
-		board->md_data.r_data.w_input.v_C_low =	(board->md_data.r_data.i_voltage[C]  < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
-		
 		board->md_data.r_data.w_input.i_A_up  =	(board->md_data.r_data.i_current[A]  > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.i_B_up  =	(board->md_data.r_data.i_current[B]  > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
-		board->md_data.r_data.w_input.i_C_up  =	(board->md_data.r_data.i_current[C]  > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
-		
 		board->md_data.r_data.w_input.p_A_up  =	(board->md_data.r_data.i_power[A]    > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.p_B_up  =	(board->md_data.r_data.i_power[B]    > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;
-		board->md_data.r_data.w_input.p_C_up  =	(board->md_data.r_data.i_power[C]    > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;		
-
 		board->md_data.r_data.w_input.c_A_up  =	(board->md_data.r_data.i_consumer[A] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.c_B_up  =	(board->md_data.r_data.i_consumer[B] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
-		board->md_data.r_data.w_input.c_C_up  =	(board->md_data.r_data.i_consumer[C] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
-
 		board->md_data.r_data.w_input.lack_A  = board->md_data.r_data.Lack_A;
 		board->md_data.r_data.w_input.lack_B  = board->md_data.r_data.Lack_B;
+		
+#if(AC_3_3 || AC_3_4)
+		board->md_data.r_data.w_input.v_C_up  =	(board->md_data.r_data.i_voltage[C]  > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
+		board->md_data.r_data.w_input.v_C_low =	(board->md_data.r_data.i_voltage[C]  < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
+		board->md_data.r_data.w_input.i_C_up  =	(board->md_data.r_data.i_current[C]  > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
+		board->md_data.r_data.w_input.p_C_up  =	(board->md_data.r_data.i_power[C]    > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;		
+		board->md_data.r_data.w_input.c_C_up  =	(board->md_data.r_data.i_consumer[C] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
 		board->md_data.r_data.w_input.lack_C  = board->md_data.r_data.Lack_C;
-#endif		
+#endif
+
+
+
+		
+	
 	}else
 	{
 			if(channel < RelaySlaveChaNum)
@@ -299,7 +377,35 @@ static void opt_over_func(uint8_t channel)
 			}
 		}
 	#endif
-	
+#else
+	for(int i = 0; i < PT_SUB_COUNT ;i++)
+	{
+		if(board->md_data.rw_data.channel_ctrl[i  ] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+		{
+			if(board->over_func[i]  || board->over_func[i+PT_SUB_COUNT])
+			{
+				board->over_func[i] = board->over_func[i+PT_SUB_COUNT] = 1;
+			}
+		}
+	}
+	async_data da = {0};
+	da.method = PROMPT_CTRL;
+	da.status = RELAY_CLOSE;
+	da.w_eep_flag = FLAG_N_W_EEP;
+	for(int i = 0; i < RelaySlaveChaNum ;i++)
+	{
+		if(board->over_func[i])
+		{
+			board->over_func[i] = 0;
+			if(board->md_data.r_data.status[i] == RELAY_OPEN)
+			{
+				da.channel = i;
+				da.fire_or_zero = _FIRE;
+				da.reg = &board->relay_staging_staus[i];
+				set_relay_sta_async(&da);				
+			}
+		}
+	}	
 	
 #endif
 

+ 160 - 3
truing_control/PDU-3-ADA/modbus/BARE/port/port.c

@@ -287,6 +287,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								async_data da = {0};
 								da.fire_or_zero = _FIRE;
 								da.w_eep_flag = FLAG_W_EEP;
+#if (AC_3_3 || AC_3_4)
 #if SUPPORT_DETECTION
 								if(board->md_data.r_data.detection & 0x1)
 #endif
@@ -305,6 +306,46 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 									}
 									set_relay_sta_async(&da);
 								}
+#else
+								
+								start = usAddress - REALAY_CTRL;
+								uint32_t flag = 0;
+								if(board->md_data.r_data.detection != 0x3)
+								{
+									if(start >= PT_SUB_COUNT)
+									{
+										if(board->md_data.rw_data.channel_ctrl[start] != 0 || board->md_data.rw_data.channel_ctrl[start - PT_SUB_COUNT] != 0)
+										{
+											if(board->md_data.rw_data.channel_ctrl[start] == 0 && (board->md_data.r_data.detection & 0x2))
+											{
+												flag = 1;
+											}
+										}
+									}else{
+										if(board->md_data.rw_data.channel_ctrl[start] != 0 || board->md_data.rw_data.channel_ctrl[start + PT_SUB_COUNT] != 0)
+										{
+											if(board->md_data.rw_data.channel_ctrl[start] == 0 && (board->md_data.r_data.detection & 0x1))
+											{
+												flag = 1;
+											}											
+										}								
+									}
+								}else
+								{
+									if(board->md_data.rw_data.channel_ctrl[start] ==0)
+									{
+										flag = 1;							
+									}
+								}
+								if(flag)
+								{
+									da.method = PROMPT_CTRL;
+									da.status = (usRegHoldBuf[WiRegIndex] & 0x1);
+									da.channel = start;
+									da.reg = &board->relay_staging_staus[start];
+									set_relay_sta_async(&da);			
+								}
+#endif
 							}else if(usAddress >= COMBINE_RELAY && usAddress <=(COMBINE_RELAY + COMBINE_RELAY_LENTH))
 							{
 								async_data da = {0};
@@ -339,7 +380,27 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 #endif
 									}
 									
-								}			
+								}		
+#else
+							if(board->md_data.r_data.detection == 0x3)
+							{
+								start = usAddress - COMBINE_RELAY;
+//								for(int i = start;i < PT_SUB_COUNT;i++)
+//								{
+									if(board->md_data.rw_data.channel_ctrl[start  ] == 0 && board->md_data.rw_data.channel_ctrl[start + PT_SUB_COUNT] == 0)
+									{
+										da.channel = start;
+										da.method = PROMPT_CTRL;
+										da.status = (usRegHoldBuf[WiRegIndex] & 0x1);
+										da.reg = &board->relay_staging_staus[da.channel];
+										set_relay_sta_async(&da);	
+										
+										da.channel = start + PT_SUB_COUNT;
+										da.reg = &board->relay_staging_staus[da.channel];
+										set_relay_sta_async(&da);	
+									}
+//								}
+							}
 #endif
 								
 							}
@@ -369,6 +430,83 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 									set_relay_sta_async(&da);
 #endif									
 								}	
+#else
+							da.method = DELAY_CTRL;
+							da.status = (usAddress == ALL_ON) ? RELAY_OPEN : RELAY_CLOSE;
+							if(board->md_data.r_data.detection != 0x3)
+							{
+								uint8_t sync_buff[PT_SUB_COUNT] = {0};
+								if(board->md_data.r_data.detection & 0x1)
+								{
+									for(int i = 0;i < PT_SUB_COUNT;i++)
+									{
+										if(board->md_data.rw_data.channel_ctrl[i  ] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+										{
+											da.channel = i;
+											da.reg = &board->relay_staging_staus[da.channel];
+											set_relay_sta_async(&da);	
+													
+											da.channel = i + PT_SUB_COUNT;
+											da.reg = &board->relay_staging_staus[da.channel];
+											set_relay_sta_async(&da);	
+											sync_buff[i] = 1;
+										}else
+										{
+											if(board->md_data.rw_data.channel_ctrl[i  ] == 0)
+											{
+												da.channel = i;
+												da.reg = &board->relay_staging_staus[da.channel];
+												set_relay_sta_async(&da);											
+											}
+										}
+									}
+								}
+								if(board->md_data.r_data.detection & 0x2)
+								{
+									for(int i = 0;i < PT_SUB_COUNT;i++)
+									{
+										if(board->md_data.rw_data.channel_ctrl[i  ] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+										{
+											if(!sync_buff[i])
+											{
+												da.channel = i;
+												da.reg = &board->relay_staging_staus[da.channel];
+												set_relay_sta_async(&da);	
+														
+												da.channel = i + PT_SUB_COUNT;
+												da.reg = &board->relay_staging_staus[da.channel];
+												set_relay_sta_async(&da);													
+											}
+										}else
+										{
+											if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+											{
+												da.channel = i + PT_SUB_COUNT;
+												da.reg = &board->relay_staging_staus[da.channel];
+												set_relay_sta_async(&da);											
+											}
+										}
+									}
+								}
+							}else
+							{
+								for(int i = 0;i < PT_SUB_COUNT;i++)
+								{
+										if(board->md_data.rw_data.channel_ctrl[i  ] == 0)
+										{
+											da.channel = i;
+											da.reg = &board->relay_staging_staus[da.channel];
+											set_relay_sta_async(&da);											
+										}
+									
+										if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
+										{
+											da.channel = i + PT_SUB_COUNT;
+											da.reg = &board->relay_staging_staus[da.channel];
+											set_relay_sta_async(&da);											
+										}									
+								}
+							}
 #endif								
 							}else if(usAddress >= THR_INPUT && usAddress <=(THR_OUTPUT_C_MAX+ THR_OUTPUT_C_MAX_LENTH))
 							{
@@ -457,9 +595,28 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 									rom_start = EEPROM_OTHER_ADDR + sizeof(uint32_t) * 63;
 								}else if(usAddress >= CHANNEL_CONTROL && usAddress <=(CHANNEL_CONTROL + CHANNEL_CONTROL_LENTH))
 								{
-									start = usAddress - OVER_FUNC;
+									start = usAddress - CHANNEL_CONTROL;
 									base = (uint32_t*)(&board->md_data.rw_data.channel_ctrl[0]) + start;
-									rom_start = EEPROM_OTHER_ADDR + sizeof(uint32_t) * 71;									
+									rom_start = EEPROM_OTHER_ADDR + sizeof(uint32_t) * 71;	
+									
+									async_data da = {0};
+									da.fire_or_zero = _FIRE;
+									da.w_eep_flag = FLAG_W_EEP;
+									da.method = PROMPT_CTRL;
+
+									da.channel = start;
+									da.reg = &board->relay_staging_staus[da.channel];
+									if(usRegHoldBuf[WiRegIndex] == 1)
+									{
+										da.status = RELAY_OPEN;
+										set_relay_sta_async(&da);	
+									}else if(usRegHoldBuf[WiRegIndex] == 2)
+									{
+										da.status = RELAY_CLOSE;
+										set_relay_sta_async(&da);												
+									}
+									
+									
 								}else if(usAddress >= CLEAR_CONSUMER && (usAddress <=(CLEAR_CONSUMER + CLEAR_CONSUMER_LENTH)))
 								{
 									start = usAddress - CLEAR_CONSUMER;

+ 3 - 5
truing_control/PDU-3-ADA/user/board_cfg.h

@@ -25,8 +25,8 @@
 
 
 #define   AC_3_3                      0
-#define  	AC_3_2											0
-#define   AC_3_4                      1
+#define  	AC_3_2											1
+#define   AC_3_4                      0
 
 
 
@@ -49,9 +49,7 @@
 	#define 	SUPPORT_DETECTION					1
 	#define 	ACSingCurrid              9
 	#define   SUPPORT_RELAY_REMENBER		1
-
-
-
+	#define   SURPPORT_2_PT             1
 #endif
 
 

+ 40 - 8
truing_control/PDU-3-ADA/user/main.c

@@ -81,7 +81,8 @@ int main(){
 		ac_board.handle_input_pt[1] = 1;
 	#endif
 	ac_board.detection();
-	
+
+#if (AC_3_3 || AC_3_4)
 	if((ac_board.md_data.r_data.detection & 0x1) == 0)
 	{
 		for(uint8_t i = 0; i < PT_SUB_COUNT;i++)
@@ -95,18 +96,49 @@ int main(){
 		
 		ac_board.handle_input_pt[0] = 0;
 	}
-#if SURPPORT_2_PT		
-		if((ac_board.md_data.r_data.detection & 0x2) == 0)
+#else
+	if(ac_board.md_data.r_data.detection != 0x3)
+	{
+		
+		
+		
+		if((ac_board.md_data.r_data.detection & 0x1) == 0)
 		{
-			for(uint8_t i = PT_SUB_COUNT; i < RelaySlaveChaNum;i++)
+			if(ac_board.handle_input_pt[0])
 			{
-				ac_board.handle_status[i] = ac_board.relay_staging_staus[i];
-				ac_board.relay_staging_staus[i] = 0;
+				for(int i = 0; i < PT_SUB_COUNT; i++)
+				{
+					if((ac_board.md_data.rw_data.channel_ctrl[i] == 0) && (ac_board.md_data.rw_data.channel_ctrl[i+PT_SUB_COUNT] == 0))
+					{
+						ac_board.handle_status[i] = (ac_board.relay_staging_staus[i] & 0x1);
+						ac_board.relay_staging_staus[i] = 0;
+						ac_board.handle_status[i + PT_SUB_COUNT] = (ac_board.relay_staging_staus[i+PT_SUB_COUNT] & 0x1);
+						ac_board.relay_staging_staus[i + PT_SUB_COUNT] = 0;
+					}
+				}
+				ac_board.handle_input_pt[0] = 0;
 			}
-			ac_board.handle_input_pt[1] = 0;
 		}
-#endif
+		if((ac_board.md_data.r_data.detection & 0x2) == 0)
+		{
+			if(ac_board.handle_input_pt[1])
+			{
+				for(int i = 0; i < PT_SUB_COUNT; i++)
+				{
+					if((ac_board.md_data.rw_data.channel_ctrl[i] == 0) && (ac_board.md_data.rw_data.channel_ctrl[i+PT_SUB_COUNT] == 0))
+					{
+						ac_board.handle_status[i] = (ac_board.relay_staging_staus[i] & 0x1);
+						ac_board.relay_staging_staus[i] = 0;
+						ac_board.handle_status[i + PT_SUB_COUNT] = (ac_board.relay_staging_staus[i+PT_SUB_COUNT] & 0x1);
+						ac_board.relay_staging_staus[i + PT_SUB_COUNT] = 0;
+					}
+				}
+				ac_board.handle_input_pt[1] = 0;
+			}
+		}		
+	}
 
+#endif
 #endif
 	
 	while(1)