|
|
@@ -31,6 +31,9 @@ static void task_1s(void);
|
|
|
|
|
|
|
|
|
|
|
|
+static void relay_ctrl(void);
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
int main(){
|
|
|
@@ -46,19 +49,23 @@ int main(){
|
|
|
time_init();
|
|
|
electricity_init();
|
|
|
query_init();
|
|
|
-
|
|
|
eMBInit(MB_RTU, ac_board.haddr, 0, 115200, MB_PAR_NONE);
|
|
|
eMBEnable();
|
|
|
+ //device
|
|
|
+ ac_board.md_data.r_data.r_d.dev_chn = DEIVECE(POWER_TYPE,INPUT_PT_NUM,ZERO_CONTRL,ZERO_CTRL_NUM,OUTPUT_CONTRL,RelaySlaveChaNum);
|
|
|
+ //
|
|
|
+
|
|
|
read_config_from_eeprom();
|
|
|
|
|
|
- strcpy(&(ac_board.md_data.r_data.b_info.date),__DATE__);
|
|
|
- strcat(&(ac_board.md_data.r_data.b_info.date)," ");
|
|
|
- strcat(&(ac_board.md_data.r_data.b_info.date),__TIME__);
|
|
|
- strcpy(&(ac_board.md_data.r_data.b_info.version),VERSION);
|
|
|
+ strcpy(&(ac_board.md_data.r_data.r_d.b_info.date),__DATE__);
|
|
|
+ strcat(&(ac_board.md_data.r_data.r_d.b_info.date)," ");
|
|
|
+ strcat(&(ac_board.md_data.r_data.r_d.b_info.date),__TIME__);
|
|
|
+ strcpy(&(ac_board.md_data.r_data.r_d.b_info.version),VERSION);
|
|
|
|
|
|
- flash_get_infomation(&ac_board.md_data.r_data.b_info);
|
|
|
+ flash_get_infomation(&ac_board.md_data.r_data.r_d.b_info);
|
|
|
while(1)
|
|
|
{
|
|
|
+ relay_ctrl();
|
|
|
task_query();
|
|
|
task_1s();
|
|
|
eMBPoll();
|
|
|
@@ -87,11 +94,224 @@ static void task_1s(void)
|
|
|
ac_board.led_flash();
|
|
|
ac_board.detection();
|
|
|
ac_board.read_ele(channel);
|
|
|
- ac_board.check_out_wanning(channel);
|
|
|
+ ac_board.check_wanning(ELE_OUTPUT,channel);
|
|
|
channel++;
|
|
|
if(channel == RelaySlaveChaNum)
|
|
|
{
|
|
|
+ //check input wanning
|
|
|
+ //calculate input
|
|
|
+#if (POWER_TYPE == POWER_AC_3_3)
|
|
|
+ for(int i = 0 ;i < 3;i++)
|
|
|
+ {
|
|
|
+ uint32_t data_voltage = 0;
|
|
|
+ uint32_t data_current = 0;
|
|
|
+ uint32_t data_power = 0;
|
|
|
+ uint32_t data_consumer = 0;
|
|
|
+ for(int j =i;j < RelaySlaveChaNum;i+=3)
|
|
|
+ {
|
|
|
+ data_voltage = ac_board.md_data.r_data.r_d.ele_out[j].voltage > data_voltage ? ac_board.md_data.r_data.r_d.ele_out[j].voltage : data_voltage;
|
|
|
+ data_current += ac_board.md_data.r_data.r_d.ele_out[j].current;
|
|
|
+ data_consumer += ac_board.md_data.r_data.r_d.ele_out[j].consumer;
|
|
|
+ data_power += ac_board.md_data.r_data.r_d.ele_out[j].power;
|
|
|
+ }
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[i].voltage = data_voltage;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[i].current = data_current;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[i].power = data_power;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[i].consumer = data_consumer;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[i].resever = ac_board.md_data.r_data.r_d.ele_out[i*=3].resever;
|
|
|
+ ac_board.check_wanning(ELE_INPUT,i);
|
|
|
+ }
|
|
|
+
|
|
|
+#else
|
|
|
+ uint8_t avi = (RelaySlaveChaNum % INPUT_PT_NUM) ? (RelaySlaveChaNum / INPUT_PT_NUM + 1) : (RelaySlaveChaNum / INPUT_PT_NUM );
|
|
|
+ uint32_t data_voltage = 0;
|
|
|
+ uint32_t data_current = 0;
|
|
|
+ uint32_t data_power = 0;
|
|
|
+ uint32_t data_consumer = 0;
|
|
|
+ if(avi == RelaySlaveChaNum)
|
|
|
+ {
|
|
|
+ for(int i = 0 ; i < avi;i++)
|
|
|
+ {
|
|
|
+ data_voltage = ac_board.md_data.r_data.r_d.ele_out[i].voltage > data_voltage ? ac_board.md_data.r_data.r_d.ele_out[i].voltage : data_voltage;
|
|
|
+ data_current += ac_board.md_data.r_data.r_d.ele_out[i].current;
|
|
|
+ data_consumer += ac_board.md_data.r_data.r_d.ele_out[i].consumer;
|
|
|
+ data_power += ac_board.md_data.r_data.r_d.ele_out[i].power;
|
|
|
+ }
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].voltage = data_voltage;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].current = data_current;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].power = data_power;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].consumer = data_consumer;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].resever = ac_board.md_data.r_data.r_d.ele_out[0].resever;
|
|
|
+ //check input wanning
|
|
|
+ ac_board.check_wanning(ELE_INPUT,0);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ for(int i = 0 ; i < avi;i++)
|
|
|
+ {
|
|
|
+ data_voltage = ac_board.md_data.r_data.r_d.ele_out[i].voltage > data_voltage ? ac_board.md_data.r_data.r_d.ele_out[i].voltage : data_voltage;
|
|
|
+ data_current += ac_board.md_data.r_data.r_d.ele_out[i].current;
|
|
|
+ data_consumer += ac_board.md_data.r_data.r_d.ele_out[i].consumer;
|
|
|
+ data_power += ac_board.md_data.r_data.r_d.ele_out[i].power;
|
|
|
+ }
|
|
|
+
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].voltage = data_voltage;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].current = data_current;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].power = data_power;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].consumer = data_consumer;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[0].resever = ac_board.md_data.r_data.r_d.ele_out[0].resever;
|
|
|
+ //check input wanning
|
|
|
+ ac_board.check_wanning(ELE_INPUT,0);
|
|
|
+ data_voltage = data_current = data_power = data_consumer =0;
|
|
|
+ for(int i = avi ; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ data_voltage = ac_board.md_data.r_data.r_d.ele_out[i].voltage > data_voltage ? ac_board.md_data.r_data.r_d.ele_out[i].voltage : data_voltage;
|
|
|
+ data_current += ac_board.md_data.r_data.r_d.ele_out[i].current;
|
|
|
+ data_consumer += ac_board.md_data.r_data.r_d.ele_out[i].consumer;
|
|
|
+ data_power += ac_board.md_data.r_data.r_d.ele_out[i].power;
|
|
|
+ }
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[1].voltage = data_voltage;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[1].current = data_current;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[1].power = data_power;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[1].consumer = data_consumer;
|
|
|
+ ac_board.md_data.r_data.r_d.ele_3_in.info[1].resever = ac_board.md_data.r_data.r_d.ele_out[avi].resever; //phase infomation
|
|
|
+ //check input wanning
|
|
|
+ ac_board.check_wanning(ELE_INPUT,1);
|
|
|
+ }
|
|
|
+#endif
|
|
|
channel = 0;
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void relay_ctrl(void)
|
|
|
+{
|
|
|
+ for(int i = 0; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ if(IS_RL_ORDER_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ uint8_t rl_old_state = GET_RL_STATUS(ac_board.md_data.rw_data.rw_d.relay_status[i]);
|
|
|
+ uint8_t rl_now_state = GET_RL_STATUS(ac_board.relay_staging_staus[i]);
|
|
|
+ if(rl_now_state > rl_old_state)
|
|
|
+ {
|
|
|
+ SET_RL_ON_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ if(IS_RL_ON_DELAY_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ ac_board.relay_limit_counter[i] = ac_board.md_data.rw_data.rw_d.delay_chn[i].delay_open;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ SET_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ ac_board.relay_limit_counter[i] = 0;
|
|
|
+ SET_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }else if (rl_now_state < rl_old_state)
|
|
|
+ {
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ SET_RL_OFF_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ if(IS_RL_OFF_DELAY_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ ac_board.relay_limit_counter[i] = ac_board.md_data.rw_data.rw_d.delay_chn[i].delay_close;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ SET_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ ac_board.relay_limit_counter[i] = 0;
|
|
|
+ SET_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ ac_board.relay_limit_counter[i] = 0;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ CLEAR_RL_ORDER_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i = 0; i < ZERO_CTRL_NUM;i++)
|
|
|
+ {
|
|
|
+ if(IS_RL_ORDER_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ uint8_t rl_old_state = GET_RL_STATUS(ac_board.md_data.rw_data.rw_d.zero_relay_status[i]);
|
|
|
+ uint8_t rl_now_state = GET_RL_STATUS(ac_board.relay_zero_staging_status[i]);
|
|
|
+ if(rl_now_state > rl_old_state)
|
|
|
+ {
|
|
|
+ SET_RL_ON_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ if(IS_RL_ON_DELAY_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ ac_board.relay_zero_limit_counter[i] = ac_board.md_data.rw_data.rw_d.zero_chn[i].delay_open;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ SET_RL_COUNTER_BEGIN_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ ac_board.relay_zero_limit_counter[i] = 0;
|
|
|
+ SET_RL_COUNTER_END_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }else if (rl_now_state < rl_old_state)
|
|
|
+ {
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ SET_RL_OFF_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ if(IS_RL_OFF_DELAY_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ ac_board.relay_zero_limit_counter[i] = ac_board.md_data.rw_data.rw_d.zero_chn[i].delay_close;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ SET_RL_COUNTER_BEGIN_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ ac_board.relay_zero_limit_counter[i] = 0;
|
|
|
+ SET_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ ac_board.relay_zero_limit_counter[i] = 0;
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_COUNTER_BEGIN_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ CLEAR_RL_ORDER_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i = 0; i < RelaySlaveChaNum;i++)
|
|
|
+ {
|
|
|
+ if(IS_RL_COUNTER_END_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ if(IS_RL_ON_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ ac_board.open(i);
|
|
|
+ }else if(IS_RL_OFF_FLAG_EN(ac_board.relay_staging_staus[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_staging_staus[i]);
|
|
|
+ ac_board.close(i);
|
|
|
+ }
|
|
|
+ //todo insert data to iic flash chache and wait write to eepeom
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i = 0; i < ZERO_CTRL_NUM;i++)
|
|
|
+ {
|
|
|
+ if(IS_RL_COUNTER_END_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_COUNTER_END_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ if(IS_RL_ON_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_ON_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ ac_board.zero_open(i);
|
|
|
+ }else if(IS_RL_OFF_FLAG_EN(ac_board.relay_zero_staging_status[i]))
|
|
|
+ {
|
|
|
+ CLEAR_RL_OFF_FLAG(ac_board.relay_zero_staging_status[i]);
|
|
|
+ ac_board.zero_close(i);
|
|
|
+ }
|
|
|
+ //todo insert data to iic flash chache and wait write to eepeom
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|