📄 101seclink.c
字号:
ComLink[i]->DLCommand = DL_CALLDATA2;
SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
DLSendProc(Port);
break;
default:
break;
}
}
else //FCB未翻转
{
if (ComLink[i]->FCBNoTurnNum)
{
ComLink[i]->FCBNoTurnNum--;
if (ComLink[i]->FCBNoTurnNum)
SendSecDataToMISI(Port);
}
}
}
else //平衡模式下,收到主站的应答处理
{
}
}
/*------------------------------------------------------------------*/
/*函数名称:ExeDLFunCode68() */
/*函数功能:处理68帧数据 */
/*------------------------------------------------------------------*/
void ExeDLFunCode68(INT8U Port)
{
INT8U i;
struct CLPDUFRAME *pFrame;
i = Port - 1;
ComLink[i]->IdleTimeCount = 0;
ComLink[i]->RetryCount = MAXRETRYNUM;
pFrame = (struct CLPDUFRAME*)&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 DLSENDCON:
ComLink[i]->DLCommand = DL_SENDCON;
SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
DLSendProc(Port);
break;
case DLSENDNOCON:
ComLink[i]->DLCommand = DL_SENDNOCON;
SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
DLSendProc(Port);
break;
case DLREQDATA2:
ComLink[i]->DLCommand = DLREQDATA2;
SecAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
DLSendProc(Port);
break;
}
}
else //FCB未翻转
{
if (ComLink[i]->FCBNoTurnNum)
{
ComLink[i]->FCBNoTurnNum--;
if (ComLink[i]->FCBNoTurnNum)
SendSecDataToMISI(Port);
}
}
}
else //平衡模式下,收到主站的应答处理
{
}
}
/*------------------------------------------------------------------*/
/*函数名称:RecResetDL() */
/*函数功能:复位链路 */
/*------------------------------------------------------------------*/
void RecResetDL(INT8U Port)
{
INT8U i;
i = Port - 1;
// ComLink[i]->DLSecStatus = SECENABLE;
ComLink[i]->RlaConCode &= 0xDF; //清FCB位
ComLink[i]->FlagData1 = FALSE;
EditSecFra10(Port, DLCON);
SendDataToMISI(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:RecDLACD() */
/*函数功能: */
/*------------------------------------------------------------------*/
void RecDLACD(INT8U Port)
{
}
/*------------------------------------------------------------------*/
/*函数名称:RecReqDLStatus() */
/*函数功能:请求链路状态 */
/*------------------------------------------------------------------*/
void RecReqDLStatus(INT8U Port)
{
INT8U i;
i = Port - 1;
ComLink[i]->FlagData1 = FALSE;
EditSecFra10(Port, DLSTATUSOK);
SendDataToMISI(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:DLSendProc() */
/*函数功能:链路层发送处理 */
/*------------------------------------------------------------------*/
void DLSendProc(INT8U Port)
{
INT8U i;
i = Port - 1;
if (ComApp[i]->AppCommand & APP_HAVEDATA1)
{
ComLink[i]->FlagData1 = TRUE;
ComApp[i]->AppCommand &= 0xFF;
}
else
ComLink[i]->FlagData1 = FALSE;
switch(ComApp[i]->AppCommand)
{
case APP_APPCON: //应用层对收到的数据做应答
EditSecFra68(Port, DLCON);
break;
case APP_APPDIABALE: //应用层无效
break;
case APP_SENDCON: //发送03命令
break;
case APP_SENDNOCON: //发送04命令 平衡模式
break;
case APP_SENDDATA: //发送08命令
EditSecFra68(Port, DLRESDATA);
break;
case APP_NODATA: //应用层无数据
EditSecFra10(Port, DLNODATA);
break;
case APP_NOJOB: //应用层无任务
break;
default:
break;
}
SendDataToMISI(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:EditSecFra10() */
/*函数功能:编辑从动站应答10帧 */
/*------------------------------------------------------------------*/
void EditSecFra10(INT8U Port, INT8U Function)
{
INT8U i;
struct FLPDUFRAME *pFrame;
i = Port - 1;
pFrame = (struct FLPDUFRAME*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
pFrame->StartField = STARTCODE10;
pFrame->Control = Function;
pFrame->Control &= (~P101_DFC);
if (ComLink[i]->FlagData1)
pFrame->Control |= P101_ACD;
else
pFrame->Control &= (~P101_ACD);
pFrame->Control &= (~P101_PRM);
pFrame->Control |= P101_DIR;
pFrame->LAddress = ComLink[i]->SourceNo;
pFrame->CheckCode = (INT8U)cscrc((void*)&pFrame->Control, 2);
pFrame->EndField = ENDCODE;
ComLink[i]->TxdTail += 5;
memcpy(ComLink[i]->TxdBuf_Sec, (INT8U*)pFrame, 5);
ComLink[i]->TxdTail_Sec = 5;
}
/*------------------------------------------------------------------*/
/*函数名称:EditSecFra68() */
/*函数功能:编辑从动站应答68帧 */
/*------------------------------------------------------------------*/
void EditSecFra68(INT8U Port, INT8U Function)
{
INT8U i;
struct CLPDUFRAME *pFrame;
i = Port - 1;
if (ComApp[i]->TxLen == 0)
return ;
pFrame = (struct CLPDUFRAME*)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead];
pFrame->StartField1 = STARTCODE68;
pFrame->FramLength1 = ComApp[i]->TxLen + 2;
pFrame->FramLength2 = ComApp[i]->TxLen + 2;
pFrame->StartField2 = STARTCODE68;
pFrame->Control = Function;
pFrame->Control &= (~P101_DFC);
if (ComLink[i]->FlagData1)
pFrame->Control |= P101_ACD;
else
pFrame->Control &= (~P101_ACD);
pFrame->Control &= (~P101_PRM);
pFrame->Control |= P101_DIR;
pFrame->LAddress = ComLink[i]->SourceNo;
memcpy((INT8U*)&pFrame->LPDU[0], (INT8U*)&ComApp[i]->TxMsg, ComApp[i]->TxLen);
pFrame->LPDU[ComApp[i]->TxLen] = (INT8U)cscrc((void*)&pFrame->Control, 2 + ComApp[i]->TxLen);
pFrame->LPDU[ComApp[i]->TxLen + 1] = ENDCODE;
ComLink[i]->TxdTail += ComApp[i]->TxLen + 8;
memcpy(ComLink[i]->TxdBuf_Sec, (INT8U*)pFrame, ComApp[i]->TxLen + 8);
ComLink[i]->TxdTail_Sec = ComApp[i]->TxLen + 8;
}
/*------------------------------------------------------------------*/
/*函数名称:RecMISIData() */
/*函数功能:接收MISI数据 */
/*------------------------------------------------------------------*/
void RecMISIData(INT8U Port, BOOL Flag)
{
INT16U i, count;
i = Port - 1;
count = Readx((INT8U *)&ComLink[i]->RxdBuf[ComLink[i]->RxdTail], LPDUSIZE, Port);
lseek(Port, count);
if (Flag)
{
ComLink[i]->RxdTail += count;
ComLink[i]->RxdLength += count;
}
SearchFrame(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:SendDataToMISI() */
/*函数功能:发送数据 */
/*------------------------------------------------------------------*/
void SendDataToMISI(INT8U Port)
{
INT16U i, count, num;
i = Port - 1;
ComLink[i]->IdleTimeCount = 0;
if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
return ;
num = ComLink[i]->TxdTail - ComLink[i]->TxdHead;
count = WriteX((INT8U *)&ComLink[i]->TxdBuf[ComLink[i]->TxdHead], num, Port);
ComLink[i]->TxdHead += count;
if (ComLink[i]->TxdHead >= ComLink[i]->TxdTail)
{
ComLink[i]->TxdTail = 0;
ComLink[i]->TxdHead = 0;
}
}
/*------------------------------------------------------------------*/
/*函数名称:SendSecDataToMISI() */
/*函数功能:重发数据 */
/*------------------------------------------------------------------*/
void SendSecDataToMISI(INT8U Port)
{
INT8U i;
i = Port - 1;
memcpy(&ComLink[i]->TxdBuf[ComLink[i]->TxdTail], ComLink[i]->TxdBuf_Sec, ComLink[i]->TxdTail_Sec);
ComLink[i]->TxdTail += ComLink[i]->TxdTail_Sec;
SendDataToMISI(Port);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -