📄 101prilink.c
字号:
if (pFrame->Control & P101_ACD)
{
ComLink[i]->DLCommand |= DL_REC_ACD;
}
if (pFrame->LAddress != ComLink[i]->ActDevAddr)
{
ComLink[i]->ActDevAddr = pFrame->LAddress;
ComLink[i]->ActIndex = P101GetIndexByAddr(Port, ComLink[i]->ActDevAddr);
}
if ((pFrame->Control & 0x0F) == DLCON)
{
ComLink[i]->DLDevs[ComLink[i]->ActIndex].FCBNoTurnNum = 0;
}
PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
P101DLSendProc(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:P101ExeDLFunCode68() */
/*函数功能:处理68帧数据 */
/*------------------------------------------------------------------*/
void P101ExeDLFunCode68(INT8U Port)
{
INT8U i;
struct CLPDUFRAME *pFrame;
i = Port - 1;
pFrame = (struct CLPDUFRAME*)(&ComLink[i]->RxdBuf[ComLink[i]->RxdHead]);
switch (pFrame->Control & P101_FUNCODE)
{
case DLCON:
ComLink[i]->DLCommand = DL_APPCON;
break;
case DLRESDATA:
ComLink[i]->DLCommand = DL_SENDDATA;
break;
}
if (pFrame->Control & P101_DFC)
{
}
if (pFrame->Control & P101_ACD)
{
ComLink[i]->DLCommand |= DL_REC_ACD;
}
if (pFrame->LAddress != ComLink[i]->ActDevAddr)
{
ComLink[i]->ActDevAddr = pFrame->LAddress;
ComLink[i]->ActIndex = P101GetIndexByAddr(Port, ComLink[i]->ActDevAddr);
}
PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[6], pFrame->FramLength1-2);
P101DLSendProc(Port);
}
/*------------------------------------------------------------------*/
/*函数名称:P101DLSendProc() */
/*函数功能:链路层发送处理 */
/*------------------------------------------------------------------*/
void P101DLSendProc(INT8U Port)
{
INT8U i, err;
BOOL fnext = FALSE;
i = Port - 1;
//更新链路层的记录
ComLink[i]->ActIndex = ComApp[i]->ActIndex;
ComLink[i]->ActDevAddr = ComLink[i]->DLDevs[ComLink[i]->ActIndex].DestAddr;
//编辑发送帧
switch(ComApp[i]->AppCommand)
{
case APP_APPCON: //应用层对收到的数据做应答
ComLink[i]->DLCommand = 0;
PriAppProc(Port, ComLink[i]->DLCommand, &ComLink[i]->RxdBuf[0], 0);
P101DLSendProc(Port);
break;
case APP_APPDIABALE: //应用层无效
break;
case APP_SENDCON: //发送03命令
P101EditFra68(Port, DLSENDCON);
break;
case APP_SENDNOCON: //发送04命令
fnext = TRUE;
P101EditFra68(Port, DLSENDNOCON);
break;
case APP_TESTDLINK: //测试链路
if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus == PRIDISABLE)
ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIWAITSTATUS;
else
ComLink[i]->DLDevs[ComLink[i]->ActIndex].DLPriStatus = PRIWAITINITEND;
P101EditFra10(Port, DLTESTDL);
break;
case APP_SENDDATA: //发送08命令
P101EditFra68(Port, DLRESDATA);
break;
case APP_REQSTATUS:
P101EditFra10(Port, DLREQSTATUS);
break;
case APP_CALLDATA1:
P101EditFra10(Port, DLREQDATA1);
break;
case APP_CALLDATA2:
P101EditFra10(Port, DLREQDATA2);
break;
case APP_NODATA: //应用层无数据
P101EditFra10(Port, DLNODATA);
break;
case APP_NOJOB: //应用层无任务
break;
default:
break;
}
//发送数据
P101SendDataToMISI(Port);
if (fnext)
{
ComApp[i]->AppCommand = 0;
// OSTimeDly(2);
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
}
/*------------------------------------------------------------------*/
/*函数名称:P101EditFra10() */
/*函数功能:编辑10帧 */
/*------------------------------------------------------------------*/
void P101EditFra10(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;
if ((Function==DLRESETRDL) || (Function==DLREQACD) || (Function==DLREQSTATUS))
pFrame->Control &= (~P101_FCV);
else
pFrame->Control |= P101_FCV;
if (ComLink[i]->ActDevAddr == 0xFF)
pFrame->Control &= (~P101_FCV);
if ((pFrame->Control & P101_FCV)) //FCV有效,FCB翻转
{
if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode & P101_FCB)
pFrame->Control &= (~P101_FCB);
else
pFrame->Control |= P101_FCB;
ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode = pFrame->Control;
}
pFrame->Control |= P101_PRM;
pFrame->Control &= (~P101_DIR);
pFrame->LAddress = ComLink[i]->ActDevAddr;
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;
}
/*------------------------------------------------------------------*/
/*函数名称:P101EditFra68() */
/*函数功能:编辑68帧 */
/*------------------------------------------------------------------*/
void P101EditFra68(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;
if ((Function==DLSENDCON) || (Function==DLREQDATA1) || (Function==DLREQDATA2))
pFrame->Control |= P101_FCV;
else
pFrame->Control &= (~P101_FCV);
if (ComLink[i]->ActDevAddr == 0xFF)
pFrame->Control &= (~P101_FCV);
if ((pFrame->Control & P101_FCV)) //FCV有效,FCB翻转
{
if (ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode & P101_FCB)
pFrame->Control &= (~P101_FCB);
else
pFrame->Control |= P101_FCB;
ComLink[i]->DLDevs[ComLink[i]->ActIndex].TlaConCode = pFrame->Control;
}
pFrame->Control |= P101_PRM;
pFrame->Control &= (~P101_DIR);
pFrame->LAddress = ComLink[i]->ActDevAddr;
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;
}
/*------------------------------------------------------------------*/
/*函数名称:P101RecMISIData() */
/*函数功能:接收MISI数据 */
/*------------------------------------------------------------------*/
void P101RecMISIData(INT8U Port, BOOL Flag)
{
INT16U i, count;
i = Port - 1;
count = Readx((INT8U *)&ComLink[i]->RxdBuf[ComLink[i]->RxdTail], LPDUSIZE, Port);
if (count == 0)
return ;
lseek(Port, count);
if (Flag)
{
ComLink[i]->RxdTail += count;
ComLink[i]->RxdLength += count;
ComLink[i]->TimeOutCount = 0;
P101SearchFrame(Port);
}
}
/*------------------------------------------------------------------*/
/*函数名称:P101SendDataToMISI() */
/*函数功能:发送数据 */
/*------------------------------------------------------------------*/
void P101SendDataToMISI(INT8U Port)
{
INT16U i, count, num;
i = Port - 1;
ComLink[i]->TimeOutCount = 0;
// 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;
}
}
/*------------------------------------------------------------------*/
/*函数名称:P101SendSecDataToMISI() */
/*函数功能:重发数据 */
/*------------------------------------------------------------------*/
void P101SendSecDataToMISI(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;
P101SendDataToMISI(Port);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -