#include "electricity.h" #include "uart.h" #include "common.h" #include "board_cfg.h" #include "Hlw8110.h" #include "relay.h" #include "ADC.h" static board_t *board = 0; static void read_ele(uint8_t channel); static void check_wanning(uint8_t in_out,uint8_t channel); static void opt_over_func(uint8_t channel); extern float F_AC_V; extern float F_AC_I; extern float F_AC_P; extern float F_AC_LINE_Freq; extern float F_AC_E; extern float F_AC_PF; extern uint32_t adc_Avg_value[ADC_CH_N]; float elec[RelaySlaveChaNum] = {0.0}; void electricity_init(void) { board = get_board(); uart1_config(9600); ch448f_config(); for(int i = 0 ; i < RelaySlaveChaNum;i++) { select_channel(i); Init_HLW8110(); } board->read_ele = read_ele; board->check_wanning = check_wanning; board->opt_overfunc = opt_over_func; } static void read_ele(uint8_t channel) { if(channel < RelaySlaveChaNum) { select_channel(channel); Calculate_HLW8110_MeterData(); board->md_data.r_data.ac_ele.ele_info[channel].voltage = F_AC_V * 1000; board->md_data.r_data.ac_ele.ele_info[channel].current = F_AC_I * 1000; board->md_data.r_data.ac_ele.ele_info[channel].power = F_AC_P * 1000; board->md_data.r_data.ac_ele.ele_info[channel].freq = F_AC_LINE_Freq * 1000; board->md_data.r_data.ac_ele.ele_info[channel].factor = F_AC_PF * 1000; elec[channel] += F_AC_E; board->md_data.r_data.ac_ele.ele_info[channel].consumer = board->ele_restore[channel] + elec[channel] * 1000; if(F_AC_V < 0.5) { board->md_data.r_data.ac_ele.ele_info[channel].voltage = 0; board->md_data.r_data.ac_ele.ele_info[channel].current = 0; board->md_data.r_data.ac_ele.ele_info[channel].power = 0; board->md_data.r_data.ac_ele.ele_info[channel].factor = 0; board->md_data.r_data.ac_ele.ele_info[channel].freq = 0; }else if(F_AC_PF < 0.1 || F_AC_PF >= 1) { board->md_data.r_data.ac_ele.ele_info[channel].current = 0; board->md_data.r_data.ac_ele.ele_info[channel].power = 0; board->md_data.r_data.ac_ele.ele_info[channel].factor = 0; } } } static void check_wanning(uint8_t in_out,uint8_t channel) { if(in_out == ELE_INPUT) { }else { if(channel < RelaySlaveChaNum) { if(IS_VOLTAGE_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].voltage > board->md_data.rw_data.thr.th[channel].v_top) { board->md_data.r_data.state.state[channel].v_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].v_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].v_top_wanning = 0; } if(IS_VOLTAGE_MIN_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].voltage < board->md_data.rw_data.thr.th[channel].v_down) { board->md_data.r_data.state.state[channel].v_down_wanning = 1; if(board->md_data.rw_data.over_func[channel].v_min_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].v_down_wanning = 0; } if(IS_CURRENT_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].current > board->md_data.rw_data.thr.th[channel].i_top) { board->md_data.r_data.state.state[channel].c_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].i_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].c_top_wanning = 0; } if(IS_POWER_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].power > board->md_data.rw_data.thr.th[channel].p_top) { board->md_data.r_data.state.state[channel].p_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].p_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].p_top_wanning = 0; } if(IS_CONSUMER_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].consumer > board->md_data.rw_data.thr.th[channel].e_top) { board->md_data.r_data.state.state[channel].e_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].c_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].e_top_wanning = 0; } } } } static void opt_over_func(uint8_t channel) { if(board->over_func[channel]) { board->over_func[channel] = 0; if(board->md_data.r_data.state.state[channel].state == RELAY_OPEN) { async_data da = {0}; da.channel = channel; da.fire_or_zero = _FIRE; da.method = PROMPT_CTRL; da.reg = &board->relay_staging_staus[channel]; da.status = RELAY_CLOSE; da.w_eep_flag = FLAG_N_W_EEP; set_relay_sta_async(&da); } } }