/************************************************************************* 
* 版权所有：	
* 文件版本： V1.00
* 文件名称： timer.c时间继电器 实现
* 生成日期： 2008年7月20日
* 作    者： 
* 功    能： 
* 更新信息：
*     更新日志1：
*         日期：      
*         修改者：    
*         修改内容：  
*         修改原因：  
*     更新日志2：
**************************************************************************/
#include "head.h"
/**************************************************************************
函数名称：InitTR
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：初始化时间继电器:设置动作和返回定值,清延时计数器,置为未启动状态 
输入参数：TIMERELAY *pTimeRelay时间继电器对象
          DWORD dTripThreshold 时间继电器延时动作时间定值
          DWORD dRetThreshold  时间继电器延时返回时间定值
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void InitTR(TIMERELAY *pTimeRelay,DWORD dTripThreshold,DWORD dRetThreshold)
{
    pTimeRelay->dTripThreshold=dTripThreshold;
    pTimeRelay->dRetThreshold=dRetThreshold;
    pTimeRelay->boolTrip=false;
    pTimeRelay->boolStart=false;
    pTimeRelay->dTimer=0;
    pTimeRelay->dTimerRetTimer=0;
    pTimeRelay->dTRTThreshold=0;
}
/**************************************************************************
函数名称：InitTR_Time
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：初始化时间继电器:设置动作和返回定值
输入参数：TIMERELAY *pTimeRelay时间继电器对象
          DWORD dTripThreshold 时间继电器延时动作时间定值
          DWORD dRetThreshold  时间继电器延时返回时间定值
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void InitTR_Time(TIMERELAY *pTimeRelay,DWORD dTripThreshold,DWORD dRetThreshold)
{
    pTimeRelay->dTripThreshold=dTripThreshold;
    pTimeRelay->dRetThreshold=dRetThreshold;
}
/**************************************************************************
函数名称：InitTR_Time_Flag
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：初始化时间继电器:设置动作和返回定值
输入参数：TIMERELAY *pTimeRelay时间继电器对象
          DWORD dTripThreshold 时间继电器延时动作时间定值
          DWORD dRetThreshold  时间继电器延时返回时间定值
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void InitTR_Time_Flag(TIMERELAY *pTimeRelay)
{
    pTimeRelay->boolTrip  = true;
    pTimeRelay->boolStart = true;
}

/**************************************************************************
函数名称：SetTR_TRTT
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：设置时间继电器延时中返回时间 
输入参数：TIMERELAY *pTimeRelay时间继电器对象
            DWORD dTRTT  返回时间 
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void SetTR_TRTT(TIMERELAY *pTimeRelay,DWORD dTRTT)
{
    pTimeRelay->dTRTThreshold=dTRTT;
}
/**************************************************************************
函数名称：PreSetTime
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：预置时间继电器计数时间并启动本对象
输入参数：TIMERELAY *pTimeRelay时间继电器对象
            DWORD dPreTime  计数时间
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void PreSetTime(TIMERELAY *pTimeRelay,DWORD dPreTime)
{
    pTimeRelay->dTimer = dPreTime;
    pTimeRelay->boolStart = true;
}
/**************************************************************************
函数名称：ResetTR
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：复位时间继电器:清延时计数器,置为未启动状态 
输入参数：TIMERELAY *pTimeRelay时间继电器对象
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void ResetTR(TIMERELAY *pTimeRelay)
{
    pTimeRelay->boolTrip=false;
    pTimeRelay->boolStart=false;
    pTimeRelay->dTimer=0;
    pTimeRelay->dTimerRetTimer=0;
}
/**************************************************************************
函数名称：RunTR
函数版本：1.00 
作者：   
创建日期：2005.4.21     
函数功能说明：运行时间继电器:清延时计数器,置为未启动状态 
输入参数：TIMERELAY *pTimeRelay时间继电器对象
          bool boolInput时间继电器对象输入状态 非0 启动 0返回
          DWORD dTime  两次运行该时间对象的时间间隔时间(采样点数)
其他输入: 
输出参数：
返回值：  
函数扇入清单：
***************************************************************************/
void RunTR(TIMERELAY *pTimeRelay,bool boolInput,DWORD dTime)
{

    if(!pTimeRelay->boolTrip)//时间继电器延时后输出没动作
    {
        if(boolInput)//输入启动状态
        {
            if(pTimeRelay->boolStart)//时间继电器启动
            {
                pTimeRelay->dTimer+=dTime;
            }
            else
            {
                pTimeRelay->boolStart=true;
                pTimeRelay->dTimer = dTime;    
            }
            
            if(pTimeRelay->dTimer >= pTimeRelay->dTripThreshold)//启动延时到
            {
                pTimeRelay->boolTrip=true;//动作输出
                pTimeRelay->dTimer=0;
            }
            pTimeRelay->dTimerRetTimer=0;//返回延时计数
        }
        else//输入返回状态
        {
            pTimeRelay->dTimerRetTimer+=dTime;
            if(pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)//启动返回延时到
            {
                pTimeRelay->dTimer=0;//启动延时计数
                pTimeRelay->boolStart=false;//清启动
            }
        }
        
    }
    else//时间继电器延时后输出动作
    {
        if(!boolInput)
        {
            if(pTimeRelay->boolStart)
            {
                pTimeRelay->dTimer+=dTime;
            }
            else
            {
                pTimeRelay->boolStart=true;
            }
            if(pTimeRelay->dTimer >= pTimeRelay->dRetThreshold)//动作返回延时到
            {
                pTimeRelay->boolTrip=false;
                pTimeRelay->dTimer=0;
            }
            pTimeRelay->dTimerRetTimer=0;
        }
        else
        {
            pTimeRelay->dTimerRetTimer+=dTime;
            if(pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)
            {
                pTimeRelay->dTimer=0;
                pTimeRelay->boolStart=false;
            }
        }
    }
}

