| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #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 uint8_t flag_value;
- 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)
- {
- #if SURPPORT_2_PT
- if( channel >= PT_SUB_COUNT)
- {
- flag_value = 1;
- }else
- {
- flag_value = 0;
- }
- #else
- flag_value = 0;
- #endif
- select_channel(channel);
- Calculate_HLW8110_MeterData();
- if(F_AC_V > 20 && F_AC_LINE_Freq < 1.0)
- {
- reinit_hlw8110();
- Calculate_HLW8110_MeterData();
- }
- if(F_AC_V < 1.0)
- {
- F_AC_V = 0.0;
- F_AC_I = 0.0;
- F_AC_P = 0.0;
- F_AC_LINE_Freq = 0.0;
- F_AC_PF = 0.0;
- }else if(F_AC_PF < 0.1 || F_AC_PF > 1 || F_AC_P < 1)
- {
- F_AC_I = 0.0;
- F_AC_P = 0.0;
- F_AC_PF = 0.0;
- }
- 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] + (uint32_t)(elec[channel] * 1000);
-
- }
- }
- 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 SUPPORT_CTRL2_LOCK2
- if(channel >= AVALIABLE_RELAY)
- return;
- #endif
- #ifndef SUPPORT_MON
- 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);
- }
- #endif
- }
- }
|