|
|
@@ -71,6 +71,28 @@ EE_ACDC_State_struct_ReadRegTrue EE_ACDC_State_ReadRegTrue[RelaySlaveChaNum];
|
|
|
EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_ThresVal_ReadReg[RelaySlaveChaNum];
|
|
|
EE_ACDC_Coef_struct_ReadReg EE_ACDC_Coef_ReadReg[RelaySlaveChaNum];
|
|
|
|
|
|
+EE_ACDC_Total_Consumption EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
|
|
|
+
|
|
|
+ACDC_Consumer_Clear EE_ACDC_Consumer_Clear[RelaySlaveChaNum] = {0};
|
|
|
+
|
|
|
+
|
|
|
+ACDC_All_Chn_Consumption ACDC_Total_All_Chn_Read_Reg;
|
|
|
+
|
|
|
+ACDC_Over_Func_WriteReg ACDC_Over_WriteReg[RelaySlaveChaNum];
|
|
|
+
|
|
|
+
|
|
|
+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 write_2_minute_flag = 0;
|
|
|
+
|
|
|
+
|
|
|
unsigned short int Sort_Onbuf[RelaySlaveChaNum];
|
|
|
unsigned short int Sort_Offbuf[RelaySlaveChaNum];
|
|
|
|
|
|
@@ -98,6 +120,13 @@ static void InitHardware(void); //
|
|
|
static void Proc2msTask_Start(void); //2ms处理任务
|
|
|
static void Proc1SecTask(void); //1s处理任务
|
|
|
|
|
|
+static void over_RelayState(void);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+uint8_t consumer_clear_flag = 0;
|
|
|
+
|
|
|
/*********************************************************************************************************
|
|
|
* 内部函数实现
|
|
|
*********************************************************************************************************/
|
|
|
@@ -115,6 +144,137 @@ 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)
|
|
|
+ {
|
|
|
+ #if ACSingPhSmaCurr
|
|
|
+ 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
|
|
|
+ #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
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+void channel_reset(unsigned char ch_x)
|
|
|
+{
|
|
|
+ if(select_channel(ch_x) == false)
|
|
|
+ return;
|
|
|
+ Uart_HLW8110_Reset();
|
|
|
+}
|
|
|
+
|
|
|
+void check_channel_reset()
|
|
|
+{
|
|
|
+ if(consumer_clear_flag){
|
|
|
+ for(int i = 0; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ if(EE_ACDC_Consumer_Clear[i].flag)
|
|
|
+ {
|
|
|
+ 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);
|
|
|
+ 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();
|
|
|
+ EE_ACDC_Consumer_Clear[i].value = 0;
|
|
|
+ }
|
|
|
+ EE_ACDC_Consumer_Clear[i].flag = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ consumer_clear_flag = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/*********************************************************************************************************
|
|
|
* 函数名称:Proc100msTask
|
|
|
* 函数功能:100ms处理任务 循环读取电能计量芯片的数据
|
|
|
@@ -261,7 +421,11 @@ static void Proc100msTask(void)
|
|
|
AC_Ele_ReadReg[channel].AC_E=F_AC_E*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
|
|
|
+ ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
|
|
|
WarnState(); //更新状态寄存器的告警阈值
|
|
|
+ over_RelayState();
|
|
|
+
|
|
|
channel=channel+1;
|
|
|
if(channel>=RelaySlaveChaNum)
|
|
|
channel=0;
|
|
|
@@ -739,6 +903,28 @@ static void Proc1SecTask(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+static void over_RelayState(void)
|
|
|
+{
|
|
|
+ for(int i = 0; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ if(over_Func_flag[i])
|
|
|
+ {
|
|
|
+ if(EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State==true)
|
|
|
+ {
|
|
|
+ RELAY_1_OFF;
|
|
|
+ EE_ACDC_State_ReadRegTrue[i].ACDC_Cha_On_Off_State = false;
|
|
|
+ }
|
|
|
+ over_Func_flag[i] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ BUFF;
|
|
|
+ LOCK;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*********************************************************************************************************
|
|
|
* 函数名称:main
|
|
|
* 函数功能:主函数
|
|
|
@@ -759,7 +945,28 @@ int main(void)
|
|
|
{
|
|
|
eMBPoll();
|
|
|
Proc100msTask(); //100ms处理任务
|
|
|
+ check_channel_reset();
|
|
|
Proc1SecTask(); //1s处理任务
|
|
|
+ if(write_2_minute_flag == 1)
|
|
|
+ {
|
|
|
+ write_2_minute_flag = 0;
|
|
|
+ uint8_t buff[4*RelaySlaveChaNum] = {0};
|
|
|
+// buff[0] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 24;
|
|
|
+// buff[1] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 16;
|
|
|
+// buff[2] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 8;
|
|
|
+// buff[3] = EE_ACDC_Total_Consum_Read_Reg.ACDC_Consumption >> 0;
|
|
|
+
|
|
|
+
|
|
|
+ for(int i = 0 ; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ int temp = i << 2;
|
|
|
+ buff[temp + 0] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 24;
|
|
|
+ buff[temp + 1] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 16;
|
|
|
+ buff[temp + 2] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 8;
|
|
|
+ buff[temp + 3] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 0;
|
|
|
+ }
|
|
|
+ AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr, buff,4*RelaySlaveChaNum);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
/*freemodbus作者使用了assert,故增加如下代码,同时
|