COE_Main()函数

/
/**

 \brief    这个函数是在背后调用的,它不影响ECAT_Application在同步模式
*

void COE_Main(void)
{
#if SDO_RES_INTERFACE
/* ECATCHANGE_START(V5.01) SDO6*/
     UINT8 abort = 0;
    if(pSdoPendFunc != NULL)
    {
        abort = pSdoPendFunc(u16StoreIndex,u8StoreSubindex,u32StoreDataSize,pStoreData,bStoreCompleteAccess);

        if(abort != ABORTIDX_WORKING)
        {
            switch(u8PendingSdo)
            {
#if SEGMENTED_SDO_SUPPORTED
                case SDO_PENDING_SEG_WRITE:
                    if(pSdoSegData)
                    {
                        /* 分配的缓存将被释放 */
                        FREEMEM( (UINT16 VARMEM *) pSdoSegData );
                        pSdoSegData = NULL;
                    }
#endif
                case SDO_PENDING_WRITE:
                     /*发送SDO的下载响应*/
                    SDOS_SdoRes(abort, 0, NULL);
                break;

                case SDO_PENDING_SEG_READ:
                case SDO_PENDING_READ:
                    /* 发送SDO的上传响应 */
                      SDOS_SdoRes(abort, u32StoreDataSize, pStoreData);
                    break;

            }

            u8PendingSdo = 0;
            u16StoreIndex = 0;
            u8StoreSubindex = 0;
            u32StoreDataSize = 0;
            pStoreData = NULL;
            bStoreCompleteAccess = 0;
            pSdoPendFunc = NULL;
        }
    }
/* ECATCHANGE_END(V5.01) SDO6*/
#endif
}
/** @} */

#endif //#if COE_SUPPORTED



/
/**
 \param    abort                SDO的接入结果
 \param    objLength            对象的总长度
 \param    pData                指向邮箱缓存的指针

 \brief    这个函数被调用当SDO响应应该被发送的时候
*

void SDOS_SdoRes(UINT8 abort, UINT32 objLength, UINT16 MBXMEM *pData)
{
    UINT16 dataSize = 0;

    if (bSdoInWork)
    {
        /* SDO-Response is expected */
        UINT8 command = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMAND;
        UINT8 completeAccess = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMPLETEACCESS;

        if ( command == SDOSERVICE_INITIATEUPLOADREQ )
        {
#if SEGMENTED_SDO_SUPPORTED
            /* dataSize contains the available size in one mailbox */
            dataSize = u16SendMbxSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE;
            if ( dataSize < objLength )
            {
                /* Segmented Upload, the variables for the segmented transfer should be initialized */
                bSdoSegFollows         = TRUE;
                bSdoSegLastToggle     = 1;
#if COMPLETE_ACCESS_SUPPORTED
                bSdoSegAccess             = completeAccess;
#endif
                nSdoSegCompleteSize    = objLength;
                nSdoSegService            = SDOSERVICE_UPLOADSEGMENTREQ;
                pSdoSegData                = (UINT16 VARMEM *) pData;
                /* the first segment shall be copied */
                MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, dataSize);
/* ECATCHANGE_START(V5.01) SDO6*/
                nSdoSegBytesToHandle = dataSize;
/* ECATCHANGE_END(V5.01) SDO6*/
            }
            else
#endif
            if ( (objLength <= 4) && (objLength > 0) )
            {
                /* Expedited response */
                if ( pData != ((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data )
                {
                    /* the data is not in the response buffer yet, it shall be copied */
                    MBXMEMCPY(((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
                }
            }
            else
            {
                /* Normal response */
                if ( pData != ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data )
                {
                    /* the data is not in the response buffer yet, it shall be copied */
                    MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
                }
            }
        }

        /* SDO access is finished, send the response */
        bSdoInWork = FALSE;
        SdoRes(abort, command, completeAccess, dataSize, objLength, pSdoResStored);
    }
}
#endif // SDO_RES_INTERFACE


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值