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

6路板:耗电量优化,增加看门狗,增加开关检测
3相4路:耗电量优化,增加看门狗。
3相3路:耗电量优化,增加看门狗。
DC:增加阈值控制,增加耗电量清零,增加看门狗,增加通道告警,以及通道阈值超限动作。
普通AC板:增加开关检测,增加看门狗,耗电量清零优化。

liyi преди 2 години
родител
ревизия
b5e64aef8a
променени са 37 файла, в които са добавени 1625 реда и са изтрити 552 реда
  1. 31 0
      control/PDU-AC-New-6/App/Fwdgt/Fwdgt.c
  2. 21 0
      control/PDU-AC-New-6/App/Fwdgt/Fwdgt.h
  3. 1 1
      control/PDU-AC-New-6/App/Hlw8110/Hlw8110.c
  4. 188 80
      control/PDU-AC-New-6/App/Main/Main.c
  5. 10 2
      control/PDU-AC-New-6/HW/Timer/Timer.c
  6. 31 0
      control/PDU-AC/App/Fwdgt/Fwdgt.c
  7. 21 0
      control/PDU-AC/App/Fwdgt/Fwdgt.h
  8. 2 1
      control/PDU-AC/App/Hlw8110/Hlw8110.c
  9. 14 0
      control/PDU-AC/App/Key/Key.c
  10. 13 1
      control/PDU-AC/App/Key/Key.h
  11. 84 36
      control/PDU-AC/App/Main/Main.c
  12. 3 3
      control/PDU-AC/App/Main/Main.h
  13. 7 1
      control/PDU-AC/App/Modbus/BARE/port/port.c
  14. 19 2
      control/PDU-AC/HW/Timer/Timer.c
  15. 1 1
      control/PDU-DC/App/ADC/ADC.c
  16. 31 0
      control/PDU-DC/App/FWDGT/Fwdgt.c
  17. 21 0
      control/PDU-DC/App/FWDGT/Fwdgt.h
  18. 292 5
      control/PDU-DC/App/Main/Main.c
  19. 408 3
      control/PDU-DC/App/Main/Main.h
  20. 1 1
      control/PDU-DC/App/Modbus/BARE/port/port.c
  21. 93 18
      control/PDU-DC/App/ReadEeprom/ReadEeprom.c
  22. 31 0
      control/PDU-Triphasic/App/Fwdgt/Fwdgt.c
  23. 21 0
      control/PDU-Triphasic/App/Fwdgt/Fwdgt.h
  24. 13 5
      control/PDU-Triphasic/App/Hlw8110/Hlw8110.c
  25. 3 1
      control/PDU-Triphasic/App/Hlw8110/Hlw8110.h
  26. 45 19
      control/PDU-Triphasic/App/Main/Main.c
  27. 1 317
      control/PDU-Triphasic/App/Modbus/BARE/port/port.c
  28. 1 1
      control/PDU-Triphasic/App/ReadEeprom/ReadEeprom.c
  29. 12 2
      control/PDU-Triphasic/HW/Timer/Timer.c
  30. 31 0
      control/PDU-Triphasic_IO/App/Fwdgt/Fwdgt.c
  31. 21 0
      control/PDU-Triphasic_IO/App/Fwdgt/Fwdgt.h
  32. 14 6
      control/PDU-Triphasic_IO/App/Hlw8110/Hlw8110.c
  33. 3 2
      control/PDU-Triphasic_IO/App/Hlw8110/Hlw8110.h
  34. 115 41
      control/PDU-Triphasic_IO/App/Main/Main.c
  35. 2 0
      control/PDU-Triphasic_IO/App/Modbus/BARE/port/port.c
  36. 1 1
      control/PDU-Triphasic_IO/App/ReadEeprom/ReadEeprom.c
  37. 19 2
      control/PDU-Triphasic_IO/HW/Timer/Timer.c

+ 31 - 0
control/PDU-AC-New-6/App/Fwdgt/Fwdgt.c

@@ -0,0 +1,31 @@
+#include "Fwdgt.h"
+#include "stdint.h"
+#include "gd32e230_fwdgt.h"
+#include "gd32e230_rcu.h"
+
+void Fwdgt_Init(void)
+{
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//800ms
+	fwdgt_write_disable();
+	fwdgt_enable();
+}
+
+
+
+void Fwdgt_reload(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();
+}
+
+

+ 21 - 0
control/PDU-AC-New-6/App/Fwdgt/Fwdgt.h

@@ -0,0 +1,21 @@
+#ifndef __FWDGT_H
+#define __FWDGT_H
+
+
+
+
+
+
+
+
+
+
+
+void Fwdgt_Init(void);
+
+void Fwdgt_reload(void);
+
+
+
+#endif
+

+ 1 - 1
control/PDU-AC-New-6/App/Hlw8110/Hlw8110.c

@@ -475,7 +475,7 @@ void Init_HLW8110(void)
 
 	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0465);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
 	DelayNms(10);
 
 	

+ 188 - 80
control/PDU-AC-New-6/App/Main/Main.c

@@ -31,11 +31,12 @@
 #include "mb.h"
 #include "Hlw8110.h"
 #include "Config.h"
-#include "Wwdgt.h"
+//#include "Wwdgt.h"
 #include "At24cxx.h"
 #include "I2c.h"
 #include "ReadEeprom.h"
 #include "Sn74lvc573.h"
+#include "Fwdgt.h"
 /*********************************************************************************************************
 *                                              宏定义
 *********************************************************************************************************/
@@ -89,8 +90,10 @@ uint32_t read_Total_Consumer[RelaySlaveChaNum] = {0};
 
 uint32_t hlw8100_flash_backup[RelaySlaveChaNum] = {0};
 uint32_t Hlw8110_Flash_value[RelaySlaveChaNum] = {0};
+float Hlw8110_Restore[RelaySlaveChaNum]={0.0};
 
 uint32_t write_2_minute_flag = 0;
+uint8_t read_kWh_flag = 0;
 
 uint16_t detection_value = 0;
 
@@ -146,64 +149,6 @@ static  void  InitSoftware(void)
 	eMBInit(MB_RTU, RelaySlaveAddress, 0, Uart0_Baud, MB_PAR_NONE);		// 初始化modbus为RTU方式,地址RelaySlaveAddress, 波特率Uart0_Baud,无校验
 	eMBEnable();																											// 使能modbus协议栈
 }
-static bool select_channel(uint8_t ch_x)
-{
-	switch(ch_x)
-	{
-		case 5:
-		{
-			SEL0_H;
-			SEL1_L;
-			SEL2_L;
-		}
-			break;
-		case 4:
-		{
-			SEL0_L;
-			SEL1_L;
-			SEL2_L;			
-		}
-			break;
-		case 3:
-		{
-			SEL0_H;
-			SEL1_H;				
-			SEL2_H;
-		}
-			break;
-		case 2:
-		{
-			SEL0_L;
-			SEL1_H;
-			SEL2_H;
-		}
-			break;
-		case 1:
-		{
-			SEL0_H;
-			SEL1_L;
-			SEL2_H;
-		}
-			break;
-		case 0:
-		{
-			SEL0_L;
-			SEL1_L;
-			SEL2_H;			
-		}
-			break;
-		default:
-			return false;
-	}
-	return true;
-}
-
-void channel_reset(unsigned char ch_x)
-{
-	if(select_channel(ch_x) == false)
-		return;
-	Uart_HLW8110_Reset();
-}
 
 void check_channel_reset()
 {
@@ -215,26 +160,14 @@ void check_channel_reset()
 				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);
+//					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();
+					Hlw8110_Restore[i] = 0.0;
+//					channel_reset(i);
 					EE_ACDC_Consumer_Clear[i].value = 0;
+					
 				}
 				EE_ACDC_Consumer_Clear[i].flag = 0;
 			}
@@ -264,6 +197,179 @@ void check_channel_reset()
 *							0   0     1   1    1     选择A7X    选择A7Y    		TR5    			5								4						5																		4靠电压互感器那边(4通道大电流)
 *							1   1     X   X    X     全部断开   全部断开
 *********************************************************************************************************/
+
+static void select_chn(uint8_t chn)
+{
+	uint8_t channel = chn;
+#if ACSingPhSmaCurr
+#if ACSingPhSmaCurrNew
+			switch(channel)
+			{
+				case 0x05:    //001
+					SEL0_H;
+					SEL1_L;
+					SEL2_L;
+					break;
+				case 0x04:    //000
+					SEL0_L;
+					SEL1_L;
+					SEL2_L;
+					break;
+				case 0x03:		//111
+					SEL0_H;
+					SEL1_H;
+					SEL2_H;
+					break;
+				case 0x02:		//110
+					SEL0_L;
+					SEL1_H;
+					SEL2_H;
+					break;
+				case 0x01:		//101
+					SEL0_H;
+					SEL1_L;
+					SEL2_H;
+					break;
+				case 0x00:		//100
+					SEL0_L;
+					SEL1_L;
+					SEL2_H;
+					break;
+				default:
+					break;
+			}
+#else
+			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
+#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
+}
+static void ProcTaskNew(void)
+{
+	if(Get100msFlag())
+	{
+		uint8_t chal_num=0;
+		for(chal_num=0; chal_num < RelaySlaveChaNum; chal_num++)
+		{
+			select_chn(chal_num);
+			Calculate_HLW8110_MeterData();
+			AC_Ele_ReadReg[chal_num].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[chal_num].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[chal_num].ACDC_V_b/1000);
+			if(AC_Ele_ReadReg[chal_num].AC_V <= 10000)			//小于10V频率为0
+			{
+				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=0;
+				AC_Ele_ReadReg[chal_num].AC_V = 0;
+			}else
+			{
+				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=F_AC_LINE_Freq*1000;
+			}
+			AC_Ele_ReadReg[chal_num].AC_LINE_Freq=AC_Ele_ReadReg[chal_num].AC_LINE_Freq;
+			AC_Ele_ReadReg[chal_num].AC_I=(F_AC_I*EE_ACDC_Coef_ReadReg[chal_num].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[chal_num].ACDC_I_b/1000);//实际的电流放大1000倍,实际的K,B值要缩小1000倍
+			if(AC_Ele_ReadReg[chal_num].AC_V == 0)
+			{
+				AC_Ele_ReadReg[chal_num].AC_I = 0;
+			}
+			if((AC_Ele_ReadReg[chal_num].AC_I)<=No_Load[chal_num])
+				AC_Ele_ReadReg[chal_num].AC_P=0;                                                                                //有功功率
+			else
+				AC_Ele_ReadReg[chal_num].AC_P=F_AC_P*1000;
+
+		}
+		Clr100msFlag();
+	}
+	if(read_kWh_flag)
+	{
+		read_kWh_flag = 0;
+		uint8_t chal_num=0;
+		for(chal_num=0; chal_num < RelaySlaveChaNum; chal_num++)
+		{
+			select_chn(chal_num);
+			Read_HLW8110_EA();
+			Hlw8110_Restore[chal_num] += F_AC_E;
+			AC_Ele_ReadReg[chal_num].AC_E = (Hlw8110_Restore[chal_num] *1000);
+			EE_ACDC_Total_Consum_Read_Reg[chal_num].ACDC_Consumption = (read_Total_Consumer[chal_num] + AC_Ele_ReadReg[chal_num].AC_E);    //total consumer
+			ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[chal_num].ACDC_Consumption;
+		}
+	}
+	WarnState();																																																							//更新状态寄存器的告警阈值
+	over_RelayState();
+}
+
 static  void  Proc100msTask(void)
 {
 	unsigned int chal_num=0;
@@ -446,8 +552,8 @@ static  void  Proc100msTask(void)
 			AC_Ele_ReadReg[channel].AC_P=0;                                                                                //有功功率
 		else
 			AC_Ele_ReadReg[channel].AC_P=F_AC_P*1000;                                                                                //有功功率
-		
-		AC_Ele_ReadReg[channel].AC_E = F_AC_E*1000;																//电能
+		Hlw8110_Restore[channel] += F_AC_E;
+		AC_Ele_ReadReg[channel].AC_E = (Hlw8110_Restore[channel]*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
@@ -1098,14 +1204,16 @@ int main(void)
 //	RelaySlaveAddress=ReadKeyValue();	//读取从机的地址
 //  InitSoftware();   								//初始化软件相关函数
 //	InitWwdgt();         							//最后初始化WWDGT模块
-
+	Fwdgt_Init();
   while(1)
   {
 		eMBPoll();
 		Proc100msTask();			//100ms处理任务
+		//ProcTaskNew();
 		detection_value = get_detection();
 		check_channel_reset();
     Proc1SecTask(); 			//1s处理任务   
+		Fwdgt_reload();
 #ifdef ACSingPhSmaCurrNew
 		if(write_2_minute_flag == 1)
 		{

+ 10 - 2
control/PDU-AC-New-6/HW/Timer/Timer.c

@@ -897,10 +897,13 @@ void TIMER15_IRQHandler(void)
 * 创建日期:2021年07月01日
 * 注    意:每毫秒进入一次中断服务函数
 *********************************************************************************************************/
+
+//extern uint8_t read_kWh_flag;
 void TIMER16_IRQHandler(void)  
 {
   static  short s_iCnt1000  = 0;                                    //定义一个静态变量s_iCnt1000作为1s计数器
 	static 	uint32_t  cnt = 0;
+//	static 	uint32_t  cntReadkWh = 0;
   if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET)  //判断定时器更新中断是否发生
   {
     timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP);         //清除定时器更新中断标志 
@@ -908,18 +911,23 @@ void TIMER16_IRQHandler(void)
                                                       
   s_iCnt1000++;           //1000ms计数器的计数值加1
 	cnt++;
-                                                      
+  //cntReadkWh++;                                             
   if(s_iCnt1000 >= 1000)  //1000ms计数器的计数值大于或等于1000
   {                                                   
     s_iCnt1000 = 0;       //重置1000ms计数器的计数值为0
     s_i1secFlag = 1;      //将1s标志位的值设置为1
   } 
 #ifdef ACSingPhSmaCurrNew
-	if(cnt == 120000)
+	if(cnt == 60000)
 	{
 		write_2_minute_flag = 1;
 		cnt = 0;
 	}
+//	if(cntReadkWh == 5000)
+//	{
+//		read_kWh_flag = 1;
+//		cntReadkWh = 0;
+//	}
 #endif
 }
 

+ 31 - 0
control/PDU-AC/App/Fwdgt/Fwdgt.c

@@ -0,0 +1,31 @@
+#include "Fwdgt.h"
+#include "stdint.h"
+#include "gd32e230_fwdgt.h"
+#include "gd32e230_rcu.h"
+
+void Fwdgt_Init(void)
+{
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//800ms
+	fwdgt_write_disable();
+	fwdgt_enable();
+}
+
+
+
+void Fwdgt_reload(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();
+}
+
+

+ 21 - 0
control/PDU-AC/App/Fwdgt/Fwdgt.h

@@ -0,0 +1,21 @@
+#ifndef __FWDGT_H
+#define __FWDGT_H
+
+
+
+
+
+
+
+
+
+
+
+void Fwdgt_Init(void);
+
+void Fwdgt_reload(void);
+
+
+
+#endif
+

+ 2 - 1
control/PDU-AC/App/Hlw8110/Hlw8110.c

@@ -59,6 +59,7 @@ unsigned int    U16_LineFData;
 unsigned int    U16_AngleData;
 unsigned int    U16_PFData;
 unsigned int 		U16_HFConst_RegData;
+
 /*---------------------------------------------------------------------------------------------------------*/
 /*---------------------------------------------------------------------------------------------------------*/
 unsigned int	U16_RMSIAC_RegData; 			// A通道电流转换系数
@@ -474,7 +475,7 @@ void Init_HLW8110(void)
 
 	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0465);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
 	DelayNms(10);
 
 	

+ 14 - 0
control/PDU-AC/App/Key/Key.c

@@ -61,6 +61,10 @@ static  void  ConfigKeyGPIO(void)
   gpio_mode_set(KEY_1_2_RCU, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY2);   //配置PF6为上拉输入K2
   gpio_mode_set(KEY_3_4_RCU, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY3);   //配置PA12为上拉输入K3
 	gpio_mode_set(KEY_3_4_RCU, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY4);   //配置PA12为上拉输入K3
+	
+	#ifdef ACSingPhSmaCurr
+	gpio_mode_set(DERECTION_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1);
+	#endif
 }
 
 /*********************************************************************************************************
@@ -117,3 +121,13 @@ unsigned char ReadKeyValue(void)
 	SlaveAddress=(~((s_arrKeyDownLevel[3]<<3)|(s_arrKeyDownLevel[2]<<2)|(s_arrKeyDownLevel[1]<<1)|s_arrKeyDownLevel[0]))&0x0f;
 	return SlaveAddress;
 }
+
+unsigned char get_detection()
+{
+	uint8_t value = 0;
+#ifdef ACSingPhSmaCurr
+	if(gpio_input_bit_get(DERECTION_GPIO,DERECTION_IO_1)==0)
+		value |=(1<<0);
+#endif
+	return value;
+}

+ 13 - 1
control/PDU-AC/App/Key/Key.h

@@ -23,7 +23,7 @@
 /*********************************************************************************************************
 *                                              宏定义
 *********************************************************************************************************/
-
+#include "Main.h"
 
 #define KEY_1_2_RCU GPIOF
 #define KEY_3_4_RCU GPIOA
@@ -38,6 +38,15 @@
 
 #define KEY_NAME_MAX 4
 
+#ifdef ACSingPhSmaCurr
+
+#define DERECTION_GPIO   		GPIOA
+#define DERECTION_IO_1 			GPIO_PIN_1
+
+#endif
+
+
+
 /*********************************************************************************************************
 *                                              枚举结构体
 *********************************************************************************************************/
@@ -49,4 +58,7 @@
 void  InitKey(void);                                                                     //初始化Key模块
 unsigned char ScanKey(unsigned int gpio_periph,unsigned int pin);																 //
 unsigned char ReadKeyValue(void);																												 //上电读取一次modbus的地址
+
+unsigned char get_detection();
+
 #endif

+ 84 - 36
control/PDU-AC/App/Main/Main.c

@@ -31,11 +31,12 @@
 #include "mb.h"
 #include "Hlw8110.h"
 #include "Config.h"
-#include "Wwdgt.h"
+//#include "Wwdgt.h"
 #include "At24cxx.h"
 #include "I2c.h"
 #include "ReadEeprom.h"
 #include "Sn74lvc573.h"
+#include "Fwdgt.h"
 /*********************************************************************************************************
 *                                              宏定义
 *********************************************************************************************************/
@@ -76,6 +77,10 @@ EE_ACDC_Total_Consumption  EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
 ACDC_Consumer_Clear EE_ACDC_Consumer_Clear[RelaySlaveChaNum] = {0};
 
 
+
+//float hlw8110_store[RelaySlaveChaNum] = {0.0};
+//uint8_t kwh_1s_read_flag = 0;
+
 ACDC_All_Chn_Consumption ACDC_Total_All_Chn_Read_Reg;
 
 ACDC_Over_Func_WriteReg 	ACDC_Over_WriteReg[RelaySlaveChaNum];  
@@ -87,10 +92,14 @@ 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 hlw8100_flash_backup[RelaySlaveChaNum] = {0};
+//uint32_t Hlw8110_Flash_value[RelaySlaveChaNum] = {0};
+float Hlw8110_Restore[RelaySlaveChaNum]={0.0};
 
 uint32_t write_2_minute_flag = 0;
+//uint8_t read_kWh_flag = 0;
+
+uint16_t detection_value = 0;
 
 
 unsigned short int Sort_Onbuf[RelaySlaveChaNum];
@@ -146,9 +155,8 @@ static  void  InitSoftware(void)
 }
 static bool select_channel(uint8_t ch_x)
 {
-	switch(ch_x)
-	{
-		#if ACSingPhSmaCurr
+	uint8_t channel = ch_x;
+#if ACSingPhSmaCurr
 			if(channel==0x00)       //011
 			{
 				gpio_bit_reset(SEL_2_RCU, SEL2);
@@ -197,8 +205,8 @@ static bool select_channel(uint8_t ch_x)
 				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1);
 				gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0);
 			}
