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

📄 101prilink.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:101prilink.c                                           	*/
/*模块功能:DL/T 634-1997 101主站方规约								*/
/*编写日期:2005年4月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/


#include "includes.h"
#include "101def.h"
#include "101prilink.h"
#include "101priapp.h"



extern struct LinkInfo* ComLink[PORTNUM];
extern struct AppInfo* ComApp[PORTNUM];
extern struct SysPort*	ComDb[PORTNUM];





/*------------------------------------------------------------------*/
/*函数名称:InitPriLink()											*/
/*函数功能:链路层初始化											*/
/*------------------------------------------------------------------*/
BOOL InitPriLink(INT8U Port, struct PortAppInfo* PortCfg)
{
	INT8U	i, j;
	INT16U	tmp;
	struct PPri101Pad *pPad;
	
	i = Port - 1;
	pPad = (struct PPri101Pad*)(PortCfg->pPad);
	
	ComLink[i]->Baudrate = PortCfg->Baudrate;	
	if (pPad != NULL)
	{
		tmp = pPad->PBase.Timer.TimeoutValue1;
		if (tmp < 100)
			tmp = 100;
		ComLink[i]->TimeOutValue = tmp / 10;
	
		tmp = pPad->PBase.ProtocolControl;
		if (tmp & BALANCE)
			ComLink[i]->BalanMode = TRUE;
		else
			ComLink[i]->BalanMode = FALSE;
	}
	else	//默认规约面板
	{
		ComLink[i]->TimeOutValue = 10;
		ComLink[i]->BalanMode = FALSE;
	}

	ComLink[i]->DevNum = ComDb[i]->DevNum;
	ComLink[i]->DLDevs = (struct DLDevInfo*)malloc (ComDb[i]->DevNum * sizeof (struct DLDevInfo));
	if (ComLink[i]->DLDevs == NULL)
		return (FALSE);
	
	for (j=0; j<ComLink[i]->DevNum; j++)
	{
		ComLink[i]->DLDevs[j].DevID = ComDb[i]->DBCfgs[j].DevID;
		ComLink[i]->DLDevs[j].DestAddr = ComDb[i]->DBCfgs[j].Address;		
		ComLink[i]->DLDevs[j].SourceNo = ComDb[i]->DBCfgs[j].MAddress;
		ComLink[i]->DLDevs[j].TlaConCode = 0;
		ComLink[i]->DLDevs[j].FCBNoTurnNum = 0;
		ComLink[i]->DLDevs[j].DLPriStatus = PRIDISABLE;
	}
	
	ComLink[i]->FrameHead = 0;
	ComLink[i]->TxdHead = 0;
	ComLink[i]->TxdTail = 0;
	ComLink[i]->RxdHead = 0;
	ComLink[i]->RxdTail = 0;
	ComLink[i]->RxdLength = 0;

	ComLink[i]->RxdStatus = RXDSTART;
	ComLink[i]->RetryCount = 0;

	P101RecMISIData(Port, FALSE);
	
	return TRUE;
	
}


/*------------------------------------------------------------------*/
/*函数名称:P101LinkOnTimer()										*/
/*函数功能:链路层定时器											*/
/*------------------------------------------------------------------*/
void P101LinkOnTimer(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	
	ComLink[i]->TimeOutCount++;
	if (ComLink[i]->TimeOutCount >= ComLink[i]->TimeOutValue)
	{
		ComLink[i]->TimeOutCount = 0;
		ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum++;
		if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum >= MAXRETRYNUM)
		{
			ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum--;
			ComLink[i]->DLCommand = DL_LINKDISABLE;
			ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = 0;
			PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
			P101DLSendProc(Port);
		}
		else	//超时重发
		{
			P101SendSecDataToMISI(Port);
		}
	}

}

