📄 fservice.c
字号:
++gSubESN;
}
// 接收到的SN必须大于LRSN
if(gSubLRSN < rmtsn) {
// 接收到的SN必须等于ESN
if(rmtsn == gSubESN) {
gSubLRSN = rmtsn;
ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
#if NS_MODULE_EN > 0
if(psock->comtype & NS_COM_TYPE) {
// NS In
}
else {
OSQPost(gpFBMsgQ, (void*)psock);
}
#else
OSQPost(gpFBMsgQ, (void*)psock);
#endif // NS_MODULE_EN
}
else {
// report error: lost packet
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= LOSS_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
else {
// report error: repitition
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= REPETITION_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
else {
// report error: data bit error
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= DATABIT_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
FreeSock(psock);
}
//////////////////////////////////////// 变量读服务 /////////////////////////////////////
//void FS_Read_req(uint8 DesIPAddr[4], uint16 DesAppID, uint16 DesObjectID, uint16 SubIndex, uint8* pUsrData) {
void FS_Read_req(PSock psock) {
uint16 srcappid;
uint32 crc;
ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
memset(psock->payload + 6, 0, 10);
if(GetFSComState() == SAFETYCOM_OPEN) {
h2n16(GetFSComESN(), psock->payload + 4);
switch(gCrcMode) {
case 1:
crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 2:
crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 3:
crc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 4:
crc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
}
h2n32(crc, psock->payload);
EPAOutput(psock);
}
else {
n2h16(psock->payload + 16, &srcappid);
AddSt(5, (void*)psock, FSRetryOutput);
FS_ComOpen_req(psock->dstip, srcappid);
}
}
/*--------------------------------------------------------------------*
*- Parameter: Smo_Socket_Index 数据索引,由通信栈获得 -*
*- Description: Safety Read 服务处理函数, 通过时间戳, CRC, SN -*
*- 检查后读取指定数据, 根据读取情况返回正/负响应, 未通过检查则产 -*
*- 生对应错误报告 -*
*--------------------------------------------------------------------*/
void FS_Read_reqhandle(PSock psock) {
uint16 srcappid, dstappid, dstobjid, subindex, rmtsn, localsn;
uint32 rmtcrc, localcrc;
FSCommunicationFailureObject fscfo;
if(GetFSComState() == SAFETYCOM_OPEN && GetFSComRmtIP() == psock->srcip) {
switch(gCrcMode) {
case 1:
localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 2:
localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 3:
localcrc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 4:
localcrc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
default:
return;
}
n2h32(psock->payload, &rmtcrc);
if(localcrc == rmtcrc) {
n2h16(psock->payload + 4, &rmtsn);
localsn = GetFSComESN();
if(rmtsn == localsn) {
n2h16(psock->payload + 16, &srcappid);
n2h16(psock->payload + 18, &dstappid);
n2h16(psock->payload + 20, &dstobjid);
n2h16(psock->payload + 22, &subindex);
// Call EPA usr layer to deal with data
ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
#if NS_MODULE_EN > 0
if(psock->comtype & NS_COM_TYPE) {
// NS In
}
else {
OSQPost(gpFBMsgQ, (void*)psock);
}
#else
OSQPost(gpFBMsgQ, (void*)psock);
#endif // NS_MODULE_EN
SetFSComESN(localsn + 1);
}
else if(rmtsn < localsn) {
// report error: repetition
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= REPETITION_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
else {
// report error: loss
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= LOSS_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
else {
// Report: CRC check error
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= DATABIT_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
FreeSock(psock);
}
/*--------------------------------------------------------------------*
*- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID -*
*- pData 需要发送的数据, 以网络序的Octet串形式提供 -*
*- Datelen 数据长度 -*
*- Description: 根据参数发送Safety Read正响应报文 -*
*--------------------------------------------------------------------*/
void FS_Read_pos(PSock psock) {
uint32 crc;
ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
memset(psock->payload + 6, 0, 10);
if(GetFSComState() == SAFETYCOM_OPEN) {
h2n16(GetFSComESN(), psock->payload + 4);
switch(gCrcMode) {
case 1:
crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 2:
crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 3:
crc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 4:
crc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
}
h2n32(crc, psock->payload);
EPAOutput(psock);
}
}
/*--------------------------------------------------------------------*
*- Parameter: Smo_Socket_Index 数据索引,由通信栈获得 -*
*- Description: Safety Read 正响应 服务处理函数, 通过时间戳, CRC, SN -*
*- 检查后读取指定数据, 未通过检查则产 -*
*- 生对应错误报告 -*
*--------------------------------------------------------------------*/
void FS_Read_poshandle(PSock psock) {
uint32 rmtcrc, localcrc;
uint16 datalen, rmtsn, localsn;
FSCommunicationFailureObject fscfo;
datalen= psock->length;
if(GetFSComState() == SAFETYCOM_OPEN) {
switch(gCrcMode) {
case 1:
localcrc = crc81_check(psock->payload + 4, datalen - 4, GetFSComKey());
break;
case 2:
localcrc = crc81_check(psock->payload + 4, datalen - 4, GetFSComKey());
break;
case 3:
localcrc = crc16_check(psock->payload + 4, datalen - 4, GetFSComKey());
break;
case 4:
localcrc = crc32_check(psock->payload + 4, datalen - 4, GetFSComKey());
break;
}
n2h32(psock->payload, &rmtcrc);
if(localcrc == rmtcrc) {
n2h16(psock->payload + 4, &rmtsn);
localsn = GetFSComESN() + 1;
if(rmtsn == localsn) {
// Call EPA usr layer to deal with data
SetFSComESN(localsn);
ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
#if NS_MODULE_EN > 0
if(psock->comtype & NS_COM_TYPE) {
// NS In
}
else {
OSQPost(gpFBMsgQ, (void*)psock);
}
#else
OSQPost(gpFBMsgQ, (void*)psock);
#endif // NS_MODULE_EN
}
else if(rmtsn < localsn) {
// report error: repetition
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= REPETITION_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
else {
// report error: loss
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= LOSS_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
else {
// Report: CRC check error
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= DATABIT_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
}
FreeSock(psock);
}
/*--------------------------------------------------------------------*
*- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID -*
*- pData 需要发送的数据, 以网络序的Octet串形式提供 -*
*- Datelen 数据长度 -*
*- Description: 根据参数发送Safety Read负响应报文 -*
*--------------------------------------------------------------------*/
void FS_Read_neg(PSock psock) {
uint32 crc;
ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
memset(psock->payload + 6, 0, 10);
if(GetFSComState() == SAFETYCOM_OPEN) {
h2n16(GetFSComESN(), psock->payload + 4);
switch(gCrcMode) {
case 1:
crc = crc81_check(psock->payload + 4, 52, GetFSComKey());
break;
case 2:
crc = crc81_check(psock->payload + 4, 52, GetFSComKey());
break;
case 3:
crc = crc16_check(psock->payload + 4, 52, GetFSComKey());
break;
case 4:
crc = crc32_check(psock->payload + 4, 52, GetFSComKey());
break;
}
h2n32(crc, psock->payload);
EPAOutput(psock);
}
}
/*--------------------------------------------------------------------*
*- Parameter: Smo_Socket_Index 数据索引,由通信栈获得 -*
*- Description: Safety Read 负响应 服务处理函数, 通过时间戳, CRC, SN -*
*- 检查后读取指定数据, 未通过检查则产 -*
*- 生对应错误报告 -*
*--------------------------------------------------------------------*/
void FS_Read_neghandle(PSock psock) {
uint16 localsn, rmtsn;
uint32 rmtcrc, localcrc;
FSCommunicationFailureObject fscfo;
if(GetFSComState() == SAFETYCOM_OPEN) {
switch(gCrcMode) {
case 1:
localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 2:
localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 3:
localcrc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
case 4:
localcrc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
break;
}
n2h32(psock->payload, &rmtcrc);
if(localcrc == rmtcrc) {
n2h16(psock->payload + 4, &rmtsn);
localsn = GetFSComESN() + 1;
if(rmtsn == localsn) {
// Call EPA usr layer to deal with data
ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
#if NS_MODULE_EN > 0
if(psock->comtype & NS_COM_TYPE) {
// NS In
}
else {
OSQPost(gpFBMsgQ, (void*)psock);
}
#else
OSQPost(gpFBMsgQ, (void*)psock);
#endif // NS_MODULE_EN
}
else if(rmtsn < localsn) {
// report error: repetition
FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
fscfo.DeviceFailure |= REPETITION_ERROR;
fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
}
else {
// report error: loss
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -