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

📄 basedo.c

📁 电力系统中的保护装置全部代码
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////////////
//      程序名: BaseDO.c                                                      
//      开出量处理部分                                             
/////////////////////////////////////////////////////////////////////////////////////
#include    "BaseVariable.h"

UNSIGNED    Switchout_buf = 0x3fff; //继电器开出缓存
UNSIGNED    CtrlOutBuf = 0x7;       //控制输出缓存: d0_运行灯, d1_485OE, d2_清看门狗, d3_液晶背光

DOSTRU  DOChn[DO_Number];           //开出

VOID    Switch_Output_on(UNSIGNED chn);
VOID    Switch_Output_off(UNSIGNED chn);
VOID    Ctrl_Output_on(UNSIGNED chn);
VOID    Ctrl_Output_off(UNSIGNED chn);
VOID    DO_Logic(VOID);

/***********************************************************************************/
/*      控制动作                                                                   */ 
/***********************************************************************************/
VOID Ctrl_Output_on(UNSIGNED chn)
{
    register UNSIGNED *p = &CtrlOutBuf;
    register OPTION   old_preempt;

    old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动

    *p &= ~(1 << chn);
    *pCTRLPORT = *p;

    NU_Change_Preemption(old_preempt);                    //可以切换任务
}

/***********************************************************************************/
/*      控制返回                                                                   */ 
/***********************************************************************************/
VOID Ctrl_Output_off(UNSIGNED chn)
{
    register UNSIGNED *p = &CtrlOutBuf;
    register OPTION   old_preempt;

    old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动

    *p |= (1 << chn);
    *pCTRLPORT = *p;

    NU_Change_Preemption(old_preempt);                    //可以切换任务
}

/***********************************************************************************/
/*      控制取反                                                                   */ 
/***********************************************************************************/
VOID Ctrl_Output_reverse(UNSIGNED chn)
{
    register UNSIGNED *p = &CtrlOutBuf;
    register OPTION   old_preempt;

    old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动
    
    *p ^= (1 << chn);
    *pCTRLPORT = *p;
    
    NU_Change_Preemption(old_preempt);                    //可以切换任务
}

/***********************************************************************************/
/*      开出动作                                                                   */ 
/***********************************************************************************/
VOID Switch_Output_on(UNSIGNED chn)
{
    register DOSTRU   *p = &DOChn[chn];
    register UNSIGNED *pbuf = &Switchout_buf;
    register OPTION   old_preempt;

    old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动

    *pbuf &= ~(1 << chn);
    *pDOPORT = *pbuf;
     
    p->clock = TMD_System_Clock;
    p->state = 0x1;

    NU_Change_Preemption(old_preempt);                    //可以切换任务
}

/***********************************************************************************/
/*      开出返回                                                                   */ 
/***********************************************************************************/
VOID Switch_Output_off(UNSIGNED chn)
{
    register DOSTRU   *p = &DOChn[chn];
    register UNSIGNED *pbuf = &Switchout_buf;
    register OPTION   old_preempt;

    old_preempt = NU_Change_Preemption(NU_NO_PREEMPT);    //不再切换任务,避免被其他任务打断,造成误动

    *pbuf |= 1 << chn;
    *pDOPORT = *pbuf;
     
    p->state = 0x0;

    NU_Change_Preemption(old_preempt);                    //可以切换任务
}


/***********************************************************************************/
/*      继电器返回和标志返回                                                       */ 
/***********************************************************************************/
VOID DO_Logic()
{          
    register PROTECT   *protect;
    register DOSTRU    *p;
    register CHECK     *check;
    register UNSIGNED  i, j, k;

    *pDOPORT = Switchout_buf;

    protect = PRO_Created_Protect_List;                   //保护列表指针
    for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
    {
        if (protect->pro_startup_flag && protect->pro_trip)
        {
            k = 1;
            break;
        }
    }

    p = &DOChn[QDJ];
    if(p->state)
    {
        if (!k && (TMD_System_Clock - p->clock >= 1000) && (Switchout_buf & 0x1ffe) == 0x1ffe)   //启动继电器的返回
            QdjBack();
    }
    else
    {
        if(k) Qdj();
    }
    
   
    protect = PRO_Created_Protect_List;                   //保护列表指针
    for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
    {
        if (protect->pro_pickup_flag && protect->pro_trip)
        {
            k = 1;
            break;
        }
    }   
    p = &DOChn[TZJ];
    if (p->state)
    {
            if(!k && TMD_System_Clock - p->clock >= 200)  //跳闸继电器的返回
            TzjBack();        
    }
    else
    {
        if(k) Tzj();
    }
    
    p = &DOChn[HZJ];
    if (p->state && TMD_System_Clock - p->clock >= 200)   //重合闸继电器的返回
        HzjBack();              
   
    p = &DOChn[YTJ];
    if (p->state && TMD_System_Clock - p->clock >= 200)   //遥跳继电器的返回
        YtjBack();        
   
    p = &DOChn[YHJ];
    if (p->state && TMD_System_Clock - p->clock >= 200)   //遥合继电器的返回
        YhjBack();              
   
    p = &DOChn[GXJ];
    if (p->state && TMD_System_Clock - p->clock >= 200)   //报警信号继电器的返回
        GxjBack();              
  
    p = &DOChn[FGJ];
    if (p->state && TMD_System_Clock - p->clock >= 200)   //复归继电器的返回
    {
        FgjBack();
       
        check = CHK_Created_Check_List;                   //以下判断是否需要继续发报警信号           
        for (j = 0; j < CHK_Total_Check; j++, check = check->chk_link_next)  //判断是否有告警未返回
        {
            if (check->pickup_flag)
            {
                Qdj();                           //如果告警未返回,再次发告警信号
                Gxj();              
                break;
            }
        }
        
        protect = PRO_Created_Protect_List;      //保护列表指针
        for (j = 0, k = 0; j < PRO_Total_Protect; j++, protect = protect->pro_link_next)
        {
            if (protect->pro_pickup_flag && !protect->pro_trip)
            {
                Qdj();
                Gxj();
                break;
            }
        }
    }
}

⌨️ 快捷键说明

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