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

📄 base.c

📁 电力系统中的保护装置全部代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
        pCHAR1 = "退出";
    }

    for (; i < JUMPER_NAME; i++)
    {
        if (*pCHAR1 != '\0')
            *pCHAR2++ = *pCHAR1++;
        else
            break;
    }
    
    for (; i < JUMPER_NAME; i++)
    {
        *pCHAR2++ = '\0';
    }
    
    pSOE->SOE_Inf = ptr->jum_inf;                         //103规约的INF号
    pSOE->DPI = ptr->jum_status + 1;                      //103规约的DPI状态

    READ_DEC_TIME(&pSOE->Year);                           //压板改变时的时间
    
    pJumperReport->pro_report_data_number = 0;            //无模拟量报告数据
    pJumperReport->pro_report_flag = 1;                   //报告标志
    pJumperReport->mmi_flag = 0;                          //不显示
    
    Fill_Report(&JumperReport);                           //填入报告区

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

/**********************************************************/
/*     public code for output                             */  
/*         使用范围:多个任务用                            */
/**********************************************************/
void    Start_up(void)          /*start up 24V */
{
   Qdj();
} 
void    Signal(void)             /*alarm operation*/
{
   Qdj();
   Gxj();
}
/**********************************************************/
/*      public code for protect logic                     */    
/*      使用范围:保护任务用                               */
/**********************************************************/ 
void ClearFlag(PROTECT *ptr)
{
    ptr->pro_startup_flag = 0;
    ptr->pro_pickup_flag = 0;
    ptr->pro_reserve4 = TMD_System_Clock;//delaytime1
}   
/**********************************************************/ 
void NoPlunge(PROTECT *ptr)
{
    ClearFlag(ptr);
}   
/**********************************************************/ 
void NoStartup(PROTECT *ptr)  
{
    if(ptr->pro_reserve1 > 0)     //flag1
        ptr->pro_reserve1 = 0;
    if(ptr->pro_reserve1 >= -1)
    {
        ptr->pro_reserve1--;
        return;
    }   

    ClearFlag(ptr);
}  
/**********************************************************/ 
UNSIGNED EraseBurr(PROTECT *ptr)
{
    if(ptr->pro_reserve1 < 0)
        ptr->pro_reserve1 = 0;

    if(ptr->pro_reserve1 <= 0)
    {
        ptr->pro_reserve1 ++;
        return(1);
    }

    return(0);
}   
/**********************************************************/
UNSIGNED StartPro(PROTECT *ptr)
{
    if(!ptr->pro_startup_flag)
    {
        ptr->pro_startup_flag = 1;
        return(0);
    }
    return(0);  
}
/**********************************************************/ 
UNSIGNED TimeWait(PROTECT *ptr,float Time_Fix_Value)
{
    if(!DOChn[BSJ].state)return(1);
    if(DOChn[TZJ].state)
    {
        ptr->pro_reserve4 = TMD_System_Clock;
        return(1);  
    }
    if(ptr->pro_pickup_flag)return(1);
    if(TMD_System_Clock - ptr->pro_reserve4 < (UNSIGNED)(Time_Fix_Value * 1000))  
    return(1);
    
    return(0);  
} 

/***********************************************************************************/
/*  函数名: SaveToEEP(VOID)                                                        */ 
/*  功能: 存储遥信报告,事件报告,自检报告,故障录波                                  */ 
/*      使用范围:自检任务用                                                        */
/***********************************************************************************/
VOID    StartSaveToEEP(VOID)
{
    UNSIGNED i;
    static   UNSIGNED    PulseSaveTime;

    if (TMD_System_Clock - PulseSaveTime > 10000)   //保存脉冲计数
    {
        PulseSaveTime = TMD_System_Clock;

        i = SAVE_PULSE;
        NU_Send_To_Queue(&SaveQueue,&i,1,NU_SUSPEND);
    }
    
}

