|
|
@@ -88,6 +88,9 @@ uint8_t RL_last_state[Output_ChN_default+1] = {0};
|
|
|
uint8_t RL_now_state[Output_ChN_default+1] = {0};
|
|
|
|
|
|
uint8_t RL_Func_statu[Output_ChN_default + 1] = {0};
|
|
|
+uint32_t Hlw8110_Flash_value[Output_ChN_default + 1] = {0};
|
|
|
+extern uint32_t Hlw8110_Flash_Backup[Output_ChN_default + 1];
|
|
|
+
|
|
|
|
|
|
|
|
|
// Ch N relay control
|
|
|
@@ -150,6 +153,9 @@ static void MODbus_CMD_New(void);
|
|
|
static void Read_HT7032_data(uint8_t cs_x);
|
|
|
static void LimiT_enable_check(uint8_t chx,uint32_t Lt_v);
|
|
|
static void Fault_state_process(uint8_t ch_x);
|
|
|
+static void hlw8110_init(uint8_t ch_x);
|
|
|
+static void channel_reset(uint8_t ch_x);
|
|
|
+static bool select_channel(uint8_t ch_x);
|
|
|
/*********************************************************************************************************
|
|
|
* 内部函数实现
|
|
|
*********************************************************************************************************/
|
|
|
@@ -169,6 +175,59 @@ static void InitSoftware(void)
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static bool select_channel(uint8_t ch_x)
|
|
|
+{
|
|
|
+ if(ch_x == 0)
|
|
|
+ return false;
|
|
|
+ switch(ch_x)
|
|
|
+ {
|
|
|
+ case CH1_out:
|
|
|
+ {
|
|
|
+ SEL_0_H;
|
|
|
+ SEL_1_H;
|
|
|
+ SEL_2_H;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CH2_out:
|
|
|
+ {
|
|
|
+ SEL_0_L;
|
|
|
+ SEL_1_H;
|
|
|
+ SEL_2_H;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CH3_out:
|
|
|
+ {
|
|
|
+ SEL_0_H;
|
|
|
+ SEL_1_L;
|
|
|
+ SEL_2_H;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void hlw8110_init(uint8_t ch_x)
|
|
|
+{
|
|
|
+ if(select_channel(ch_x) == false)
|
|
|
+ return;
|
|
|
+ Init_HLW8110();
|
|
|
+}
|
|
|
+
|
|
|
+static void channel_reset(uint8_t ch_x)
|
|
|
+{
|
|
|
+ int i = 10;
|
|
|
+ if(select_channel(ch_x) == false)
|
|
|
+ return;
|
|
|
+ Uart_HLW8110_Reset();
|
|
|
+ while(i--);
|
|
|
+ Init_HLW8110();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*********************************************************************************************************
|
|
|
* 函数名称:InitHardware
|
|
|
* 函数功能:所有的硬件相关的模块初始化函数都放在此函数中
|
|
|
@@ -196,33 +255,7 @@ static void InitHardware(void)
|
|
|
int i;
|
|
|
for(i = 1; i <=AC3PPDU_active_chn;i++)
|
|
|
{
|
|
|
- switch(i)
|
|
|
- {
|
|
|
- case 1: //111
|
|
|
- {
|
|
|
- SEL_0_H;
|
|
|
- SEL_1_H;
|
|
|
- SEL_2_H;
|
|
|
- Init_HLW8110();
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2: //110
|
|
|
- {
|
|
|
- SEL_0_L;
|
|
|
- SEL_1_H;
|
|
|
- SEL_2_H;
|
|
|
- Init_HLW8110();
|
|
|
- }
|
|
|
- break;
|
|
|
- case 3: //101
|
|
|
- {
|
|
|
- SEL_0_H;
|
|
|
- SEL_1_L;
|
|
|
- SEL_2_H;
|
|
|
- Init_HLW8110();
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
+ hlw8110_init(i);
|
|
|
}
|
|
|
|
|
|
//init_HT7032_SPI();
|
|
|
@@ -990,8 +1023,13 @@ static void MODbus_CMD_New(void)
|
|
|
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];
|
|
|
+
|
|
|
AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
|
|
|
+ AT24CxxWriteOneByte(ERom_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
|
|
|
@@ -1004,9 +1042,15 @@ static void MODbus_CMD_New(void)
|
|
|
}
|
|
|
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];
|
|
|
+
|
|
|
AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
|
|
|
+ AT24CxxWriteOneByte(ERom_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
|
|
|
@@ -1022,16 +1066,19 @@ static void MODbus_CMD_New(void)
|
|
|
{
|
|
|
if(data)
|
|
|
{
|
|
|
+
|
|
|
temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
|
|
|
- hlw8110_base[temp_addr+1] = 0;
|
|
|
|
|
|
+ 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);
|
|
|
AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
|
|
|
}
|
|
|
}
|
|
|
@@ -1041,11 +1088,14 @@ static void MODbus_CMD_New(void)
|
|
|
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] = 0;
|
|
|
+ hlw8110_base[i+CH1_out] = 0;
|
|
|
+ //channel_reset(i+CH1_out);
|
|
|
}
|
|
|
AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
|
|
|
}
|