-		#endif
-		#if ACSingPhHigCurr
+#endif
+#if ACSingPhHigCurr
 			if(channel==0x00) //100
 			{
 				gpio_bit_set(SEL_2_RCU, SEL2);
@@ -223,18 +231,12 @@ static bool select_channel(uint8_t ch_x)
 				gpio_bit_set(XYEN_SEL0_1_RCU, SEL1);
 				gpio_bit_set(XYEN_SEL0_1_RCU, SEL0);
 			}
-		#endif
-	}
+#endif
+
 
 	return true;
 }
 
-void channel_reset(unsigned char ch_x)
-{
-	if(select_channel(ch_x) == false)
-		return;
-	Uart_HLW8110_Reset();
-}
 
 void check_channel_reset()
 {
@@ -248,24 +250,12 @@ void check_channel_reset()
 					
 					int temp = i << 2;
 					uint8_t buff[4] = {0};
-					AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr+temp, buff,4);
+					//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();
+					Hlw8110_Restore[i] = 0.0;
+					// channel_reset(i);
 					EE_ACDC_Consumer_Clear[i].value = 0;
+					
 				}
 				EE_ACDC_Consumer_Clear[i].flag = 0;
 			}
@@ -275,6 +265,59 @@ void check_channel_reset()
 	
 }
 
+//static void ProcTaskNew(void)
+//{
+//	if(Get100msFlag())
+//	{
+//		uint8_t chal_num=0;
+//		for(chal_num=0; chal_num < RelaySlaveChaNum; chal_num++)
+//		{
+//			select_channel(chal_num);
+//			Calculate_HLW8110_MeterData();
+//			AC_Ele_ReadReg[chal_num].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[chal_num].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[chal_num].ACDC_V_b/1000);
+//			if(AC_Ele_ReadReg[chal_num].AC_V <= 10000)			//小于10V频率为0
+//			{
+//				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=0;
+//				AC_Ele_ReadReg[chal_num].AC_V = 0;
+//			}else
+//			{
+//				AC_Ele_ReadReg[chal_num].AC_LINE_Freq=F_AC_LINE_Freq*1000;
+//			}
+//			AC_Ele_ReadReg[chal_num].AC_LINE_Freq=AC_Ele_ReadReg[chal_num].AC_LINE_Freq;
+//			AC_Ele_ReadReg[chal_num].AC_I=(F_AC_I*EE_ACDC_Coef_ReadReg[chal_num].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[chal_num].ACDC_I_b/1000);//实际的电流放大1000倍,实际的K,B值要缩小1000倍
+//			if(AC_Ele_ReadReg[chal_num].AC_V == 0)
+//			{
+//				AC_Ele_ReadReg[chal_num].AC_I = 0;
+//			}
+//			if((AC_Ele_ReadReg[chal_num].AC_I)<=No_Load[chal_num])
+//				AC_Ele_ReadReg[chal_num].AC_P=0;                                                                                //有功功率
+//			else
+//				AC_Ele_ReadReg[chal_num].AC_P=F_AC_P*1000;
+//			AC_Ele_ReadReg[chal_num].AC_PF=F_AC_PF*1000;	
+//		}
+//		WarnState();																																																							//更新状态寄存器的告警阈值
+//		over_RelayState();
+//		Clr100msFlag();
+//	}
+//	if(read_kWh_flag)
+//	{
+//		read_kWh_flag = 0;
+//		uint8_t chal_num=0;
+//		for(chal_num=0; chal_num < RelaySlaveChaNum; chal_num++)
+//		{
+//			select_channel(chal_num);
+//			Read_HLW8110_EA();
+//			Hlw8110_Restore[chal_num] += F_AC_E;
+//			AC_Ele_ReadReg[chal_num].AC_E = (Hlw8110_Restore[chal_num] *1000);
+//			EE_ACDC_Total_Consum_Read_Reg[chal_num].ACDC_Consumption = (read_Total_Consumer[chal_num] + AC_Ele_ReadReg[chal_num].AC_E);    //total consumer
+//			ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[chal_num].ACDC_Consumption;
+//		}
+//	}
+
+//}
+
+
+
 /*********************************************************************************************************
 * 函数名称:Proc100msTask
 * 函数功能:100ms处理任务 循环读取电能计量芯片的数据
@@ -418,7 +461,8 @@ static  void  Proc100msTask(void)
 			AC_Ele_ReadReg[channel].AC_P=0;                                                                                //有功功率
 		else
 			AC_Ele_ReadReg[channel].AC_P=F_AC_P*1000;                                                                                //有功功率
-		AC_Ele_ReadReg[channel].AC_E=F_AC_E*1000;																																									 //电能
+		Hlw8110_Restore[channel] += F_AC_E;
+		AC_Ele_ReadReg[channel].AC_E=(Hlw8110_Restore[channel]*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
@@ -584,8 +628,9 @@ static  void  InitHardware(void)
 	while(1)
 	{
 		eMBPoll();
-//		Proc100msTask();									//100ms处理任务
-		Proc1SecTask(); 									//1s处理任务 
+		Proc100msTask();									//100ms处理任务
+		//ProcTaskNew();
+		//Proc1SecTask(); 									//1s处理任务 
 //		test1 = gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK);
 //		if(test1)	//如果有jlink接入,则不会动作继电器,直接跳出进入主函数
 		if((gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))||(Jlink_Sta_Flag==0x01))	//如果有jlink接入,则不会动作继电器,直接跳出进入主函数
@@ -940,13 +985,16 @@ int main(void)
 //	RelaySlaveAddress=ReadKeyValue();	//读取从机的地址
 //  InitSoftware();   								//初始化软件相关函数
 //	InitWwdgt();         							//最后初始化WWDGT模块
-
+	Fwdgt_Init();												//watch dog
   while(1)
   {
 		eMBPoll();
 		Proc100msTask();			//100ms处理任务
+		//ProcTaskNew();
+		detection_value = get_detection();
 		check_channel_reset();
     Proc1SecTask(); 			//1s处理任务   
+		Fwdgt_reload();
 		if(write_2_minute_flag == 1)
 		{
 			write_2_minute_flag = 0;

+ 3 - 3
control/PDU-AC/App/Main/Main.h

@@ -105,8 +105,8 @@
 
 
 //选择设备类型
-#define ACSingPhSmaCurr			1  	//交流单相小电流
-#define ACSingPhHigCurr   	0		//交流单相大电流
+#define ACSingPhSmaCurr			0  	//交流单相小电流
+#define ACSingPhHigCurr   	1		//交流单相大电流
 #define ACThreePhSmaCurr		0		//交流三相小电流
 #define ACThreePhHigCurr   	0		//交流三相大电流
 #define DCSingCtrlCurr			0		//直流继电器采集
@@ -123,7 +123,7 @@
 #endif
 
 #if ACSingPhHigCurr
-	#define RelaySlaveChaNum	4		//通道数
+	#define RelaySlaveChaNum	1		//通道数
 	#define ACSingCurrid 2   //设备ID
 #endif
 

+ 7 - 1
control/PDU-AC/App/Modbus/BARE/port/port.c

@@ -59,6 +59,9 @@ static USHORT   usRegDiscreteStart = REG_DISCRETE_START;
 static uint8_t  usRegDiscreteBuf[REG_DISCRETE_NREGS];
 
 extern unsigned long int Delay_Ms;
+extern unsigned char detection_value;
+
+
 
 /* ----------------------- Start implementation -----------------------------*/
 //int
@@ -195,6 +198,9 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 						}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);
+						}else if(usAddress == AC_Sing_Detection_Addr)
+						{
+							memcpy(&usRegHoldBuf[iRegIndex],&detection_value,usNRegs*2);
 						}
             while(usNRegs > 0)
             {
@@ -303,7 +309,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 								memcpy(&EE_ACDC_Coef_ReadReg[Chal_num],&usRegHoldBuf[WiRegIndex],WusNRegs*2);	//将接收的数据放入读结构体中
 								memcpy(&Eeprom_Wbuf,&usRegHoldBuf[WiRegIndex],WusNRegs*2);								 	//将数据由16进制转化为无符号数据存入数组 
 								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)))
+						}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);

+ 19 - 2
control/PDU-AC/HW/Timer/Timer.c

@@ -43,6 +43,9 @@ unsigned long int Delay_Ms_2=0;
 unsigned int All_On_Flag;
 unsigned int All_Off_Flag;
 
+
+extern uint32_t write_2_minute_flag; 
+
 /*********************************************************************************************************
 *                                              内部函数声明
 *********************************************************************************************************/
@@ -772,22 +775,36 @@ void TIMER15_IRQHandler(void)
 * 创建日期:2021年07月01日
 * 注    意:每毫秒进入一次中断服务函数
 *********************************************************************************************************/
+
+extern uint8_t read_kWh_flag;
 void TIMER16_IRQHandler(void)  
 {
   static  short s_iCnt1000  = 0;                                    //定义一个静态变量s_iCnt1000作为1s计数器
-
+	static 	uint32_t  cnt = 0;
+//	static 	uint32_t  cntReadkWh = 0;
   if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET)  //判断定时器更新中断是否发生
   {
     timer_interrupt_flag_clear(TIMER16, TIMER_INT_FLAG_UP);         //清除定时器更新中断标志 
   }                                                   
                                                       
   s_iCnt1000++;           //1000ms计数器的计数值加1
