forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-05-16 5ac1d0febb8de5e91ce2463baea68ddac3f66091
Function/VALVE/valve_control.c
@@ -1,291 +1,320 @@
#include "valve_control.h"
#include "gpio.h"
#include "uart.h"
#include "lcd.h"
#include "gprs.h"
#include "low_pwr_test.h"
#include "tim.h"
#include "system_log.h"
#include "check_out.h"
#include "master_slave_inter.h"
#include "system_mem_para.h"
VALVE_WORK_TYPE op_cl_valve_log_flag_g = VWT_NONE; // ¿ª/¹Ø·§ÈÕÖ¾±ê־루ÓÃÓÚÅжÏÊÇ·ñÐèÒªÈÕÖ¾´æ´¢²¢´¢´æ£©
__IO VALVE_CTRL_PARA_T   valve_ctrl_para_g;
SYS_ALARM_VALVE_T op_cl_valve_cause_id = AV_NORMAL; // ¿ª¹Ø·§Ô­ÒòID£¨ÓÃÓÚÏÔʾ/¹Ø·§Ô­ÒòID´æ´¢£©
FlagStatus valve_signal_complete_g = RESET; // ¿ª¹Ø·§µ½Î»ÐźÅ
/*¹Ø·§×ÖĬÈÏÖµ*/
TYPE_CHECK_SIZE(VALVE_CTL_BYTES_T,22);//ºË²é½á¹¹Ìå´óС
VALVE_CTL_BYTES_T __attribute__ ((aligned (2))) valve_ctl_bytes_g = {
    {1, 1, 1, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
    {0, 0, 1, 0, 1, 0},
    {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
    {0},
    {0},
    {0},
    {0},
    {0, 0, 0, 0, 1, 1, 1, 1},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
    {0},
};
static const VALVE_CLOSE_FUNC_TABLE_DRV_T  valve_close_tab_func[] = {
    {V_GPRS_CMD_CL, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    {AV_FLOW_DIRECTION, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    /*{Íâµç±ä»¯¹Ø·§, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},*/
      {AV_UNCAP_1, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    {AV_VALVE_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_1, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_2, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_3, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_4, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_5, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_SET_CUMULATE, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    {AV_NO_USE_GAS, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    {AV_NO_GPRS, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    /* {ÐÅÓüƷÑ, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},*/
    {AV_LITH_LOW, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_LITH_UNDER, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_LITH_REMOVE, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_LOW, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_UNDER, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_REMOVE, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_GPRS_FAIL, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    /* {ȫΪSV101µÄ²ÎÊý, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_5},*/
    {AV_TEMP_UP, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_UP_UP, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_DOWN, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_DOWN_DOWN, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_UP, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_UP_UP, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_DOWN, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_DOWN_DOWN, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_PRESS_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_CPU_TEMP_UP, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_CPU_TEMP_DOWN, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
      {AV_CPU_TEMP_DRASTIC_CHANGE, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_FLOW_VEL_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_TOF_DIFF_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SOUND_VEL_ERR, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SNR_ERR, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SIG_UP, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SIG_TH_ERR, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_GAIN_ERR, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_UT_LOSE, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_INPUT_WATER_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
      {AV_MEDIA_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_DISMANTLE, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_MEASURE_ERR, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_LEAKAGE, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_LCD_UP, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_LCD_TEMP_LOW, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_1, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_2, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_3, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CONSTANT_TINY_FLOW, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CONSTANT_FLOW, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CL_HAVE_FLOW, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_11},
};
void Valve_IO_Init(void)
void Motor_AB_GPIO_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( VALVE_FORCED_OPEN_PORT, VALVE_FORCED_OPEN_PIN, IN_NORMAL);
   OutputIO( VALVE_CMD_A_PORT, VALVE_CMD_A_PIN, OUT_PUSHPULL);
   OutputIO( VALVE_CMD_B_PORT, VALVE_CMD_B_PIN, OUT_PUSHPULL);
   OutputIO( VALVE_CMD_C_PORT, VALVE_CMD_C_PIN, OUT_PUSHPULL);
   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();
   
   VALVE_SLEEP;
   VALVE_PWR_OFF;
}
#define VALVE_SWITCHING_G6_G10   1750U
#define VALVE_SWITCHING_G16_G25   2300U
void Valve_OpenCloseTimeInit(void)
{
   if(check_cal_g.device_type == G6 || check_cal_g.device_type == G10)
      BsTimer_Init(12000,VALVE_SWITCHING_G6_G10); // 1Khz = 1ms
   else
      BsTimer_Init(12000,VALVE_SWITCHING_G16_G25); // 1Khz = 1ms
   BSTIM_EGR_UG_Setable(ENABLE); //ʹÄÜUG¼Ä´æÆ÷ÓÃÓÚ¸üÐÂARRºÍPSC
   BSTIM_ISR_UIF_Clr();
}
// ¿ª·§
SYS_ALARM_VALVE_T Valve_Open(SYS_ALARM_VALVE_T op_cl_cause_id)
void ValveMotorOpenRun(void)
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CL) // ·§ÃŹØ
  {
      Valve_Awaken_Init();
      ValveCtl_BsTimer_Clk_Init();
    /*¹©µç£¬¿ª·§*/
      SYS_BST_EN;
    VALVE_PWR_ON;
    VALVE_OPEN;
      BSTIM_CR1_CEN_Setable(ENABLE);//Æô¶¯¶¨Ê±Æ÷TIM
    __VALVE_WORK_TYPE_SET(VWT_OPEN);
    __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_OPENING, AV_NORMAL);
#ifdef RS232_PRINTF
    printf("---> ¿ª·§ÖР<---\r\n");
#endif
      op_cl_valve_cause_id = op_cl_cause_id;
  }
   return AV_NORMAL;
   Motor_AB_GPIO_Init();
   Motor_OP_CL_GPIO_Init();
   Motor_A_HIGH;
   Motor_B_LOW;
   GPIO_EXTI_Init( Motor_OP_PORT, Motor_OP_PIN, EXTI_FALLING, ENABLE);
   GPIO_EXTI_Init( Motor_CL_PORT, Motor_CL_PIN, EXTI_FALLING, ENABLE);
}
// ¹Ø·§
SYS_ALARM_VALVE_T Valve_Close(SYS_ALARM_VALVE_T op_cl_cause_id)
void ValveMotorCloseRun(void)
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_OP) // ·§ÃÅ¿ª
  {
      Valve_Awaken_Init();
      ValveCtl_BsTimer_Clk_Init();
    /*¹©µç£¬¹Ø·§*/
      SYS_BST_EN;
    VALVE_PWR_ON;
    VALVE_CLOSE;
      BSTIM_CR1_CEN_Setable(ENABLE);//Æô¶¯¶¨Ê±Æ÷TIM
    if (__SYS_STATUS_BYTES_GET(valve_lock) == SET)
      __VALVE_WORK_TYPE_SET(VWT_FORCED_CLOSE);
    else
      __VALVE_WORK_TYPE_SET(VWT_NORMAL_CLOSE);
    __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_CLOSING, AV_NORMAL);
#ifdef RS232_PRINTF
    printf("---> ¹Ø·§ÖР<---\r\n");
#endif
#if GPRS_PROTOCOL_SELECT
        gprs_protocol_head_tail_g.gprs_protocol_normal_data_head.valve_close_reason = op_cl_valve_cause_id = op_cl_cause_id; // ¸³ÓèÔ¶´«¹Ø·§Ô­ÒòID
#else
        op_cl_valve_cause_id = op_cl_cause_id;     // ¸³ÓèÔ¶´«¹Ø·§Ô­ÒòID
#endif
   Motor_AB_GPIO_Init();
   Motor_OP_CL_GPIO_Init();
   Motor_A_LOW;
   Motor_B_HIGH;
   GPIO_EXTI_Init( Motor_OP_PORT, Motor_OP_PIN, EXTI_FALLING, ENABLE);
   GPIO_EXTI_Init( Motor_CL_PORT, Motor_CL_PIN, EXTI_FALLING, ENABLE);
}
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;
}
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;
      
  }
   return AV_NORMAL;
}
/*ÅжϿª¹Ø·§µ½Î»*/
void Valve_StateSet(void)
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CLOSING || __SYS_STATUS_BYTES_GET(valve_state) == VALVE_OPENING)
  {
      IWDT_Clr();
    if (valve_signal_complete_g) // Óе½Î»ÐźÅ
    {
      valve_signal_complete_g = RESET;
         if(zero_drift_valve_flag == 0)
            __SYS_ALARM_BYTES_SET(valve_change,SET);
         else
            zero_drift_valve_flag = 0;
      if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CLOSING) // ¸Ä±ä״̬±ê־λ
        __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_CL, AV_NORMAL);
      else if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_OPENING)
        __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_OP, AV_NORMAL);
#ifdef RS232_PRINTF
      printf("---> ¿ª/¹Ø·§Íê³É <---\r\n");
#endif
    }
#ifdef RS232_PRINTF
    printf("PE2 = %d,PE3 = %d,PE4 = %d\r\n", GPIO_ReadOutputDataBit(VALVE_CMD_A_PORT, VALVE_CMD_A_PIN),
           GPIO_ReadOutputDataBit(VALVE_CMD_B_PORT, VALVE_CMD_B_PIN),
           GPIO_ReadOutputDataBit(VALVE_CMD_C_PORT, VALVE_CMD_C_PIN));
#endif
  }
      default:break;
   }
   //ÆäËûÐèÒª³õʼ»¯µÄ²ÎÊý
}
/*¿ª·§µÄÌØÊâÌõ¼þÅжÏ*/
uint8_t Valve_Open_SpecialJudge(__IO SYS_STATUS_T *state_bytes_p)
uint16_t GetValveRunMaxTime(CALIBER_TYPE caliber_type_l)
{
  /*Ïê¼û¡¶·§ºÍÈ¼Æø±íµÄ״̬×Ö¡¢±¨¾¯×ֵȹ²Óù¦ÄܵÄÊáÀí¡·*/
  uint8_t power_temp_press_status = state_bytes_p->lith_under | state_bytes_p->lith_low | state_bytes_p->lith_remove |
                                    state_bytes_p->alka_under | state_bytes_p->alka_low | state_bytes_p->alka_remove |
                                    state_bytes_p->temp_down | state_bytes_p->temp_down_down | state_bytes_p->temp_up | state_bytes_p->temp_up_up |
                                    state_bytes_p->press_down | state_bytes_p->press_down_down | state_bytes_p->press_up | state_bytes_p->press_up_up;
  return !power_temp_press_status;
}
void Valve_Process(SYS_ALARM_VALVE_T * pOp_cl_cause)
{
  if (LargeCurrent_LimitingProcess() & 1)
  {
    /*Èç¹ûÐèÒª¹Ø·§*/
    if (*pOp_cl_cause != V_KEY_OP && *pOp_cl_cause != AV_NORMAL)
      {
         uint8_t valve_ctl_temp = 0;
         // °´¼ü¹Ø·§
         if (*pOp_cl_cause == V_KEY_CL)
         {
#ifdef RS232_PRINTF
            printf("¾¯¸æÐԹط§\r\n");
#endif
            *pOp_cl_cause = Valve_Close(*pOp_cl_cause);
         }
         else
         {
            // ¹Ø·§×ÖÅжϹط§
            for (uint8_t i = 0; i < VALVE_CLOSE_FUNC_TABLE_NUM; i++)
            {
               // ²é±í
               if (valve_close_tab_func[i].valve_close_flag == *pOp_cl_cause && valve_close_tab_func[i].valve_close_byte != NULL)
               {
                  valve_ctl_temp = (*valve_close_tab_func[i].valve_close_byte >> valve_close_tab_func[i].offset_bit) & 0x0003;
                  if (valve_ctl_temp & 0x01) // ÐèÒª¹Ø·§
                  {
                     if (valve_ctl_temp & 0x02) // Ç¿ÖÆÐԹط§
                     {
                        //ÒѾ­Óо¯¸æÐԹط§ºóÓÖ²úÉúÁËÇ¿ÖÆÐԹط§£¬ÐèÒª¸Ä±ä¹Ø·§ID£¬ÓÃÓÚ¸üÖ±¹ÛµÄÏÔʾ
                        if(__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CL && __SYS_STATUS_BYTES_GET(valve_lock) == RESET)
                        {
                           __VALVE_WORK_TYPE_SET(VWT_LOCK);
                           op_cl_valve_cause_id = *pOp_cl_cause;
                        }
                        __SYS_STATUS_BYTES_STATUS(valve_lock, SET, AV_NORMAL); // ÉÏËø
#ifdef RS232_PRINTF
                        printf("Ç¿ÖÆÐԹط§\r\n");
#endif
                     }
                     else // ¾¯¸æÐԹط§
                     {
#ifdef RS232_PRINTF
                        printf("¾¯¸æÐԹط§\r\n");
#endif
                     }
                     *pOp_cl_cause = Valve_Close(*pOp_cl_cause);
                  }
                  else
                     *pOp_cl_cause = AV_NORMAL;
                  break;
               }
   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 ;
            }
         }
      }
      else if (*pOp_cl_cause == V_KEY_OP) // ¿ª·§
      {
         //¼ì¶¨Ä£Ê½ÏÂÇ¿ÖÆÐԹط§£¬×Ô¶¯¿ª·§ºó£¬ÐèÒª°ÑËø±ê־Ҳȥ³ý
         if(__SYS_STATUS_BYTES_GET(valve_lock) == SET && sys_display_para_g.sys_and_display_mode == CALIB_MODE)
            __SYS_STATUS_BYTES_STATUS(valve_lock, RESET, AV_NORMAL);
      // ÅжÏijЩ״̬ÊÇ·ñ»Ö¸´Õý³££¨×´Ì¬×ÖÅжϣ©or ¼ì¶¨Ä£Ê½
//      if (Valve_Open_SpecialJudge(&sys_admin_g.sys_admin.state_bytes) || (sys_display_para_g.sys_and_display_mode == CALIB_MODE))
//      {
         *pOp_cl_cause = Valve_Open(*pOp_cl_cause);
//      }
      }
  }
   Valve_StateSet();
}
void ValveCtrlHade(CALIBER_TYPE caliber_type_l,FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p)
{
   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;
         valve_ctrl_para_g.valve_ctrl_order = VC_NONE;
      }else{
         if(0){ //?Ô¶´«¡¢485²É¼¯µÈÇé¿öÏÂÑÓ³ÙÖ´Ðз§ÃŶ¯×÷
         }else{
            valve_ctrl_para_g.open_time_cnt = GetValveRunMaxTime(caliber_type_l);
            ValveMotorOpenRun();
            save_valve_para_g.valve_status = VALVE_OPENING;
            valve_ctrl_para_g.valve_ctrl_order = VC_NONE;
         }
      }
   }else if(valve_ctrl_para_g.valve_ctrl_order == VC_CLOSE){
      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;
         valve_ctrl_para_g.valve_ctrl_order = VC_NONE;
      }else{
         if(0){ //?Ô¶´«¡¢485²É¼¯µÈÇé¿öÏÂÑÓ³ÙÖ´Ðз§ÃŶ¯×÷
         }else{
            valve_ctrl_para_g.close_time_cnt = GetValveRunMaxTime(caliber_type_l);
            ValveMotorCloseRun();
            save_valve_para_g.valve_status = VALVE_CLOSING;
            valve_ctrl_para_g.valve_ctrl_order = VC_NONE;
         }
      }
   }else if(valve_ctrl_para_g.valve_ctrl_order == VC_LOCK){
      save_valve_para_g.valve_lock_state = VL_LOCK;
   }
   //?ÅжϿª¹Ø·§ÊÇ·ñµ½Î»
   if(save_valve_para_g.valve_status==VALVE_OPENING){
      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(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;
}
//·§ÃŲÙ×÷º¯Êý£¬Èç¹û·§ÃÅÕý¿ª¹ý³ÌÖУ¬´¥·¢¹Ø·§£¬ÔòÐèҪֹͣ¿ª·§£¬×ª¶ø½øÐйط§
ErrorStatus ValveCtrlOrder(VALVE_CTEL_TYPE_T valve_ctrl_order_l)
{
   switch(valve_ctrl_order_l){
      case VC_NONE:break;
      case VC_OPEN:
         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;
            return PASS;
         }
      break;
      case VC_CLOSE:
         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_CLOSE;
            return PASS;
         }
      break;
      case VC_UNLOCK:
         save_valve_para_g.valve_lock_state = VL_UNLOCK;
         return PASS;
      break;
      case VC_LOCK:
         save_valve_para_g.valve_lock_state = VL_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;
         //¿ªÊ¼Æô¶¯Ç¿¿ª
      }
   }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);//¹þµÂ·§ÃŲÙ×÷´¦Àíº¯Êý
}