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

📄 101seclink.c

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


#include "includes.h"
#include "101def.h"
#include "101seclink.h"
#include "101secapp.h"



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



/*------------------------------------------------------------------*/
/*函数名称:InitSecLink()											*/
/*函数功能:链路层初始化											*/
/*------------------------------------------------------------------*/
BOOL InitSecLink(INT8U Port, struct PortAppInfo* PortCfg)
{
	INT8U	i;
	INT16U	tmp;
	struct PSec101Pad *pPad;
	
	i = Port - 1;
	pPad = (struct PSec101Pad*)(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]->SourceNo = ComDb[i]->DBCfgs->Address;
//	ComLink[i]->DestinationNo = ComDb[i]->DBCfgs->Address;
	
	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]->RetryCount = 0;

	RecMISIData(Port, FALSE);
	
	return TRUE;
}

/*------------------------------------------------------------------*/
/*函数名称:LinkOnTimer()											*/
/*函数功能:链路层定时器											*/
/*------------------------------------------------------------------*/
void LinkOnTimer(INT8U Port)
{
/*	INT8U	i;
	
	i = Port - 1;
	
	//超时处理
	ComLink[i]->IdleTimeCount++;
*/

}

/*------------------------------------------------------------------*/
/*函数名称:SendNextData()											*/
/*函数功能:继续发送未发完的数据或应用层的主动数据					*/
/*------------------------------------------------------------------*/
void SendNextData(INT8U Port)
{
	SecAppProcNext(Port);
	DLSendProc(Port);
}

/*------------------------------------------------------------------*/
/*函数名称:SearchFrame()											*/
/*函数功能:寻找正确帧												*/
/*------------------------------------------------------------------*/
void SearchFrame(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 (!ExeDLFun10(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 (!ExeDLFun68(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:
					ExeDLFunCode10(Port);
					ComLink[i]->RxdHead += sizeof (struct FLPDUFRAME);  
           			ComLink[i]->RxdStatus = RXDSTART;
					break;
					
				case STARTCODE68:
					ExeDLFunCode68(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);
				stop = TRUE;
			}
     	}	

 	}

}

/*------------------------------------------------------------------*/
/*函数名称:ExeFun10()												*/
/*函数功能:检测10帧正确性											*/
/*------------------------------------------------------------------*/
BOOL ExeDLFun10(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]->SourceNo)
		return (FALSE);
	tmp = (INT8U)cscrc((void*)&pFrame->Control, 2);
	if (pFrame->CheckCode != tmp)
		return (FALSE);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:ExeFun68()												*/
/*函数功能:检测68帧头正确性										*/
/*------------------------------------------------------------------*/
BOOL ExeDLFun68(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 != BROADCASTADDR) && (pFrame->LAddress != ComLink[i]->SourceNo))
		return (FALSE);

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:ExeDLFunCode10()										*/
/*函数功能:处理10帧数据											*/
/*------------------------------------------------------------------*/
void ExeDLFunCode10(INT8U Port)
{
	INT8U	i;
	struct FLPDUFRAME *pFrame;
	
	i = Port - 1;
	ComLink[i]->IdleTimeCount = 0;
	ComLink[i]->RetryCount = MAXRETRYNUM;
	
	pFrame = (struct FLPDUFRAME*)&ComLink[i]->RxdBuf[0];
	
	if (pFrame->Control & P101_PRM)	//非平衡式,被动接收命令
	{
		if ( ((pFrame->Control & P101_FCB) != (ComLink[i]->RlaConCode & P101_FCB))
			|| (!(pFrame->Control & P101_FCV)) )	//FCV无效 或 FCB翻转
		{
			if (pFrame->Control & P101_FCV)	//FCV有效
			{
				ComLink[i]->RlaConCode = pFrame->Control;
 		    	ComLink[i]->FCBNoTurnNum = MAXRETRYNUM;
			}
						
			switch (pFrame->Control & P101_FUNCODE)
			{
				case DLRESETRDL:
					ComLink[i]->DLCommand = DL_RESETDL;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
					RecResetDL(Port);
					break;
				
				case DLTESTDL:		//(平衡式暂不处理)
					break;
				
				case DLREQACD:
					RecDLACD(Port);
					break;
					
				case DLREQSTATUS:
					RecReqDLStatus(Port);
					break;
					
				case DLREQDATA1:
					ComLink[i]->DLCommand = DL_CALLDATA1;
					SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
					DLSendProc(Port);
					break;
					
				case DLREQDATA2:

⌨️ 快捷键说明

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