-                                                      
+	cnt++;
+//  cntReadkWh++;                                             
   if(s_iCnt1000 >= 1000)  //1000ms计数器的计数值大于或等于1000
   {                                                   
     s_iCnt1000 = 0;       //重置1000ms计数器的计数值为0
     s_i1secFlag = 1;      //将1s标志位的值设置为1
   } 
+	if(cnt == 60000)
+	{
+		write_2_minute_flag = 1;
+		cnt = 0;
+	}
+//	if(cntReadkWh == 5000)
+//	{
+//		read_kWh_flag = 1;
+//		cntReadkWh = 0;
+//	}
 }
 
 /*********************************************************************************************************

+ 1 - 1
control/PDU-DC/App/ADC/ADC.c

@@ -35,7 +35,7 @@
 *********************************************************************************************************/
 bool adc_data_ok_flag = false;
 uint8_t adc_sample_n;//采样次数
-uint16_t adc_original_value[ADC_CH_N];//存放各通道原始值
+uint16_t adc_original_value[ADC_CH_N]={0};//存放各通道原始值
 uint16_t adc_calc_value[ADC_Avg_N][ADC_CH_N];//各通道中间过程计算值
 uint32_t adc_Avg_value[ADC_CH_N];//存放各通道平均值
 

+ 31 - 0
control/PDU-DC/App/FWDGT/Fwdgt.c

@@ -0,0 +1,31 @@
+#include "Fwdgt.h"
+#include "stdint.h"
+#include "gd32e230_fwdgt.h"
+#include "gd32e230_rcu.h"
+
+void Fwdgt_Init(void)
+{
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//800ms
+	fwdgt_write_disable();
+	fwdgt_enable();
+}
+
+
+
+void Fwdgt_reload(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();
+}
+
+

+ 21 - 0
control/PDU-DC/App/FWDGT/Fwdgt.h

@@ -0,0 +1,21 @@
+#ifndef __FWDGT_H
+#define __FWDGT_H
+
+
+
+
+
+
+
+
+
+
+
+void Fwdgt_Init(void);
+
+void Fwdgt_reload(void);
+
+
+
+#endif
+

+ 292 - 5
control/PDU-DC/App/Main/Main.c

@@ -30,7 +30,6 @@
 #include "Uart1.h"
 #include "mb.h"
 #include "IM1253E.h"
-#include "Wwdgt.h"
 #include "At24cxx.h"
 #include "I2c.h"
 #include "ReadEeprom.h"
@@ -38,6 +37,7 @@
 #include "Sn74hc595.h"
 #include <stdbool.h>
 #include "ADC.h"
+#include "Fwdgt.h"
 /*********************************************************************************************************
 *                                              宏定义
 *********************************************************************************************************/
@@ -81,18 +81,38 @@ uint8_t RL_Rx_state = 0x00;
 uint8_t DCPDU_active_chn = RELAY_ChN_default;
 uint8_t Fault_state_V = 0xff;
 uint8_t Fault_state_I = 0;
+uint8_t Relay_OnOff_Func = 0;
 uint8_t Fault_state_Reg = 0;
 uint8_t Fault_state_Last = 0;
 float TotalWh[RELAY_ChN_default] ={0.0};
 
 
+
+
+uint8_t DCPDU_Vmax_LTen_flag[RELAY_ChN_default] = {0x00};
+uint8_t DCPDU_Vmin_LTen_flag[RELAY_ChN_default] = {0x00};
+uint8_t DCPDU_Imax_LTen_flag[RELAY_ChN_default] = {0x00};
+uint8_t DCPDU_Wmax_LTen_flag[RELAY_ChN_default] = {0x00};
+uint8_t DCPDU_kWhmax_LTen_flag[RELAY_ChN_default] = {0x00};
+
+
+
+uint8_t DCPDU_OverFunc[RELAY_ChN_default] = {0};
+
+
+uint8_t RL_Last_state[RELAY_ChN_default] = {0};
+uint8_t RL_Now_state[RELAY_ChN_default] = {0};
+
+
+
 uint16_t Devid_IDChalNum = 0;//设备类型和通道数
-uint16_t adc_data_zero[ADC_CH_N];
+uint16_t adc_data_zero[ADC_CH_N]= {0};
 
 uint32_t DCPDU_Iout_Zero[RELAY_ChN_default] = {0};
 uint32_t DCPDU_Modbus_Reg[DCPDU_Modbus_Reg_len] = {0};
 uint32_t DCPDU_Iin_Zero = 0;
 uint32_t DCPDU_Win_Zero = 0;
+
 extern bool Rx_Finish_flag; 
 extern bool adc_data_ok_flag;
 extern uint8_t ch_cnt;
@@ -110,6 +130,9 @@ static  void  InitSoftware(void);   			//
 static  void  InitHardware(void);   			//初始化硬件相关的模块
 static  void  CHK_JLINK(void);
 static  void MODbus_CMD(void);
+
+void LimiT_enable_check(uint8_t ch_x,uint32_t Lt_v);
+
 /*********************************************************************************************************
 *                                              内部函数实现
 *********************************************************************************************************/
@@ -157,6 +180,13 @@ static  void  InitHardware(void)
 	Delay_Ms_1 = 0;
 }
 
+
+
+
+
+
+
+
 /*********************************************************************************************************
 * 函数名称:CHK_JLINK
 * 函数功能:检测JLINK有没有插上
@@ -276,6 +306,112 @@ static  void  CHK_JLINK(void)
 	}
 	RL_Rx_state = Eeprom_Rbuf[ERom_RL_ST_Addr];
 }
+
+/*********************************************************************************************************
+* 函数名称:fault_state_process
+* 函数功能:check channel worning and openration func
+* 输入参数:uint8_t
+* 输出参数:void
+* 返 回 值:void 
+* 创建日期:2024年04月12日
+* 注    意:
+*********************************************************************************************************/
+static void fault_state_process(uint8_t chn)
+{
+	uint32_t temp0 = 4 * chn;
+	if(DCPDU_Vmax_LTen_flag[chn])
+	{
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0] > DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr+chn])
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] |= DCPDU_Vmax_Fault;
+			if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + chn])
+			{
+				DCPDU_OverFunc[chn] = 1;
+			}
+			//DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + i] |= DCPDU_Vmin_NFault;
+		}else
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] &= DCPDU_Vmax_NFault;
+		}
+	}
+	if(DCPDU_Vmin_LTen_flag[chn])
+	{
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0] < DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr+chn])
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] |= DCPDU_Vmin_Fault;
+			if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + chn])
+			{
+				DCPDU_OverFunc[chn] = 1;
+			}
+		}else
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] &= DCPDU_Vmin_NFault;
+		}
+	}
+	if(DCPDU_Imax_LTen_flag[chn])
+	{
+		if(DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 1] > DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr+chn])
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] |= DCPDU_Imax_Fault;
+			if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + chn])
+			{
+				DCPDU_OverFunc[chn] = 1;
+			}
+		}else {
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] &= DCPDU_Imax_NFault;
+		}
+	}
+	if(DCPDU_Wmax_LTen_flag[chn])
+	{
+		if(DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 2] > DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr+chn])
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] |= DCPDU_Wmax_Fault;
+			if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + chn])
+			{
+				DCPDU_OverFunc[chn] = 1;
+			}
+		}else
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] &= DCPDU_Wmax_NFault;
+		}
+	}
+	if(DCPDU_kWhmax_LTen_flag[chn])
+	{
+		if(DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 3] > DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr+chn])
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] |= DCPDU_kWhmax_Fault;
+			if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + chn])
+			{
+				DCPDU_OverFunc[chn] = 1;
+			}
+		}else
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + chn] &= DCPDU_kWhmax_NFault;
+		}
+	}
+}
+
+static void RL_Over_Func()
+{
+	for(int i = 0; i <RELAY_ChN_default;i++)
+	{
+		if(DCPDU_OverFunc[i])
+		{
+			uint8_t temp0 = 0x01 << i;
+			Relayx_Onoff_state(i,RELAY_OFF);
+			temp0 = ~temp0;
+			DCPDU_Modbus_Reg[Mb_Dbuff_RL_ST_Addr] &= temp0;
+			//E
+			//AT24CxxWriteOneByte(ERom_RL_ST_Addr,Eeprom_Rbuf[ERom_RL_ST_Addr]);
+			DCPDU_OverFunc[i] = 0;
+		}
+	}
+	Eeprom_Rbuf[ERom_RL_ST_Addr] = DCPDU_Modbus_Reg[Mb_Dbuff_RL_ST_Addr] & Active_state_bit;
+	RL_Rx_state = Eeprom_Rbuf[ERom_RL_ST_Addr];
+	Write_74hc573();
+}
+
+
 /*********************************************************************************************************
 * 函数名称:main
 * 函数功能:主函数 
@@ -343,9 +479,15 @@ int main(void)
 		temp0 = 4*i;
 		TotalWh[i] = DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 3];//耗电量初始化
 	}
+	for(i = 0;i < RELAY_ChN_default;i++)
+	{
+		LimiT_enable_check(i,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr+i]);
+	}
+	Fwdgt_Init();
 	while(1)
 	{
 		CHK_JLINK();
+		Fwdgt_reload();
 		eMBPoll();
 		if(Read_IM1253E_flag)//定时读1253
 		{
@@ -382,6 +524,11 @@ int main(void)
 				if(DCPDU_Modbus_Reg[Mb_Dbuff_VInput_Addr] > DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i])
 				{
 					Fault_state_V |= temp2;
+//					if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] & DCPDU_Over_V_Max_Func_enable)
+//					{
+//						Relay_OnOff_Func |= temp2;
+//					}
+					//if(Relayx_Onoff_state[])
 				}
 				else
 				{
@@ -417,6 +564,8 @@ int main(void)
 			
 			DCPDU_Modbus_Reg[Mb_Dbuff_KWhInput_Addr] = temp_da[3] / 100;
 			DCPDU_Modbus_Reg[Mb_Dbuff_KWhInput_Addr] *= 10;//去掉第3位小数
+			
+			//jugement consumer !!!!
 		}
 		if(Get1SecFlag()) //判断1s标志状态
 		{
@@ -447,6 +596,10 @@ int main(void)
 				Eeprom_Rbuf[ERom_TotalWh1_Addr + temp0 + 3] = DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 3];
 				AT24CxxWrite(ERom_TotalWh1_Addr + temp0,(Eeprom_Rbuf + ERom_TotalWh1_Addr + temp0),4);
 			}
+			for(i = 0;i < DCPDU_active_chn;i++)
+			{
+				fault_state_process(i);
+			}
 		}
 		if(adc_data_ok_flag)//读到ADC数据,然后进行处理。
 		{
@@ -480,6 +633,7 @@ int main(void)
 				temp_p = temp_v * temp_i;
 				DCPDU_Modbus_Reg[temp0 + Mb_Dbuff_P1Output_Addr + 2] = temp_p / 10;
 				adc_Avg_value[i] = 0;
+
 			}
 			Fault_state_Reg = Fault_state_V | Fault_state_I;
 		}
@@ -496,9 +650,51 @@ int main(void)
 		{
 
 		}
+		RL_Over_Func();
 		MODbus_CMD();//MODBUS命令池处理。
 	}
 }
+
+void LimiT_enable_check(uint8_t ch_x,uint32_t Lt_v)
+{
+	if((Lt_v & DCPDU_Vmax_LT_enable) == DCPDU_Vmax_LT_enable)
+	{
+		DCPDU_Vmax_LTen_flag[ch_x] = 1;
+	}else
+	{
+		DCPDU_Vmax_LTen_flag[ch_x] = 0;
+	}
+	if((Lt_v & DCPDU_Vmin_LT_enable) == DCPDU_Vmin_LT_enable)
+	{
+		DCPDU_Vmin_LTen_flag[ch_x] = 1;
+	}else
+	{
+		DCPDU_Vmin_LTen_flag[ch_x] = 0;
+	}
+	if((Lt_v & DCPDU_Imax_LT_enable) == DCPDU_Imax_LT_enable)
+	{
+		DCPDU_Imax_LTen_flag[ch_x] = 1;
+	}else
+	{
+		DCPDU_Imax_LTen_flag[ch_x] = 0;
+	}
+	if((Lt_v & DCPDU_Wmax_LT_enable) == DCPDU_Wmax_LT_enable)
+	{
+		DCPDU_Wmax_LTen_flag[ch_x] = 1;
+	}else
+	{
+		DCPDU_Wmax_LTen_flag[ch_x] = 0;
+	}
+	if((Lt_v & DCPDU_kWhmax_LT_enable) == DCPDU_kWhmax_LT_enable)
+	{
+		DCPDU_kWhmax_LTen_flag[ch_x] = 1;
+	}else
+	{
+		DCPDU_kWhmax_LTen_flag[ch_x] = 0;
+	}
+}
+
+
 /*********************************************************************************************************
 * 函数名称:MODbus_CMD
 * 函数功能:modbus命令池处理
@@ -514,9 +710,12 @@ void MODbus_CMD(void)
 	{
 		static uint8_t temp_data[4];
 		static uint32_t temp_addr;
+		uint32_t data = 0;
+		uint8_t index = 0;
 		if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_VLit1_min_Addr)//设置电压最大阈值
 		{
 			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_max_Addr;
+			index = temp_addr;
 			temp_addr = temp_addr << 2;
 			temp_addr += ERom_VLit1_max_Addr;
 			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
@@ -524,30 +723,58 @@ void MODbus_CMD(void)
 			Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
 			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
 			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			if(DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] < THRESHOULD_JUDGMENT)
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] &= (Shield_Vmax_Threshould_Disable);
+			}else
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] |= (Shield_Vmax_Threshould_Enable);
+			}
+			LimiT_enable_check(index,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index]);
+			
 			AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 		}
 		else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ILit1_max_Addr)//设置电压最小阈值
 		{
 			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_min_Addr;
+			index = temp_addr;
 			temp_addr = temp_addr << 2;
 			temp_addr += ERom_VLit1_min_Addr;
 			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
 			Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
 			Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
 			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
-			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];	
+			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			if(DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] < THRESHOULD_JUDGMENT)
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] &= (Shield_Vmin_Threshould_Disable);
+			}else
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] |= (Shield_Vmin_Threshould_Enable);
+			}
+			LimiT_enable_check(index,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index]);	
 			AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 		}
 		else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ILit1_min_Addr)//设置电流最大阈值
 		{
 			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_ILit1_max_Addr;
+			index = temp_addr;
 			temp_addr = temp_addr << 2;
 			temp_addr += ERom_ILit1_max_Addr;
 			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
 			Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
 			Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
-			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];	
-			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];			
+			
+			if(DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] < THRESHOULD_JUDGMENT)
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] &= (Shield_Imax_Threshould_Disable);
+			}else
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] |= (Shield_Imax_Threshould_Enable);
+			}
+			LimiT_enable_check(index,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index]);
 			AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 		}
 		else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_ST_Addr)//设置电流最小阈值
@@ -606,6 +833,66 @@ void MODbus_CMD(void)
 			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
 			DCPDU_RL_time.RL_offtime[Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Toff1_Addr] = Eeprom_Rbuf[temp_addr];
 			AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
+		}else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_WLit8_max_Addr)					//power
+		{
+			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_WLit1_max_Addr;
+			index = temp_addr;
+			temp_addr = temp_addr << 2;
+			temp_addr += ERom_WLit1_max_Addr;
+			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
+			Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
+			Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
+			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];	
+			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			if(DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] < THRESHOULD_JUDGMENT)
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] &= (Shield_Wmax_Threshould_Disable);
+			}else
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] |= (Shield_Wmax_Threshould_Enable);
+			}
+			LimiT_enable_check(index,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index]);
+			AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
+		}else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_kWhLit8_max_Addr)					//consumer
+		{
+			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_kWhLit1_max_Addr;
+			index = temp_addr;
+			temp_addr = temp_addr << 2;
+			temp_addr += ERom_kWhLit1_max_Addr;
+			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
+			Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
+			Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
+			Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];	
+			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			if(DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] < THRESHOULD_JUDGMENT)
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] &= (Shield_Kwhmax_Threshould_Disable);
+			}else
+			{
+				DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index] |= (Shield_kWhmax_Threshould_Enable);
+			}
+			LimiT_enable_check(index,DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + index]);
+			
+			AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
+		}
+		else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_RL_Over_Ch8_Func)		//over func
+		{
+			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Over_Ch1_Func;
+			temp_addr += ERom_RL_Over_Func_Ch1;
+			Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+			
+			DCPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
+			AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
+		}else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_Clear_Consumer_ALL)
+		{
+			temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_Clear_Consumer_Ch1;
+			TotalWh[temp_addr] = 0.0;
+		}else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_Clear_Consumer_ALL)
+		{
+			for(int i = 0; i < RELAY_ChN_default;i++)
+			{
+				TotalWh[temp_addr] = 0.0;
+			}
 		}
 		Modbus_Wr_buff[Wr_eeprom_cnt][0] = 0;
 		Wr_eeprom_begin_flag = true;

+ 408 - 3
control/PDU-DC/App/Main/Main.h

@@ -24,8 +24,8 @@
 /*********************************************************************************************************
 *                                              宏定义
 *********************************************************************************************************/
