⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basedi.c

📁 电力系统中的保护装置全部代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////////////
//      程序名: BaseDI.c                                                      
//      开入量处理部分                                             
/////////////////////////////////////////////////////////////////////////////////////
#include    "BaseVariable.h"

VOID      PulseRoutine1(DISTRU *p);
VOID      PulseRoutine2(DISTRU *p);
VOID      PulseRoutine3(DISTRU *p);
VOID      PulseRoutine4(DISTRU *p);
VOID      YXRoutine1(DISTRU *p);
VOID      YXRoutine2(DISTRU *p);
VOID      YXRoutine3(DISTRU *p);
VOID      YXRoutine4(DISTRU *p);
VOID      YXRoutine5(DISTRU *p);
VOID      YXRoutine6(DISTRU *p);
VOID      YXRoutine7(DISTRU *p);
VOID      YXRoutine8(DISTRU *p);
VOID      YXRoutine9(DISTRU *p);
VOID      THRoutine(DISTRU *p);
VOID      BSCHRoutine(DISTRU *p);
VOID      JXRoutine(DISTRU *p);
VOID      TWRoutine(DISTRU *p);
VOID      YKYXRoutine(DISTRU *p);
VOID      STRoutine(DISTRU *p);
VOID      HWRoutine(DISTRU *p);
VOID      FGRoutine(DISTRU *p);
VOID      DIUnused(DISTRU *p);
VOID      YXSub(DISTRU *p);
VOID      DLSub(DISTRU *pDISTRU, UNSIGNED uDPI);
VOID      DI_Handle_Initialize(VOID);
VOID      DI_Handle_Routine(VOID);
extern    UNSIGNED  THWXN_Flag;
UNSIGNED  PulseCounter[PULSENUM];            //电度脉冲计数
UNSIGNED  Revert_Flag;                       //复归标志
UNSIGNED  Switchin_buf;                      //开入位

DISTRU  DIChn[DI_Number] =
{
    {"脉冲开入1","脉冲开入1动作","脉冲开入1返回",        0,   0,  9,   PulseRoutine1},   //脉冲1
    {"脉冲开入2","脉冲开入2动作","脉冲开入2返回",        0,   0,  9,   PulseRoutine2},   //脉冲2
    {"脉冲开入3","脉冲开入3动作","脉冲开入3返回",        0,   0,  9,   PulseRoutine3},   //脉冲3
    {"脉冲开入4","脉冲开入4动作","脉冲开入4返回",        0,   0,  9,   PulseRoutine4},   //脉冲4
    {"遥信1","遥信1动作","遥信1返回",          151,  43, 20,      YXRoutine1},   //开入1:开关1侧刀闸
    {"遥信1","遥信2动作","遥信2返回",          152,  43, 20,      YXRoutine2},   //开入2:开关1侧地刀
    {"遥信3","遥信3动作","遥信3返回",          153,  43, 20,      YXRoutine3},   //开入3:开关2侧刀闸
    {"遥信4","遥信4动作","遥信4返回",          154,  43, 20,      YXRoutine4},     //开入4:开关2驳氐盯
    {"遥信5","遥信5动作","遥信5返回",          155,  43, 20,      YXRoutine5},   //开入5:旁路刀闸
    {"遥信6","遥信6动作","遥信6返回",          164,  41, 20,      YXRoutine6},   //开入6:压力闭锁跳合
    {"遥信7","遥信7动作","遥信7返回",          165,  41, 20,      YXRoutine7},   //开入7:压力闭锁合
    {"遥信8","遥信8动作","遥信8返回",          166,  41, 20,      YXRoutine8},   //开入8:压力闭锁跳
    {"遥信9","遥信9动作","遥信9返回",          167,  41, 20,      YXRoutine9},   //开入9:压力异常
    {"弹簧未蓄能","弹簧未蓄能动作","弹簧未蓄能返回",      168,  41, 20,       THRoutine},   //弹簧未蓄能
    {"闭锁重合闸","闭锁重合闸动作","闭锁重合闸返回",        0,   0, 20,     BSCHRoutine},   //闭锁重合闸
    {"检修状态","检修状态动作","检修状态返回",          0,   0, 20,       JXRoutine},   //检修状态
    {"跳位","跳位动作","跳位返回",            150,  43, 20,       TWRoutine},   //跳位
    {"遥控允许","遥控允许动作","遥控允许返回",        163,  41, 20,     YKYXRoutine},   //遥控允许
    {"手跳","手跳动作","手跳返回",            149,  43, 20,       STRoutine},   //手跳
    {"合位","合位动作","合位返回",            150,  43, 20,       HWRoutine},   //合位
    {"复归","复归动作","复归返回",              0,   0, 20,       FGRoutine},   //复归
    {"未用开入1","备用开入1动作","备用开入1返回",        0,   0, 20,        DIUnused},
    {"未用开入2","备用开入2动作","备用开入2返回",        0,   0, 20,        DIUnused},
    {"未用开入3","备用开入3动作","备用开入3返回",        0,   0, 20,        DIUnused},
    {"未用开入4","备用开入4动作","备用开入4返回",        0,   0, 20,        DIUnused},
    {"未用开入5","备用开入5动作","备用开入5返回",        0,   0, 20,        DIUnused},
    {"未用开入6","备用开入6动作","备用开入6返回",        0,   0, 20,        DIUnused},
    {"未用开入7","备用开入7动作","备用开入7返回",        0,   0, 20,        DIUnused},
    {"未用开入8","备用开入8动作","备用开入8返回",        0,   0, 20,        DIUnused},
    {"未用开入9","备用开入9动作","备用开入9返回",        0,   0, 20,        DIUnused},
    {"未用开入10","备用开入10动作","备用开入10返回",      0,   0, 20,        DIUnused},
    {"未用开入11","备用开入11动作","备用开入11返回",      0,   0, 20,        DIUnused}
};
        
