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

📄 secapp.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
        ComApp[i]->AppCommand=APP_APPCON;
    }
}
//OK
void S101ProcClock(INT8U Port, BOOL Conf) //处理对钟
{
    struct IEC101Time_t Time;
    struct AbsTime_t AbsTime;
    INT8U i;

    i=Port-1;
    GetTime((void*)(&ComApp[i]->OldSysTime),ABSTIME);//记录对钟前的系统时间

    if (ComApp[i]->Sec101Pad.PBase.CmdControl&SETSECTIME)
    {
        Time.MSecond = MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);
        Time.Minute  = ComApp[i]->pRxData[2]&0x3f;
        Time.Hour    = ComApp[i]->pRxData[3]&0x1f;
        Time.Day     = ComApp[i]->pRxData[4]&0x1f;
        Time.Month   = ComApp[i]->pRxData[5]&0x0f;
        Time.Year    = ComApp[i]->pRxData[6]&0x7f;
        
        if (Conf) //非广播对钟,要加延迟时间
        {
            if (ComApp[i]->Sec101Pad.Control&USESTANDARDCLOCKFORMAT)
            	TimeChange((void*)&AbsTime, ABSTIME, (void*)&Time, IEC101TIME);
            else
                TimeChange((void*)&AbsTime, ABSTIME, (void*)&Time, IEC101EXTTIME);

            if(((long)AbsTime.Msecond+ComApp[i]->TimeDelay)<60000)
                AbsTime.Msecond+=ComApp[i]->TimeDelay;
            else
            {
                AbsTime.Msecond=(long)AbsTime.Msecond+ComApp[i]->TimeDelay-60000;
                AbsTime.Minute++;
            }
            SetTime((void*)&AbsTime, ABSTIME);
            
        }
        else//广播对钟
        {
            if (ComApp[i]->Sec101Pad.Control&USESTANDARDCLOCKFORMAT)
                SetTime((void*)&Time,IEC101TIME);
            else
                SetTime((void*)&Time,IEC101EXTTIME);
        }
    }
    if (Conf)
    {
        ComApp[i]->Data1.Flag|=CallClock;//为了设置一级数据标志
        ComApp[i]->LengthOut=0;
        ComApp[i]->AppCommand=APP_APPCON;
        ComApp[i]->AppCommand|=APP_HAVEDATA1;
    }
}

void S101ProcReset(INT8U Port)
{
    INT8U i;
    
    i=Port-1;
    ComApp[i]->Data1.Flag|=CallReset;
    ComApp[i]->ResetPubAddr=ComApp[i]->RxPubAddr;
    ComApp[i]->ResetInfoAddr=ComApp[i]->RxInfoAddr;
    ComApp[i]->ResetGRP=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];

    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_APPCON;
    ComApp[i]->AppCommand|=APP_HAVEDATA1;
}

void S101ProcTest(INT8U Port)
{
    INT8U i;
    
    i=Port-1;
    ComApp[i]->Data1.Flag|=CallTest;
    ComApp[i]->TestPubAddr=ComApp[i]->RxPubAddr;
    ComApp[i]->TestInfoAddr=ComApp[i]->RxInfoAddr;

    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_APPCON;
    ComApp[i]->AppCommand|=APP_HAVEDATA1;
}


//OK
void EnCodeInitEnd(INT8U Port)
{
    INT32U Addr;
    INT8U i,jj;
    i=Port-1;
    
    ComApp[i]->TxMsg[0]=M_EI_NA;
    //pTxVSQ->Num=1;
    //pTxVSQ->SQ=0;
    *(ComApp[i]->pTxVSQ) = 1;
    (*(ComApp[i]->pTxVSQ)) &= ~VSQ_SQ;

    ComApp[i]->TxMsg[ComApp[i]->CotLocation]=INIT_101;
    Addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
    for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
        ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj);     //???wjr

    *(ComApp[i]->pTxInfoAddr)=0;
    *(ComApp[i]->pTxInfoAddr+1)=0;

    //初始化原因
    *(ComApp[i]->pTxData)=0;

    ComApp[i]->AppCommand=APP_SENDDATA;
    ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
    if(ComApp[i]->BalanMode)
        ComApp[i]->AppCommand=APP_SENDCON;
}


void SetUMsgFlag(INT8U Port)
{
    INT8U i;
    i = Port - 1;
    ComApp[i]->Data1.Flag|=HaveYK;
}