-#define DCPDU_Modbus_Reg_len       200     //modbus寄存器长度
-#define RELAY_ChN_default          6       //所用通道数,默认值
+#define DCPDU_Modbus_Reg_len       300     //modbus寄存器长度
+#define RELAY_ChN_default          8       //所用通道数,默认值
 #define RELAY_ontime_default       0       //继电器开通延时默认及最小值
 #define RELAY_ontime_max           99      //继电器开通延时最大值
 #define RELAY_offtime_default      0       //继电器断开延时默认及最小值
@@ -83,6 +83,33 @@
 #define DCPDU_P8Output_Addr   (DCPDU_Modbus_RegStAd + 38)
 #define DCPDU_P8Output_ByteN  16
 
+
+#define DCPDU_CH1_FT_ST_Addr (DCPDU_Modbus_RegStAd + 42)
+#define DCPDU_CH1_FT_ST_ByteN 1
+
+#define DCPDU_CH2_FT_ST_Addr (DCPDU_Modbus_RegStAd + 43)
+#define DCPDU_CH2_FT_ST_ByteN 1
+
+#define DCPDU_CH3_FT_ST_Addr (DCPDU_Modbus_RegStAd + 44)
+#define DCPDU_CH3_FT_ST_ByteN 1
+
+#define DCPDU_CH4_FT_ST_Addr (DCPDU_Modbus_RegStAd + 45)
+#define DCPDU_CH4_FT_ST_ByteN 1
+
+#define DCPDU_CH5_FT_ST_Addr (DCPDU_Modbus_RegStAd + 46)
+#define DCPDU_CH5_FT_ST_ByteN 1
+
+#define DCPDU_CH6_FT_ST_Addr (DCPDU_Modbus_RegStAd + 47)
+#define DCPDU_CH6_FT_ST_ByteN 1
+
+#define DCPDU_CH7_FT_ST_Addr (DCPDU_Modbus_RegStAd + 48)
+#define DCPDU_CH7_FT_ST_ByteN 1
+
+#define DCPDU_CH8_FT_ST_Addr (DCPDU_Modbus_RegStAd + 49)
+#define DCPDU_CH8_FT_ST_ByteN 1
+
+
+
 #define DCPDU_VLit1_max_Addr   (DCPDU_Modbus_RegStAd + 50)
 #define DCPDU_VLit1_max_ByteN  4
 
@@ -238,12 +265,17 @@
 
 #define DCPDU_RL_Alloff_Addr  (DCPDU_Modbus_RegStAd + 151)
 #define DCPDU_RL_Alloff_ByteN 1
+
+
+
+
 ///
 #define Mb_Dbuff_DevAddr          0 
 #define Mb_Dbuff_VInput_Addr      2 
 #define Mb_Dbuff_IInput_Addr      3 
 #define Mb_Dbuff_WInput_Addr      4 
 #define Mb_Dbuff_KWhInput_Addr    5 
+
 #define Mb_Dbuff_P1Output_Addr    10 
 #define Mb_Dbuff_P2Output_Addr    14 
 #define Mb_Dbuff_P3Output_Addr    18 
@@ -252,6 +284,18 @@
 #define Mb_Dbuff_P6Output_Addr    30 
 #define Mb_Dbuff_P7Output_Addr    34 
 #define Mb_Dbuff_P8Output_Addr    38 
+
+
+#define Mb_Dbuff_CH1FT_ST_Addr     42
+#define Mb_Dbuff_CH2FT_ST_Addr     43
+#define Mb_Dbuff_CH3FT_ST_Addr     44
+#define Mb_Dbuff_CH4FT_ST_Addr     45
+#define Mb_Dbuff_CH5FT_ST_Addr     46
+#define Mb_Dbuff_CH6FT_ST_Addr     47
+#define Mb_Dbuff_CH7FT_ST_Addr     48
+#define Mb_Dbuff_CH8FT_ST_Addr     49
+
+
 #define Mb_Dbuff_VLit1_max_Addr    50 
 #define Mb_Dbuff_VLit2_max_Addr    51 
 #define Mb_Dbuff_VLit3_max_Addr    52 
@@ -260,6 +304,8 @@
 #define Mb_Dbuff_VLit6_max_Addr    55 
 #define Mb_Dbuff_VLit7_max_Addr    56 
 #define Mb_Dbuff_VLit8_max_Addr    57 
+
+
 #define Mb_Dbuff_VLit1_min_Addr    66 
 #define Mb_Dbuff_VLit2_min_Addr    67 
 #define Mb_Dbuff_VLit3_min_Addr    68 
@@ -268,6 +314,9 @@
 #define Mb_Dbuff_VLit6_min_Addr    71 
 #define Mb_Dbuff_VLit7_min_Addr    72 
 #define Mb_Dbuff_VLit8_min_Addr    73 
+
+
+
 #define Mb_Dbuff_ILit1_max_Addr    82 
 #define Mb_Dbuff_ILit2_max_Addr    83 
 #define Mb_Dbuff_ILit3_max_Addr    84 
@@ -276,6 +325,9 @@
 #define Mb_Dbuff_ILit6_max_Addr    87 
 #define Mb_Dbuff_ILit7_max_Addr    88 
 #define Mb_Dbuff_ILit8_max_Addr    89 
+
+
+
 #define Mb_Dbuff_ILit1_min_Addr    98 
 #define Mb_Dbuff_ILit2_min_Addr    99 
 #define Mb_Dbuff_ILit3_min_Addr    100 
@@ -284,6 +336,9 @@
 #define Mb_Dbuff_ILit6_min_Addr    103 
 #define Mb_Dbuff_ILit7_min_Addr    104 
 #define Mb_Dbuff_ILit8_min_Addr    105 
+
+
+
 #define Mb_Dbuff_RL_ST_Addr       114 
 #define Mb_Dbuff_RLft_ST_Addr     116 
 #define Mb_Dbuff_RL_Ton1_Addr     118 
@@ -305,8 +360,199 @@
 #define Mb_Dbuff_RL_Allon_Addr    150 
 #define Mb_Dbuff_RL_Alloff_Addr   151 
 
+#define Mb_Dbuff_WLit1_max_Addr    160
+#define Mb_Dbuff_WLit2_max_Addr    161
+#define Mb_Dbuff_WLit3_max_Addr    162
+#define Mb_Dbuff_WLit4_max_Addr    163
+#define Mb_Dbuff_WLit5_max_Addr    164
+#define Mb_Dbuff_WLit6_max_Addr    165
+#define Mb_Dbuff_WLit7_max_Addr    166
+#define Mb_Dbuff_WLit8_max_Addr    167
+
+#define Mb_Dbuff_kWhLit1_max_Addr      170
+#define Mb_Dbuff_kWhLit2_max_Addr      171
+#define Mb_Dbuff_kWhLit3_max_Addr      172
+#define Mb_Dbuff_kWhLit4_max_Addr      173
+#define Mb_Dbuff_kWhLit5_max_Addr      174
+#define Mb_Dbuff_kWhLit6_max_Addr      175
+#define Mb_Dbuff_kWhLit7_max_Addr      176
+#define Mb_Dbuff_kWhLit8_max_Addr      177
+
+
+#define Mb_Dbuff_CH1ST_FT_Addr          181
+#define Mb_Dbuff_CH2ST_FT_Addr          182
+#define Mb_Dbuff_CH3ST_FT_Addr          183
+#define Mb_Dbuff_CH4ST_FT_Addr          184
+#define Mb_Dbuff_CH5ST_FT_Addr          185
+#define Mb_Dbuff_CH6ST_FT_Addr          186
+#define Mb_Dbuff_CH7ST_FT_Addr          187
+#define Mb_Dbuff_CH8ST_FT_Addr          188
+
+
+#define Mb_Dbuff_RL_Over_Ch1_Func 			190
+#define Mb_Dbuff_RL_Over_Ch2_Func 			191
+#define Mb_Dbuff_RL_Over_Ch3_Func 			192
+#define Mb_Dbuff_RL_Over_Ch4_Func 			193
+#define Mb_Dbuff_RL_Over_Ch5_Func 			194
+#define Mb_Dbuff_RL_Over_Ch6_Func 			195
+#define Mb_Dbuff_RL_Over_Ch7_Func 			196
+#define Mb_Dbuff_RL_Over_Ch8_Func 			197
+
+
+#define Mb_Dbuff_Clear_Consumer_Ch1     200
+#define Mb_Dbuff_Clear_Consumer_Ch2     201
+#define Mb_Dbuff_Clear_Consumer_Ch3     202
+#define Mb_Dbuff_Clear_Consumer_Ch4     203
+#define Mb_Dbuff_Clear_Consumer_Ch5     204
+#define Mb_Dbuff_Clear_Consumer_Ch6     205
+#define Mb_Dbuff_Clear_Consumer_Ch7     206
+#define Mb_Dbuff_Clear_Consumer_Ch8     207
+#define Mb_Dbuff_Clear_Consumer_ALL     207
+  
+
+
+
+
+#define DCPDU_WLit1_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit1_max_Addr)
+#define DCPDU_WLit1_max_ByteN 4
+
+#define DCPDU_WLit2_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit2_max_Addr)
+#define DCPDU_WLit2_max_ByteN 4
+
+
+#define DCPDU_WLit3_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit3_max_Addr)
+#define DCPDU_WLit3_max_ByteN 4
+
+
+#define DCPDU_WLit4_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit4_max_Addr)
+#define DCPDU_WLit4_max_ByteN 4
+
+
+#define DCPDU_WLit5_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit5_max_Addr)
+#define DCPDU_WLit5_max_ByteN 4
+
+
+#define DCPDU_WLit6_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit6_max_Addr)
+#define DCPDU_WLit6_max_ByteN 4
+
+
+#define DCPDU_WLit7_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit7_max_Addr)
+#define DCPDU_WLit7_max_ByteN 4
+
+
+#define DCPDU_WLit8_max_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_WLit8_max_Addr)
+#define DCPDU_WLit8_max_ByteN 4
+
+
+
+#define DCPDU_kWhLit1_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit1_max_Addr)
+#define DCPDU_kWhLit1_max_ByteN 4
+
+#define DCPDU_kWhLit2_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit2_max_Addr)
+#define DCPDU_kWhLit2_max_ByteN 4
+
+#define DCPDU_kWhLit3_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit3_max_Addr)
+#define DCPDU_kWhLit3_max_ByteN 4
+
+#define DCPDU_kWhLit4_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit4_max_Addr)
+#define DCPDU_kWhLit4_max_ByteN 4
+
+#define DCPDU_kWhLit5_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit5_max_Addr)
+#define DCPDU_kWhLit5_max_ByteN 4
+
+#define DCPDU_kWhLit6_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit6_max_Addr)
+#define DCPDU_kWhLit6_max_ByteN 4
+
+#define DCPDU_kWhLit7_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit7_max_Addr)
+#define DCPDU_kWhLit7_max_ByteN 4
+
+#define DCPDU_kWhLit8_max_Addr (DCPDU_Modbus_RegStAd + Mb_Dbuff_kWhLit8_max_Addr)
+#define DCPDU_kWhLit8_max_ByteN 4
+
+
+#define DCPDU_CH1ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH1ST_FT_Addr)
+#define DCPDU_CH1ST_FT_ByteN 1
+
+#define DCPDU_CH2ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH2ST_FT_Addr)
+#define DCPDU_CH2ST_FT_ByteN 1
+
+#define DCPDU_CH3ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH3ST_FT_Addr)
+#define DCPDU_CH3ST_FT_ByteN 1
+
+#define DCPDU_CH4ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH4ST_FT_Addr)
+#define DCPDU_CH4ST_FT_ByteN 1
+
+#define DCPDU_CH5ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH5ST_FT_Addr)
+#define DCPDU_CH5ST_FT_ByteN 1
+
+#define DCPDU_CH6ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH6ST_FT_Addr)
+#define DCPDU_CH6ST_FT_ByteN 1
+
+#define DCPDU_CH7ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH7ST_FT_Addr)
+#define DCPDU_CH7ST_FT_ByteN 1
+
+#define DCPDU_CH8ST_FT_Addr	(DCPDU_Modbus_RegStAd + Mb_Dbuff_CH8ST_FT_Addr)
+#define DCPDU_CH8ST_FT_ByteN 1
+
+
+#define DCPDU_RL_Over_Ch1_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch1_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch1_ByteN     1
+
+#define DCPDU_RL_Over_Ch2_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch2_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch2_ByteN     1
+
+#define DCPDU_RL_Over_Ch3_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch3_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch3_ByteN     1
+
+#define DCPDU_RL_Over_Ch4_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch4_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch4_ByteN     1
+
+#define DCPDU_RL_Over_Ch5_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch5_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch5_ByteN     1
+
+#define DCPDU_RL_Over_Ch6_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch6_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch6_ByteN     1
+
+#define DCPDU_RL_Over_Ch7_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch7_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch7_ByteN     1
+
+#define DCPDU_RL_Over_Ch8_Addr  (DCPDU_Modbus_RegStAd + Mb_Dbuff_RL_Over_Ch8_Func)						//add by liyi
+#define DCPDU_RL_Over_Ch8_ByteN     1
+
+
+
+#define DCPDU_RL_Clear_Consumer_Ch1_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch1)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch1_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch2_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch2)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch2_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch3_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch3)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch3_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch4_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch4)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch4_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch5_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch5)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch5_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch6_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch6)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch6_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch7_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch7)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch7_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_Ch8_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_Ch8)			//add by liyi
+#define DCPDU_RL_Clear_Consumer_Ch8_ByteN    				1
+
+#define DCPDU_RL_Clear_Consumer_All_Addr    				(DCPDU_Modbus_RegStAd + Mb_Dbuff_Clear_Consumer_ALL)    //add by liyi
+#define DCPDU_RL_Clear_Consumer_ALL_ByteN    				1
+
+
+
+
 //Eeprom的存储地址和地址下最多能存储多少个字节数据
