SDO处理(二)

来源:互联网 发布:南方大数据100指数雪球 编辑:程序博客网 时间:2024/05/17 07:41
[cpp] view plain copy
  1. \brief    当SDO响应需要被发送的时候,这个函数将会被调用  
[cpp] view plain copy
  1. void SdoRes(UINT8 abort, UINT8 command, UINT8 completeAccess, UINT16 dataSize, UINT32 objLength, TINITSDOMBX MBXMEM *pSdoRes)  
  2. {  
  3.     /* 对于上传分段响应,这个转换位将会被设置 */  
  4.     if ((command != SDOSERVICE_UPLOADSEGMENTREQ) && (command != SDOSERVICE_DOWNLOADSEGMENTREQ))  
  5.     {  
  6.         pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = 0;  
  7.     }  
  8.     if ( abort == 0 )  
  9.     {  
  10.         /* SDO-Download or SDO-Upload was successful, generate the SDO- and CoE-Header 如果SDO下载和SDO上传操作成功,则需要产生SDO和CoE的数据报头*/  
  11.         pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;  
  12.         pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDORESPONSE) << COEHEADER_COESERVICESHIFT;  
  13.         if ( command == SDOSERVICE_INITIATEUPLOADREQ )//如果SDO服务是Initiateuploadreq  
  14.         {  
  15.             // HBu 06.02.06: Complete Access Bit in the SDO-Upload-Response too *///判断是否为快速上传响应?  
  16.             if ( (objLength <= 4) && (objLength > 0) )  
  17.             {  
  18.                 /* Expedited Upload Response *///则是快速上传响应  
  19.                 pSdoRes->MbxHeader.Length             =         EXPEDITED_FRAME_SIZE;  
  20.                 pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |  
  21.                                                                                         SDOHEADER_TRANSFERTYPE        |  
  22.                                                                                         completeAccess |  
  23.                                                                                         ((MAX_EXPEDITED_DATA - ((UINT8)objLength)) << SDOHEADERSHIFT_DATASETSIZE) |  
  24.                                                                                         SDOSERVICE_INITIATEUPLOADRES;<span>     </span>  
[cpp] view plain copy
  1.             }  
  2.             else  
  3.             {  
  4.                 /* Normal or Segmented Upload Response *///普通上传或者分段上传模式响应  
  5. #if SEGMENTED_SDO_SUPPORTED  
  6. /*ECATCHANGE_START(V5.01) SDO3*/  
  7.                 if (((dataSize < MBX_HEADER_SIZE + UPLOAD_NORM_RES_SIZE)) || (objLength > (UINT32)(dataSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE)) <span> </span>/*ECATCHANGE_END(V5.01) SDO3*/  
[cpp] view plain copy
  1.                 {  
  2.                     pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+dataSize);  
  3.                 }  
  4.                 else  
  5. #endif  
  6.                 {  
  7.                     pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+((UINT16)objLength));  
  8.                 }  
  9.                    ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[0] = SWAPWORD((UINT16)objLength);  
  10.                    ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[1] = SWAPWORD((UINT16)(objLength>>16));  
  11.                 pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |  
  12.                                                                                         completeAccess |  
  13.                                                                                         SDOSERVICE_INITIATEUPLOADRES;  
  14.             }  
  15.         }  
  16.         /* for a segmented response the command was wrong in the response *///对于分段响应,命令是错误的响应  
  17.         else if ( command == SDOSERVICE_DOWNLOADSEGMENTREQ )  
  18.         {  
  19.             /* Download segmented response */  
  20.             pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;  
  21.             pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_DOWNLOADSEGMENTRES;  
  22.       }  
  23.         else if ( command != SDOSERVICE_UPLOADSEGMENTREQ )  
  24.         {  
  25.             /* Download response */  
  26.             pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;  
  27.             pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_INITIATEDOWNLOADRES;  
  28.         }  
  29.     }  
  30.     else//当about 不是等于0  
  31.     {  
  32.         /* generate a SDO-Abort-Request */  
  33.         pSdoRes->MbxHeader.Length         = ABORT_NORM_RES_SIZE;  
  34.         pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;  
  35.         pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDOREQUEST) << COEHEADER_COESERVICESHIFT;  
  36.         pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    = SDOSERVICE_ABORTTRANSFER;  
  37. #if BIG_ENDIAN_16BIT  
  38.         ((UINT16 MBXMEM *) &((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode)[0] = ((UINT16 *) &cAbortCode[abort])[1];  
  39.         ((UINT16 MBXMEM *) &((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode)[1] = ((UINT16 *) &cAbortCode[abort])[0];  
  40. #else  
  41.         ((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode = SWAPDWORD(cAbortCode[abort]);  
  42. #endif  
  43.     }  
  44.   
  45.     // HBu 02.05.06: if the CoE-response could not be sent because the  
  46.     //               send mailbox is full it should be stored//如果CoE-response不可以被发送,因为发送邮箱已经满了,那么它应该被存储  
  47.     if (MBX_MailboxSendReq((TMBX MBXMEM *) pSdoRes, COE_SERVICE) != 0)  
  48.     {  
  49.         /* we store the CoE mailbox service to send it later (in COE_ContinueInd) when the mailbox is read */  
  50.         pCoeSendStored = (TMBX MBXMEM *) pSdoRes;  
  51.     }  
  52. }  
0 0
原创粉丝点击