void RunTR2(TIMERELAY *pTimeRelay,bool boolInput,DWORD dTime)
{

    if(!pTimeRelay->boolTrip)//时间继电器延时后输出没动作
    {
        if(boolInput)//输入启动状态
        {
            if(pTimeRelay->boolStart)//时间继电器启动
            {
                pTimeRelay->dTimer+=dTime;
            }
            else
            {
                pTimeRelay->boolStart=true;
                pTimeRelay->dTimer = dTime;    
            }
            
            if(pTimeRelay->dTimer >= pTimeRelay->dTripThreshold)//启动延时到
            {
                pTimeRelay->boolTrip=true;//动作输出
                pTimeRelay->dTimer=0;
            }
            pTimeRelay->dTimerRetTimer=0;//返回延时计数
        }
        
        else//输入返回状态
        {
            pTimeRelay->dTimerRetTimer+=dTime;
			pTimeRelay->dTimer+=dTime;//
            if(pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)//启动返回延时到
            {
                pTimeRelay->dTimer=0;//启动延时计数
                pTimeRelay->boolStart=false;//清启动
            }
        }
        
    }
    else//时间继电器延时后输出动作
    {
        if(!boolInput)
        {
            if(pTimeRelay->boolStart)
            {
                pTimeRelay->dTimer+=dTime;
            }
            else
            {
                pTimeRelay->boolStart=true;
            }
            if(pTimeRelay->dTimer >= pTimeRelay->dRetThreshold)//动作返回延时到
            {
                pTimeRelay->boolTrip=false;
                pTimeRelay->dTimer=0;
            }
            pTimeRelay->dTimerRetTimer=0;
        }
        
        else
        {
            pTimeRelay->dTimerRetTimer+=dTime;
			pTimeRelay->dTimer+=dTime;//
            if(pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)
            {
                pTimeRelay->dTimer=0;
                pTimeRelay->boolStart=false;
            }
        }
        
    }
}

//时间修正，大于50ms&&小于2s -> 为了满足保护动作时间需要减去10ms
void CorrectTR(TIMERELAY *pTimeRelay)
{
	if(pTimeRelay->dTripThreshold>T_10ms*4 && pTimeRelay->dTripThreshold<T_1s*2)
		pTimeRelay->dTripThreshold-=T_10ms;
}

///////////////////////file end//////////////////////////////////////////////////////////////////////////////
//#endif //  __TIMER_C
