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

📄 secapp.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
        else
        {
            S101ProcAllData(Port);
        }

        if(ComApp[i]->Data1.Flag!=0)//
            ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }
    
    if(ComApp[i]->Data1.Flag&FreezeDD)//冻结电度
    {
        ComApp[i]->Data1.Flag&=(~FreezeDD);
        if(ComApp[i]->EditDDCon==0xFF)
        {
            ComApp[i]->EditDDCon=0;
            EnCodeCounterConf(Port);
        }
        if(ComApp[i]->Data1.Flag!=0)//
        	ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }
    
    if(ComApp[i]->Data1.Flag&CallDD)//传送电度
    {
        if(ComApp[i]->EditDDCon==0xFF)
        {
            ComApp[i]->EditDDCon=0;
            EnCodeCounterConf(Port);
        }
        else
        {
            ProcCounter(Port);
        }
        if(ComApp[i]->Data1.Flag!=0)//
            ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }
    
    if(ComApp[i]->Data1.Flag&HaveNVA)//变化遥测,如果数据变化频繁会影响其他数据传输,所以放在后面。
    {
        S101EnCodeNVA(Port);
        //ComApp[i]->Data1.Flag &= (~HaveNVA);
        if(ComApp[i]->Data1.Flag!=0)//
                ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }
    
    //无一级数据
    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_NODATA;
}

//二级数据处理:包括背景数据、循环周期数据
void S101ProcData2(INT8U Port)
{
    INT8U i;
    i=Port-1;
           
    if(ComApp[i]->Data2Flag&ProtectData)//保护定值数据
    {
        ComApp[i]->Data2Flag&=(~ProtectData);
        SendProtectData(Port);
        if(ComApp[i]->Data1.Flag!=0)//
            ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }
   
    if(ComApp[i]->Data2Flag&BackData)//该标志在定时器中设置,发送完数据后清掉
    {
        S101ProcAllData(Port);
        if(ComApp[i]->Data1.Flag!=0)
            ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
        
    }

    if(ComApp[i]->Data2Flag&UpLoadFile)//文件操作,按照标准要求应比周期数据级别还低。
    {
        //处理函数
        switch(ComApp[i]->FileStep)
        {
            case CallDir:
                SendDir(Port);
                break;
            case SelectFile:
                FileReady(Port);
                break;
            case CallFile:
                SectionReady(Port);
                break;
            case CallSection:
                SendSegments(Port);
                break;
            case LastSegment:
                SendLastSegment(Port);
                break;
            case LastSection:
                SendLastSection(Port);
                break;
            default:
                ComApp[i]->Data2Flag&=(~UpLoadFile);
                ComApp[i]->FileStep=FileOver;
                ComApp[i]->LengthOut=0;
                ComApp[i]->AppCommand=APP_NODATA;
                break;
        }
        if(ComApp[i]->Data1.Flag!=0)//
            ComApp[i]->AppCommand|=APP_HAVEDATA1;
        return;
    }


    //召唤二级数据时,无二级数据可能以一级数据应答。都没有以无数据应答。
    S101ProcData1(Port);
}

