7.7. EtherCAT Mailbox Transfer

To be able to initiate a mailbox transfer the client has to create a mailbox transfer object first. This mailbox transfer object also contains the memory where the data to be transferred is stored. The one client that initiated the mailbox transfer will be notified about a mailbox transfer completion by the emNotify() callback function.

To be able to identify the transfer which was completed the client has to assign a unique transfer identifier for each mailbox transfer. The mailbox transfer object can only be used for one single mailbox transfer. If multiple transfers shall be initiated in parallel the client has to create one transfer object for each. The transfer object can be re-used after mailbox transfer completion.

Typical mailbox transfer sequence:

  1. Record a mailbox transfer.

  2. Create a transfer object (for example a SDO download transfer object).
    MbxTferDesc.dwMaxDataLen = 10
    MbxTferDesc.pbyMbxTferDescData = (EC_T_PBYTE)OsMalloc(MbxTferDesc.dwMaxDataLen)
    pMbxTfer = emMbxTferCreate(&MbxTferDesc)
        state of the transfer object = Idle
  3. Set the location to write the transferred data to, determine the transfer ID, store the client ID in the object and initiate the transfer (e.g. a SDO upload). A transfer may only be initiated if the state of the transfer object is Idle.
    pMbxTfer->dwDataLen = MbxTferDesc.dwMaxDataLen;
    pMbxTfer->pbyMbxTferData = MbxTferDesc.pbyMbxTferDescData
    pMbxTfer->dwTferId = 1;
    pMbxTfer->dwClntId = dwClntId;
    dwResult = emCoeSdoUplodadReq(pMbxTfer, dwSlaveId, wObIndex, ...);
        state of the transfer object = Pend or TferReqError

    The state will then be set to Pend to indicate that this mailbox transfer object currently is in use and the transfer is not completed. If the mailbox transfer cannot be initiated the master will set the object into the state TferReqError - in such cases the client is responsible to set the state back into Idle.

  4. If the mailbox transfer is completed the notification callback function of the corresponding client ( emNotify()) will be called with a pointer to the mailbox transfer object. The state of the transfer object is set to TferDone prior to calling emNotify().
    if( dwResult != EC_E_NOERROR ) { ... }
    emNotify( EC_NOTIFY_MBOXRCV, pParms )
        state of the transfer object = TferDone
  5. In case of errors the appropriate error handling has to be executed. Application must set the transfer object state to Idle.
    if( pMbxTfer->dwErrorCode != EC_E_NOERROR ) { ... }
        In emNotify: application may set transfer object state to Idle
  6. Delete the transfer object. Alternatively this object can be used for the next transfer.

7.7.1. Mailbox transfer object states

The following states exist for a mailbox transfer object:



enumerator eMbxTferStatus_Idle

Mailbox transfer object not in use

enumerator eMbxTferStatus_Pend

Mailbox transfer in process

enumerator eMbxTferStatus_TferDone

Mailbox transfer completed

enumerator eMbxTferStatus_TferReqError

Mailbox transfer request error

enumerator eMbxTferStatus_TferWaitingForContinue

Mailbox transfer waiting for continue, object owned by application

enumerator eMbxTferStatus_BCppDummy

A mailbox transfer will be processed by the monitor independently from the client’s timeout setting. Some types of mailbox transfers can be cancelled by the client, e.g. if the client’s timeout elapsed.

