P2UWaterJiangXi/app/UWater_valve_app.c

394 lines
10 KiB
C

/*******************************************************************************
* @Copyright (c) :(C)2016, Qingdao ieslab Co., Ltd
* @FileName :GP22Gas_valve_app.c
* @Author :Kv-L
* @Version :V1.0
* @Date :2016年5月25日 13:54:51
* @Description :the function of the entity of GP22Gas_valve_app.c
*******************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#include "UWater_valve_app.h"
#include "UWater_valve_driver.h"
#include "UWater_rtcc_app.h"
#include "UWater_gp22_app.h"
#include "SOE.h"
#if defined(VALVE)
static u8 valve_rcv_order = 0; //启动阀控的命令
static u8 valve_rcv_order_backup = 0; //防止旧命令被冲,记录上次收到的命令
static u8 valve_deal_state = VALVE_DEAL_S0; //阀门
static DateTime sys_rtcc_time_valve; //用于获取系统当前时间
static Fram_To_Float valve_tmp_float;
static u8 s_valapp_upload_state = 0;//关阀上报控制
static u8 ValveCheckOrder(void)
{
u8 result_return = FALSE;
//EE中状态
switch(Sys_data_object.P1.ies_valve_paras.valve_state)
{
case VALVE_STATE_OPEN:
{
/*普通开阀状态下:
(1)收到普关、应急关、权限关,保存阀门状态并关阀动作
*/
switch(valve_rcv_order_backup)
{
case VALVE_STATE_OPEN:
case VALVE_STATE_OPEN_EMERGENCY:
{
ValveStartTask(VALVE_TO_OPEN); //0208
}
break;
case VALVE_STATE_CLOSE:
case VALVE_STATE_CLOSE_EMERGENCY:
case VALVE_STATE_CLOSE_LOCK:
{
ValveStoreRcvState(valve_rcv_order_backup);
ValveStartTask(VALVE_TO_CLOSE);
result_return = TRUE;
}
break;
default:
break;
}
}
break;
case VALVE_STATE_OPEN_EMERGENCY:
{
/*应急开阀状态下:
(1)收到普关、应急关、权限关,保存阀门状态并关阀动作
(2)可以切换到普通开阀状态(普通开阀状态不限制用水量)
*/
switch(valve_rcv_order_backup)
{
case VALVE_STATE_OPEN_EMERGENCY:
{
ValveStartTask(VALVE_TO_OPEN); //0208
}
break;
case VALVE_STATE_OPEN:
{
ValveStartTask(VALVE_TO_OPEN); //0208
ValveStoreRcvState(valve_rcv_order_backup);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE:
case VALVE_STATE_CLOSE_EMERGENCY:
case VALVE_STATE_CLOSE_LOCK:
{
ValveStoreRcvState(valve_rcv_order_backup);
ValveStartTask(VALVE_TO_CLOSE);
result_return = TRUE;
}
break;
default:
break;
}
}
break;
case VALVE_STATE_CLOSE:
{
/*普通关阀状态下:
(1)可以切换到应急关、权限关
(2)可以普通开阀、应急开阀
*/
switch(valve_rcv_order_backup)
{
case VALVE_STATE_OPEN:
case VALVE_STATE_OPEN_EMERGENCY:
{
ValveStoreRcvState(VALVE_STATE_OPEN);//普通关阀状态下的任何开阀,都设为普通开阀(不限制用水量)
ValveStartTask(VALVE_TO_OPEN);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
}
break;
case VALVE_STATE_CLOSE_EMERGENCY:
case VALVE_STATE_CLOSE_LOCK:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
ValveStoreRcvState(valve_rcv_order_backup);
result_return = TRUE;
}
break;
default:
break;
}
}
break;
case VALVE_STATE_CLOSE_EMERGENCY:
{
/*应急关阀状态下:
(1)可以切换到应急开,记录应急开阀是用水量,等达到应急用水量时切换为权限关阀
(2)可以普通开阀,普通开阀状态不限制用水量
(3)可以切换到普通关阀\权限关阀
*/
switch(valve_rcv_order_backup)
{
case VALVE_STATE_OPEN_EMERGENCY:
{
valve_tmp_float.gp22_u32 = Gp30CheckDataApp(2);
//应到达用水量 L
Sys_data_object.P1.ies_pulse_remain.datas = (u32)(valve_tmp_float.gp22_float) + Sys_data_object.P1.ies_pulse_emergency.datas*100;
FrameSetMsgApp(MsgValve_EmergencyFlowStore);
ValveStoreRcvState(valve_rcv_order_backup);
ValveStartTask(VALVE_TO_OPEN);
result_return = TRUE;
}
break;
case VALVE_STATE_OPEN:
{
ValveStoreRcvState(valve_rcv_order_backup);
ValveStartTask(VALVE_TO_OPEN);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE:
case VALVE_STATE_CLOSE_LOCK:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
ValveStoreRcvState(valve_rcv_order_backup);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE_EMERGENCY:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
}
break;
default:
break;
}
}
break;
case VALVE_STATE_CLOSE_LOCK:
{
/*权限关阀状态下:
(1)可以普通开阀
(2)可以普通开阀,普通开阀状态不限制用水量
(3)可以切换到普通关阀\应急关阀
*/
switch(valve_rcv_order_backup)
{
case VALVE_STATE_OPEN:
{
ValveStoreRcvState(valve_rcv_order_backup);
ValveStartTask(VALVE_TO_OPEN);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE:
case VALVE_STATE_CLOSE_EMERGENCY:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
ValveStoreRcvState(valve_rcv_order_backup);
result_return = TRUE;
}
break;
case VALVE_STATE_CLOSE_LOCK:
{
ValveStartTask(VALVE_TO_CLOSE); //0208
}
break;
default:
break;
}
}
break;
default:
{
}
break;
}
return result_return;
}
//阀控模块的系统处理
void ValveDealAppMachine(void)
{
if(VALVE_STATE_OPEN_EMERGENCY == Sys_data_object.P1.ies_valve_paras.valve_state)
{
valve_tmp_float.gp22_u32 = Gp30CheckDataApp(2);
if(valve_tmp_float.gp22_float > Sys_data_object.P1.ies_pulse_remain.datas)//用水超过设定紧急用水量
{
ValveDealAppStart(VALVE_STATE_CLOSE_LOCK);//权限关阀
}
}
else if(FrameCheckMsgApp(Msg_ValveOpenEmergency))
{
FrameClearMsgApp(Msg_ValveOpenEmergency);
if((VALVE_STATE_CLOSE_EMERGENCY == Sys_data_object.P1.ies_valve_paras.valve_state)||(VALVE_STATE_CLOSE == Sys_data_object.P1.ies_valve_paras.valve_state))
{
ValveDealAppStart(VALVE_STATE_OPEN_EMERGENCY);
}
}
switch(valve_deal_state)
{
case (VALVE_DEAL_S0):
{
if(valve_rcv_order) //控阀命令非零
{
valve_rcv_order_backup = valve_rcv_order; //备份控阀命令,防止新的控阀指令将其覆盖
valve_rcv_order = 0;
valve_deal_state = VALVE_DEAL_COMMON;
}
else if(RtccCheckMsgApp(RtccMsg_ValveActive)) //定时活动阀门消息,每月1号23点0分
{
RtccClearMsgApp(RtccMsg_ValveActive);
RtccGetDateTime(&sys_rtcc_time_valve);
if((0x01 == sys_rtcc_time_valve.s.day) &&
(0x23 == sys_rtcc_time_valve.s.hour) &&
(0x00 == sys_rtcc_time_valve.s.minute) &&
(VALVE_AUTO_CHECK_OPEN == Sys_data_object.P1.ies_valve_up_times.valve_auto_check))
{
//当前阀门状态为开启,检测硬件电路
if((VALVE_STATE_OPEN == Sys_data_object.P1.ies_valve_paras.valve_state) ||
(VALVE_STATE_OPEN_EMERGENCY == Sys_data_object.P1.ies_valve_paras.valve_state)) //当前阀门状态为开启
{
valve_deal_state = VALVE_DEAL_ACTIVE_HALF;
}
}
}
}
break;
case (VALVE_DEAL_COMMON): //其他控阀
{
if (ValveIfIdle())
{
if(ValveCheckOrder()) //判断是否需要更新EE状态及控阀操作
{
switch(valve_rcv_order_backup) //存SOE
{
case VALVE_STATE_OPEN:
{
SaveNewSoe(SOE_VALVE_OPEN,SOE_REMARK_NOR);
}
break;
case VALVE_STATE_OPEN_EMERGENCY:
{
SaveNewSoe(SOE_VALVE_OPEN_EMERGENCY,SOE_REMARK_NOR);
}
break;
case VALVE_STATE_CLOSE:
{
SaveNewSoe(SOE_VALVE_CLOSE,SOE_REMARK_NOR);
}
break;
case VALVE_STATE_CLOSE_EMERGENCY:
{
SaveNewSoe(SOE_VALVE_CLOSE_EMERGENCY,SOE_REMARK_NOR);
}
break;
case VALVE_STATE_CLOSE_LOCK:
{
SaveNewSoe(SOE_VALVE_CLOSE_LOCK,SOE_REMARK_NOR);
}
break;
}
}
valve_deal_state = VALVE_DEAL_S0;
}
}
break;
case (VALVE_DEAL_ACTIVE_HALF): //定期活动阀门---半开
{
if (ValveIfIdle())
{
ValveStartTask(VALVE_TO_HALF_OPEN);
valve_deal_state = VALVE_DEAL_ACTIVE_OPEN;
}
}
break;
case (VALVE_DEAL_ACTIVE_OPEN): //定期活动阀门---全开
{
if (ValveIfIdle())
{
ValveStartTask(VALVE_TO_OPEN);
valve_deal_state = VALVE_DEAL_S0;
}
}
break;
default:
{
valve_rcv_order = 0;
valve_rcv_order_backup = 0;
valve_deal_state = VALVE_DEAL_S0;
}
break;
}
}
/*******************************************************************************
* @fun_name: ValveGetUploadStateApp
* @brief : 阀控app 查询是否在关阀上报期间内
* @param[in] : None
* @param[out] :None
* @retval :None
* @other :
******************************************************************************/
u8 ValveGetUploadStateApp(void)
{
if(s_valapp_upload_state == 1)
{
return VALVE_CLOSE_UPLOAD_TIME;
}
return NO_VALVE_CLOSE_UPLOAD_TIME;
}
//启动阀控
void ValveDealAppStart(u8 valve_order)
{
valve_rcv_order = valve_order;
}
//判空闲
u8 ValveDealAppMachineIfIdle(void)
{
if(VALVE_DEAL_S0 == valve_deal_state)
{
return TASK_IDLE;
}
else
{
return TASK_BUSY;
}
}
/*******************************************************************************
* @fun_name: ValveGetStateApp
* @brief : 阀控app state查询
* @param[in] : None
* @param[out] :None
* @retval :None
* @other :
******************************************************************************/
u8 ValveGetStateApp(void)
{
return ValveGetState();
}
#endif
#ifdef __cplusplus
}
#endif
/***************************************************************END OF FILE****/