/***********************************************************************************/
/*    函数名: VOID WriteEEP(UNSIGNED* pSource, UNSIGNED* pDest, Length)            */ 
/*    功能: 以DMA方式将RAM内容移到EEPROM中                                         */ 
/*    说明: 如果按页写EEPROM,就必须用DMA方式,因为写入时,相邻字节时间间隔必须小于200*/
/*      us                                                                         */
/*      使用范围:自检任务用                                                        */
/***********************************************************************************/
VOID    WriteEEP(UNSIGNED *pSource, UNSIGNED *pDest, UNSIGNED Length)
{
    static   REPORT    EEPErrorReport;

    register UNSIGNED  *pEEP, *pRAM, i, *j, k, error_flag;
    register REPORT    *pRPT;
    register SOE       *pSOE;

    if (EEP_ErrorFlag) return;

    while (Length)
    {
        j = (UNSIGNED *)((UNSIGNED)pDest & ~(EEPPAGELENGTH - 1));  //计算EEP页地址

        pEEP = j;
        pRAM = EEPPage;                                            //将EEPROM一页拷贝到RAM中
        for (i = 0; i < EEPPAGELENGTH; i++)
            *pRAM++ = *pEEP++;

        i = (UNSIGNED)pDest & (EEPPAGELENGTH - 1);                 //目的地址相对于页的偏移值
        pRAM = EEPPage + i;                                        //RAM的偏移地址
        for (; i < EEPPAGELENGTH && Length != 0; i++)
        {
            *pRAM++ = *pSource++;
            Length--;
            pDest++;
        }
     
        k = 0;
        do
        {
            k++;
            error_flag = 0;
            
            NU_Suspend_Task(&Task_2_CB);
            NU_Suspend_Task(&Task_3_CB);
            NU_Suspend_Task(&Task_4_CB);
            DMAWriteEEP(j);     
            NU_Sleep(8);
            NU_Resume_Task(&Task_2_CB);
            NU_Resume_Task(&Task_3_CB);
            NU_Resume_Task(&Task_4_CB);
            
            NU_Sleep(6);
            
            pEEP = j;
            pRAM = EEPPage;
            for (i = 0; i < EEPPAGELENGTH; i++)
            {
                if ((*pRAM++ & 0xff) == (*pEEP++ & 0xff))
                    continue;
                else
                {
                    error_flag = 1;
                    break;
                }
            }   
        
        }while (error_flag && k < 3);

        if (error_flag)
        {
            EEP_ErrorFlag = 1;
            pRPT = &EEPErrorReport;
            pSOE = &pRPT->pro_report_soe;
            pSOE->pSOE_name = pSOE->SOE_name;
            strcpy(pSOE->SOE_name,"EEPROM故障");
            pSOE->SOE_Inf = 196;
            pSOE->DPI = 1;
            READ_DEC_TIME(&pSOE->Year);         
            pRPT->pro_report_data_number = 0;
            pRPT->pro_report_flag = 1;
            pRPT->mmi_flag = MMIDISPLAY + MMIPICKUP;    
            Fill_Report(pRPT);  
            break;
        }
    }
    
}

/***********************************************************************************/
/*    函数名: VOID DMAWriteEEP(UNSIGNED*)                                          */ 
/*    功能: 启动DMA,将RAM内容移到EEPROM中                                          */ 
/*    说明: 先打开软件写保护,再启动DMA传送                                         */
/***********************************************************************************/
UNSIGNED uWriteEEP;
UNSIGNED *pWriteEEP,*pEEPPage = EEPPage;
VOID    DMAWriteEEP(UNSIGNED *p)
{
/*
    *(UNSIGNED *)0x808010 = 0x1450;                //DMA1 global control register
    *(UNSIGNED *)0x808014 = (UNSIGNED)EEPPage;     //DMA1 source address register
    *(UNSIGNED *)0x808016 = (UNSIGNED)p;           //DMA1 destination address register
    *(UNSIGNED *)0x808018 = EEPPAGELENGTH;         //DMA1 transfer length register
     
    IE = 0x10100;                                  //只允许发采样脉冲中断,因为该中断不会超过200us
    *(UNSIGNED *)0x205555 = 0xaa;                  //打开EEP软件写保护
    *(UNSIGNED *)0x202aaa = 0x55;
    *(UNSIGNED *)0x205555 = 0xa0;
    *(UNSIGNED *)0x808010 |= 0x3;                  //DMA1 global control register,开始DMA1传送
    IE = NU_ENABLE_USE_INTERRUPTS;                 //开放所有中断  
*/
    uWriteEEP = 1;
    pWriteEEP = p;
}

/***********************************************************************************/
/*    函数名: VOID SaveToEEP(UNSIGNED SaveType)                                    */ 
/*    功能: 启动DMA,将RAM内容移到EEPROM中                                          */ 
/*    说明: 先打开软件写保护,再启动DMA传送                                         */
/***********************************************************************************/
extern Clock DS1302Time;
VOID SaveToEEP(UNSIGNED SaveType)
{
    UNSIGNED PulseData[4*PULSENUM];
    float    fvar;
    register UNSIGNED    *p,*p1,i,j,k,l;
    register PROTECT     *protect;
    register SETTING     *pSets;
    register REPORT      *pRPT;
    register EEP_REPORT  *pEEP_RPT;
    register SOE         *pSOE;
    register VALUE       *pVAL;
    register EEP_VALUE   *pEEPV;
    register PRO_CHANNEL *pChl;
    register Clock       *pDS;
    
    switch(SaveType)
    {
        case SAVE_PULSE:                                                   //存电度脉冲
        {
            p = PulseData;
            p1 = PulseCounter;
            for (i = 0; i < PULSENUM; i++)
            {
                j = *p1++;
                *p++ = j;

⌨️ 快捷键说明

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