//OK
void ProcTaskMsg(INT8U Port)//处理遥控返校信息
{
    INT8U	i, err;
    void	*msg;
    
    i=Port-1;
    
    msg = OSQPend(ComDb[i]->CommQ, 0, &err);
    if (err == OS_NO_ERR)
    {
	EnCodeCtrlRet(Port, (struct DBBOOPInfo*)msg);
    }
    
}
//OK
BOOL EnCodeCtrlRet(INT8U Port, struct DBBOOPInfo* Info)  //遥控返校
{
	INT8U  i, jj;
	INT8U sco=0;
	INT8U dco=0;
	INT32U Addr;
    
	i=Port-1;
    	if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT))  //遥控不允许
    	{
        	ComApp[i]->LengthOut=0;
        	ComApp[i]->AppCommand=APP_NODATA;
           	return(FALSE);
    	}
    	
            ComApp[i]->TxMsg[0]=C_DC_NA;
            switch(ComApp[i]->YKTypeID)
            {
                case C_SC_NA:
                    ComApp[i]->TxMsg[0]=C_SC_NA;
                    break;
                case C_DC_NA:
                    ComApp[i]->TxMsg[0]=C_DC_NA;
                    break;
                case C_RC_NA:
                    ComApp[i]->TxMsg[0]=C_RC_NA;
                    break;
            }

            *(ComApp[i]->pTxVSQ) = 1;

            if (Info->Flag & BOOPSELECT)
            {
                if (Info->Status & BODEL)            //遥控撤消
                {
                    ComApp[i]->TxMsg[ComApp[i]->CotLocation]=DEACTCON;
                    ComApp[i]->YKStatus=YKTERM;
                }
                else
                {
                    ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTCON;
                }

                if(ComApp[i]->YKTypeID==C_SC_NA)
                    //pSCO->SE=1;  //select
                    sco |= SCO_SE;
                else
                    //pDCO->SE=1;  //select
                    dco |= DCO_SE;
            }
            else
            {
                ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTCON;
                if(ComApp[i]->YKTypeID==C_SC_NA)
                    sco &= ~SCO_SE;
                else
                    dco &= ~DCO_SE;
                ComApp[i]->YKStatus=YKTERM;
            }

            if(Info->Flag & BOOPERROR)//错误
                ComApp[i]->TxMsg[ComApp[i]->CotLocation]|=0x40;
            else
                ComApp[i]->TxMsg[ComApp[i]->CotLocation]&=(~0x40);

                Addr=S101GetAddrByDevIndex(Port, ComApp[i]->BODevIndex);
    		for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
        		ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj);
            *(ComApp[i]->pTxInfoAddr)=LOBYTE((Info->SID+LBO-1));
            *(ComApp[i]->pTxInfoAddr+1)=HIBYTE((Info->SID+LBO-1));

            if(ComApp[i]->YKTypeID==C_SC_NA)
            {
                if (Info->Status & BOCLOSE)  //he
                    sco |=1;
                else   //fen
                    sco &=0xfe;

                ComApp[i]->ScoTemp = sco;
                *(ComApp[i]->pTxData) = sco;
            }
            else
            {
                if (Info->Status & BOCLOSE)  //he
                    dco |= 2;
                else   //fen
                    dco |= 1;
                
                ComApp[i]->DcoTemp = dco;
                *(ComApp[i]->pTxData) = dco;
            }

            ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
            ComApp[i]->AppCommand=APP_SENDDATA;
            if(ComApp[i]->YKStatus==YKTERM)
            {
                ComApp[i]->AppCommand|=APP_HAVEDATA1;
                (ComApp[i]->Data1.Flag)|=HaveYK;
            }

            if(ComApp[i]->BalanMode)
                ComApp[i]->AppCommand=APP_SENDCON;

            return(TRUE);

}
//OK
void EditYKTerm(INT8U Port)//遥控结束
{
    INT8U i;
    INT16U jj;
    INT32U Addr;
    i=Port-1;
    ComApp[i]->TxMsg[0]=C_DC_NA;
    switch(ComApp[i]->YKTypeID)
    {
        case C_SC_NA:
            ComApp[i]->TxMsg[0]=C_SC_NA;
            *(ComApp[i]->pTxData) = ComApp[i]->ScoTemp;
            break;
        case C_DC_NA:
            ComApp[i]->TxMsg[0]=C_DC_NA;
            *(ComApp[i]->pTxData) = ComApp[i]->DcoTemp;
            break;
        case C_RC_NA:
            ComApp[i]->TxMsg[0]=C_RC_NA;
            *(ComApp[i]->pTxData) = ComApp[i]->DcoTemp;
            break;
    }

    (*(ComApp[i]->pTxVSQ)) = 1;

    ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTTERM;
    Addr=S101GetAddrByDevIndex(Port, ComApp[i]->BODevIndex);
    for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
        ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj);
    *(ComApp[i]->pTxInfoAddr)=LOBYTE(ComApp[i]->YKIDTemp);
    *(ComApp[i]->pTxInfoAddr+1)=HIBYTE(ComApp[i]->YKIDTemp);  //???wjr

   	ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
   	ComApp[i]->AppCommand=APP_SENDDATA;
   	if(ComApp[i]->BalanMode)
   	   	ComApp[i]->AppCommand=APP_SENDCON;
}