/***********************************************************************************/
/*      开入变化检测                                                               */ 
/***********************************************************************************/
VOID    Swiinput_Handle(UNSIGNED Index)
{
    static   UNSIGNED  Switchin_Flag = 0;

    register UNSIGNED  *p,iThisTime,iLastTime,iTwoTime,iBit,j;
    register DISTRU    *pp = DIChn;

    p = &SoftTime.DI[Index];
    iThisTime = *p ^ Switchin_buf;     //本次变化标志
    iLastTime = Switchin_Flag;         //上次变化标志
    iTwoTime = iThisTime | iLastTime;  //标志或
    if (iTwoTime)
    {
        for (j = 0,iBit = 0x1; j < DI_Number; j++,pp++,iBit <<= 1)
        {
            if (iTwoTime & iBit)
            {
                if (iLastTime & iBit)
                {
                    if (iThisTime & iBit)
                    {
                        if(++pp->counter >= pp->counter_set)
                        {
                            Switchin_buf ^= iBit;
                            Switchin_Flag &= ~iBit;
                            pp->state = (Switchin_buf & iBit) == 0 ? 1 : 0 ;
                            (*(pp->proutine))(pp);
                        }
                    }
                    else
                    if(--pp->counter == 0)Switchin_Flag &= ~iBit;
                }
                else
                {
                    Switchin_Flag |= iBit;
                    pp->counter = 2;
                    pp->time = Index;
                }   
            }
        }
    }
}

/***********************************************************************************/
/*      填遥信报告                                                               */ 
/***********************************************************************************/
REPORT  YxReport;
VOID    YXSub(DISTRU *pDISTRU)
{
    register REPORT    *pREPORT = &YxReport;
    register SOE       *pSOE = &pREPORT->pro_report_soe;
    register CHAR      *pCHAR1,*pCHAR2;
    register UNSIGNED  i;
    
    if(pDISTRU->state)
    {
        pSOE->pSOE_name = pDISTRU->on_name;
        pCHAR1 = pDISTRU->on_name;  
    }
    else
    {
        pSOE->pSOE_name = pDISTRU->off_name;
        pCHAR1 = pDISTRU->off_name; 
    }
    pCHAR2 = pSOE->SOE_name;
    for (i = 0; i < SOE_NAME; i++, *pCHAR2++ = *pCHAR1++);
    
    pSOE->SOE_Inf = pDISTRU->inf;
    if (pDISTRU->asdu == 41)
        pSOE->DPI = pDISTRU->state;
    else
        pSOE->DPI = pDISTRU->state + 1;

    i = SoftTime.HourMinuteSec[pDISTRU->time];
    pSOE->Hour = i >> 24;
    pSOE->Minute = (i >> 16) & 0xff;
    pSOE->Millionsecond = i & 0xffff;

    i = SoftTime.YearMonthDay[pDISTRU->time];
    pSOE->Year = (i >> 16) & 0xff;
    pSOE->Month = (i >> 8) & 0xff;
    pSOE->Day = i & 0xff;

    pREPORT->pro_report_flag = pDISTRU->asdu;
    pREPORT->mmi_flag = MMIPICKUP;  
    
    Fill_Report(&YxReport);  
}

/***********************************************************************************/
/*      填遥信报告                                                               */ 
/***********************************************************************************/
VOID    DLSub(DISTRU *pDISTRU,UNSIGNED uDPI)
{
    register REPORT    *pREPORT = &YxReport;
    register SOE       *pSOE = &pREPORT->pro_report_soe;
    register CHAR      *pCHAR1,*pCHAR2;
    register UNSIGNED  i;
    
    if(pDISTRU->state)
    {
        pSOE->pSOE_name = pDISTRU->on_name;
        pCHAR1 = pDISTRU->on_name;  
    }
    else
    {
        pSOE->pSOE_name = pDISTRU->off_name;
        pCHAR1 = pDISTRU->off_name; 
    }
    pCHAR2 = pSOE->SOE_name;
    for (i = 0; i < SOE_NAME; i++, *pCHAR2++ = *pCHAR1++);
    
    pSOE->SOE_Inf = pDISTRU->inf;
    pSOE->DPI = uDPI + 1;

    i = SoftTime.HourMinuteSec[pDISTRU->time];
    pSOE->Hour = i >> 24;
    pSOE->Minute = (i >> 16) & 0xff;
    pSOE->Millionsecond = i & 0xffff;

    i = SoftTime.YearMonthDay[pDISTRU->time];
    pSOE->Year = (i >> 16) & 0xff;
    pSOE->Month = (i >> 8) & 0xff;
    pSOE->Day = i & 0xff;

    pREPORT->pro_report_flag = 43;  
    pREPORT->mmi_flag = MMIPICKUP;
            
    Fill_Report(&YxReport);  
}


/***********************************************************************************/
/*      电度脉冲开入1                                                               */
/***********************************************************************************/
VOID    PulseRoutine1(DISTRU *pDISTRU)
{
    if (pDISTRU->state) PulseCounter[0]++;        
}

/***********************************************************************************/
/*      电度脉冲开入2                                                               */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -