Преглед на файлове

双火线部分代码!!!

liyi преди 1 година
родител
ревизия
5770dbf5c2

+ 37 - 0
truing_control/PDU-Triphasic_IO/HARDWARE/Hlw8110/Hlw8110.c

@@ -1027,6 +1027,43 @@ void read_Hlw8110(uint8_t cs_x,uint8_t read_kWh_flag)
 			SEL_2_L;
 		}
 		break;
+#if SUPPORT_DOUBLE_FIRE
+		case 3:
+		{
+			SEL_0_H;
+			SEL_1_H;
+			SEL_2_L;
+		}
+		break;
+		case 4:
+		{
+			SEL_0_L;
+			SEL_1_L;
+			SEL_2_H;
+		}
+		break;
+		case 5:
+		{
+			SEL_0_H;
+			SEL_1_L;
+			SEL_2_H;
+		}
+		break;
+		case 6:
+		{
+			SEL_0_L;
+			SEL_1_H;
+			SEL_2_H;
+		}
+		break;
+		case 7:
+		{
+			SEL_0_H;
+			SEL_1_H;
+			SEL_2_H;
+		}
+		break;
+#endif
 		default:
 			return;
 	}

+ 49 - 2
truing_control/PDU-Triphasic_IO/HARDWARE/IO/key_io.c

@@ -1,5 +1,6 @@
 #include "key_io.h"
 #include "gd32e23x_libopt.h"
+#include "board_cfg.h"
 
 
 
@@ -9,6 +10,14 @@
 #define KEY_IO_RST_RCU     			RCU_GPIOC
 #define KEY_IO_DETECTION_RCU    RCU_GPIOA
 
+#if SUPPORT_DOUBLE_FIRE
+	#define KEY_IO_DETECTION_2_RCU    RCU_GPIOB
+	#define KEY_IO_DETECTION_2    		GPIOB
+	#define KEY_DETECTION_2           GPIO_PIN_3
+	uint8_t  key_detection_2 = 0;
+	extern uint16_t  detection_count_2;
+#endif
+
 
 #define KEY_IO_RST  			GPIOC
 #define KEY_IO_TEST				GPIOB
@@ -25,6 +34,17 @@
 #define DERECTION_EXIT_SOURCE         				EXTI_SOURCE_PIN11
 #define DERECTION_EXIT_EXIT      							EXTI_11	
 
+#if SUPPORT_DOUBLE_FIRE
+
+
+#define DERECTION_EXIT_RCU_2										EXTI_SOURCE_GPIOB
+#define DERECTION_EXIT_PIN_2     								KEY_DETECTION_2
+#define DERECTION_EXIT_SOURCE_2         				EXTI_SOURCE_PIN3
+#define DERECTION_EXIT_EXIT_2      							EXTI_3
+
+#endif
+
+
 extern uint16_t  detection_count;
 uint8_t  key_detection = 0;
 
@@ -49,10 +69,20 @@ static void   ConfigDetection(void)
 	rcu_periph_clock_enable(RCU_CFGCMP);
 	rcu_periph_clock_enable(KEY_IO_DETECTION_RCU);
 	gpio_mode_set(KEY_IO_DETECTION, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_DETECTION);
