📄 101seclink.c
字号:
/*------------------------------------------------------------------*/
/*模块名称: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 + -