//OK
void S101ProcControl(INT8U Port)  //处理遥控,遥控不允许或公共体地址错,不发消息。
{
    	INT8U	i, dco, sco;
    	struct BOCode code;
    	struct DBInfo info;
	unsigned short InfoAddr;
    
        i = Port - 1;
        ComApp[i]->YKTypeID=ComApp[i]->RxTypeID;
        InfoAddr=ComApp[i]->RxInfoAddr;
        ComApp[i]->YKIDTemp=InfoAddr;
	
	memset (&code, 0, sizeof (struct BOCode));
	
	switch (ComApp[i]->RxTypeID)
	{
		case C_SC_NA:	//单点遥控命令
			 ComApp[i]->ScoTemp = *(ComApp[i]->pRxData);
			 sco = *(ComApp[i]->pRxData);
		         if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT))//参数设置为不允许遥控
		         {
			         ComApp[i]->HaveWrongData=TRUE;
		                 ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
		                 ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNTYPEID;
		                 ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
		                 memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
		
		                 ComApp[i]->LengthOut=0;
		                 ComApp[i]->AppCommand=APP_APPCON;
		                 ComApp[i]->AppCommand|=APP_HAVEDATA1;
		                 return;
		          }
		          if (S101GetActDevIndexByAddr(Port,ComApp[i]->RxPubAddr))//根据公共体地址查设备序号。
		          {
		                ComApp[i]->BODevIndex=ComApp[i]->ActDevIndex;
		          }
		          else
		          {
		                ComApp[i]->HaveWrongData=TRUE;
		                ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
		          	ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNPUBADDR;
		                ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
		                memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
		
		                ComApp[i]->LengthOut=0;
		                ComApp[i]->AppCommand=APP_APPCON;
		                ComApp[i]->AppCommand|=APP_HAVEDATA1;
		                return;
		          }
		          info.SuperID = ComDb[i]->DBCfgs->DevID;
			  info.DevID = ComApp[i]->ActDevIndex;
			  info.Type = BORESQ;
			  info.Start = InfoAddr - LBO + 1;
			  if ((sco & SCO_SE) == SCO_SE)
				info.Num = BOSELECT;
			  else
				info.Num = BOOPERATE;
				
			  if ((sco & SCO_SCS) == 0)
				code.Control |=	BOOPEN;
			  else if ((sco & SCO_SCS) == 1)
				code.Control |= BOCLOSE;
							
			  if ((ComApp[i]->RxCot&COT_REASON)==ACT)
				code.Control &= (~BODEL);
			  else
				code.Control |= BODEL;
				
			  code.Status = BORCNONSUPPORT;
			   //向数据库发送遥控命令消息。
		          if((ComApp[i]->RxCot&COT_TEST)==0)//正常命令,(测试位为1则不能实际操作遥控)
			  	DBOperate((INT8U*)&code, &info);
			/*		
			  if (code.Status != BORCOK)
			  {
			 	result.SuperID = info.SuperID;
				result.DevID = info.DevID;
				result.ID = info.Start;
				result.Status = code.Control;
				if (dco & DCO_SE)
					result.Flag = BOOPSELECT;
				else
					result.Flag = BOOPOPERATE;
					
				if (ComApp[i]->RxMsg->Head.COT != ACT)
					result.Flag |= BOOPDEL;
	
				result.Flag |= BOOPERROR;
				EnCodeControl(Port, &result);
			  }
			*/	   
			 	          
			break;
		case C_DC_NA:   //双点遥控命令
        	case C_RC_NA:	//步调节
			dco = *ComApp[i]->pRxData;
           		ComApp[i]->DcoTemp = dco;
			if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT))//参数设置为不允许遥控
		        {
			        ComApp[i]->HaveWrongData=TRUE;
		                ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
		                ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNTYPEID;
		                ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
		                memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
		
		                ComApp[i]->LengthOut=0;
		                ComApp[i]->AppCommand=APP_APPCON;
		                ComApp[i]->AppCommand|=APP_HAVEDATA1;
		                return;
		        }
		        if (S101GetActDevIndexByAddr(Port,ComApp[i]->RxPubAddr))//根据公共体地址查设备序号。
		        {
		                ComApp[i]->BODevIndex=ComApp[i]->ActDevIndex;
		        }
		        else
		        {
		        	ComApp[i]->HaveWrongData=TRUE;
		                ComApp[i]->WrongDataLength=ComApp[i]->LengthIn;
		          	ComApp[i]->RxMsg[ComApp[i]->CotLocation]=UNKNOWNPUBADDR;
		                ComApp[i]->RxMsg[ComApp[i]->CotLocation]|=0x40;
		                memcpy((void*)ComApp[i]->WrongData,(void*)ComApp[i]->RxMsg,ComApp[i]->LengthIn);
		
		                ComApp[i]->LengthOut=0;
		                ComApp[i]->AppCommand=APP_APPCON;
		                ComApp[i]->AppCommand|=APP_HAVEDATA1;
		                return;
		        }
			info.SuperID = ComDb[i]->DBCfgs->DevID;
			info.DevID = ComApp[i]->ActDevIndex;
			info.Type = BORESQ;
			info.Start = InfoAddr - LBO + 1;
			if (dco & DCO_SE)
				info.Num = BOSELECT;
			else
				info.Num = BOOPERATE;
			
			if ((dco & DCO_DCS) == 0x01)
				code.Control |=	BOOPEN;
			else if ((dco & DCO_DCS) == 0x02)
				code.Control |= BOCLOSE;
						
			if (ComApp[i]->RxMsg[ComApp[i]->CotLocation] == ACT)
				code.Control &= (~BODEL);
			else
				code.Control |= BODEL;
			
			code.Status = BORCNONSUPPORT;
			//向数据库发送遥控命令消息。
            		if((ComApp[i]->RxCot&COT_TEST)==0)//正常命令,(测试位为1则不能实际操作遥控)
           			DBOperate((INT8U*)&code, &info);
				
			break;
			
		case C_SE_NA:
		
			break;
	}
	
    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_APPCON;
    ComApp[i]->AppCommand|=APP_HAVEDATA1;
}


//OK
void S101ProcAllDataCall(INT8U Port)
{
    INT8U i;
    
    i=Port-1;
    ComApp[i]->Data1.Flag|=CallAllData;
    ComApp[i]->EditAllDataCon=0xff;

    ComApp[i]->Data2Flag&=(~BackData);//清掉背景数据标志

    ComApp[i]->GroupTrn.TypeID=C_IC_NA;
    ComApp[i]->GroupTrn.COT=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];//总召唤限定词 传送原因,
    ComApp[i]->GroupTrn.PubAddr=ComApp[i]->RxPubAddr;

    if (ComApp[i]->GroupTrn.PubAddr==ComApp[i]->BroadCastAddr)//广播,召唤所有设备数据
    {
        ComApp[i]->GroupTrn.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
        ComApp[i]->AllDataNum = 0;
    }
    else//召唤某一设备数据
    {
        ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
        if (S101GetActDevIndexByAddr(Port,ComApp[i]->GroupTrn.PubAddr))//根据公共体地址查设备序号。
        {
            ComApp[i]->GroupTrn.DevIndex=ComApp[i]->ActDevIndex;
            
        }
        else//没有对应该公共体地址的设备
        {
            ComApp[i]->GroupTrn.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
        }
    }

    if(ComApp[i]->GroupTrn.COT==INTROGEN)
    {
        ComApp[i]->GroupTrn.GroupNo=1;//组号从1开始
        ComApp[i]->GroupTrn.InfoAddr=LBI;//信息体地址从0x1开始
    }
    else
    {
        ComApp[i]->GroupTrn.GroupNo=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]-INTROGEN;
        ComApp[i]->GroupTrn.InfoAddr=LBI;//信息体地址从0x1开始,该数值有校正。
    }
    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_APPCON;
    ComApp[i]->AppCommand|=APP_HAVEDATA1;
}


void S101ProcDDCall(INT8U Port)
{
    INT8U i;
    
    i=Port-1;
    ComApp[i]->GroupTrnDD.TypeID=C_CI_NA;
    ComApp[i]->GroupTrnDD.PubAddr=ComApp[i]->RxPubAddr;
    ComApp[i]->GroupTrnDD.Description=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];

    if((ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]&0x3f)==5)//电度总召唤
    {
        ComApp[i]->GroupTrnDD.COT=REQCOGCN;
    }
    else//分组召唤
    {
        ComApp[i]->GroupTrnDD.COT=REQCOGCN+((ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength])&0x3f);
    }

    if(ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength]&0xc0)//冻结电度
    {
        ComApp[i]->Data1.Flag|=FreezeDD;
        ComApp[i]->EditDDCon=0xff;
        FreezeCounter(Port);
    }
    else//读电度
    {
        ComApp[i]->Data1.Flag|=CallDD;
        ComApp[i]->EditDDCon=0xff;
    }

    if (ComApp[i]->GroupTrnDD.PubAddr==ComApp[i]->BroadCastAddr)//广播,召唤所有设备数据
    {
        ComApp[i]->GroupTrnDD.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
    }
    else//召唤某一设备数据
    {
        if (S101GetActDevIndexByAddr(Port, ComApp[i]->GroupTrnDD.PubAddr))//根据公共体地址查设备序号。
        {
            ComApp[i]->GroupTrnDD.DevIndex=ComApp[i]->ActDevIndex;
        }
        else//没有对应该公共体地址的设备
        {
            ComApp[i]->GroupTrnDD.DevIndex=ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;//总召唤数据从设备序号0开始
        }
    }

    if(ComApp[i]->GroupTrnDD.COT==REQCOGCN)//电度总召唤
    {
        ComApp[i]->GroupTrnDD.GroupNo=1;//组号从1开始
        ComApp[i]->GroupTrnDD.InfoAddr=LBCR;//信息体地址从开始
    }
    else
    {
        ComApp[i]->GroupTrnDD.GroupNo=ComApp[i]->GroupTrnDD.COT-REQCOGCN;
        ComApp[i]->GroupTrnDD.InfoAddr=LBCR;//信息体地址从开始,该数值有校正。
    }
    ComApp[i]->LengthOut=0;
    ComApp[i]->AppCommand=APP_APPCON;
    ComApp[i]->AppCommand|=APP_HAVEDATA1;
}


//OK
void S101ProcTimeDelay(INT8U Port)
{
    INT8U i;
    
    i=Port-1;
    if ((ComApp[i]->RxCot&COT_REASON)==ACT)//6,激活
    {
        GetTime((void*)(&ComApp[i]->SecSysTimeR),ABSTIME);
        ComApp[i]->ReadTimeFlag=0xff;
        ComApp[i]->SDTTime=MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);

        ComApp[i]->Data1.Flag|=CallTimeDelay;//为了设置一级数据标志
        ComApp[i]->LengthOut=0;
        ComApp[i]->AppCommand=APP_APPCON;
        ComApp[i]->AppCommand|=APP_HAVEDATA1;
    }
    else if ((ComApp[i]->RxCot&COT_REASON)==SPONT)//3,设置延迟时间
    {
        ComApp[i]->TimeDelay=MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);
        ComApp[i]->LengthOut=0;

⌨️ 快捷键说明

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