-#define RELAY_para_sum      256
+#define RELAY_para_sum      400
 #define ERom_Reg_StAddr     0x0000
 #define ERom_RL_Ch_N_addr   0x0000
 #define ERom_RL_Ch_N_ByteN  1
@@ -493,6 +739,161 @@
 
 
 
+#define ERom_CH1LT_ST_Addr (260)
+#define ERom_CH1LT_ST_ByteN  2
+
+#define ERom_CH2LT_ST_Addr (262)
+#define ERom_CH2LT_ST_ByteN  2
+
+#define ERom_CH3LT_ST_Addr (264)
+#define ERom_CH3LT_ST_ByteN  2
+
+#define ERom_CH4LT_ST_Addr (266)
+#define ERom_CH4LT_ST_ByteN  2
+
+#define ERom_CH5LT_ST_Addr (268)
+#define ERom_CH5LT_ST_ByteN  2
+
+#define ERom_CH6LT_ST_Addr (270)
+#define ERom_CH6LT_ST_ByteN  2
+
+#define ERom_CH7LT_ST_Addr (272)
+#define ERom_CH7LT_ST_ByteN  2
+
+#define ERom_CH8LT_ST_Addr (274)
+#define ERom_CH8LT_ST_ByteN  2
+
+
+ 
+#define ERom_WLit1_max_Addr   (280)
+#define ERom_WLit1_max_ByteN  4
+
+#define ERom_WLit2_max_Addr   (284)
+#define ERom_WLit2_max_ByteN  4
+
+
+#define ERom_WLit3_max_Addr   (288)
+#define ERom_WLit3_max_ByteN  4
+
+
+#define ERom_WLit4_max_Addr   (292)
+#define ERom_WLit4_max_ByteN  4
+
+
+#define ERom_WLit5_max_Addr   (296)
+#define ERom_WLit5_max_ByteN  4
+
+
+#define ERom_WLit6_max_Addr   (300)
+#define ERom_WLit6_max_ByteN  4
+
+
+#define ERom_WLit7_max_Addr   (304)
+#define ERom_WLit7_max_ByteN  4
+
+
+#define ERom_WLit8_max_Addr   (308)
+#define ERom_WLit8_max_ByteN  4
+
+
+
+#define ERom_kWhLit1_max_Addr (320)
+#define ERom_kWhLit1_max_ByteN  4
+
+#define ERom_kWhLit2_max_Addr (324)
+#define ERom_kWhLit2_max_ByteN  4
+
+#define ERom_kWhLit3_max_Addr (328)
+#define ERom_kWhLit3_max_ByteN  4
+
+#define ERom_kWhLit4_max_Addr (332)
+#define ERom_kWhLit4_max_ByteN  4
+
+#define ERom_kWhLit5_max_Addr (336)
+#define ERom_kWhLit5_max_ByteN  4
+
+#define ERom_kWhLit6_max_Addr (340)
+#define ERom_kWhLit6_max_ByteN  4
+
+#define ERom_kWhLit7_max_Addr (344)
+#define ERom_kWhLit7_max_ByteN  4
+
+#define ERom_kWhLit8_max_Addr (348)
+#define ERom_kWhLit8_max_ByteN  4
+
+
+
+#define ERom_RL_Over_Func_Ch1 			(360)
+#define ERom_RL_Over_Func_Ch1_ByteN    1
+
+#define ERom_RL_Over_Func_Ch2 			(361)
+#define ERom_RL_Over_Func_Ch2_ByteN    1
+
+#define ERom_RL_Over_Func_Ch3 			(362)
+#define ERom_RL_Over_Func_Ch3_ByteN    1
+
+#define ERom_RL_Over_Func_Ch4 			(363)
+#define ERom_RL_Over_Func_Ch4_ByteN    1
+
+#define ERom_RL_Over_Func_Ch5 			(364)
+#define ERom_RL_Over_Func_Ch5_ByteN    1
+
+#define ERom_RL_Over_Func_Ch6 			(365)
+#define ERom_RL_Over_Func_Ch6_ByteN    1
+
+#define ERom_RL_Over_Func_Ch7 			(366)
+#define ERom_RL_Over_Func_Ch7_ByteN    1
+
+#define ERom_RL_Over_Func_Ch8 			(367)
+#define ERom_RL_Over_Func_Ch8_ByteN    1
+
+
+
+#define DCPDU_Over_I_Max_Func_enable 0x00000001
+#define DCPDU_Over_V_Max_Func_enable 0x00000002
+#define DCPDU_Over_V_Min_Func_enable 0x00000004
+#define DCPDU_Over_P_Max_Func_enable 0x00000008
+#define DCPDU_Over_C_Max_Func_enable 0x00000010
+
+
+#define Default_Consum_Max   (4000000000)
+#define Default_Voltage_Max  (1000000000)
+#define Default_Current_Max  (1000000000)
+#define Default_Power_Max		 (1000000000)
+
+#define THRESHOULD_JUDGMENT (50)							//enable or disable relay by the small threshold  
+
+
+#define Shield_Vmax_Threshould_Disable   (0xfffffffE)
+#define Shield_Vmin_Threshould_Disable   (0xfffffffD)
+#define Shield_Imax_Threshould_Disable   (0xfffffffB)
+#define Shield_Wmax_Threshould_Disable   (0xffffffF7)
+#define Shield_Kwhmax_Threshould_Disable (0xffffffEF)
+
+#define Shield_Vmax_Threshould_Enable    (0x00000001)
+#define Shield_Vmin_Threshould_Enable    (0x00000002)
+#define Shield_Imax_Threshould_Enable    (0x00000004)
+#define Shield_Wmax_Threshould_Enable    (0x00000008)
+#define Shield_kWhmax_Threshould_Enable  (0x00000010)
+
+
+
+#define DCPDU_Vmax_Fault         0x00000001
+#define DCPDU_Vmax_NFault        0xfffffffe
+#define DCPDU_Vmin_Fault         0x00000002
+#define DCPDU_Vmin_NFault        0xfffffffd
+#define DCPDU_Imax_Fault         0x00000004
+#define DCPDU_Imax_NFault        0xfffffffb
+#define DCPDU_Wmax_Fault         0x00000008
+#define DCPDU_Wmax_NFault        0xfffffff7
+#define DCPDU_kWhmax_Fault       0x00000010
+#define DCPDU_kWhmax_NFault      0xffffffef
+
+#define DCPDU_Vmax_LT_enable     0x00000001
+#define DCPDU_Vmin_LT_enable     0x00000002
+#define DCPDU_Imax_LT_enable     0x00000004
+#define DCPDU_Wmax_LT_enable     0x00000008
+#define DCPDU_kWhmax_LT_enable   0x00000010
 
 
 /////////////////////////////////////
@@ -525,6 +926,10 @@ typedef struct	DC_SUM_Para_struct_Reg
 	
 }DC_SUM_Para_struct_Reg; 
 
+
+
+
+
 extern unsigned int All_On_Flag;							//继电器全开标志
 extern unsigned int All_Off_Flag;							//继电器全关标志 
 extern unsigned int All_On_Flag1;							//继电器全开标志

+ 1 - 1
control/PDU-DC/App/Modbus/BARE/port/port.c

@@ -195,7 +195,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 					temp1 = DCPDU_Device_ID << 8;
 					DCPDU_Modbus_Reg[T_cnt] += temp1;
 				}
-				else if((usAddress >= DCPDU_VLit1_max_Addr)&&(usAddress < (DCPDU_RL_Alloff_Addr + DCPDU_RL_Alloff_ByteN)))
+				else if((usAddress >= DCPDU_VLit1_max_Addr)&&(usAddress < (DCPDU_RL_Over_Ch8_Addr + DCPDU_RL_Clear_Consumer_ALL_ByteN)))
 				{
 					T_cnt = usAddress - DCPDU_Modbus_RegStAd;
 					memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);

+ 93 - 18
control/PDU-DC/App/ReadEeprom/ReadEeprom.c

@@ -40,6 +40,7 @@ uint8_t Eeprom_Rbuf[RELAY_para_sum]={0};
 extern uint8_t DCPDU_active_chn;
 extern uint8_t Active_state_bit;
 extern uint32_t DCPDU_Modbus_Reg[DCPDU_Modbus_Reg_len];
+
 /*********************************************************************************************************
 *                                              ÄÚ²¿º¯ÊýÉùÃ÷
 *********************************************************************************************************/
@@ -110,40 +111,114 @@ void  ReadEeprom(void)
 			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] += (Eeprom_Rbuf[ERom_ILit1_min_Addr + temp3] << temp2);
 			
 			DCPDU_Modbus_Reg[Mb_Dbuff_P1Output_Addr + temp0 + 3] += (Eeprom_Rbuf[ERom_TotalWh1_Addr + temp3] << temp2);
+			
+			//read 
 		}
 		
-		if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Vin_LTmax_default))
+//		if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Vin_LTmax_default))
+//		{
+//			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = Vin_LTmax_default;
+//		}
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] > Default_Voltage_Max)
 		{
-			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = Vin_LTmax_default;
+			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = 0;
+		}
+//		if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Vin_LTmax_default))
+//		{
+//			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = Vin_LTmin_default;
+//		}
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Default_Voltage_Max)
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = 0;
+		}
+//		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i])
+//		{
+//			temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i];
+//			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i];
+//			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = temp3;
+//		}
+		
+//		if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Iout_LTmax_default))
+//		{
+//			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = Iout_LTmax_default;
+//		}
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Default_Current_Max)
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = 0;
+		}
+//		if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] > Iout_LTmax_default))
+//		{
+//			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = Iout_LTmin_default;
+//		}
+//		if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i])
+//		{
+//			temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i];
+//			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i];
+//			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = temp3;
+//		}
+	}
+	DCPDU_Modbus_Reg[DCPDU_RL_Allon_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Allon_Addr];
+	DCPDU_Modbus_Reg[DCPDU_RL_Alloff_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Alloff_Addr];
+	
+	for(i = 0;i < RELAY_ChN_default;i++)
+	{
+		for(j = 0;j < 4;j++)
+		{
+			temp0 = 8 * j;
+			temp0 = 24 - temp0;
+			temp1 = 4 * i;
+			temp1 += j;
+
+			DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] += Eeprom_Rbuf[ERom_WLit1_max_Addr + temp1] << temp0;
+			DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] += Eeprom_Rbuf[ERom_kWhLit1_max_Addr + temp1] << temp0;
 		}
-		if((DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] < Vin_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] > Vin_LTmax_default))
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] > Default_Power_Max)
 		{
-			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = Vin_LTmin_default;
+			DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + i] = 0;
 		}
-		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i])
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] > Default_Consum_Max)
 		{
-			temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i];
-			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i];
-			DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + i] = temp3;
+			DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] = 0;
 		}
+	}
+	
+	
+	// read channel status
+	for(i = 0;i < RELAY_ChN_default;i++)
+	{
+		uint8_t temp = i << 1;
+		DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr+temp];				//Read channel status
 		
-		if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] > Iout_LTmax_default))
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmax_Threshould_Disable);
+		}
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr+i] < THRESHOULD_JUDGMENT)
 		{
-			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = Iout_LTmax_default;
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Vmin_Threshould_Disable);
 		}
-		if((DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] < Iout_LTmin_default) || (DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] > Iout_LTmax_default))
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr+i] < THRESHOULD_JUDGMENT)
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Imax_Threshould_Disable);
+		}	
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
+		{
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Wmax_Threshould_Disable);
+		}	
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr+i] < THRESHOULD_JUDGMENT)
 		{
-			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = Iout_LTmin_default;
+			DCPDU_Modbus_Reg[Mb_Dbuff_CH1ST_FT_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
 		}
-		if(DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] < DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i])
+	}
+	//read over func
+	for(i = 0;i < RELAY_ChN_default;i++)
+	{
+		DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = Eeprom_Rbuf[ERom_RL_Over_Func_Ch1+i];
+		if(DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] >0x0F)
 		{
-			temp3 = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i];
-			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + i] = DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i];
-			DCPDU_Modbus_Reg[Mb_Dbuff_ILit1_min_Addr + i] = temp3;
+			DCPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + i] = 0;
 		}
 	}
