EtherCAT Slave 入門教程 - 郵箱服務(1)


mailbox.c Implementation

郵箱buffer處理的描述(MAILBOX_QUEUE = 0):

兩個郵箱buffer用於發送和接收郵箱服務。

正常運行:
啟動郵箱處理(handler) psWriteMbx以及郵箱buffer 1,、psReadMbx、psRepeatMbx和psStoreMbx為0。
在此狀態下,將忽略Repeat請求,因為尚未發送任何服務。

發送第一個郵箱服務時(在MBX_CopyToSendMailbox中),psWriteMbx獲取郵箱buffer 2,psReadMbx獲取發送郵箱buffer 1,psRepeatMbx 和 psStoreMbx仍為0。
從主站讀取第一個郵箱服務時,發送的郵箱buffer 1存儲在psRepeatMbx(MBX_MailboxReadInd)中。

在psReadMbx始終獲取實際發送的郵箱buffer之后,psWriteMbx設置為0(在發送郵箱服務被讀且調用MBX_MailboxReadInd之前,不會處理從主站接收的另一個郵箱服務)。
當讀取郵箱服務時,psWriteMbx得到psRepeatMbx的buffer,psRepeatMbx得到psReadMbx的buffer。

主站Repeat請求:
當主站發Repeat請求時(MBX_MailboxRepeatReq),有三種不同的可能:

  1. 自郵箱處理(handler)啟動以來未發送任何郵箱服務(psRepeatMbx=0):無需執行任何操作

  2. 接收到上一個已發送郵箱服務的確認(MBX_MailboxReadInd())(bSendMbxIsFull = 0):
    上一個發送郵箱服務(psRepeatMbx)將被再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設為0

  3. 未接收到上一次的發送郵箱服務的確認(psReadMbx和psRepeatMbx包含不同的buffer,psReadMbx仍在郵箱中(因為尚未調用MBX_MailboxReadInd,bSendMbxIsFull = 1):
    psReadMbx將在郵箱中被刪除(調用DisableSyncManChannel和EnableSyncManChannel)然后存儲在psStoreMbx中,psRepeatMbx將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將置為0。
    發送重復郵箱服務(調用MBX_MailboxReadInd)時,psReadMbx將存儲在psRepeatMbx中,psStoreMbx將被發送(在mbx中)並存儲在psReadMbx中,psStoreMbx將被設為0。

郵箱buffer處理的描述(MAILBOX_QUEUE = 1):

有兩個郵箱buffer用於發送和接收郵箱服務。

正常操作(psWriteMbx僅用於本地存儲):
啟動郵箱處理(handler) psReadMbx,psRepeatMbx和psStoreMbx為0。
在此狀態下,將忽略Repeat請求,因為尚未發送任何服務。

當從主站接收到郵箱服務時(在MBX_CheckAndCopyMailbox中),郵箱buffer將使用APPL_AllocMailboxBuffer獲取,相應的協議服務功能將被調用(在MBX_WriteMailboxInd中)。
該buffer應用於協議服務響應。
發送第一個郵箱服務時(在MBX_CopyToSendMailbox中),psReadMbx將獲取發送郵箱buffer,psRepeatMbx和psStoreMbx仍為0。

讀取第一個來自主站的郵箱服務時,將存儲發送的郵箱buffer(psReadMbx)。在psRepeatMbx中(在MBX_MailboxReadInd中)。
之后,psReadMbx始終獲取實際發送的郵箱buffer(在MBX_CopyToSendMailbox中)當讀取郵箱服務時,將返回psRepeatMbx(使用appl eu freemailboxbuffer),psRepeatMbx將獲取psReadMbx的buffer。

主站Repeat請求:

當主站發Repeat請求時(mbx_mailboxrepeatreq),有三種不同的可能:

  1. 自郵箱處理(handler)啟動以來未發送任何郵箱服務(psRepeatMbx=0):無需執行任何操作

  2. 接收到上一個已發送郵箱服務的確認(以MBX_MailboxReadInd為單位)(bSendMbxIsFull=0):
    最后發送的郵箱服務(psRepeatMbx)將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設置為0

  3. 未收到最后發送的郵箱服務的確認(psReadMbx和psRepeatMbx包含不同的buffer,psReadMbx仍在郵箱中(因為尚未調用mbx_-mailboxreadind,bSendMbxIsFull=1):
    psReadMbx將在郵箱中刪除(調用DisableSyncManChannel和EnableSyncManChannel)和存儲在psStoreMbx中,psRepeatMbx將再次發送(在MBX_CopyToSendMailbox中)並存儲在psReadMbx中,psRepeatMbx將設置為0。
    發送重復郵箱服務(調用MBX_MailboxReadInd)時,psReadMbx將存儲在psRepeatMbx中。
    psStoreMbx將被發送(在mbx中)並存儲在psReadMbx中,psStoreMbx將被設置為0。

mailbox.c 解析

1. UINT8 PutInMbxQueue(TMBX MBXMEM * pMbx, TMBXQUEUE MBXMEM * pQueue)

2. TMBX MBXMEM * GetOutOfMbxQueue(TMBXQUEUE MBXMEM * pQueue)

3. void MBX_Init(void)

4. UINT16 MBX_StartMailboxHandler(void)

5. void MBX_StopMailboxHandler(void)

6. UINT8 MailboxServiceInd(TMBX MBXMEM *pMbx)

checks the mailbox header:
(pMbx->Mbxheader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE

when mailbox header type is MBX_TYPE_COE, it calls:

COE_ServiceInd((TCOEMBX MBXMEM *) pMbx);

7. void MBX_MailboxWriteInd(TMBX MBXMEM *pMbx)

8. void MBX_MailboxReadInd(void)

9. void MBX_MailboxRepeatReq(void)

10. UINT8 MBX_MailboxSendReq( TMBX MBXMEM * pMbx, UINT8 flags )

11. void MBX_CheckAndCopyMailbox(void)

Check if the received mailbox command can be processed, the contents of the Receive Mailbox will be copied in the variable sMbx.

12. UINT8 MBX_CopyToSendMailbox(TMBX MBXMEM *pMbx)

13. void MBX_Main(void)

  1. GetOutOfMbxQueue(&sMbxReceiveQueue);
    to check if a received mailbox service was stroed.
  2. MailboxServiceInd(pMbx);
    to check the mailbox header for the requested service and calls the corresponding XXX_ServiceInd function.
  3. if (bReceiveMbxIsLocked)
      MBX_CheckAndCopyMailbox();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM