#include "valve_control.h"
|
#include "gpio.h"
|
#include "system_mem_para.h"
|
#include "power_manage.h"
|
#include "linked_list.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(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;
|
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;
|
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){
|
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(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;
|
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(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)
|
{
|
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_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);//¹þµÂ·§ÃŲÙ×÷´¦Àíº¯Êý
|
|
|
}
|