-	DCPDU_Modbus_Reg[DCPDU_RL_Allon_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Allon_Addr];
-	DCPDU_Modbus_Reg[DCPDU_RL_Alloff_Addr - DCPDU_Modbus_RegStAd] = Eeprom_Rbuf[ERom_RL_Alloff_Addr];
 }
 
 /*********************************************************************************************************

+ 31 - 0
control/PDU-Triphasic/App/Fwdgt/Fwdgt.c

@@ -0,0 +1,31 @@
+#include "Fwdgt.h"
+#include "stdint.h"
+#include "gd32e230_fwdgt.h"
+#include "gd32e230_rcu.h"
+
+void Fwdgt_Init(void)
+{
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//3.2s
+	fwdgt_write_disable();
+	fwdgt_enable();
+}
+
+
+
+void Fwdgt_reload(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();
+}
+
+

+ 21 - 0
control/PDU-Triphasic/App/Fwdgt/Fwdgt.h

@@ -0,0 +1,21 @@
+#ifndef __FWDGT_H
+#define __FWDGT_H
+
+
+
+
+
+
+
+
+
+
+
+void Fwdgt_Init(void);
+
+void Fwdgt_reload(void);
+
+
+
+#endif
+

+ 13 - 5
control/PDU-Triphasic/App/Hlw8110/Hlw8110.c

@@ -111,6 +111,8 @@ extern AC3PPDU_RELAY_Para_Reg AC3PPDU_RL_time[Output_ChN_default + 2];//
 extern AC_Output_struct_Reg  AC3PPDU_Output[Output_ChN_default + 2]; 
 
 extern uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len];
+float hlw8110_store[Output_ChN_default + 1] = {0};
+//extern uint32_t HLW8110_BasekWh[Output_ChN_default + 1];
 //extern uint32_t Hlw8110_Flash_value[Output_ChN_default + 1];
 //uint32_t Hlw8110_Flash_Backup[Output_ChN_default + 1] = {0};
 /*---------------------------------------------------------------------------------------------------------*/
@@ -485,7 +487,7 @@ void Init_HLW8110(void)
 
 	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0465);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
 	DelayNms(10);
 
 	
@@ -945,7 +947,7 @@ void Calculate_HLW8110_MeterData(void)
 	Read_HLW8110_U();
 	Read_HLW8110_PA();
 	Read_HLW8110_PSA();
-	Read_HLW8110_EA();
+	//Read_HLW8110_EA();
 	
 	Read_HLW8110_LineFreq();
 	Read_HLW8110_Angle();
@@ -987,7 +989,7 @@ void Calculate_HLW8110_MeterData(void)
 //	printf("----------------------------------------------\r\n");			
 }
 
-void read_Hlw8110(uint8_t cs_x)
+void read_Hlw8110(uint8_t cs_x,uint8_t read_kWh_flag)
 {
 #define ACDC_V_k 1000
 #define ACDC_V_b 0
@@ -1049,8 +1051,14 @@ void read_Hlw8110(uint8_t cs_x)
 	{
 		AC3PPDU_Output[temp0].AC_U = ((F_AC_P / F_AC_PF)-F_AC_PS) *1000;
 	}
+	if(read_kWh_flag)
+	{
+		Read_HLW8110_EA();
 
-	AC3PPDU_Output[temp0].AC_kWh = F_AC_E *1000;
+	}else
+		F_AC_E = 0.0;
+	//AC3PPDU_Output[temp0].AC_kWh = F_AC_E *1000;
+	hlw8110_store[cs_x + CH1_out] += F_AC_E;
 	
 	AC3PPDU_Output[temp0].AC_F = F_AC_LINE_Freq *1000;
 	if(AC3PPDU_Output[temp0].AC_V == 0)
@@ -1066,7 +1074,7 @@ void read_Hlw8110(uint8_t cs_x)
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 3] = AC3PPDU_Output[cs_x + CH1_out].AC_U;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 4] = AC3PPDU_Output[cs_x + CH1_out].AC_S;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 5] = AC3PPDU_Output[cs_x + CH1_out].AC_F;
-	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 6] = AC3PPDU_Output[cs_x + CH1_out].AC_kWh;
+	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 6] = (hlw8110_store[cs_x + CH1_out] *1000);
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 7] = AC3PPDU_Output[cs_x + CH1_out].AC_Q;
 	
 	// 

+ 3 - 1
control/PDU-Triphasic/App/Hlw8110/Hlw8110.h

@@ -76,6 +76,8 @@ void Calculate_HLW8110_MeterData(void);
 
 void Init_HLW8112(void);
 void HLW8112_Measure(void);
-void read_Hlw8110(unsigned char channel);
+void read_Hlw8110(uint8_t cs_x,uint8_t read_kWh_flag);
+
+void read_Hlw8110_kWh(unsigned char cs_x);
 
 #endif

+ 45 - 19
control/PDU-Triphasic/App/Main/Main.c

@@ -36,6 +36,7 @@
 #include "Uart1.h"
 #include "Hlw8110.h"
 #include "stdint.h"
+#include "Fwdgt.h"
 //#include "HT7032_SPI.h"
 /*********************************************************************************************************
 *                                              宏定义
@@ -112,6 +113,7 @@ extern uint32_t RL_N_delay_Limit;			// add by liyi
 uint8_t reset_hlw8110_flag[Output_ChN_default + 1]={0};
 
 uint32_t hlw8110_base[Output_ChN_default + 1] = {0}; //add by liyi
+extern float hlw8110_store[Output_ChN_default + 1];
 uint8_t write_kwh2Eeprom_flag = 0;
 
 
@@ -136,6 +138,10 @@ uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len] = {0};
 uint32_t AC3PPDU_Iin_Zero = 0;
 uint32_t AC3PPDU_Win_Zero = 0;
 
+
+uint8_t kwh_200ms_read_flag = 0;
+
+
 uint32_t dev_info = 0;
 
 extern uint8_t ch_cnt;
@@ -673,12 +679,16 @@ int main(void)
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] = AC3PPDU_APlack_Fault + AC3PPDU_BPlack_Fault;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] += AC3PPDU_CPlack_Fault;
 	
+	Fwdgt_Init();								//
+	
+	
 	while(1)
 	{
 			//DelayNms(10);
-			dev_info = (AC3PPDU_Device_ID << 8 | Output_ChN_default);
-			CHK_JLINK();
-			eMBPoll();
+		Fwdgt_reload();	
+		dev_info = (AC3PPDU_Device_ID << 8 | Output_ChN_default);
+		CHK_JLINK();
+		eMBPoll();
 		if(Get1SecFlag()) //判断1s标志状态
 		{
 			LEDFlicker2();
@@ -725,10 +735,21 @@ int main(void)
 //				
 //				
 //			}
-			for(int j = 0 ; j < Hlw8110_CS;j++)
+			if(kwh_200ms_read_flag)
+			{
+				for(int j = 0 ; j < Hlw8110_CS;j++)
+				{
+					//if(!reset_hlw8110_flag[j])
+						read_Hlw8110(j,1);
+				}
+				kwh_200ms_read_flag = 0;
+			}else
 			{
-				if(!reset_hlw8110_flag[j])
-					read_Hlw8110(j);
+				for(int j = 0 ; j < Hlw8110_CS;j++)
+				{
+					//if(!reset_hlw8110_flag[j])
+						read_Hlw8110(j,0);
+				}
 			}
 			
 			//输入A相电压,平均
@@ -771,19 +792,19 @@ int main(void)
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH6_out].AC_P;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH9_out].AC_P;
 			//输入A相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + AC3PPDU_Output[CH1_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + (hlw8110_store[CH1_out]*1000);
 			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH1_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH4_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH7_out].AC_kWh;
 			//输入B相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + AC3PPDU_Output[CH2_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + (hlw8110_store[CH2_out]*1000);
 			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH2_out].AC_kWh;
 			
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH5_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH8_out].AC_kWh;
 			//输入C相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + AC3PPDU_Output[CH3_out].AC_kWh;
-			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] 	+= AC3PPDU_Output[CH3_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + (hlw8110_store[CH3_out]*1000);
+			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH3_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH6_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH9_out].AC_kWh;
 
@@ -1151,22 +1172,26 @@ static void MODbus_CMD_New(void)
 				{
 					
 					temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
-					uint8_t value = temp_addr;
+//					uint8_t value = temp_addr;
 					
 					//Hlw8110_Flash_value[temp_addr+CH1_out] = AC3PPDU_Output[temp_addr+CH1_out].AC_kWh;
 					//Hlw8110_Flash_value[temp_addr+CH1_out] = Hlw8110_Flash_Backup[temp_addr+CH1_out];
 					//hlw8110_base[temp_addr+CH1_out] = 0;
-					temp_addr = temp_addr << 2;
-					temp_addr += ERom_TotalWh1_Addr;
+//					temp_addr = temp_addr << 2;
+//					temp_addr += ERom_TotalWh1_Addr;
 //					Eeprom_Rbuf[temp_addr+0] = 0;
 //					Eeprom_Rbuf[temp_addr+1] = 0;
 //					Eeprom_Rbuf[temp_addr+2] = 0;
 //					Eeprom_Rbuf[temp_addr+3] = 0;
 //					channel_reset(temp_addr+CH1_out);
 //					InitUART1(9600);
-					hlw8110_init(value+CH1_out);
-					reset_hlw8110_flag[value] = 0;
-					AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
+//					hlw8110_init(value+CH1_out);
+//					reset_hlw8110_flag[value] = 0;
+//					AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
+					
+					//HLW8110_BasekWh[temp_addr+CH1_out] = 0;
+					hlw8110_base[temp_addr+CH1_out] = 0;
+					hlw8110_store[temp_addr+CH1_out] = 0.0;
 				}
 			}
 			case Mb_Dbuff_Clear_Chnall_Consumer:
@@ -1188,12 +1213,13 @@ static void MODbus_CMD_New(void)
 //						//InitCH448F();
 					for(i = 0; i < Output_ChN_default ;i++)
 					{
-						hlw8110_init(i+CH1_out);
-						reset_hlw8110_flag[i] = 0;
+						//HLW8110_BasekWh[CH1_out+i] = 0;
+						hlw8110_base[i+CH1_out] = 0;
+						hlw8110_store[i+CH1_out] = 0.0;
 					}
-					AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
 				}
 			}
+			break;
 			default:
 				break;
 		}

+ 1 - 317
control/PDU-Triphasic/App/Modbus/BARE/port/port.c

@@ -135,7 +135,7 @@ extern uint32_t hlw8110_base[Output_ChN_default + 1];
 extern void channel_reset(uint8_t ch_x);
 extern void hlw8110_init(uint8_t ch_x);
 
-extern uint8_t reset_hlw8110_flag[Output_ChN_default + 1];
+//extern uint8_t reset_hlw8110_flag[Output_ChN_default + 1];
 
 eMBErrorCode
 eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
@@ -208,322 +208,6 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 						memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);
 						Modbus_Wr_buff[cmd_cnt][0] = 1;
 						Modbus_Wr_buff[cmd_cnt][1] = T_cnt;
-						uint32_t temp_addr;
-						uint32_t base_addr = Modbus_Wr_buff[cmd_cnt][1];
-						uint32_t data = Modbus_Wr_buff[cmd_cnt][2];
-						
-						switch(T_cnt)
-						{
-//								case Mb_Dbuff_ViLit_max_Addr ... Mb_Dbuff_kWhiLit_max_Addr:						//input votage max votage min current power coustermer add by liyi
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_ViLit_max_Addr;
-//									temp_addr = temp_addr << 2;
-//									temp_addr += ERom_ViLit_max_Addr;
-//									Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//									Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//									Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//									Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//								}
-//								break;
-//								case Mb_Dbuff_VLit1_max_Addr ... Mb_Dbuff_VLit9_max_Addr:							//output voltage max threod for 1,2,3,4,5,6,7,8,9 channels
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_ViLit_max_Addr;
-			
-//									temp_addr = temp_addr << 2;
-//									temp_addr += ERom_VLit1_max_Addr;
-//									Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//									Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//									Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//									Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//									if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										uint32_t value = base_addr - Mb_Dbuff_VLit1_max_Addr;
-//										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);
-//									}
-//								}
-//								break;
-//								case Mb_Dbuff_VLit1_min_Addr ... Mb_Dbuff_VLit9_min_Addr:							//output voltage min thred for 1,2,3,4,5,6,7,8,9 channels
-//								{
-//										temp_addr = base_addr - Mb_Dbuff_VLit1_min_Addr;
-//										temp_addr = temp_addr << 2;
-//										temp_addr += ERom_VLit1_min_Addr;
-//										Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//										Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//										Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//										Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//										AC3PPDU_Modbus_Reg[base_addr] = data;
-//										if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											uint32_t value = base_addr - Mb_Dbuff_VLit1_min_Addr;
-//											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);
-//										}
-//								}
-//								break;
-//								case Mb_Dbuff_ILit1_max_Addr ... Mb_Dbuff_ILit9_max_Addr:							// output current max throud for 1,2,3,4,5,6,7,8,9 channels
-//								{
-//										temp_addr = base_addr - Mb_Dbuff_ILit1_max_Addr;
-//										temp_addr = temp_addr << 2;
-//										temp_addr += ERom_ILit1_max_Addr;
-//										Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//										Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//										Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//										Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//										AC3PPDU_Modbus_Reg[base_addr] = data;
-//										if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											uint32_t value = base_addr - Mb_Dbuff_ILit1_max_Addr;
-//											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);
-//										}
-//								}
-//								break;
-//								case Mb_Dbuff_WLit1_max_Addr ... Mb_Dbuff_WLit9_max_Addr:	
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_WLit1_max_Addr;
-////									value = temp_addr;
-//									temp_addr = temp_addr << 2;
-//									temp_addr += ERom_WLit1_max_Addr;
-//									Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//									Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//									Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//									Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//									if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										uint32_t value = base_addr - Mb_Dbuff_WLit1_max_Addr;
-//										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);
-//									}
-//								}
-//								break;
-//								case Mb_Dbuff_kWhLit1_max_Addr ... Mb_Dbuff_kWhLit9_max_Addr:	
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_kWhLit1_max_Addr;
-//									//value = temp_addr;
-//									temp_addr = temp_addr << 2;
-//									temp_addr += ERom_kWhLit1_max_Addr;
-//									Eeprom_Rbuf[temp_addr + 0] = data >> 24;
-//									Eeprom_Rbuf[temp_addr + 1] = data >> 16;
-//									Eeprom_Rbuf[temp_addr + 2] = data >> 8;
-//									Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//									if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										uint32_t value = base_addr - Mb_Dbuff_kWhLit1_max_Addr;
-//										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);
-//									}
-//								}
-//								break;
-//								case Mb_Dbuff_RL_Allon_Addr:	
-//								{
-//									//RL_Allon_flag = true;
-//									for(int i = 0;i < Output_ChN_default;i++)
-//									{
-//										temp_addr = i << 1; 
-//										Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
-//										AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
-//									}	
-//									Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x41;
-//									AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
-//								}
-//								break;
-//								case Mb_Dbuff_RL_Alloff_Addr:	
-//								{
-//									//RL_Alloff_flag = true;
-//									for(int i = 0;i < Output_ChN_default;i++)
-//									{
-//										temp_addr = i << 1;
-//										Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
-//										Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
-//										AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
-//									}
-//									Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x80;
-//									Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] & 0xfe;
-//									AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
-//								}
-//								break;
-//								case Mb_Dbuff_LT_ST_Addr:																							//set input status
-//								{
-//									AC3PPDU_RL_time[CH_in].LT_state = data;
-//									Eeprom_Rbuf[ERom_LT_ST_Addr] = data;
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//									LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
-//								}
-//								break;
-//								case Mb_Dbuff_CH1LT_ST_Addr ...  Mb_Dbuff_CHNLT_ST_Addr:							//set output relay statues
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_CH1LT_ST_Addr;
-//									if(temp_addr == 9) {					//Ch N
-//										AC3PPDU_RL_N_time.LT_state = data;
-//									}else{
-//										if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											data &= (Shield_Vmax_Threshould_Disable);
-//										}
-//										if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											data &= (Shield_Vmin_Threshould_Disable);
-//										}
-//										if(AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											data &= (Shield_Imax_Threshould_Disable);
-//										}
-//										if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											data &= (Shield_Wmax_Threshould_Disable);
-//										}
-//										if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//										{
-//											data &= (Shield_Kwhmax_Threshould_Disable);
-//										}
-//										
-//										AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
-//										LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
-//									}
-//									temp_addr = temp_addr << 1;
-//									temp_addr += ERom_CH1LT_ST_Addr;
-//									Eeprom_Rbuf[temp_addr] = data;
-//								}
-//								break;
-//								case Mb_Dbuff_OUTCH1_ST_Addr ... Mb_Dbuff_OUTCH3_ST_Addr:							//set output channel relay's status
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_OUTCH1_ST_Addr;
-//									OutUnit_control_flag[temp_addr] = 1;
-//									temp_addr *= 3;
-//									if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										data &= (Shield_Vmax_Threshould_Disable);
-//									}
-//									if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										data &= (Shield_Vmin_Threshould_Disable);
-//									}
-//									if(AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										data &= (Shield_Imax_Threshould_Disable);
-//									}
-//									if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										data &= (Shield_Wmax_Threshould_Disable);
-//									}
-//									if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
-//									{
-//										data &= (Shield_Kwhmax_Threshould_Disable);
-//									}
-//									
-//									AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
-//									AC3PPDU_RL_time[temp_addr + CH2_out].LT_state = data;
-//									AC3PPDU_RL_time[temp_addr + CH3_out].LT_state = data;
-//									
-//									temp_addr = temp_addr << 1;
-//									Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr] = data;
-//									Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr] = data;
-//									Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr] = data;
-//									
-//									LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
-//									LimiT_enable_check((temp_addr + CH2_out),AC3PPDU_RL_time[temp_addr + CH2_out].LT_state);
-//									LimiT_enable_check((temp_addr + CH3_out),AC3PPDU_RL_time[temp_addr + CH3_out].LT_state);
-//									
-//								}
-//								break;
-//								case Mb_Dbuff_RL_Ton1_Addr ... Mb_Dbuff_RL_TonN_Addr:									//set on status delay for 1,2,3,4,5,6,7,8,9,N channels
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_RL_Ton1_Addr;
-//									if(temp_addr == 9){				//Ch   N   add by liyi
-//										AC3PPDU_RL_N_time.RL_ontime = data;
-//									}else
-//									{
-//										AC3PPDU_RL_time[temp_addr + CH1_out].RL_ontime = data;
-//									}
-//									AC3PPDU_RL_N_time.RL_ontime = data;
-//									temp_addr += ERom_RL_Ton1_Addr;
-//									
-//									Eeprom_Rbuf[temp_addr] = data;
-//									Eeprom_Rbuf[ERom_RL_TonN_Addr] = data;
-//									AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
-//									AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_TonN_Addr] = Eeprom_Rbuf[ERom_RL_TonN_Addr];
-//								}
-//								break;
-//								case Mb_Dbuff_RL_Toff1_Addr ... Mb_Dbuff_RL_ToffN_Addr:               //set off status delay for 1,2,3,4,5,6,7,8,9,N channels
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_RL_Toff1_Addr;
-//									if(temp_addr == 9){
-//										AC3PPDU_RL_N_time.RL_offtime = data;
-//									}else {
-//										AC3PPDU_RL_time[temp_addr + CH1_out].RL_offtime = data;
-//									}
-//									AC3PPDU_RL_N_time.RL_offtime = data;
-//									temp_addr += ERom_RL_Toff1_Addr;
-//				
-//									Eeprom_Rbuf[temp_addr] = data;
-//									Eeprom_Rbuf[ERom_RL_ToffN_Addr] = data;
-//									AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
-//									AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_ToffN_Addr] = Eeprom_Rbuf[ERom_RL_ToffN_Addr];
-//								}
-//								break;
-//								case Mb_Dbuff_RL_Over_Ch1_Func ... Mb_Dbuff_RL_Over_Ch9_Func:					//threod over limit operation
-//								{
-//									temp_addr = base_addr - Mb_Dbuff_RL_Over_Ch1_Func;
-//									temp_addr += ERom_RL_Over_Ch1_Addr;
-//									AC3PPDU_Modbus_Reg[base_addr] = data;
-//									Eeprom_Rbuf[temp_addr] = data;
-//								}
-//								break;
-								case Mb_Dbuff_Clear_Chn1_Consumer ... Mb_Dbuff_Clear_Chn9_Consumer:
-								{
-									if(data)
-									{
-										temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
-										int value = temp_addr;
-										//Hlw8110_Flash_value[temp_addr+CH1_out] = AC3PPDU_Output[temp_addr+CH1_out].AC_kWh;
-										//Hlw8110_Flash_value[temp_addr+CH1_out] = Hlw8110_Flash_Backup[temp_addr+CH1_out];
-										hlw8110_base[temp_addr+CH1_out] = 0;
-										temp_addr = temp_addr << 2;
-										temp_addr += ERom_TotalWh1_Addr;
-										Eeprom_Rbuf[temp_addr+0] = 0;
-										Eeprom_Rbuf[temp_addr+1] = 0;
-										Eeprom_Rbuf[temp_addr+2] = 0;
-										Eeprom_Rbuf[temp_addr+3] = 0;
-										channel_reset(value+CH1_out);
-										InitUART1(9600);
-										reset_hlw8110_flag[value] =1;
-										//hlw8110_init(value+CH1_out);
-									}
-								}
-								break;
-								case Mb_Dbuff_Clear_Chnall_Consumer:
-								{
-									if(data)
-									{
-										for(int i = 0; i < Output_ChN_default ;i++)
-										{
-											int temp = i << 2;
-											//Hlw8110_Flash_value[i+CH1_out] = AC3PPDU_Output[i+CH1_out].AC_kWh;
-											//Hlw8110_Flash_value[i+CH1_out] = Hlw8110_Flash_Backup[i+CH1_out];
-											Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = 0;
-											Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = 0;
-											Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = 0;
-											Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = 0;
-											hlw8110_base[i+CH1_out] = 0;
-											channel_reset(i+CH1_out);
-											reset_hlw8110_flag[i] = 0;
-										}
-										InitUART1(9600);
-											//InitCH448F();
-//										for(int i = 0; i < Output_ChN_default ;i++)
-//											hlw8110_init(i+CH1_out);
-									}
-								}
-								break;
-								default:
-								break;
-						}
-						
 						
 						cmd_cnt++;
 						if(cmd_cnt >= Mb_Wcmd_Width)

+ 1 - 1
control/PDU-Triphasic/App/ReadEeprom/ReadEeprom.c

@@ -167,7 +167,7 @@ void ReadEeprom(void)
 		}
 		if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] < THRESHOULD_JUDGMENT)
 		{
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
 		}
 	}
 	//read ChN status 

+ 12 - 2
control/PDU-Triphasic/HW/Timer/Timer.c

@@ -56,6 +56,8 @@ extern uint8_t RL_end_delay_flag[Output_ChN_default + 1];
 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
+extern uint8_t kwh_200ms_read_flag; 					 // add by liyi
+
 /*********************************************************************************************************
 *                                              内部函数声明
 *********************************************************************************************************/