/*------------------------------------------------------------------*/
/*函数名称:P101SearchFrame()										*/
/*函数功能:寻找正确帧												*/
/*------------------------------------------------------------------*/
void P101SearchFrame(INT8U Port)
{
	BOOL stop = FALSE;
	INT8U	i, err, tmp, num;
	
	i = Port - 1;
	while ((ComLink[i]->RxdHead < ComLink[i]->RxdTail) && (!stop))
 	{
 		if (ComLink[i]->RxdStatus == RXDSTART)
 		{
			if ((ComLink[i]->RxdBuf[ComLink[i]->RxdHead] != STARTCODE10)
				&& (ComLink[i]->RxdBuf[ComLink[i]->RxdHead] != STARTCODE68))
			{
				ComLink[i]->RxdHead++;
				continue;
			}
 			
 			//找到后,清除无用的缓冲区报文
 			if (ComLink[i]->RxdTail > ComLink[i]->RxdHead)
 			{
 				ComLink[i]->RxdLength = ComLink[i]->RxdTail - ComLink[i]->RxdHead;
 				memcpy (ComLink[i]->RxdBuf, &ComLink[i]->RxdBuf[ComLink[i]->RxdHead], ComLink[i]->RxdLength);
 				ComLink[i]->RxdHead = 0;
 				ComLink[i]->RxdTail = ComLink[i]->RxdLength;
 			}

 			ComLink[i]->RxdStatus = RXDHEAD;
 		}
 		
 		if (ComLink[i]->RxdStatus == RXDHEAD)
 		{
 			//10帧
 			if (ComLink[i]->RxdBuf[ComLink[i]->RxdHead] == STARTCODE10)
 			{
 				if (ComLink[i]->RxdLength >= sizeof (struct FLPDUFRAME))
 				{
 					if (!P101ExeDLFun10(Port))
 					{
	         			ComLink[i]->RxdHead++;  
           				ComLink[i]->RxdStatus = RXDSTART;
          			}
         			else
          				ComLink[i]->RxdStatus = RXDCONTINUE; 
 				}
 				else
 					stop = TRUE;
 			}
 			//68帧
 			if (ComLink[i]->RxdBuf[ComLink[i]->RxdHead] == STARTCODE68)
 			{
 				if (ComLink[i]->RxdLength > sizeof (struct FLPDUFRAME))
 				{
 					if (!P101ExeDLFun68(Port))
 					{
	         			ComLink[i]->RxdHead++;  
           				ComLink[i]->RxdStatus = RXDSTART;
          			}
         			else
         			{
         				num = ComLink[i]->RxdBuf[ComLink[i]->RxdHead+1];
         				if (ComLink[i]->RxdLength >= (num + 6))	//报文收全
						{
							tmp = (INT8U)cscrc((void*)&ComLink[i]->RxdBuf[ComLink[i]->RxdHead+4], num);
							if ((ComLink[i]->RxdBuf[num+4] == tmp)
								&& (ComLink[i]->RxdBuf[num+5] == ENDCODE))
         					{
         						ComLink[i]->RxdStatus = RXDCONTINUE;
         					}
         					else
         					{
         						ComLink[i]->RxdHead += 6;  
           						ComLink[i]->RxdStatus = RXDSTART;
         					}
         				}
         				else
         					stop = TRUE;
         			}
 				}
 				else
 					stop = TRUE;
 				
 			}
 		}
 		
 		if (ComLink[i]->RxdStatus == RXDCONTINUE)
 		{
			if (ComLink[i]->RxdHead > 0)
			{
				ComLink[i]->RxdLength = ComLink[i]->RxdTail - ComLink[i]->RxdHead;
 				memcpy (ComLink[i]->RxdBuf, &ComLink[i]->RxdBuf[ComLink[i]->RxdHead], ComLink[i]->RxdLength);
 				ComLink[i]->RxdHead = 0;
 				ComLink[i]->RxdTail = ComLink[i]->RxdLength;
 			}
 			
			switch (ComLink[i]->RxdBuf[ComLink[i]->RxdHead])
     		{
				case STARTCODE10:
					P101ExeDLFunCode10(Port);
					ComLink[i]->RxdHead += sizeof (struct FLPDUFRAME);  
           			ComLink[i]->RxdStatus = RXDSTART;
					break;
					
				case STARTCODE68:
					P101ExeDLFunCode68(Port);
					ComLink[i]->RxdHead += ComLink[i]->RxdBuf[ComLink[i]->RxdHead+1] + 6;  
           			ComLink[i]->RxdStatus = RXDSTART;
					break;
     		}

			if (ComLink[i]->RxdTail > ComLink[i]->RxdHead)
			{
				OSFlagPost(ComDb[i]->Event, NEXTFRAME, OS_FLAG_SET, &err);
			}
     	}	

 	}

}

/*------------------------------------------------------------------*/
/*函数名称:P101ExeFun10()											*/
/*函数功能:检测10帧正确性											*/
/*------------------------------------------------------------------*/
BOOL P101ExeDLFun10(INT8U Port)
{
	INT8U	i, tmp;
	struct FLPDUFRAME *pFrame;
	
	i = Port - 1;
	pFrame = (struct FLPDUFRAME*)(&ComLink[i]->RxdBuf[ComLink[i]->RxdHead]);
	
	if (pFrame->EndField != ENDCODE)
		return (FALSE);
//	if (pFrame->LAddress != ComLink[i]->ActDevAddr)
//		return (FALSE);
	tmp = (INT8U)cscrc((void*)&pFrame->Control, 2);
	if (pFrame->CheckCode != tmp)
		return (FALSE);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:P101ExeFun68()											*/
/*函数功能:检测68帧头正确性										*/
/*------------------------------------------------------------------*/
BOOL P101ExeDLFun68(INT8U Port)
{
	INT8U	i;
	struct CLPDUFRAME *pFrame;
	
	i = Port - 1;
	pFrame = (struct CLPDUFRAME*)(&ComLink[i]->RxdBuf[ComLink[i]->RxdHead]);
	
	if (pFrame->StartField1 != pFrame->StartField2)
		return (FALSE);
	if (pFrame->FramLength1 != pFrame->FramLength2)
		return (FALSE);
//	if (pFrame->LAddress != ComLink[i]->ActDevAddr)
//		return (FALSE);

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:P101ExeDLFunCode10()									*/
/*函数功能:处理10帧数据											*/
/*------------------------------------------------------------------*/
void P101ExeDLFunCode10(INT8U Port)
{
	INT8U	i;
	struct FLPDUFRAME *pFrame;
	
	i = Port - 1;
	pFrame = (struct FLPDUFRAME*)(&ComLink[i]->RxdBuf[ComLink[i]->RxdHead]);
	
	switch (pFrame->Control & P101_FUNCODE)
	{
		case DLCON:
			if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus == PRIWAITRSCON)
			{
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIENABLE;
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode = 0;
				ComLink[i]->DLCommand = DL_LINKENABLE;
			}
			else
				ComLink[i]->DLCommand = DL_APPCON;
			break;
			
		case DLNODATA:
			ComLink[i]->DLCommand = DL_NODATA;
			break;
			
		case DLSTATUSOK:
			if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus < PRIWAITRSCON)
			{
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIWAITRSCON;
				P101EditFra10(Port, DLRESETRDL);
				ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum = 0;
				P101SendDataToMISI(Port);
			}
			return ;
			break;
			
		case DLNOWORK:
			ComLink[i]->DLCommand = DL_LINKDISABLE;
			break;			
	}
	
	if (pFrame->Control & P101_DFC)
	{
		
	}

⌨️ 快捷键说明

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