-	nvic_irq_enable(EXTI4_15_IRQn,2);
+	nvic_irq_enable(EXTI4_15_IRQn,3);
 	syscfg_exti_line_config(DERECTION_EXIT_RCU,DERECTION_EXIT_SOURCE);
 	exti_init(DERECTION_EXIT_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
 	exti_interrupt_flag_clear(DERECTION_EXIT_EXIT);
+	
+#if SUPPORT_DOUBLE_FIRE
+	rcu_periph_clock_enable(KEY_IO_DETECTION_2_RCU);
+	gpio_mode_set(KEY_IO_DETECTION_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_DETECTION_2);
+	nvic_irq_enable(EXTI2_3_IRQn,3);
+	syscfg_exti_line_config(DERECTION_EXIT_RCU_2,DERECTION_EXIT_SOURCE_2);
+	exti_init(DERECTION_EXIT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
+	exti_interrupt_flag_clear(DERECTION_EXIT_EXIT_2);	
+#endif	
+
 }
 
 void EXTI4_15_IRQHandler(void){
@@ -65,6 +95,18 @@ void EXTI4_15_IRQHandler(void){
 	}
 }
 
+#if SUPPORT_DOUBLE_FIRE
+
+void EXTI2_3_IRQHandler(void){
+	if(RESET != exti_interrupt_flag_get(DERECTION_EXIT_EXIT_2))
+	{
+		key_detection_2 = 1;
+		detection_count_2 = 0;
+		exti_interrupt_flag_clear(DERECTION_EXIT_EXIT_2);
+	}
+}
+#endif
+
 
 bool get_rst()
 {
@@ -105,5 +147,10 @@ uint8_t  get_detection()
 //	bool ret = false;
 //	if((status = gpio_input_bit_get(KEY_IO_IO,KEY_DETECTION)) == RESET)
 //		ret = true;
-	return key_detection;
+	uint8_t value = 0;
+#if SUPPORT_DOUBLE_FIRE
+	value |= (key_detection_2 ? (1<<1):(0<<1));
+#endif
+	value |= (key_detection ? (1<<0):(0<<0));
+	return value;
 }

+ 1 - 1
truing_control/PDU-Triphasic_IO/HARDWARE/ReadEeprom/ReadEeprom.c

@@ -11,7 +11,7 @@
 
 extern uint8_t AC3PPDU_active_chn;
 extern uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len];
