///////////////////////////////////////////////////////////////////////////////////////// /** \param abort SDO接近的结果 \param command SDO的命令索引 \param completeAccess 指示是否完成接近是需要的 \param dataSize 响应对象数据的大小 \param objLength 对象的完成的大小 \param pSdoRes 邮箱缓存的指针 \brief 这个函数被调用当SDO响应应该被发送 *//////////////////////////////////////////////////////////////////////////////////////// void SdoRes(UINT8 abort, UINT8 command, UINT8 completeAccess, UINT16 dataSize, UINT32 objLength, TINITSDOMBX MBXMEM *pSdoRes) { /* 当上传响应,toggle bit 应该被覆盖 */ if ((command != SDOSERVICE_UPLOADSEGMENTREQ) && (command != SDOSERVICE_DOWNLOADSEGMENTREQ)) { pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = 0; } if ( abort == 0 ) { /* SDO-Download or SDO-Upload 成功, 产生SDO和CoE的数据包头 */ pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK; pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDORESPONSE) << COEHEADER_COESERVICESHIFT; if ( command == SDOSERVICE_INITIATEUPLOADREQ ) { // HBu 06.02.06: Complete Access Bit in the SDO-Upload-Response too */ if ( (objLength <= 4) && (objLength > 0) ) { /* 快速上传响应 */ pSdoRes->MbxHeader.Length = EXPEDITED_FRAME_SIZE; pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOHEADER_SIZEINDICATOR | SDOHEADER_TRANSFERTYPE | completeAccess | ((MAX_EXPEDITED_DATA - ((UINT8)objLength)) << SDOHEADERSHIFT_DATASETSIZE) | SDOSERVICE_INITIATEUPLOADRES; } else { /* 普通和分段上传响应 */ #if SEGMENTED_SDO_SUPPORTED /*ECATCHANGE_START(V5.01) SDO3*/ if (((dataSize < MBX_HEADER_SIZE + UPLOAD_NORM_RES_SIZE)) || (objLength > (UINT32)(dataSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE)) ) /*ECATCHANGE_END(V5.01) SDO3*/ { pSdoRes->MbxHeader.Length = SWAPWORD(UPLOAD_NORM_RES_SIZE+dataSize); } else #endif { pSdoRes->MbxHeader.Length = SWAPWORD(UPLOAD_NORM_RES_SIZE+((UINT16)objLength)); } ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[0] = SWAPWORD((UINT16)objLength); ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[1] = SWAPWORD((UINT16)(objLength>>16)); pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOHEADER_SIZEINDICATOR | completeAccess | SDOSERVICE_INITIATEUPLOADRES; } } /* 对于分段响应,命令是错误的在响应当中 */ else if ( command == SDOSERVICE_DOWNLOADSEGMENTREQ ) { /* Download segmented response */ pSdoRes->MbxHeader.Length = DOWNLOAD_NORM_RES_SIZE; pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOSERVICE_DOWNLOADSEGMENTRES; } else if ( command != SDOSERVICE_UPLOADSEGMENTREQ ) { /* Download response */ pSdoRes->MbxHeader.Length = DOWNLOAD_NORM_RES_SIZE; pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOSERVICE_INITIATEDOWNLOADRES; } } else { /* 产生SDO-Abort-产生 */ pSdoRes->MbxHeader.Length = ABORT_NORM_RES_SIZE; pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK; pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDOREQUEST) << COEHEADER_COESERVICESHIFT; pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = SDOSERVICE_ABORTTRANSFER; ((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode = SWAPDWORD(cAbortCode[abort]); } // HBu 02.05.06: 如果CoE响应,不应该被发送,因为发送邮箱是满的,它应该被存储 if (MBX_MailboxSendReq((TMBX MBXMEM *) pSdoRes, COE_SERVICE) != 0) { /* 我们存储CoE邮箱服务应该晚一点发送它,当邮箱被读 pCoeSendStored = (TMBX MBXMEM *) pSdoRes; } }