@@ -247,6 +249,7 @@ void TIMER15_IRQHandler(void)
 void TIMER16_IRQHandler(void)  
 {
   static  uint32_t s_iCnt1000  = 0;//定义一个静态变量s_iCnt1000作为1s计数器
+	static  uint8_t s_iCntread =0;
 
   if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET)  //判断定时器更新中断是否发生
   {
@@ -261,12 +264,19 @@ void TIMER16_IRQHandler(void)
 		Read_data_cnt = 0;
 		Start_Read_Flag = true;
 	}
-	if(s_iCnt1000 == 120)
+	if(s_iCnt1000 == 60)
 	{
 		s_iCnt1000 = 0;
 		write_kwh2Eeprom_flag = 1;
 	}
+	if( s_iCntread == 5 )
+	{
+		kwh_200ms_read_flag = 1;
+		s_iCntread = 0;
+	}
+	
 	s_iCnt1000 ++;
+	s_iCntread++;
   s_i1secFlag = 1;      //将1s标志位的值设置为1
 }
 
@@ -286,7 +296,7 @@ void InitTimer(void)
 {
 	Delay_N_mS = 0;
 	ConfigTimer14(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
-  ConfigTimer15(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
+  //ConfigTimer15(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
   ConfigTimer16(9999, 7199);  //72MHz/(7199+1)=0.01MHz,由0计数到9999为1s
 }
 /*********************************************************************************************************

+ 31 - 0
control/PDU-Triphasic_IO/App/Fwdgt/Fwdgt.c

@@ -0,0 +1,31 @@
+#include "Fwdgt.h"
+#include "stdint.h"
+#include "gd32e230_fwdgt.h"
+#include "gd32e230_rcu.h"
+
+void Fwdgt_Init(void)
+{
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//800ms
+	fwdgt_write_disable();
+	fwdgt_enable();
+}
+
+
+
+void Fwdgt_reload(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();
+}
+
+

+ 21 - 0
control/PDU-Triphasic_IO/App/Fwdgt/Fwdgt.h

@@ -0,0 +1,21 @@
+#ifndef __FWDGT_H
+#define __FWDGT_H
+
+
+
+
+
+
+
+
+
+
+
+void Fwdgt_Init(void);
+
+void Fwdgt_reload(void);
+
+
+
+#endif
+

+ 14 - 6
control/PDU-Triphasic_IO/App/Hlw8110/Hlw8110.c

@@ -111,6 +111,8 @@ extern AC3PPDU_RELAY_Para_Reg AC3PPDU_RL_time[Output_ChN_default + 2];//
 extern AC_Output_struct_Reg  AC3PPDU_Output[Output_ChN_default + 2]; 
 
 extern uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len];
+float hlw8110_store[Output_ChN_default + 1] = {0};
+//extern uint32_t HLW8110_BasekWh[Output_ChN_default + 1];
 //extern uint32_t Hlw8110_Flash_value[Output_ChN_default + 1];
 //uint32_t Hlw8110_Flash_Backup[Output_ChN_default + 1] = {0};
 /*---------------------------------------------------------------------------------------------------------*/
@@ -485,7 +487,7 @@ void Init_HLW8110(void)
 
 	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0465);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
 	DelayNms(10);
 
 	
@@ -945,7 +947,7 @@ void Calculate_HLW8110_MeterData(void)
 	Read_HLW8110_U();
 	Read_HLW8110_PA();
 	Read_HLW8110_PSA();
-	Read_HLW8110_EA();
+	//Read_HLW8110_EA();
 	
 	Read_HLW8110_LineFreq();
 	Read_HLW8110_Angle();
@@ -987,7 +989,7 @@ void Calculate_HLW8110_MeterData(void)
 //	printf("----------------------------------------------\r\n");			
 }
 
-void read_Hlw8110(uint8_t cs_x)
+void read_Hlw8110(uint8_t cs_x,uint8_t read_kWh_flag)
 {
 #define ACDC_V_k 1000
 #define ACDC_V_b 0
@@ -1049,8 +1051,14 @@ void read_Hlw8110(uint8_t cs_x)
 	{
 		AC3PPDU_Output[temp0].AC_U = ((F_AC_P / F_AC_PF)-F_AC_PS) *1000;
 	}
-	
-	AC3PPDU_Output[temp0].AC_kWh = F_AC_E *1000;
+	if(read_kWh_flag)
+	{
+		Read_HLW8110_EA();
+
+	}else
+		F_AC_E = 0.0;
+	//AC3PPDU_Output[temp0].AC_kWh = F_AC_E *1000;
+	hlw8110_store[cs_x + CH1_out] += F_AC_E;
 	
 	AC3PPDU_Output[temp0].AC_F = F_AC_LINE_Freq *1000;
 	if(AC3PPDU_Output[temp0].AC_V == 0)
@@ -1066,7 +1074,7 @@ void read_Hlw8110(uint8_t cs_x)
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 3] = AC3PPDU_Output[cs_x + CH1_out].AC_U;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 4] = AC3PPDU_Output[cs_x + CH1_out].AC_S;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 5] = AC3PPDU_Output[cs_x + CH1_out].AC_F;
-	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 6] = AC3PPDU_Output[cs_x + CH1_out].AC_kWh;
+	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 6] = (hlw8110_store[cs_x + CH1_out] *1000);
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + temp1 + 7] = AC3PPDU_Output[cs_x + CH1_out].AC_Q;
 	
 	// 

+ 3 - 2
control/PDU-Triphasic_IO/App/Hlw8110/Hlw8110.h

@@ -74,9 +74,10 @@ void Read_HLW8110_PF(void);
 void Read_HLW8110_Angle(void);
 void Calculate_HLW8110_MeterData(void);
 
-
 void Init_HLW8112(void);
 void HLW8112_Measure(void);
-void read_Hlw8110(unsigned char channel);
+void read_Hlw8110(uint8_t cs_x,uint8_t read_kWh_flag);
+
+void read_Hlw8110_kWh(unsigned char cs_x);
 
 #endif

+ 115 - 41
control/PDU-Triphasic_IO/App/Main/Main.c

@@ -37,6 +37,7 @@
 #include "Hlw8110.h"
 #include "stdint.h"
 #include "key_io.h"