//OK
BOOL S101GetActDevIndexByAddr(INT8U Port, INT16U Addr)
{
    	INT8U	i, j;
	INT16U	dev;
	
	i = Port - 1;
	
	if (Addr == ComApp[i]->BroadCastAddr)
	{
		ComApp[i]->ActDevIndex = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
		return (TRUE);
	}
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
		if (Addr == DBCfgs[dev].Address)
		{
			ComApp[i]->ActDevIndex = dev;
			return (TRUE);
		}
	}
	
	return (FALSE);
}

//OK
void EnCodeBIENT(INT8U Port)  //编辑COS  将来这里要区分单点双点yx
{
    	BOOL	rc;
	INT8U	i, j, Len, jj;
	struct DBInfo info;
	INT16U addr;
		
	i = Port - 1;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.Type = COSDATA;
	info.Start = STARTTYPE;
	info.Num = 0x20;	//dingding?
	
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		info.DevID = ComApp[i]->ActDevIndex;
		rc = DBRead(ComApp[i]->Tmpbuf, &info);
		if ((!rc) || (info.Num == 0))
		{
			rc = S101GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
			if (rc)
				continue;
			else
				break;
		}
				
		ComApp[i]->TxMsg[0]=M_SP_NA;//1,不带时标的单点信息
	        *(ComApp[i]->pTxVSQ) &= ~VSQ_SQ;
	
	        if(ComApp[i]->BalanMode==TRUE)//zzw
	            ComApp[i]->TxMsg[ComApp[i]->CotLocation]=SPONT;
	        else
	            ComApp[i]->TxMsg[ComApp[i]->CotLocation]=REQ;
	        addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	        for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
	            ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=addr>>(8*jj);
	        
		Len=SetMsg(Port,ComApp[i]->Tmpbuf,info.Num);
		
		ComApp[i]->LastFrame=BI;
	        ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
		ComApp[i]->LastDevType = COSDATA;
		ComApp[i]->LastDevNum = info.Num;
	        ComApp[i]->BIFrame|=BIENTFRAME;
	        ComApp[i]->LengthOut=Len;
	        if(ComApp[i]->BalanMode)
	        	ComApp[i]->AppCommand=APP_SENDCON;
	        else
	        	ComApp[i]->AppCommand=APP_SENDDATA;
	        if(info.Num<0x20)      //读完数据
	        	ComApp[i]->Data1.Flag &= (~HaveCOS);
	      // sprintf(errbuf, "发出COS %d", info.Num);
		//ErrorInfo(OSPrioCur, errbuf);
	        return;
	}
        ComApp[i]->Data1.Flag&=(~HaveCOS);
	ComApp[i]->AppCommand = APP_NODATA;	
}

//OK
void S101EnCodeSOE(INT8U Port) //编辑SOE //暂时不考虑双点遥信
{
	INT8U Len,jj;
	INT16U i,j;
	BOOL rc;
	struct DBInfo info;
	INT32U addr;
	   
	i = Port - 1;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.Type = SOEDATA;
	info.Start = STARTTYPE;
	info.Num = 0x10;	//dingding?
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		info.DevID = ComApp[i]->ActDevIndex;
	
		rc = DBRead(ComApp[i]->Tmpbuf, &info);
		if ((!rc) || (info.Num == 0))
		{
			rc = S101GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
			if (rc)
				continue;
			else
				break;
		}
		
		ComApp[i]->TxMsg[0]=M_SP_TA;   //带时标的单点信息
	        if(ComApp[i]->Sec101Pad.Control&USECP56TIME2A)
	            ComApp[i]->TxMsg[0]=M_SP_TB;   //带长时标的单点信息
	        addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	        for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
	            ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=addr>>(8*jj);
	        *(ComApp[i]->pTxVSQ) &= ~VSQ_SQ;
	        if(ComApp[i]->BalanMode==TRUE)//zzw
	            ComApp[i]->TxMsg[ComApp[i]->CotLocation]=SPONT;
	        else
	            ComApp[i]->TxMsg[ComApp[i]->CotLocation]=REQ;
	            
	        Len=SetMsg(Port,ComApp[i]->Tmpbuf,info.Num);

⌨️ 快捷键说明

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