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