-extern uint32_t hlw8110_base[Output_ChN_default + 1];
+extern uint32_t hlw8110_base[Output_ChN_default+1];
 
 /*********************************************************************************************************
 * º¯ÊýÃû³Æ£ºReadEeprom

+ 25 - 3
truing_control/PDU-Triphasic_IO/HARDWARE/Relay/Relay.c

@@ -9,7 +9,12 @@ static void ConfigRelayGPIO(void);
 static void ConfigRelayGPIO(void)
 {
 	rcu_periph_clock_enable(Data_Output_RCU_B);  
-  
+#if SUPPORT_DOUBLE_FIRE
+  gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |GPIO_PIN_12 |GPIO_PIN_13 |GPIO_PIN_14|GPIO_PIN_15);          
+  gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |GPIO_PIN_12 |GPIO_PIN_13 |GPIO_PIN_14|GPIO_PIN_15); 
+	gpio_bit_reset(GPIOB, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |GPIO_PIN_12 |GPIO_PIN_13 |GPIO_PIN_14|GPIO_PIN_15);  
+#else
+
   gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, DB_Out1);          
   gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, DB_Out1); 
   gpio_bit_reset(GPIOB, DB_Out1);   																		
@@ -24,7 +29,12 @@ static void ConfigRelayGPIO(void)
 	
   gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, DB_Out4);          
   gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, DB_Out4);
-  gpio_bit_reset(GPIOB, DB_Out4);   																				
+  gpio_bit_reset(GPIOB, DB_Out4);   
+
+
+
+
+#endif
 }
 
 void InitRelay(void)
@@ -48,4 +58,16 @@ void Relayx_Onoff_state(uint8_t RLx,uint8_t st)
 	}
 }
 
-
+void set_relay_state(uint8_t channel,uint8_t status)
+{
+	uint8_t data = (channel + 8);
+	if(data >15)
+			return;
+	if(status)
+	{
+		gpio_bit_set(GPIOB,BIT(data));
+	}else
+	{
+		gpio_bit_reset(GPIOB,BIT(data));
+	}
+}

+ 7 - 4
truing_control/PDU-Triphasic_IO/HARDWARE/Relay/Relay.h

@@ -25,10 +25,12 @@
 #define Data_Output_RCU_B RCU_GPIOB
 
 
-#define DB_Out4 GPIO_PIN_11					// N
-#define DB_Out3 GPIO_PIN_10					// L3
-#define DB_Out2 GPIO_PIN_9					// L2
-#define DB_Out1 GPIO_PIN_8					// L1
+#define DB_Out4 GPIO_PIN_11					// N      
+#define DB_Out3 GPIO_PIN_10					// L3			
+#define DB_Out2 GPIO_PIN_9					// L2			
+#define DB_Out1 GPIO_PIN_8					// L1     
+
+
 
 
 
@@ -53,4 +55,5 @@
 
 void InitRelay(void);                   
 void Relayx_Onoff_state(uint8_t RLx,uint8_t st);
+void set_relay_state(uint8_t channel,uint8_t status);
 #endif

+ 25 - 4
truing_control/PDU-Triphasic_IO/HARDWARE/Timer/Timer.c

@@ -30,15 +30,20 @@ static uint8_t s_i100mSFlag 														= 0;    							//
 static uint8_t s_i1secFlag 															= 0;    							//将1s标志位的值设置为0
 uint8_t Read_data_cnt 																	= 0;
 uint32_t Delay_N_mS 																		= 0;
-uint32_t RL_delay_cnt[Output_ChN_default + 1] 					= {0};
-uint32_t RL_delay_Limit[Output_ChN_default + 1] 				= {0};
+uint32_t RL_delay_cnt[Output_ChN_default] 					= {0};
+uint32_t RL_delay_Limit[Output_ChN_default] 				= {0};
 #if SUPPORT_ZERO_LINE
 uint32_t RL_N_delay_cnt 																= 0;
 uint32_t RL_N_delay_Limit 															= 0;
 #endif
 
-extern uint8_t RL_begin_delay_flag[Output_ChN_default + 1];
-extern uint8_t RL_end_delay_flag[Output_ChN_default + 1];
+#if SUPPORT_DOUBLE_FIRE
+	extern	uint8_t  key_detection_2;
+	uint16_t  detection_count_2 = 0;
+#endif
+
+extern uint8_t RL_begin_delay_flag[Output_ChN_default];
+extern uint8_t RL_end_delay_flag[Output_ChN_default];
 extern uint8_t RL_N_begin_delay_flag;  																				//add by liyi
 extern uint8_t RL_N_end_delay_flag;																						// add by liyi
 extern uint8_t write_kwh2Eeprom_flag; 																				// add by liyi
@@ -47,6 +52,8 @@ extern uint8_t kwh_200ms_read_flag; 					 																// add by liyi
 uint32_t  detection_count = 0;																								// add by liyi
 extern uint8_t key_detection;																									// add by liyi
 
+uint16_t read_ele_count = 0;
+extern uint8_t read_ele_flag;
 
 /*********************************************************************************************************
 *                                              内部函数声明
@@ -146,6 +153,20 @@ void TIMER14_IRQHandler(void)
 		key_detection = 0;
 		detection_count = 0;
 	}
+#if SUPPORT_DOUBLE_FIRE
+	detection_count_2 ++;
+	if(detection_count_2 >1000)
+	{
+		detection_count_2 = 0;
+		key_detection_2 = 0;
+	}
+#endif
+	read_ele_count ++;
+	if(read_ele_count >=600)
+	{
+		read_ele_count = 0;
+		read_ele_flag = 1;
+	}
 	if(Delay_N_mS > 0)
 	{
 		Delay_N_mS--;

+ 3 - 3
truing_control/PDU-Triphasic_IO/Modbus/BARE/port/port.c

@@ -34,15 +34,15 @@
 
 //保持寄存器
 #define REG_HOLD_START   AC3PPDU_Modbus_RegStAd
-#define REG_HOLD_NREGS   1000
+#define REG_HOLD_NREGS   700
 
 //线圈
 #define REG_COILS_START  0
-#define REG_COILS_NREGS  4
+#define REG_COILS_NREGS  1
 
 //开关寄存器
 #define REG_DISCRETE_START 1000
-#define REG_DISCRETE_NREGS 4
+#define REG_DISCRETE_NREGS 1
 /* ----------------------- Static variables ---------------------------------*/
 static USHORT   usRegInputStart = REG_INPUT_START;
 static USHORT   usRegInputBuf[REG_INPUT_NREGS];

+ 6 - 1
truing_control/PDU-Triphasic_IO/USER/board_cfg.h

@@ -5,7 +5,8 @@
 
 
 #define PRJ_3_P_4_LINE  0
-#define PRJ_3_P_3_LINE  1
+#define PRJ_3_P_3_LINE  0
+#define PRJ_3_P_2_LINE  1
  
 
 #if PRJ_3_P_3_LINE
@@ -17,6 +18,10 @@
 	#define SUPPORT_ZERO_LINE			1
 	#define SUPPORT_KEY_CTRL      0
 	#define SUPPORT_DETECTION     0
