CAN現場總線只定義了OSI網絡模型的第一層(物理層) 和第二層(數據鏈路層) ,而這兩層一般已被CAN硬件完全實現了。由於沒有規定應用層,本身並不完整,需要一個高層協議來定義CAN報文中的11/29位標識符和8字節數據的使用。而且,隨着CAN總線的廣泛應用,國內外很多公司都開發出使用CAN總線的控制設備,為了使各種CAN設備可以互相兼容,需要一個開放的、標准化的高層協議來實現各種CAN設備進行標准的、統一的通訊。
CANopen協議的子協議——實時伺服驅動和運動控制協議(CiA DSP402)是專門針對驅動裝置和運動控制裝置等運動控制系統的協議規范,該協議定義了伺服驅動器、變頻器和步進式電機控制器的功能特性,它還指定了多種操作模式和相應的組態參數。CANopen協議的特點尤其是 DSP402 子協議的針對性決定了其適用於分布式運動控制系統。CANopen協議目前還沒有開放的協議源代碼,用戶使用該協議時可以選擇購買或者根據自己的需求進行編程實現。
- CANopen和CAN報文關系
CAN 報文由7個不同的位域組成,而CANopen就是規定其中的仲裁域(11 位標識符) 和數據域(8 字節數據) 的使用情況
- 術語
COB —— 通訊對象,在 CAN 網絡上的一個傳輸單元。Communication object; a CAN message
SDO —— 服務數據對象,一種COB。主要用來在設備之間傳輸大的低優先級數據,典型的是用來配置CANopen網絡上的設備。
PDO —— 進程數據對象,一種COB。用來傳輸實時數據,比如控制命令、給定值和實際值。
EDS —— 電子數據表。 EDS 文件包含關於節點及其對象字典的信息。
NMT —— 網絡管理。它負責CAN 網絡上的初始化、配置和故障處理。
OD —— 對象字典。對象字典是所有數據結構的集合,這些數據涉及設備的應用程序、通信以及狀態機,對象字典利用對象來描述CANopen設備的全部功能。對象字典位於通信層和用戶層之間,它的作用主要是為用戶提供服務接口。
- COB-ID
CANopen 是一個基於 CAN (控制局域網)串行總線系統和 CAL( CAN 應用層)的高層協議。 CANopen 的核心概念是設備對象字典( OD: Object Dictionary),CANopen 通訊通過對象字典( OD)能夠訪問驅動器的所有參數。
COB-ID(通訊對象標識符)分配:
The type of COB transmitted is indicated in the arbitration field of the message, and thereby determines its priority. 注意:PDO/SDO 的發送/接受是由( slave)CAN節點方觀察的。即要發送SDO數據幀給設備(如驅動器),COB應為SDO-Receive類型。
- SDO
SDO 用來訪問一個設備的對象字典。訪問者被稱作客戶 (client),對象字典被訪問且提供所請求服務的 CANopen 設備別稱作服務器(server)。客戶端的 CAN 報文和服務器的應答CAN 報文長度為8個字節(注意不是所有的數據字節都包含有效信息,不夠8字節的要補0)。SDO主要用於CANopen主站對從節點的參數配置。服務確認是SDO的最大的特點,為每個消息都生成一個應答,確保數據傳輸的准確性。When using SDOs, it is important to remember that: An SDO has a lower priority than a PDO;An SDO session is not complete until it is confirmed.
SDO的通訊原則很簡單,發送方(客戶端)發送CAN-ID為600h+Node-ID的報文,其中Node-ID為接收方(服務器)的節點地址,數據長度均為8字節;接收方(服務器)成功接收后,回應CAN-ID為580h+Node-ID的報文。這里的Node-ID依然是接收方(服務器)的節點地址,數據長度均為8字節。如下圖所示。
SDO 有 2 種傳送機制:
1. 快速傳送(Expedited transfer) : 最多傳輸 4 字節數據
2. 分段傳送(Segmented transfer): 傳輸數據長度大於 4 字節
最常用最常見的SDO協議是快速SDO,所謂快速,就是1次來回就搞定。前提是讀取和寫入的值不能大於32位。通過快速SDO,可以直接對CANopen節點的對象字典中的值進行讀取和修改,所以在做參數配置之外,也經常作為關鍵性數據傳輸之用。比如CANopen控制機器人的電機轉動角度時,就使用SDO來傳輸,保證可靠到達。當需要傳輸的值超過32位時,就不能使用快速SDO傳輸。必須使用普通SDO進行分幀傳輸。在應用中較少用到,一般用於CANopen節點的程序固件升級,或者做網關轉換MVB總線之類數據最大可達256位的應用。
讀指令的詳細信息參考DS-301協議中的Chapter4.3 Initiate SDO Upload Protocol;寫指令參考Initiate SDO Download Protocol.
比如讀取設備對象字典0x1000處的內容(假設為32位數據0x00020192),發送的數據格式如下:
返回數據格式如下:
下面是寫指令的例子(假設設備節點地址為1,COB-ID = 功能碼 + 節點地址),在對象字典0x607F處寫入數據0x50000。0x22為SDO命令,具體代表的意思要參考DS301手冊
====================================================================================================================
注意:CANopen使用的是小端模式,即低位字節在前,高位字節在后!
錯誤報文代碼參考Abort SDO Transfer Protocol章節
參考: