mailbox 编程_往死里写——从站mailbox实现 | 学步园
void ECAT_Main(void)函數里面
首先檢查是否有服務儲存在mailbox里面。調用MBX_Main();(This function is called cyclically to check if a received Mailbox service was stored?)
在MBX_Main(void)里面獲得mailbox的接受隊列里面的郵箱賦予pMbx。
通過函數MailboxServiceInd(*pmbx)來檢查郵箱頭部給對應的服務,然后調用對應的XXXX_ServiceInd-function函數
根據pMbx->MbxHeader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE來判讀對應的服務
#define ? ? MBX_TYPE_AOE ? ? ? ? ? ? ? ? ? ? ? ?1
#define ? ? MBX_TYPE_EOE ? ? ? ? ? ? ? ? ? ? ? ?2
#define ? ? MBX_TYPE_COE ? ? ? ? ? ? ? ? ? ? ? ?3
#define ? ? MBX_TYPE_FOE ? ? ? ? ? ? ? ? ? ? ? ?4
#define ? ? MBX_TYPE_SOE ? ? ? ? ? ? ? ? ? ? ? ?5
#define ? ? MBX_TYPE_VOE ? ? ? ? ? ? ? ? ? ? ? ?15
通過判斷(pMbx->MbxHeader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE 來判斷郵箱請求服務的類型。
這里發現郇極、劉艷強書《工業以太網現場總線EtherCAT驅動程序設計及應用》P24頁 ?和圖2.26,表2.6 里有個錯誤
在從站協議V5.10里,它的非周期性郵箱數據通信,郵箱數據單元結構里,郵箱數據頭,是由長度(16位)、地址(16位)、通道(6位)、優先級(2位)、計數器(4位)、類型(4位)。
而在書里面,把類型和計數器的位置顛倒了。
長度(16)
地址(16位)
通道(6位)
優先級(2位)
計數器(4位)
類型(4位)
MBX_TYPE_AOE
1
MBX_TYPE_EOE
2
MBX_TYPE_COE
3
MBX_TYPE_FOE
4
MBX_TYPE_SOE
5
MBX_TYPE_VOE
15
當郵箱數據頭類型=3(CoE)時,COE_ServiceInd((TCOEMBX MBXMEM *)pMbx)函數
通過強制類型轉換,套出CoE數據頭
這里注意,大小端模式下,CoE類型的位置是不一樣的。
在這里我們采用小端模式
PDO編號(9位)
保留(3位)
類型(4位)
CoE數據頭
通過判斷類型,跳轉到對應的類型處理中去
COESERVICE_EMERGENCY
1
COESERVICE_SDOREQUEST
2
COESERVICE_SDORESPONSE
3
COESERVICE_TXPDO
4
COESERVICE_RXPDO
5
COESERVICE_TXPDOREMREQ
6
COESERVICE_RXPDOREMREQ
7
COESERVICE_SDOINFO
8
CoE命令定義
這里SDO服務,這里SDO數據幀格式
SDO控制(8)
索引(16)
子索引(8)
數據(32)
可選擴展數據(1~1470)
SDO通信服務的3種類型
1、快速傳輸服務:與標準的CANopen協議相同,只使用8個字節,最多傳輸4個字節有效數據;
2、常規傳輸服務:使用超過8個字節,可以傳輸超過4個字節的有效數據,最大可傳輸有效數據取決于郵箱SM所管理的存儲區容量;
3、分段傳輸服務:對于超過郵箱容量的情況,使用分段的方式進行傳輸。
在從站代碼里面只定義了 SDO請求 的服務程序 和 SDO信息的服務程序;
當接受到SDO-Request 的時候 ,將調用SDOS_SdoInd()函數來處理SDO請求,如果存在SDO協議被使用,則對應的處理函數將被調用。
在這里強行套用套接頭(TINITSDOMBX)
這里通過指令
UINT8 sdoHeader = pSdoInd->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMANDMASK;
UINT8 command = (sdoHeader & SDOHEADER_COMMAND);
將CoE的命令碼讀出來
如果命令碼CCS 是0x01:下載請求;0x00:分段下載請求
SDO傳輸又分為下載和上傳兩種,下載傳輸常用于主站設置從站參數,上傳傳輸用于主站讀取從站的性能參數。這兩種服務在物理上是對稱的。
在書《工業以太網現場總線EtherCAT驅動程序設計及應用》P101 表5.5 里面CoE的命令碼CCS可以補充
0x00
分段下載請求
0x01
下載請求
CCS
0x02
上傳請求
0x03
分段上傳請求
0x04
停止傳輸
通過函數OBJ_GetObjectHandle();獲得對象字典的句柄,并判斷請求的索引是否在對象字典里面定義
SDO傳輸又分為下載和上傳兩種,下載傳輸常用于主站設置從站參數,上傳傳輸用于主站讀取從站的性能參數。
(1)SDO下載傳輸請求
SDO下載傳輸請求數據格式。如果要傳輸的數據小于4個字節,則使用快速SDO傳輸服務,它完全兼容CANopen協議,使用8個字節數據,其中4個字節為數據區,有效字節為4減去SDO控制字節中的位2和3表示的數值。(表示傳輸的數據小于4個字節,因為只有兩位表示,所以,其中值為0,1,2,3)
如果要傳輸的數據大于4個字節,則使用常規傳輸服務。在常規傳輸時,用快速傳輸時的4個數據字節表示要傳輸的數據的完整大小。用擴展數據部分傳輸有效數據。有效數據的最大容量為郵箱容量減去16。實際大小為郵箱頭中長度數據n減去10。SDO下載傳輸請求服務的數據幀內容如表所示。
(2)SDO分段下載傳輸
在常規下載傳輸時,如果傳輸數據對象的總數量大于本次傳輸的允許數據數量,則必須使用后續的分段下載傳輸服務。
(3)SDO下載傳輸響應
從站收到SDO下載請求之后,執行相應的處理,然后將響應數據寫入輸入郵箱SM1中,由主站讀走。主站只有得到正確的響應之后才能執行下一步SDO操作。正確的SDO下載響應數據格式如圖
(4)終止SDO傳輸
在SDO傳輸過程中,如果某一方發現有錯誤,可以發起SDO終止傳輸請求,對方收到此請求后,停止當前SDO傳輸。SDO終止傳輸請求不需要應答。
(5)SDO下載傳輸過程
主站首先發送SDO下載請求道從站SM0,從站讀取郵箱數據后執行相應操作,并將響應數據寫入輸入郵箱SM1。主站讀SM1,讀到有效數據后,根據響應數據判斷下載請求的執行結果。
2、緊急事件
緊急事件由設備內部得錯誤事件觸發,將診斷信息發送給主站。當診斷事件消失之后,從站應該將診斷事件和錯誤復位碼再發送一次。
SDO數據,1字節(控制字節),位4,完全操作(COMPLETE_ACCESS),0x00:操作由索引號和子索引號檢索的參數體;0x01:操作完整的數據對象,子索引應該為0或1(不包括子索引0)
在這里這個完全操作是什么作用?
總結
以上是生活随笔為你收集整理的mailbox 编程_往死里写——从站mailbox实现 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ES6-11(2015-2020)】特
- 下一篇: [2] ADB 基本用法