After completion of the mailbox transfer (with timeout and the client may finally set the transfer object into the state EC_T_MBXTFER_STATUS::eMbxTferStatus_Idle. New mailbox transfers can only be requested if the object is in the state EC_T_MBXTFER_STATUS::eMbxTferStatus_Idle.

7.7.2. emMbxTferCreate

EC_T_MBXTFER *emMbxTferCreate(EC_T_DWORD dwInstanceID, EC_T_MBXTFER_DESC *pMbxTferDesc)

Creates a mailbox transfer object.

While a mailbox transfer is in process the related transfer object and the corresponding memory may not be accessed. After a mailbox transfer completion the object may be used for the next transfer. The mailbox transfer object has to be deleted by calling ecatMbxTferDelete if it is not needed any more.

  • dwInstanceID – [in] Instance ID (Multiple EtherCAT Network Support)

  • pMbxTferDesc – [in] Pointer to the mailbox transfer descriptor. Determines details of the mailbox transfer.


EC_E_NOERROR or error code


Public Members

EC_T_DWORD dwMaxDataLen

Maximum amount of data bytes that shall be transferred using this object. A mailbox transfer type without data transfer will ignore this parameter

EC_T_BYTE *pbyMbxTferDescData

Pointer to byte stream carrying in and out data of mailbox content


Public Members


[] Client ID


[out] Mailbox transfer descriptor. All elements of pMbxTferDesc will be stored here


[] This type information is written to the Mailbox Transfer Object by the last call to a mailbox command function. It may be used as an information, and is required to fan out consecutive notifications. This value is only valid until next mailbox relevant API call, where this value may be overwritten

EC_T_DWORD dwDataLen

[] Amount of data bytes for the next mailbox transfer. If the mailbox transfer does not transfer data from or to the slave this parameter will be ignored. This element has to be set to an appropriate value every time prior to initiate a new request. When the transfer is completed (emNotify) this value will contain the amount of data that was actually transferred

EC_T_BYTE *pbyMbxTferData

[in/out] Pointer to data. In case of a download transfer the client has to store the data in this location. In case of an upload transfer this element points to the received data. Access to data that was uploaded from a slave is only valid within the notification function because the buffer will be re-used by the master “this data has to be copied into a separate buffer in case it has to be used later by the client


[out] Transfer state. After a new transfer object is created the state will be set to eMbxTferStatus_Idle

EC_T_DWORD dwErrorCode

[out] Error code of a mailbox transfer that was terminated with error


[] Transfer ID. For every new mailbox transfer a unique ID has to be assigned. This ID can be used after mailbox transfer completion to identify the transfer


[] Mailbox data. This element contains mailbox transfer data, e.g. the CoE object dictionary list.



enumerator eMbxTferType_COE_SDO_DOWNLOAD

CoE SDO download

enumerator eMbxTferType_COE_SDO_UPLOAD

CoE SDO upload

enumerator eMbxTferType_COE_GETODLIST

CoE Get object dictionary list

enumerator eMbxTferType_COE_GETOBDESC

CoE Get object description

enumerator eMbxTferType_COE_GETENTRYDESC

CoE Get object entry description

enumerator eMbxTferType_COE_EMERGENCY

CoE emergency request

enumerator eMbxTferType_COE_RX_PDO


enumerator eMbxTferType_FOE_FILE_UPLOAD

FoE upload

enumerator eMbxTferType_FOE_FILE_DOWNLOAD

FoE download

enumerator eMbxTferType_SOE_READREQUEST

SoE read request

enumerator eMbxTferType_SOE_READRESPONSE

SoE read response

enumerator eMbxTferType_SOE_WRITEREQUEST

SoE write request

enumerator eMbxTferType_SOE_WRITERESPONSE

SoE write response

enumerator eMbxTferType_SOE_NOTIFICATION

SoE notification

enumerator eMbxTferType_SOE_EMERGENCY

SoE emergency

enumerator eMbxTferType_VOE_MBX_READ

VoE read

enumerator eMbxTferType_VOE_MBX_WRITE

VoE write

enumerator eMbxTferType_AOE_READ

AoE read

enumerator eMbxTferType_AOE_WRITE

AoE write

enumerator eMbxTferType_AOE_READWRITE

AoE read/write

enumerator eMbxTferType_AOE_WRITECONTROL

AoE write control

enumerator eMbxTferType_RAWMBX

Raw mbx

enumerator eMbxTferType_FOE_SEG_DOWNLOAD

FoE segmented download

enumerator eMbxTferType_FOE_SEG_UPLOAD

FoE segmented upload

enumerator eMbxTferType_S2SMBX

S2S mbx

enumerator eMbxTferType_BCppDummy

Public Members


AoE, Class A




CoE Object Dictionary list


CoE object description


CoE entry description


CoE emergency data


CoE InitCmd


FoE, Class A




SoE notification request


SoE emergency request

7.7.3. emMbxTferAbort

EC_T_DWORD emMbxTferAbort(EC_T_DWORD dwInstanceID, EC_T_MBXTFER *pMbxTfer)

Abort a running mailbox transfer.

This function may not be called from within the JobTask’s context.

  • dwInstanceID – [in] Instance ID (Multiple EtherCAT Network Support)

  • pMbxTfer – [in] Mailbox transfer object created with emMbxTferCreate


EC_E_NOERROR if successful

Currently only supported for FoE Transfer, CoE Download and CoE Upload.

7.7.4. emMbxTferDelete

EC_T_VOID emMbxTferDelete(EC_T_DWORD dwInstanceID, EC_T_MBXTFER *pMbxTfer)

Deletes a mailbox transfer object.

A transfer object may only be deleted if it is in the Idle state.

  • dwInstanceID – [in] Instance ID (Multiple EtherCAT Network Support)

  • pMbxTfer – [in] Mailbox transfer object created with emMbxTferCreate


EC_E_NOERROR or error code

7.7.5. emNotify - EC_NOTIFY_MBOXRCV

Indicates a mailbox transfer completion.

  • pbyInBuf: [in] Pointer to a structure of type EC_T_MBXTFER, contains the corresponding mailbox transfer object.

  • dwInBufSize: [in] Size of the transfer object provided at pbyInBuf in bytes.

  • pbyOutBuf: [out] Should be set to EC_NULL

  • dwOutBufSize: [in] Should be set to 0

  • pdwNumOutData: [out] Should be set to EC_NULL

The element EC_T_MBXTFER::dwClntId contains the corresponding ID of the client that is notified, the corresponding transfer ID can be found in EC_T_MBXTFER::dwTferId. The transfer result is stored in EC_T_MBXTFER::dwErrorCode.

On error EC_T_MBXTFER::eTferStatus is eMbxTferStatus_TferReqError, on success eMbxTferStatus_TferDone. In order to reuse the transfer object the application must set it back to eMbxTferStatus_Idle.

The EC_T_MBXTFER::eMbxTferType element determines the mailbox transfer type (e.g. eMbxTferType_COE_SDO_DOWNLOAD for a completion of a CoE SDO download transfer).