+#include "Fwdgt.h"
 
 //#include "HT7032_SPI.h"
 /*********************************************************************************************************
@@ -111,9 +112,10 @@ extern uint32_t RL_N_delay_Limit;			// add by liyi
 
 
 
-
+uint8_t reset_hlw8110_flag[Output_ChN_default + 1]={0};
 
 uint32_t hlw8110_base[Output_ChN_default + 1] = {0}; //add by liyi
+extern float hlw8110_store[Output_ChN_default + 1];
 uint8_t write_kwh2Eeprom_flag = 0;
 
 
@@ -138,6 +140,10 @@ uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len] = {0};
 uint32_t AC3PPDU_Iin_Zero = 0;
 uint32_t AC3PPDU_Win_Zero = 0;
 
+
+uint8_t kwh_200ms_read_flag = 0;
+
+
 uint32_t dev_info = 0;
 
 extern uint8_t ch_cnt;
@@ -731,13 +737,15 @@ int main(void)
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] = AC3PPDU_APlack_Fault + AC3PPDU_BPlack_Fault;
 	AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] += AC3PPDU_CPlack_Fault;
 	
+	Fwdgt_Init();								//
 	while(1)
 	{
 			//DelayNms(10);
-			dev_info = (AC3PPDU_Device_ID << 8 | Output_ChN_default);
-			key_io_control();
-			CHK_JLINK();
-			eMBPoll();
+		Fwdgt_reload();	
+		key_io_control();
+		dev_info = (AC3PPDU_Device_ID << 8 | Output_ChN_default);
+		CHK_JLINK();
+		eMBPoll();
 		if(Get1SecFlag()) //判断1s标志状态
 		{
 			LEDFlicker2();
@@ -777,13 +785,30 @@ int main(void)
 		if(Start_Read_Flag)//读数据
 		{
 			Start_Read_Flag = false;
-
-			for(int j = 0 ; j < Hlw8110_CS;j++)
+//			for(i = 0;i < HT7032_CS;i++)
+//			{
+//			//	Read_HT7032_data(i);
+//				//read Hlw8110 eche one data;
+//				
+//				
+//			}
+			if(kwh_200ms_read_flag)
 			{
-				read_Hlw8110(j);
+				for(int j = 0 ; j < Hlw8110_CS;j++)
+				{
+					//if(!reset_hlw8110_flag[j])
+						read_Hlw8110(j,1);
+				}
+				kwh_200ms_read_flag = 0;
+			}else
+			{
+				for(int j = 0 ; j < Hlw8110_CS;j++)
+				{
+					//if(!reset_hlw8110_flag[j])
+						read_Hlw8110(j,0);
+				}
 			}
 			
-			
 			//输入A相电压,平均
 			AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = AC3PPDU_Output[CH1_out].AC_V;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] += AC3PPDU_Output[CH4_out].AC_V;
@@ -824,19 +849,19 @@ int main(void)
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH6_out].AC_P;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH9_out].AC_P;
 			//输入A相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + AC3PPDU_Output[CH1_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + (hlw8110_store[CH1_out]*1000);
 			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH1_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH4_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH7_out].AC_kWh;
 			//输入B相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + AC3PPDU_Output[CH2_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] =	hlw8110_base[CH2_out] + (hlw8110_store[CH2_out]*1000);
 			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH2_out].AC_kWh;
 			
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH5_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH8_out].AC_kWh;
 			//输入C相电量,求和
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + AC3PPDU_Output[CH3_out].AC_kWh;
-			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] 	+= AC3PPDU_Output[CH3_out].AC_kWh;
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + (hlw8110_store[CH3_out]*1000);
+			//AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH3_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH6_out].AC_kWh;
 //			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH9_out].AC_kWh;
 
@@ -895,6 +920,7 @@ static void MODbus_CMD_New(void)
 		uint32_t temp_addr;
 		uint32_t base_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1];
 		uint32_t data = Modbus_Wr_buff[Wr_eeprom_cnt][2];
+		uint32_t value = 0;
 		
 		switch(base_addr)
 		{
@@ -914,6 +940,7 @@ static void MODbus_CMD_New(void)
 			case Mb_Dbuff_VLit1_max_Addr ... Mb_Dbuff_VLit9_max_Addr:							//output voltage max threod for 1,2,3,4,5,6,7,8,9 channels
 				{
 					temp_addr = base_addr - Mb_Dbuff_VLit1_max_Addr;
+					value = temp_addr;
 					temp_addr = temp_addr << 2;
 					temp_addr += ERom_VLit1_max_Addr;
 					Eeprom_Rbuf[temp_addr + 0] = data >> 24;
@@ -921,12 +948,18 @@ static void MODbus_CMD_New(void)
 					Eeprom_Rbuf[temp_addr + 2] = data >> 8;
 					Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
 					AC3PPDU_Modbus_Reg[base_addr] = data;
+					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);
+					}
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 				}
 				break;
 			case Mb_Dbuff_VLit1_min_Addr ... Mb_Dbuff_VLit9_min_Addr:							//output voltage min thred for 1,2,3,4,5,6,7,8,9 channels
 			{
 					temp_addr = base_addr - Mb_Dbuff_VLit1_min_Addr;
+					value = temp_addr;
 					temp_addr = temp_addr << 2;
 					temp_addr += ERom_VLit1_min_Addr;
 					Eeprom_Rbuf[temp_addr + 0] = data >> 24;
@@ -934,12 +967,18 @@ static void MODbus_CMD_New(void)
 					Eeprom_Rbuf[temp_addr + 2] = data >> 8;
 					Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
 					AC3PPDU_Modbus_Reg[base_addr] = data;
+					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);
+					}
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
 			case Mb_Dbuff_ILit1_max_Addr ... Mb_Dbuff_ILit9_max_Addr:							// output current max throud for 1,2,3,4,5,6,7,8,9 channels
 			{
 					temp_addr = base_addr - Mb_Dbuff_ILit1_max_Addr;
+					value = temp_addr;
 					temp_addr = temp_addr << 2;
 					temp_addr += ERom_ILit1_max_Addr;
 					Eeprom_Rbuf[temp_addr + 0] = data >> 24;
@@ -947,12 +986,18 @@ static void MODbus_CMD_New(void)
 					Eeprom_Rbuf[temp_addr + 2] = data >> 8;
 					Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
 					AC3PPDU_Modbus_Reg[base_addr] = data;
+					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);
+					}
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
 			case Mb_Dbuff_WLit1_max_Addr ... Mb_Dbuff_WLit9_max_Addr:							//output power max .....
 			{
 					temp_addr = base_addr - Mb_Dbuff_WLit1_max_Addr;
+					value = temp_addr;
 					temp_addr = temp_addr << 2;
 					temp_addr += ERom_WLit1_max_Addr;
 					Eeprom_Rbuf[temp_addr + 0] = data >> 24;
@@ -960,12 +1005,18 @@ static void MODbus_CMD_New(void)
 					Eeprom_Rbuf[temp_addr + 2] = data >> 8;
 					Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
 					AC3PPDU_Modbus_Reg[base_addr] = data;
+					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);
+					}
 					AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
 			case Mb_Dbuff_kWhLit1_max_Addr ... Mb_Dbuff_kWhLit9_max_Addr:					//output customers max .....
 			{
 						temp_addr = base_addr - Mb_Dbuff_kWhLit1_max_Addr;
+						value = temp_addr;
 						temp_addr = temp_addr << 2;
 						temp_addr += ERom_kWhLit1_max_Addr;
 						Eeprom_Rbuf[temp_addr + 0] = data >> 24;
@@ -973,6 +1024,12 @@ static void MODbus_CMD_New(void)
 						Eeprom_Rbuf[temp_addr + 2] = data >> 8;
 						Eeprom_Rbuf[temp_addr + 3] = data >> 0;	
 						AC3PPDU_Modbus_Reg[base_addr] = data;
+						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);
+						}
+				
 						AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
 			}
 				break;
@@ -1020,9 +1077,9 @@ static void MODbus_CMD_New(void)
 			case Mb_Dbuff_CH1LT_ST_Addr ...  Mb_Dbuff_CHNLT_ST_Addr:							//set output relay statues
 			{
 				temp_addr = base_addr - Mb_Dbuff_CH1LT_ST_Addr;
-				if(temp_addr == 9) {					//Ch N
-					AC3PPDU_RL_N_time.LT_state = data;
-				}else{
+//				if(temp_addr == 9) {					//Ch N
+//					AC3PPDU_RL_N_time.LT_state = data;
+//				}else{
 					if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
 					{
 						data &= (Shield_Vmax_Threshould_Disable);
@@ -1047,7 +1104,7 @@ static void MODbus_CMD_New(void)
 					AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
 					
 					LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
-				}
+//				}
 				temp_addr = temp_addr << 1;
 				temp_addr += ERom_CH1LT_ST_Addr;
 				Eeprom_Rbuf[temp_addr] = data;
@@ -1173,44 +1230,61 @@ static void MODbus_CMD_New(void)
 				{
 					
 					temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
+//					uint8_t value = temp_addr;
 					
 					//Hlw8110_Flash_value[temp_addr+CH1_out] = AC3PPDU_Output[temp_addr+CH1_out].AC_kWh;
 					//Hlw8110_Flash_value[temp_addr+CH1_out] = Hlw8110_Flash_Backup[temp_addr+CH1_out];
+					//hlw8110_base[temp_addr+CH1_out] = 0;
+//					temp_addr = temp_addr << 2;
+//					temp_addr += ERom_TotalWh1_Addr;
+//					Eeprom_Rbuf[temp_addr+0] = 0;
+//					Eeprom_Rbuf[temp_addr+1] = 0;
+//					Eeprom_Rbuf[temp_addr+2] = 0;
+//					Eeprom_Rbuf[temp_addr+3] = 0;
+//					channel_reset(temp_addr+CH1_out);
+//					InitUART1(9600);
+//					hlw8110_init(value+CH1_out);
+//					reset_hlw8110_flag[value] = 0;
+//					AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
+					
+					//HLW8110_BasekWh[temp_addr+CH1_out] = 0;
 					hlw8110_base[temp_addr+CH1_out] = 0;
-					temp_addr = temp_addr << 2;
-					temp_addr += ERom_TotalWh1_Addr;
-					Eeprom_Rbuf[temp_addr+0] = 0;
-					Eeprom_Rbuf[temp_addr+1] = 0;
-					Eeprom_Rbuf[temp_addr+2] = 0;
-					Eeprom_Rbuf[temp_addr+3] = 0;
-					channel_reset(temp_addr+CH1_out);
-					InitUART1(9600);
-					hlw8110_init(temp_addr+CH1_out);
-					AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
+					hlw8110_store[temp_addr+CH1_out] = 0.0;
 				}
 			}
 			case Mb_Dbuff_Clear_Chnall_Consumer:
 			{
 				if(data){
-					for(i = 0; i < Output_ChN_default ;i++)
+//					for(i = 0; i < Output_ChN_default ;i++)
+//					{
+//						int temp = i << 2;
+//						//Hlw8110_Flash_value[i+CH1_out] = AC3PPDU_Output[i+CH1_out].AC_kWh;
+//						//Hlw8110_Flash_value[i+CH1_out] = Hlw8110_Flash_Backup[i+CH1_out];
+//						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = 0;
+//						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = 0;
+//						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = 0;
+//						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = 0;
+//						hlw8110_base[i+CH1_out] = 0;
+//						channel_reset(i+CH1_out);
+//					}
+//						InitUART1(9600);
+//						//InitCH448F();
+//					for(i = 0; i < Output_ChN_default ;i++)
+//					{
+//						//hlw8110_init(i+CH1_out);
+//						//reset_hlw8110_flag[i] = 0;
+//						
+//					}
+//					AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
+					for(i = 0; i < Output_ChN_default;i++)
 					{
-						int temp = i << 2;
-						//Hlw8110_Flash_value[i+CH1_out] = AC3PPDU_Output[i+CH1_out].AC_kWh;
-						//Hlw8110_Flash_value[i+CH1_out] = Hlw8110_Flash_Backup[i+CH1_out];
-						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = 0;
-						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = 0;
-						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = 0;
-						Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = 0;
+						//HLW8110_BasekWh[CH1_out+i] = 0;
 						hlw8110_base[i+CH1_out] = 0;
-						channel_reset(i+CH1_out);
+						hlw8110_store[i+CH1_out] = 0.0;
 					}
-						InitUART1(9600);
-						//InitCH448F();
-					for(i = 0; i < Output_ChN_default ;i++)
-						hlw8110_init(i+CH1_out);
-					AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
 				}
 			}
+			break;
 			default:
 				break;
 		}

+ 2 - 0
control/PDU-Triphasic_IO/App/Modbus/BARE/port/port.c

@@ -198,11 +198,13 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 						memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);
 						Modbus_Wr_buff[cmd_cnt][0] = 1;
 						Modbus_Wr_buff[cmd_cnt][1] = T_cnt;
+						
 						cmd_cnt++;
 						if(cmd_cnt >= Mb_Wcmd_Width)
 						{
 							cmd_cnt = 0;
 						}
+						
 					}
 				}
 				else//´íÎó

+ 1 - 1
control/PDU-Triphasic_IO/App/ReadEeprom/ReadEeprom.c

@@ -166,7 +166,7 @@ void  ReadEeprom(void)
 		}
 		if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] < THRESHOULD_JUDGMENT)
 		{
-			AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
+			AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] &= (Shield_Kwhmax_Threshould_Disable);
 		}
 	}
 	//read ChN status 

+ 19 - 2
control/PDU-Triphasic_IO/HW/Timer/Timer.c

@@ -56,6 +56,8 @@ extern uint8_t RL_end_delay_flag[Output_ChN_default + 1];
 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
+extern uint8_t kwh_200ms_read_flag; 					 // add by liyi
+
 /*********************************************************************************************************
 *                                              内部函数声明
 *********************************************************************************************************/
@@ -233,6 +235,13 @@ void TIMER15_IRQHandler(void)
   {
     timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP);       //清除定时器更新中断标志
   }
+	if(s_iCnt100 == 1000)
+	{
+		kwh_200ms_read_flag = 1;
+		s_iCnt100 = 0;
+	}
+	
+	s_iCnt100++;
 }
 
 /*********************************************************************************************************
@@ -247,6 +256,7 @@ void TIMER15_IRQHandler(void)
 void TIMER16_IRQHandler(void)  
 {
   static  uint32_t s_iCnt1000  = 0;//定义一个静态变量s_iCnt1000作为1s计数器
+	static  uint8_t s_iCntread =0;
 
   if (timer_interrupt_flag_get(TIMER16, TIMER_INT_FLAG_UP) == SET)  //判断定时器更新中断是否发生
   {
@@ -261,12 +271,19 @@ void TIMER16_IRQHandler(void)
 		Read_data_cnt = 0;
 		Start_Read_Flag = true;
 	}
-	if(s_iCnt1000 == 120)
+	if(s_iCnt1000 == 60)
 	{
 		s_iCnt1000 = 0;
 		write_kwh2Eeprom_flag = 1;
 	}
+	if( s_iCntread == 5 )
+	{
+		kwh_200ms_read_flag = 1;
+		s_iCntread = 0;
+	}
+	
 	s_iCnt1000 ++;
+	s_iCntread++;
   s_i1secFlag = 1;      //将1s标志位的值设置为1
 }
 
@@ -286,7 +303,7 @@ void InitTimer(void)
 {
 	Delay_N_mS = 0;
 	ConfigTimer14(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
-  ConfigTimer15(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
+  //ConfigTimer15(999, 71);  //72MHz/(71+1)=1MHz,由0计数到999为1ms 
   ConfigTimer16(9999, 7199);  //72MHz/(7199+1)=0.01MHz,由0计数到9999为1s
 }
 /*********************************************************************************************************