#include "valve_control.h" #include "gpio.h" #include "system_mem_para.h" #include "power_manage.h" #include "linked_list.h" #include "sizhu_alarm_record.h" #include "sizhu_event_record.h" __IO VALVE_CTRL_PARA_T valve_ctrl_para_g; void Motor_AB_GPIO_Init(void) { OutputIO(Motor_A_PORT,Motor_A_PIN,OUT_PUSHPULL); OutputIO(Motor_B_PORT,Motor_B_PIN,OUT_PUSHPULL); } void Motor_OP_CL_GPIO_Init(void) { InputtIO(Motor_OP_PORT,Motor_OP_PIN,IN_NORMAL); InputtIO(Motor_CL_PORT,Motor_CL_PIN,IN_NORMAL); } void Motor_OP_CL_GPIO_Init_sleep_mode(void) { CloseIO(Motor_OP_PORT,Motor_OP_PIN); CloseIO(Motor_CL_PORT,Motor_CL_PIN); } void Force_Open_GPIO_Init(void) { InputtIO(VALVE_FORCE_OPEN_PORT,VALVE_FORCE_OPEN_PIN,IN_NORMAL); } void Force_Open_GPIO_Init_sleep_mode(void) { CloseIO(VALVE_FORCE_OPEN_PORT,VALVE_FORCE_OPEN_PIN); } void Valve_CTRL_GPIO_Init(void) { Motor_AB_GPIO_Init(); Motor_A_LOW; Motor_B_LOW; Motor_OP_CL_GPIO_Init_sleep_mode(); } void ValveMotorOpenRun(void) { Motor_AB_GPIO_Init(); Motor_OP_CL_GPIO_Init(); Motor_A_HIGH; Motor_B_LOW; } void ValveMotorCloseRun(void) { //ÅжÏÊÇ·ñÐèÒª½èµç¹Ø·§,ÎÞÍâµç£¬¼îµçµôµç»òÕßÒÆ³ý״̬Ͻèµã£¬ï®µçÒªÇóÕý³£×´Ì¬ if(__SYS_STATUS_BYTES_GET(alka_remove) == SET || __SYS_STATUS_BYTES_GET(alka_down) == SET){ if(__SYS_STATUS_BYTES_GET(lith_low) == RESET && __SYS_STATUS_BYTES_GET(lith_down) == RESET && __SYS_STATUS_BYTES_GET(lith_remove) == RESET){ if(__SYS_STATUS_BYTES_GET(power_state) == RESET){ borrow_Pwr_GPIO_Clk_Init(); BORROW_PWR_ON; delay_ms(1); } } } Motor_AB_GPIO_Init(); Motor_OP_CL_GPIO_Init(); Motor_A_LOW; Motor_B_HIGH; } void ValveMotorStop(void) { Motor_AB_GPIO_Init(); Motor_OP_CL_GPIO_Init_sleep_mode(); GPIO_EXTI_Init( Motor_OP_PORT, Motor_OP_PIN, EXTI_FALLING, DISABLE); GPIO_EXTI_Init( Motor_CL_PORT, Motor_CL_PIN, EXTI_FALLING, DISABLE); Motor_A_LOW; Motor_B_LOW; //½èµç¹Ø±Õ borrow_Pwr_GPIO_Clk_Init(); BORROW_PWR_OFF; } VALVE_STATUS Read_OP_CL_VALVE_Status(u16 delay_time_ms) { uint8_t Open_status,Close_status; Motor_OP_CL_GPIO_Init(); if((delay_time_ms > 0)&&(delay_time_ms <101 )) //´Ë´¦´ý¶¨£¬Ä¿Ç°²»ÐèÒªÑÓ³Ù£¬ÑÓ³Ùʱ¼ä¸ø0¾ÍÐÐ { delay_ms(delay_time_ms); } Open_status = Motor_OP_IO_READ; Close_status = Motor_CL_IO_READ; if((Open_status==(uint8_t)Bit_RESET)&&(Close_status==(uint8_t)Bit_SET)) { return VALVE_OPEN; }else if((Open_status==(uint8_t)Bit_SET)&&(Close_status==(uint8_t)Bit_RESET)) { return VALVE_CLOSE; }else if((Open_status==(uint8_t)Bit_SET)&&(Close_status==(uint8_t)Bit_SET)) { return VALVE_ERROR; }else { return VALVE_ERROR; } } void ValveRunParaInit(VALVE_TYPE valve_type_in) { // VALVE_STATUS valve_status; switch (valve_type_in){ case VM_PENGSHENG: ; case VM_HADE: save_valve_para_g.valve_status = Read_OP_CL_VALVE_Status(0); break; default:break; } //ÆäËûÐèÒª³õʼ»¯µÄ²ÎÊý } uint16_t GetValveRunMaxTime(CALIBER_TYPE caliber_type_l) { switch (caliber_type_l){ case DN25_TYPE: return VALVE_HADE_RUN_TIME_DN25 ; case DN32_TYPE: return VALVE_HADE_RUN_TIME_DN32 ; case DN40_TYPE: return VALVE_HADE_RUN_TIME_DN40 ; case DN50_TYPE: return VALVE_HADE_RUN_TIME_DN50 ; case DN80_TYPE: return VALVE_HADE_RUN_TIME_DN80 ; case DN100_TYPE: return VALVE_HADE_RUN_TIME_DN100 ; case DN150_TYPE: return VALVE_HADE_RUN_TIME_DN150 ; case DN200_TYPE: return VALVE_HADE_RUN_TIME_DN200 ; default: return VALVE_HADE_RUN_TIME_DN200 ; } } void ValveCtrlHade(CALIBER_TYPE caliber_type_l,FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p) { if(valve_ctrl_para_g.force_open_status ==SET){ //Ç¿¿ªÓÅÏȼ¶¸ß£¬¼ì²âµ½Ç¿¿ª²»Ö´Ðз§ÃÅ¿ØÖÆ,¹Ø±ÕÖжϼì²â¡£ ¼ì²â·§ÃÅ״̬£¬Èç¹û¿ªµ½Î»£¬×´Ì¬±ä¸üΪ¿ª£¬·ñÔò״̬Ϊ¿ª·§ÖÐ GPIO_EXTI_Init( Motor_CL_PORT, Motor_CL_PIN, EXTI_FALLING, DISABLE); if(Read_OP_CL_VALVE_Status(0) !=VALVE_OPEN){ save_valve_para_g.valve_status = VALVE_OPENING; ValveMotorStop(); }else{ save_valve_para_g.valve_status = VALVE_OPEN; } return ; //Ç¿¿ªÐźÅÓÐЧʱ£¬Ö±½ÓÌø³öº¯Êý£¬²»ÅжϺóÐøÂß¼­ }else if(valve_ctrl_para_g.valve_ctrl_order == VC_OPEN){ if(Read_OP_CL_VALVE_Status(0) == VALVE_OPEN){ ValveMotorStop(); save_valve_para_g.valve_status = VALVE_OPEN; valve_ctrl_para_g.close_time_cnt = 0; sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,ALARM_ID_NORMAL); valve_ctrl_para_g.valve_ctrl_order = VC_NONE; }else{ if(sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag==SET||sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag==SET){ //Ô¶´«¡¢485²É¼¯µÈÇé¿öÏÂÑÓ³ÙÖ´Ðз§ÃŶ¯×÷ ; }else{ valve_ctrl_para_g.open_time_cnt = GetValveRunMaxTime(caliber_type_l); ValveMotorOpenRun(); save_valve_para_g.valve_status = VALVE_OPENING; sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,ALARM_ID_NORMAL); valve_ctrl_para_g.valve_ctrl_order = VC_NONE; delay_ms(10); //ÑÓºó´ò¿ªÖÕ¶Ë GPIO_EXTI_Init( Motor_OP_PORT, Motor_OP_PIN, EXTI_FALLING, ENABLE); } } }else if((valve_ctrl_para_g.valve_ctrl_order == VC_CLOSE)||(valve_ctrl_para_g.valve_ctrl_order == VC_CLOSE_AND_LOCK )){ if(Read_OP_CL_VALVE_Status(0) == VALVE_CLOSE){ ValveMotorStop(); save_valve_para_g.valve_status = VALVE_CLOSE; valve_ctrl_para_g.open_time_cnt = 0; if((save_valve_para_g.valve_lock_state == VL_UNLOCK)&&(valve_ctrl_para_g.valve_ctrl_order == VC_CLOSE_AND_LOCK)) { save_valve_para_g.valve_lock_state = VL_LOCK ; } sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,save_valve_para_g.valve_close_ID); valve_ctrl_para_g.valve_ctrl_order = VC_NONE; }else{ if(sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag==SET||sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag==SET){ //Ô¶´«¡¢485²É¼¯µÈÇé¿öÏÂÑÓ³ÙÖ´Ðз§ÃŶ¯×÷ ; }else{ valve_ctrl_para_g.close_time_cnt = GetValveRunMaxTime(caliber_type_l); ValveMotorCloseRun(); save_valve_para_g.valve_status = VALVE_CLOSING; if((save_valve_para_g.valve_lock_state == VL_UNLOCK)&&(valve_ctrl_para_g.valve_ctrl_order == VC_CLOSE_AND_LOCK)) { save_valve_para_g.valve_lock_state = VL_LOCK ; } sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,save_valve_para_g.valve_close_ID); valve_ctrl_para_g.valve_ctrl_order = VC_NONE; delay_ms(10); //ÑÓºó´ò¿ªÖÕ¶Ë GPIO_EXTI_Init( Motor_CL_PORT, Motor_CL_PIN, EXTI_FALLING, ENABLE); } } }else if(valve_ctrl_para_g.valve_ctrl_order == VC_LOCK){ if(save_valve_para_g.valve_lock_state == VL_UNLOCK) { save_valve_para_g.valve_lock_state = VL_LOCK ; sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,ALARM_ID_NORMAL); } valve_ctrl_para_g.valve_ctrl_order = VC_NONE; }else if(valve_ctrl_para_g.valve_ctrl_order == VC_UNLOCK){ if(save_valve_para_g.valve_lock_state == VL_LOCK) { save_valve_para_g.valve_lock_state = VL_UNLOCK; sizhuValveActionLogHandle(valve_ctrl_para_g.valve_ctrl_source, valve_ctrl_para_g.valve_ctrl_order,ALARM_ID_NORMAL); } valve_ctrl_para_g.valve_ctrl_order = VC_NONE; }else{ } //ÅжϿª¹Ø·§ÊÇ·ñµ½Î» if(save_valve_para_g.valve_status==VALVE_OPENING){ if(Read_OP_CL_VALVE_Status(0) ==VALVE_OPEN){ ValveMotorStop();//¹Ø±ÕÇý¶¯ save_valve_para_g.valve_status = VALVE_OPEN; }else if(valve_ctrl_para_g.open_time_cnt==0){ //³¬Ê±½áÊø ValveMotorStop(); save_valve_para_g.valve_status = VALVE_ERROR; }else{ valve_ctrl_para_g.open_time_cnt--; } // if(valve_ctrl_para_g.force_open_status ==SET){ // //¿ª·§¹ý³ÌÖÐÓöµ½Ç¿¿ª£¬¹Ø±ÕÇý¶¯ // ValveMotorStop(); // } }else if(save_valve_para_g.valve_status==VALVE_CLOSING){ if(Read_OP_CL_VALVE_Status(0) ==VALVE_CLOSE){ ValveMotorStop();//¹Ø±ÕÇý¶¯ save_valve_para_g.valve_status = VALVE_CLOSE; }else if(valve_ctrl_para_g.close_time_cnt==0){ //³¬Ê±½áÊø ValveMotorStop(); save_valve_para_g.valve_status = VALVE_ERROR; }else{ valve_ctrl_para_g.close_time_cnt--; } // if(valve_ctrl_para_g.force_open_status ==SET){ // //¹Ø·§¹ý³ÌÖÐÓöµ½Ç¿¿ª£¬¹Ø±ÕÇý¶¯£¬×´Ì¬¸Ä±ä³É¿ª·§ÖУ¬ÖØÖÿª·§¼ÆÊ± // ValveMotorStop(); // save_valve_para_g.valve_status = VALVE_OPENING; // valve_ctrl_para_g.open_time_cnt = GetValveRunMaxTime(caliber_type_l); // } } //·§ÃŲÙ×÷½øÐÐÖÐ״̬ÖÃλ if((save_valve_para_g.valve_status==VALVE_OPENING)||(save_valve_para_g.valve_status==VALVE_CLOSING)) sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag = SET; else sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag = RESET; //״̬×Ö´¦Àí if(save_valve_para_g.valve_lock_state == VL_UNLOCK) system_status_word_g.status_word.valve_lock = RESET; else system_status_word_g.status_word.valve_lock = SET; if(save_valve_para_g.valve_status == VALVE_ERROR){ if(system_status_word_g.status_word.valve_state != VALVE_ERROR){ //´¥·¢·§ÃÅÒì³£±¨¾¯ if(__SYS_ALARM_REPORT_CTL_BYTES_GET(valve_error) == SET) __SYS_ALARM_BYTES_SET(valve_error, ALARM_ID_VALVE_ABNORMAL); system_alarm_word_for_valve_g.alarm_word.valve_error = SET; //¹Ø·§±¨¾¯×´Ì¬ÖÃλ } }else{ system_status_word_g.status_word.valve_state = save_valve_para_g.valve_status; } } //·§ÃŲÙ×÷º¯Êý£¬Èç¹û·§ÃÅÕý¿ª¹ý³ÌÖУ¬´¥·¢¹Ø·§£¬ÔòÐèҪֹͣ¿ª·§£¬×ª¶ø½øÐйط§ ErrorStatus ValveCtrlOrder(VALVE_CTRL_TYPE_T valve_ctrl_order_l,VALVE_CTRL_SOURCE_T valve_ctrl_source) { valve_ctrl_para_g.valve_ctrl_source = valve_ctrl_source; switch(valve_ctrl_order_l){ case VC_NONE:break; case VC_OPEN: if((__SYS_STATUS_BYTES_GET(alka_remove) == SET || __SYS_STATUS_BYTES_GET(alka_down) == SET)&&(__SYS_STATUS_BYTES_GET(power_state) ==RESET)){ return FAIL;//¼îµçûµçÇÒûÓÐÍâµç£¬²»ÔÊÐí¿ª·¢ } if((save_valve_para_g.valve_status == VALVE_CLOSE)&&(valve_ctrl_para_g.force_open_status==RESET)){ valve_ctrl_para_g.valve_ctrl_order = VC_OPEN; pwr_vol_g.alka_flag = AMS_VALVE_CTRL_BEFORE; return PASS; } break; case VC_CLOSE: if((save_valve_para_g.valve_status != VALVE_CLOSE)&&(save_valve_para_g.valve_status != VALVE_CLOSING)&&(valve_ctrl_para_g.force_open_status==RESET)){ valve_ctrl_para_g.valve_ctrl_order = VC_CLOSE; pwr_vol_g.alka_flag = AMS_VALVE_CTRL_BEFORE; } return PASS; // break; case VC_CLOSE_AND_LOCK: valve_ctrl_para_g.valve_ctrl_order = VC_LOCK; //ÏȽöËø¶¨£¬ÔÚÅжϷ§ÃÅ״̬¿´Ðè²»ÐèÒªÖ´Ðйط§ if((save_valve_para_g.valve_status != VALVE_CLOSE)&&(save_valve_para_g.valve_status != VALVE_CLOSING)&&(valve_ctrl_para_g.force_open_status==RESET)){ valve_ctrl_para_g.valve_ctrl_order = VC_CLOSE_AND_LOCK; pwr_vol_g.alka_flag = AMS_VALVE_CTRL_BEFORE; } return PASS; case VC_UNLOCK: valve_ctrl_para_g.valve_ctrl_order = VC_UNLOCK; return PASS; // break; case VC_LOCK: valve_ctrl_para_g.valve_ctrl_order = VC_LOCK; return PASS; // break; default: break; } return FAIL; } void ValveForceOpenSignalCheck(void) { uint8_t force_open_io_status=(uint8_t)Bit_RESET; Force_Open_GPIO_Init(); if(VALVE_FORCE_OPEN_IO_READ==Bit_SET){ delay_ms(5); if(VALVE_FORCE_OPEN_IO_READ==Bit_SET) force_open_io_status=(uint8_t)Bit_SET; } if(force_open_io_status==(uint8_t)Bit_SET){ if(valve_ctrl_para_g.force_open_status !=SET){ valve_ctrl_para_g.force_open_status =SET; //¿ªÊ¼Æô¶¯Ç¿¿ª sizhuValveActionLogHandle(VALVE_CTRL_FORCE_OPEN, VC_FORCE_OPEN,ALARM_ID_NORMAL); } }else{ if(valve_ctrl_para_g.force_open_status ==SET){ valve_ctrl_para_g.force_open_status =RESET; //Ç¿¿ª½áÊø } } if((valve_ctrl_para_g.force_open_status ==SET)&&(Read_OP_CL_VALVE_Status(0)==VALVE_OPEN)){ //?¼ì²âµ½Ç¿¿ª£¬µ«ÊÇ·§ÃÅ״̬¶ÁÈ¡ÒѾ­¿ªµ½Î»£¬ÌáÊ¾ÒÆ³ýÇ¿¿ªµçÔ´£¿ // } } void valveCtrlPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p) //Èç¹ûÒª²Ù×÷·§ÃÅÔòµ÷Óú¯ÊýValveCtrlOrder£¨VC_OPEN£©;Èë²Î´ú±í²Ù×÷ÄÚÈÝ { ValveForceOpenSignalCheck();//Ç¿¿ªÅжϴ¦Àí ValveCtrlHade(equipment_basic_inf_g.caliber_type,sys_fun_run_ctrl_p);//¹þµÂ·§ÃŲÙ×÷´¦Àíº¯Êý }