+#elif PRJ_3_P_2_LINE
+	#define SUPPORT_DETECTION     	1
+	#define SUPPORT_DETECT_REMENBER 1
+	#define SUPPORT_DOUBLE_FIRE     1
 #endif
 
 #endif

+ 1 - 1
truing_control/PDU-Triphasic_IO/USER/cfg.h

@@ -18,7 +18,7 @@
 #define PROGRAME_APP1_SIZE								(48*1024)													//App1 programe Max size
 
 
-#define VERSION                          		"V1.0.0.20"
+#define VERSION                          		"V1.0.0.0"
 
 #define MODBUS_HEAD                        	"GOWONE_UPGRADE"
 

+ 287 - 103
truing_control/PDU-Triphasic_IO/USER/main.c

@@ -23,8 +23,8 @@
 
 
 
-AC_Output_struct_Reg  			AC3PPDU_Output[Output_ChN_default + 2] = {0}; 
-AC3PPDU_RELAY_Para_Reg 			AC3PPDU_RL_time[Output_ChN_default + 2] = {0};
+AC_Output_struct_Reg  			AC3PPDU_Output[Output_ChN_default + 1] = {0}; 
+AC3PPDU_RELAY_Para_Reg 			AC3PPDU_RL_time[Output_ChN_default + 1] = {0};
 AC3PPDU_RELAY_Para_Reg 			AC3PPDU_RL_N_time;	
 
 
@@ -41,7 +41,7 @@ uint8_t 			flash_flag = 0;
 uint32_t 			AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len] = {0};
 uint8_t 			AC3PPDU_active_chn;
 information_t infomation;
-uint32_t 			hlw8110_base[Output_ChN_default + 1] = {0}; //add by liyi
+uint32_t 			hlw8110_base[Output_ChN_default+1] = {0}; //add by liyi
 uint8_t 			Wr_eeprom_cnt = 0;
 
 uint8_t 		read_ele_flag = 0;
@@ -67,13 +67,13 @@ bool orderFlag[Output_ChN_default] ={0};
 #endif
 
 
-uint8_t RL_begin_delay_flag[Output_ChN_default+1] 	= {0x00};
-uint8_t RL_end_delay_flag[Output_ChN_default+1] 		= {0x00};
-uint8_t RL_ON_flag[Output_ChN_default+1] 						= {0x00};
-uint8_t RL_OFF_flag[Output_ChN_default+1] 					= {0x00};
-uint8_t RL_last_state[Output_ChN_default+1] 				= {0x00};
-uint8_t RL_now_state[Output_ChN_default+1] 					= {0x00};
-uint8_t RL_Func_statu[Output_ChN_default + 1] 			= {0x00};
+uint8_t RL_begin_delay_flag[Output_ChN_default] 	= {0x00};
+uint8_t RL_end_delay_flag[Output_ChN_default] 		= {0x00};
+uint8_t RL_ON_flag[Output_ChN_default] 						= {0x00};
+uint8_t RL_OFF_flag[Output_ChN_default] 					= {0x00};
+uint8_t RL_last_state[Output_ChN_default] 				= {0x00};
+uint8_t RL_now_state[Output_ChN_default] 					= {0x00};
+uint8_t RL_Func_statu[Output_ChN_default] 			= {0x00};
 uint8_t RL_All_Func 																= 0x0;
 uint32_t normal_running_time = 0;
 
@@ -102,10 +102,10 @@ uint8_t write_kwh2Eeprom_flag 													= 0;
 
 
 
-extern float 										hlw8110_store[Output_ChN_default + 1];
+extern float 										hlw8110_store[Output_ChN_default+1];
 extern uint32_t 								Modbus_Wr_buff[Mb_Wcmd_Width][Mb_Wcmd_len];
 
-extern uint32_t 								RL_delay_Limit[Output_ChN_default + 1];
+extern uint32_t 								RL_delay_Limit[Output_ChN_default];
 
 
 static void MODbus_CMD_New(void);
