COE_Main()函数

[cpp]  view plain  copy
  1. /  
  2. /** 
  3.  
  4.  \brief    这个函数是在背后调用的,它不影响ECAT_Application在同步模式 
  5. *////  
  6.   
  7. void COE_Main(void)  
  8. {  
  9. #if SDO_RES_INTERFACE  
  10. /* ECATCHANGE_START(V5.01) SDO6*/  
  11.      UINT8 abort = 0;  
  12.     if(pSdoPendFunc != NULL)  
  13.     {  
  14.         abort = pSdoPendFunc(u16StoreIndex,u8StoreSubindex,u32StoreDataSize,pStoreData,bStoreCompleteAccess);  
  15.   
  16.         if(abort != ABORTIDX_WORKING)  
  17.         {  
  18.             switch(u8PendingSdo)  
  19.             {  
  20. #if SEGMENTED_SDO_SUPPORTED  
  21.                 case SDO_PENDING_SEG_WRITE:  
  22.                     if(pSdoSegData)  
  23.                     {  
  24.                         /* 分配的缓存将被释放 */  
  25.                         FREEMEM( (UINT16 VARMEM *) pSdoSegData );  
  26.                         pSdoSegData = NULL;  
  27.                     }  
  28. #endif  
  29.                 case SDO_PENDING_WRITE:  
  30.                      /*发送SDO的下载响应*/  
  31.                     SDOS_SdoRes(abort, 0, NULL);  
  32.                 break;  
  33.   
  34.                 case SDO_PENDING_SEG_READ:  
  35.                 case SDO_PENDING_READ:  
  36.                     /* 发送SDO的上传响应 */  
  37.                       SDOS_SdoRes(abort, u32StoreDataSize, pStoreData);  
  38.                     break;  
  39.   
  40.             }  
  41.   
  42.             u8PendingSdo = 0;  
  43.             u16StoreIndex = 0;  
  44.             u8StoreSubindex = 0;  
  45.             u32StoreDataSize = 0;  
  46.             pStoreData = NULL;  
  47.             bStoreCompleteAccess = 0;  
  48.             pSdoPendFunc = NULL;  
  49.         }  
  50.     }  
  51. /* ECATCHANGE_END(V5.01) SDO6*/  
  52. #endif  
  53. }  
  54. /** @} */  
  55.   
  56. #endif //#if COE_SUPPORTED  



[cpp]  view plain  copy
  1. /  
  2. /** 
  3.  \param    abort                SDO的接入结果 
  4.  \param    objLength            对象的总长度 
  5.  \param    pData                指向邮箱缓存的指针 
  6.  
  7.  \brief    这个函数被调用当SDO响应应该被发送的时候 
  8. *////  
  9.   
  10. void SDOS_SdoRes(UINT8 abort, UINT32 objLength, UINT16 MBXMEM *pData)  
  11. {  
  12.     UINT16 dataSize = 0;  
  13.   
  14.     if (bSdoInWork)  
  15.     {  
  16.         /* SDO-Response is expected */  
  17.         UINT8 command = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMAND;  
  18.         UINT8 completeAccess = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMPLETEACCESS;  
  19.   
  20.         if ( command == SDOSERVICE_INITIATEUPLOADREQ )  
  21.         {  
  22. #if SEGMENTED_SDO_SUPPORTED  
  23.             /* dataSize contains the available size in one mailbox */  
  24.             dataSize = u16SendMbxSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE;  
  25.             if ( dataSize < objLength )  
  26.             {  
  27.                 /* Segmented Upload, the variables for the segmented transfer should be initialized */  
  28.                 bSdoSegFollows         = TRUE;  
  29.                 bSdoSegLastToggle     = 1;  
  30. #if COMPLETE_ACCESS_SUPPORTED  
  31.                 bSdoSegAccess             = completeAccess;  
  32. #endif  
  33.                 nSdoSegCompleteSize    = objLength;  
  34.                 nSdoSegService            = SDOSERVICE_UPLOADSEGMENTREQ;  
  35.                 pSdoSegData                = (UINT16 VARMEM *) pData;  
  36.                 /* the first segment shall be copied */  
  37.                 MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, dataSize);  
  38. /* ECATCHANGE_START(V5.01) SDO6*/  
  39.                 nSdoSegBytesToHandle = dataSize;  
  40. /* ECATCHANGE_END(V5.01) SDO6*/  
  41.             }  
  42.             else  
  43. #endif  
  44.             if ( (objLength <= 4) && (objLength > 0) )  
  45.             {  
  46.                 /* Expedited response */  
  47.                 if ( pData != ((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data )  
  48.                 {  
  49.                     /* the data is not in the response buffer yet, it shall be copied */  
  50.                     MBXMEMCPY(((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);  
  51.                 }  
  52.             }  
  53.             else  
  54.             {  
  55.                 /* Normal response */  
  56.                 if ( pData != ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data )  
  57.                 {  
  58.                     /* the data is not in the response buffer yet, it shall be copied */  
  59.                     MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);  
  60.                 }  
  61.             }  
  62.         }  
  63.   
  64.         /* SDO access is finished, send the response */  
  65.         bSdoInWork = FALSE;  
  66.         SdoRes(abort, command, completeAccess, dataSize, objLength, pSdoResStored);  
  67.     }  
  68. }  
  69. #endif // SDO_RES_INTERFACE 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值