@@ -135,31 +135,64 @@ static void app_init(META_DATA_S *meta)
 
 static bool select_channel(uint8_t ch_x)
 {
-	if(ch_x == 0)
-		return false;
 	switch(ch_x)
 	{
-		case CH1_out:
+		case 0:
 		{
 				SEL_0_L;
 				SEL_1_L;
 				SEL_2_L;
 		}
 			break;
-		case CH2_out:
+		case 1:
 		{
 				SEL_0_H;
 				SEL_1_L;
 				SEL_2_L;
 		}
 			break;
-		case CH3_out:
+		case 2:
 		{
 				SEL_0_L;
 				SEL_1_H;
 				SEL_2_L;
 		}
 			break;
+		case 3:
+		{
+				SEL_0_H;
+				SEL_1_H;
+				SEL_2_L;
+		}
+			break;
+		case 4:
+		{
+				SEL_0_L;
+				SEL_1_L;
+				SEL_2_H;
+		}
+			break;
+		case 5:
+		{
+				SEL_0_H;
+				SEL_1_L;
+				SEL_2_H;
+		}
+			break;
+		case 6:
+		{
+				SEL_0_L;
+				SEL_1_H;
+				SEL_2_H;
+		}
+			break;
+		case 7:
+		{
+				SEL_0_H;
+				SEL_1_H;
+				SEL_2_H;
+		}
+			break;
 		default:
 			return false;
 	}
@@ -187,11 +220,11 @@ static void  check_jlink()
 	#if SUPPORT_DETECTION
 			if(detection_value == 0)			// duan lu qi shi fou zai xian
 			{
-				for(int i = 0; i < Output_ChN_default;i++)
-				{
-					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
-					orderFlag[i]=true;
-				}
+//				for(int i = 0; i < Output_ChN_default;i++)
+//				{
+//					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
+//					orderFlag[i]=true;
+//				}
 			}else
 	#endif
 			{
@@ -217,18 +250,29 @@ static void  check_jlink()
 			}
 #else
 	#if SUPPORT_DETECTION
-  		if(detection_value == 0)
-			{
-				for(int i = 0; i < Output_ChN_default;i++)
-				{
-					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
-					orderFlag[i]=true;
-				}
-		#if SUPPORT_ZERO_LINE
-				AC3PPDU_RL_N_time.LT_state &= 0xffffff7e;
-				orderFlag_N = true;
+		#if SUPPORT_DOUBLE_FIRE
+//		if(detection_value != 0x3)
+//		{
+//				for(int i = 0; i < Output_ChN_default;i++)
+//				{
+//					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
+//					orderFlag[i]=true;
+//				}		
+//		}
+		#else
+//  		if(detection_value == 0)
+//			{
+//				for(int i = 0; i < Output_ChN_default;i++)
+//				{
+//					AC3PPDU_RL_time[i + CH1_out].LT_state &=0xffffff7e;
+//					orderFlag[i]=true;
+//				}
+//		#if SUPPORT_ZERO_LINE
+//				AC3PPDU_RL_N_time.LT_state &= 0xffffff7e;
+//				orderFlag_N = true;
+//		#endif
+//			}
 		#endif
-			}
 	#endif
 #endif
 
@@ -361,40 +405,42 @@ static void  check_jlink()
 					if(RL_ON_flag[i] > 0)
 					{
 						RL_ON_flag[i] = 0;
-						switch (i)
-						{
-							case 0:
-								DB_Out1_H;
-								break;
-							case 1:
-								DB_Out2_H;
-								break;
-							case 2:
-								DB_Out3_H;
-								break;
-							default:
-								return;
-						}
+						set_relay_state(i,1);
+//						switch (i)
+//						{
+//							case 0:
+//								DB_Out1_H;
+//								break;
+//							case 1:
+//								DB_Out2_H;
+//								break;
+//							case 2:
+//								DB_Out3_H;
+//								break;
+//							default:
+//								return;
+//						}
 						AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = (AC3PPDU_RL_time[i + CH1_out].LT_state 				| 0x01);
 						AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
 						
 					}else if(RL_OFF_flag[i] > 0)
 					{
 						RL_OFF_flag[i] = 0;
-						switch (i)
-						{
-							case 0:
-								DB_Out1_L;
-								break;
-							case 1:
-								DB_Out2_L;
-								break;
-							case 2:
-								DB_Out3_L;
-								break;
-							default:
-								return;
-						}
+						set_relay_state(i,0);
+//						switch (i)
+//						{
+//							case 0:
+//								DB_Out1_L;
+//								break;
+//							case 1:
+//								DB_Out2_L;
+//								break;
+//							case 2:
+//								DB_Out3_L;
+//								break;
+//							default:
+//								return;
+//						}
 						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
@@ -415,10 +461,11 @@ static void LimiT_enable_check(uint8_t ch_x,uint32_t Lt_v)
 {
 	uint16_t temp0 = 0;
 	temp0 = Lt_v >> 1;
+#if (!SUPPORT_DOUBLE_FIRE)
 	if(ch_x > 3)
 	{
 		return;
-	}
+#endif
 	//ͨµÀ×î´óµçѹ
 	if((temp0 & AC3PPDU_Vmax_LT_enable) == AC3PPDU_Vmax_LT_enable)
 	{
@@ -493,19 +540,40 @@ static void RL_Over_Func()
 
 static void key_io_control()
 {
-
-	if(get_detection())
-	{
-		AC3PPDU_Modbus_Reg[Mb_Dbuff_Detection] = 0x1;
-	}else
-	{
-		AC3PPDU_Modbus_Reg[Mb_Dbuff_Detection] = 0x0;
-	}
+	AC3PPDU_Modbus_Reg[Mb_Dbuff_Detection] = detection_value;
 }
 
 void switch_recode()
 {
 #if SUPPORT_DETECT_REMENBER
+	#if SUPPORT_DOUBLE_FIRE
+	if(detection_value != 0x3)
+	{
+		if(handle_detection[0] == 1)
+		{
+			for(int i = 0; i < Output_ChN_default;i++)
+			{	
+				handle_status[i] = (AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] & 0x1);
+				AC3PPDU_RL_time[i + CH1_out].LT_state &= 0xffffff7e;
+				orderFlag[i]=true;	
+			}
+			handle_detection[0] = 0;			
+		}
+	}else
+	{
+		if(handle_detection[0] == 0)
+		{
+			for(int i = 0; i < Output_ChN_default;i++)
+			{
+				uint32_t data = (AC3PPDU_RL_time[i + CH1_out].LT_state & (~0x40));
+				AC3PPDU_RL_time[i + CH1_out].LT_state  = (data & 0x40);
+				AC3PPDU_RL_time[i + CH1_out].LT_state |= handle_status[i];
+				orderFlag[i]=true;
+			}
+			handle_detection[0] = 1;	
+		}
+	}
+	#else
 	if(detection_value == 0)
 	{
 		if(handle_detection[0] == 1)
@@ -516,9 +584,9 @@ void switch_recode()
 				AC3PPDU_RL_time[i + CH1_out].LT_state &= 0xffffff7e;
 				orderFlag[i]=true;
 			}
-#if SUPPORT_ZERO_LINE
-			handle_status_N = (AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr] & 0x1);
-#endif
+		#if SUPPORT_ZERO_LINE
+					handle_status_N = (AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr] & 0x1);
+		#endif
 			handle_detection[0] = 0;
 		}
 	}else
@@ -532,21 +600,117 @@ void switch_recode()
 				AC3PPDU_RL_time[i + CH1_out].LT_state |= handle_status[i];
 				orderFlag[i]=true;
 			}
-#if SUPPORT_ZERO_LINE
-		uint32_t data = (AC3PPDU_RL_N_time.LT_state & (~0x40));
-		AC3PPDU_RL_time[i + CH1_out].LT_state  = (data & 0x40);
-		AC3PPDU_RL_time[i + CH1_out].LT_state |= handle_status[i];
-			orderFlag_N = true;
-#endif
+			#if SUPPORT_ZERO_LINE
+					uint32_t data = (AC3PPDU_RL_N_time.LT_state & (~0x40));
+					AC3PPDU_RL_time[i + CH1_out].LT_state  = (data & 0x40);
+					AC3PPDU_RL_time[i + CH1_out].LT_state |= handle_status[i];
+						orderFlag_N = true;
+			#endif
 			handle_detection[0] = 1;			
 		}
 	}
+	#endif
 #endif
 }
 
 
 
 
+static void read_ele(void)
+{
+#if SUPPORT_DOUBLE_FIRE
+	static uint8_t channel = 0;
+	read_Hlw8110(channel,0);
+	channel ++;
+	if(channel == Output_ChN_default)
+	{
+		channel = 0;
+		//
+		uint32_t _data = 0;
+		_data = AC3PPDU_Output[CH1_out].AC_V > _data ? AC3PPDU_Output[CH1_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH2_out].AC_V > _data ? AC3PPDU_Output[CH2_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH3_out].AC_V > _data ? AC3PPDU_Output[CH3_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH4_out].AC_V > _data ? AC3PPDU_Output[CH4_out].AC_V :_data;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = _data;
+		_data = 0;
+		_data = AC3PPDU_Output[CH5_out].AC_V > _data ? AC3PPDU_Output[CH5_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH6_out].AC_V > _data ? AC3PPDU_Output[CH6_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH7_out].AC_V > _data ? AC3PPDU_Output[CH7_out].AC_V :_data;
+		_data = AC3PPDU_Output[CH8_out].AC_V > _data ? AC3PPDU_Output[CH8_out].AC_V :_data;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] = _data;
+		
+		_data  = AC3PPDU_Output[CH1_out].AC_I;
+		_data += AC3PPDU_Output[CH2_out].AC_I;
+		_data += AC3PPDU_Output[CH3_out].AC_I;
+		_data += AC3PPDU_Output[CH4_out].AC_I;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] = _data;
+		
+		_data  = AC3PPDU_Output[CH5_out].AC_I;
+		_data += AC3PPDU_Output[CH6_out].AC_I;
+		_data += AC3PPDU_Output[CH7_out].AC_I;
+		_data += AC3PPDU_Output[CH8_out].AC_I;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] = _data;	
+		
+		_data  = AC3PPDU_Output[CH1_out].AC_P;
+		_data += AC3PPDU_Output[CH2_out].AC_P;
+		_data += AC3PPDU_Output[CH3_out].AC_P;
+		_data += AC3PPDU_Output[CH4_out].AC_P;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] = _data;
+		
+		_data  = AC3PPDU_Output[CH5_out].AC_P;
+		_data += AC3PPDU_Output[CH6_out].AC_P;
+		_data += AC3PPDU_Output[CH7_out].AC_P;
+		_data += AC3PPDU_Output[CH8_out].AC_P;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] = _data;		
+		
+		_data  = AC3PPDU_Output[CH1_out].AC_kWh;
+		_data += AC3PPDU_Output[CH2_out].AC_kWh;
+		_data += AC3PPDU_Output[CH3_out].AC_kWh;
+		_data += AC3PPDU_Output[CH4_out].AC_kWh;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = _data;
+		
+		_data  = AC3PPDU_Output[CH5_out].AC_kWh;
+		_data += AC3PPDU_Output[CH6_out].AC_kWh;
+		_data += AC3PPDU_Output[CH7_out].AC_kWh;
+		_data += AC3PPDU_Output[CH8_out].AC_kWh;
+		AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] = _data;		
+			
+		for(int i = 0;i < (Output_ChN_default + 1);i++)
+		{
+			Fault_state_process(i);
+		}		
+	}
+	
+	
+#else
+			for(int j = 0 ; j < Hlw8110_CS;j++)
+				read_Hlw8110(j,0);
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = AC3PPDU_Output[CH1_out].AC_V;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] = AC3PPDU_Output[CH2_out].AC_V;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] = AC3PPDU_Output[CH3_out].AC_V;
+			
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] = AC3PPDU_Output[CH1_out].AC_I;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] = AC3PPDU_Output[CH2_out].AC_I;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] = AC3PPDU_Output[CH3_out].AC_I;
+			
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] = AC3PPDU_Output[CH1_out].AC_P;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] = AC3PPDU_Output[CH2_out].AC_P;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] = AC3PPDU_Output[CH3_out].AC_P;
+			
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + (hlw8110_store[CH1_out]*1000);
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + (hlw8110_store[CH2_out]*1000);
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + (hlw8110_store[CH3_out]*1000);
+			for(int i = 0;i < (Output_ChN_default + 1);i++)
+			{
+				Fault_state_process(i);
+			}		
+#endif
+}
+
+
+
+
+
 
 int main(void)
 {
@@ -566,7 +730,7 @@ int main(void)
 	eMBEnable();
 	key_io_init(NULL);
 	AC3PPDU_active_chn = Output_ChN_default;
-	for(int i = 1; i <= AC3PPDU_active_chn;i++)
+	for(int i = 0; i < AC3PPDU_active_chn;i++)
 	{
 		hlw8110_init(i);
 	}
@@ -635,30 +799,14 @@ int main(void)
 #if SUPPORT_DETECTION
 			detection_value = get_detection();
 #endif
-			for(int j = 0 ; j < Hlw8110_CS;j++)
-				read_Hlw8110(j,0);
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = AC3PPDU_Output[CH1_out].AC_V;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] = AC3PPDU_Output[CH2_out].AC_V;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] = AC3PPDU_Output[CH3_out].AC_V;
-			
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] = AC3PPDU_Output[CH1_out].AC_I;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] = AC3PPDU_Output[CH2_out].AC_I;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] = AC3PPDU_Output[CH3_out].AC_I;
-			
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] = AC3PPDU_Output[CH1_out].AC_P;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] = AC3PPDU_Output[CH2_out].AC_P;
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] = AC3PPDU_Output[CH3_out].AC_P;
-			
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + (hlw8110_store[CH1_out]*1000);
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + (hlw8110_store[CH2_out]*1000);
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + (hlw8110_store[CH3_out]*1000);
-			for(int i = 0;i < (Output_ChN_default + 1);i++)
-			{
-				Fault_state_process(i);
-			}	
 			normal_running_time+=2;
 			write_eep_count ++;
 		}
+		if(read_ele_flag)
+		{
+			read_ele_flag = 0;
+			read_ele();
+		}
 		switch_recode();
 		if(write_eep_count >= 120)			// 120 second recode
 		{
@@ -1164,6 +1312,7 @@ static void Fault_state_process(uint8_t ch_x)
 	
 	if(ch_x == CH_in)
 	{
+#if (!SUPPORT_DOUBLE_FIRE)
 			uint32_t sort_buff[3] = {0};
 			uint32_t Vmax = 0;
 			uint32_t Vmin = 0;
@@ -1180,7 +1329,7 @@ static void Fault_state_process(uint8_t ch_x)
 			{
 				uint32_t v_mid = AC3PPDU_Lack_Voltage *2; 
 				count ++;
-				if(count == 4)
+				if(count == 2)
 				{
 					if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] < v_mid)
 					{
@@ -1203,7 +1352,42 @@ static void Fault_state_process(uint8_t ch_x)
 				AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] = 0;
 				count = 0;
 			}
-		
+#else
+		uint32_t Vmax = 0;
+		uint32_t Vmin = 0;
+		if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr])
+		{
+			Vmax = AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr];
+			Vmin = AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr];
+		}else
+		{
+			Vmax =  AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr];
+			Vmin = AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr];
+		}
+		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(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] < v_mid)
+				{
+					AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 1;
+				}
+				if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] < v_mid)
+				{
+					AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 1;
+				}
+				count = 0;
+			}
+		}else
+		{
+				AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 0;
+				AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 0;
+				//AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] = 0;
+				count = 0;
+		}
+#endif
 		if((AC3PPDU_Modbus_Reg[Mb_Dbuff_ALL_LT_ST_Addr]  & Shield_Vmax_Threshould_enable) > 0)
 		{
 			if(AC_BASE[0] > AC3PPDU_Modbus_Reg[Mb_Dbuff_All_ViLit_Max])

+ 2 - 0
truing_control/PDU-Triphasic_IO/USER/main.h

@@ -21,6 +21,7 @@
 *********************************************************************************************************/
 #include  "stdbool.h"
 #include "gd32e23x_libopt.h"
+#include "board_cfg.h"
 /*********************************************************************************************************
 *                                              ???
 *********************************************************************************************************/
@@ -172,6 +173,7 @@
 #define Mb_Dbuff_OUTCH1_ST_Addr     202
 #define Mb_Dbuff_OUTCH2_ST_Addr     203
 #define Mb_Dbuff_OUTCH3_ST_Addr     204
+#define Mb_Dbuff_OUTCH4_ST_Addr     205
 
 #define Mb_Dbuff_RL_Ton1_Addr       208
 #define Mb_Dbuff_RL_Ton2_Addr       209