CANopen
CANopen是一種架構在控制器區域網路(Controllor Area Network, CAN)上的高層通訊協定,包括通訊子協定及設備子協定常在嵌入式系統中使用,也是工業控制常用到的一種現場總線。
CANopen 實作了OSI模型中的網路層以上(包括網路層)的協定。CANopen 標準包括定址方案、數個小的通訊子協定及由設備子協定所定義的應用層。 CANopen 支援網路管理、設備監控及節點間的通訊,其中包括一個簡易的傳輸層,可處理資料的分段傳送及其組合。一般而言資料鏈結層及實體層會用CAN來實作。除了 CANopen 外,也有其他的通訊協定(如EtherCAT)實作 CANopen 的設備子協定。
基本的 CANopen 設備及通訊子協定定義在 CAN in Automation (CiA) draft standard 301.[1]。針對個別設備的子協定以 CiA 301 為基礎再進行擴充。如針對 I/O 模組的 CiA401[2]及針對運動控制的 CiA402[3]。
目录 |
設備模型 [编辑]
以下是所有 CANopen 設備都要具備的功能:
- 通訊單元 處理和網路上其他模組通訊所需要的通訊協定。
- 設備的啟動及重置由狀態機 (state machine)控制。狀態機需包括以下的幾個狀態:Initialization, Pre-operational, Operational 及 Stopped。當接收到網路管理 (NMT) 通訊物件,狀態機會轉換到對應的狀態。
- 物件字典 (Object Dictionary) 是一個有 16 位元索引 (Index) 的變數陣列。每個變數可以(但非必須)有 8 位元的子索引 (Subindex)。變數可用來調整設備的組態,也可以對應設備量測的資料或設備的輸出。
- 當狀態機設定為 operational 之後,設備的應用 (application) 部份就會實現設備預期的機能。此部份可以由物件字典中的變數調整其設定,而資料由通訊層傳收或接收。
物件字典 [编辑]
CANopen 設備都需要具備物件字典,用來設定設備組態及進行非即時的通訊。物件字典的entry 定義如下:
- 索引 (Index):物件 16 位元的位址。
- 物件名稱 (Object name):一個代表物件的 symbolic type,可以是陣列、紀錄或只是一個變數。
- 名稱 (Name):描述此 entry 的字串。
- 形態 (Type):變數的資料形態。
- 屬性 (Attribute):提供此 entry 是否可讀/可寫的資料,有下列四種:可讀/寫、唯讀、唯寫、唯讀常數。
- 必須 (Mandatory)/可選 (Optional)欄位定義屬於特定設備規範下的設備,是否必須實現某些物件。
在 CANopen 標準中定義了物件字典中的基本資料型態,包括邏輯值、整數及浮點數。也定義了複合物件:如陣列、記錄及字串。複合物件用一個 8 位元的數值作為其子索引(subindex)。記錄或陣列中子索引 0 的位置記錄此資料結構的元素個數,資料型態為 UNSIGNED8。
例如在 CiA301 標準中,設備通訊的參數放在索引範圍 0x1000 - 0x1FFF (通訊行規區)。此區域的前幾項如下:
| 索引 | 物件名稱 | 名稱 | 形態 | 屬性 | M/O |
|---|---|---|---|---|---|
| 0x1000 | VAR | device type | UNSIGNED32 | 唯讀 | M |
| 0x1001 | VAR | error register | UNSIGNED8 | 唯讀 | M |
| ... | |||||
| 0x1008 | VAR | manufacturer device name | Vis-String | 常數 | O |
| ... |
若配合適當的工具,可以用編輯電子資料表(electronic data sheet, EDS)檔案的方式規劃一個設備,並且將變數的數值上傳到設備中。EDS 檔案的格式通常會是INI檔。
通訊 [编辑]
通訊物件 [编辑]
CANopen 的物理層 CANbus 每次傳送的資料量不大,其中包括 11 位元的 ID、遠端傳輸請求(RTR)位元及大小不超過8位元組的資料。CANopen 將 CANbus 11 位元的 ID 分為 4 位元的功能碼及 7 位元的 CANopen 節點 ID。7 位元的 ID 共有 128 種不同的組合,其中 ID 0 不使用,因此一個 CANopen 網路上最多允許 127 台設備。CANbus 在 CAN 2.0 B 規格中允許 29 位元的 ID,因此若配合 CAN 2.0 B 使用,CANopen 網路上可以超過127 台設備,不過在實際運用中,大多數的 CANopen 網路上設備數量均低於此數值。
CANopen 將 CANbus 的 11 位元 ID 稱為通訊物件 ID (COB-ID)。當傳輸資料出現碰撞時,CANbus 的仲裁機制會使 COB-ID 最小的訊息繼續傳送,不用等待或重傳。COB-ID 的前 4 個位元是 CANopen 的功能碼,因此數值小的功能碼表示對應的功能重要,允許的延遲時間較短。
以下是一個標準的 CANopen 頁框:
| COB-ID | RTR | 資料長度 | 資料 | ||
|---|---|---|---|---|---|
| 功能碼 | 節點 ID | ||||
| 長度 | 4 位元 | 7 位元 | 1 位元 | 4 位元 | 0-8 位元組 |
在 CANopen 標準中,部份 COB-ID 被保留作網路管理及 SDO 通訊用。而在設備初始化後,有些功能碼和 COB-ID 會對映到標準的功能,不過後續仍可以規劃為其他用途。
通訊模型 [编辑]
CANopen 設備間的通訊可分為以下三種通訊模型。
- 在主從 master/slave 模型中,一個 CANopen 設備為 master,負責傳送或接收其他設備(稱為 slave)的資料。NMT 協定就使用了 master/slave 模型。
- 客户端/服务器(client/server)模型定義在 SDO 協定中,SDO client 將物件字典的索引及子索引傳送給 SDO server,因此會產生一個或數個需求資料(物件字典中,索引及子索引對應的內容)的 SDO 封包。
- 生產者/消費者(producer/consumer)模型 用在 Heartbeat and Node Guarding 協定。由一個生產者送出資料給消費者,同一個生產者的資料可能給一個以上的消費者。又可分為二種:
- push-model:生產者會自動送出資料給消費者。
- pull-model:消費者需送出請求訊息,生產者才會送出資料。
协议 [编辑]
NMT 协议 [编辑]
NMT(網路管理, Network management)协议是用来发布(設備內部)狀態機的狀態變更命令(如啟動設備或停止設備)、以及监测遠端設備启动及故障情形。
NMT master 使用的模組控制協定可變更設備的狀態。其 COB-ID 為 0,其功能碼及節點 ID 均為 0,因此網路上的所有節點均會處理這個訊息。在此訊息的資料部份會有此訊息實際針對節點的ID,此 ID 也可為 0,表示所有節點都要變更為指定的狀態。
心跳協定(Heartbeat protocol)是用來監控網路中的節點及確認其正常工作。心跳訊息的生產者(一般是 slave 設備)週期性的送出功能碼 1110、ID 為本身節點 ID 的訊息,訊息的資料部份有一個表示節點狀態的位元。而心跳訊息的消費者負責接收上述資料,若在指定時間(於設備的物件字典中定義)內,消費者均未收到訊息,可採取相關行動(例如顯示錯誤或重置該設備)。
其格式為:
COBID + DATA(status of node)
CANopen 設備需要在 bootup 時自動從 Initializing 狀態切換至 Pre-operational 狀態,設備會在切換完成後送出一個心跳訊息,這就是心跳協定。
有一種 pull model 的 NMT 協定,稱作節點監控(Node guarding)協定,也可以作從機的監控。
服務資料物件 (SDO) 協定 [编辑]
服務資料物件(SDO)可用來存取遠端節點的物件字典,讀取或設定其中的資料。提供物件字典的節點稱為SDO server,存取物件字典的節點稱為SDO client。SDO 通訊一定由SDO client 開始,並提供初始化相關的參數。
在CANopen的術語中,上傳是指由 SDO server 中讀取資料,而下載是指設定 SDO server 的資料。
由於物件字典中的資料長度可能超過 8 個位元組,無法只用一個 CAN 頁框傳輸, SDO 也支援長訊息的分割(segmentation)和合併(desegmentation)。這樣的物件有二種:SDO 下載/上傳(SDO download/upload)及SDO 區塊下載/上傳(SDO Block download/upload)。CANopen 協定較新版本支援SDO區塊傳輸,可以允許傳輸大量的資料,且傳輸的 overhead 可以較低。
負責處理 SDO 資料傳輸的 COB ID 可在物件字典中設定。在物件字典的索引 0x1200 至 0x127F 可設定 SDO server 的 COB ID,最多可設定到 127 個。而 SDO client 可以在物件字典的索引 0x1280 至 0x12FF 中設定。不過預定義連結(pre-defined connection set)定義在開機後(Pre-operational 狀態)可用來設定設備組態的 SDO。接收用的 COB ID 為 0x600 + 節點 ID,而傳送用的 COB 為 0x580 + 節點 ID。
以下用 SDO 下載來說明 SDO 的協定,SDO client 在要啟始下載時,會送出 CAN 訊息,其 ID 為接收端 SDO channel 的 COB ID,而 CAN 頁框的資料欄位內容如下:
| CAN 頁框的資料欄位 | |||||||
|---|---|---|---|---|---|---|---|
| 位元組 1 | 位元組 2-3 | 位元組 4 | 位元組 5-8 | ||||
| 3 位元 | 1 位元 | 2 位元 | 1 位元 | 1 位元 | |||
| ccs=1 | 接收(=0) | n | e | s | 索引 | 子索引 | 資料 |
- ccs 是 SDO 傳輸時 client 指令的識別碼,可分為以下幾種:
- 0:SDO區域下載
- 1:啟始下載
- 2:啟始上傳
- 3:SDO區域上傳
- 4:中斷SDO傳輸
- n為此訊息中實際資料的長度,只有在e和s設定時有效
- e若設為1,表示是快速傳輸(expedited transfer),目前訊息即包括了所有要傳輸的資料。若設為0,表示要傳輸的資料無法用一個訊息傳送,會分割為數個訊息。
- s若設為1,且e也設為1,表示資料長度記錄在n。若n設為0,表示實際完整資料的長度會放在此訊息中的資料欄位中。
- 索引是要存取資料的物件字典索引。
- 子索引是要存取變數的子索引。
- 資料在快速傳輸(e=1)時是要上傳的資料,若s=1且e=0,則是實際資料的長度。
进程数据对象 (PDO) 協定 [编辑]
进程数据对象 (PDO) 協定可用來在許多節點之間交換即時的資料。可透過一個 PDO ,傳送最多 8 位元組(64位元)資料給一設備,或由一設備接收最多 8 位元組(64位元)的資料。一個 PDO 可以由物件字典中幾個不同索引的資料組成,規劃方式則是透過物件字典中對應 PDO mapping 及 PDO 參數的索引。
PDO 分為兩種:傳送用的 TPDO 及接收用的 RPDO。一個節點的 TPDO 是將資料由此節點傳輸到其他節點,而 RPDO 則是接收由其他節點傳輸的資料。一個節點分別有 4 個 TPDO 及 4 個 RPDO 。
PDO 可以用同步或非同步的方式傳送:同步的 PDO 是由 SYNC 訊息觸發,而非同步的 PDO 是由節點內部的條件或其他外部條件觸發。例如若一個節點規劃為允許接受其他節點產生的 TPDO 請求,則可以由其他節點送出一個沒有資料但有設定 RTR 位元的 TPDO(TPDO 請求),使該節點送出需求的資料。
藉由 RPDO 也可以使兩個或兩個以上的設備同時啟動。只要將其 RPDO 對應到相同的 TPDO 即可。
同步 (SYNC) 協定 [编辑]
同步協定使用生產者/消費者模型。同步生產者(Sync-Producer)會定時產生同步信號供同步消費者(Sync-Consumer)使用。當同步消費者收到信號,即可以進行已規劃好的同步工作。[4]
同步信號會定時產生,若有 PDO 是由同步信號引發,透過 PDO 傳送時間及同步信號傳送週期之間的調整,可以使感測器定期的取様,而致動器也可以根據最新的輸入信號產生對應的輸出。
在物件字典中,同步物件的索引為 0x1005,可透過編輯此物件啟動同步協定。
時間標記物件 (TIME) 協定 [编辑]
一般而言,時間標記物件的內容是從1984年1月1日午夜之後到現在之間經過的時間,單位為毫秒。為一個48位元(6位元組)的數值。
不過有些應用會要求時間要非常精確,這種情形會需要精準的同步,尤其是在大型網路,通訊速度受限時更是如此。此時需要將各設備的時鐘同步,精準度要到毫秒的等級。這個要求可透過高解析度的同步信號達成,在同步信號中也包括了另一種時間標記,可供各設備調整時鐘用。
同步信號中的時間標記型態為 unsigned32,單位為 1 毫秒,因此時間標記會在每 72 分鐘歸零重新計數。
緊急物件 (EMCY) 協定 [编辑]
初始化 [编辑]
以下是在master初始化2個壓力感測器(ID 分別為 1 和 2)中,通訊的資料。
| CAN ID | 資料長度 | 資料 | 說明 |
|---|---|---|---|
| 0x0 | 2 | 1 0 | master 將系統設定為 operational mode |
| 0x80 | 0 | Master 送出 SYNC 訊息,使設備送出資料 | |
| 0x181 | 4 | CD 82 01 00 | ID 1 的節點 (CID-0x180),讀到的壓力為 0x0182CD(99021) 帕 |
| 0x182 | 4 | E5 83 01 00 | ID 2 的節點 (CID-0x181),讀到的壓力為 0x018E5(99301) 帕 |
CANopen 專有名詞 [编辑]
- PDO 程序資料物件 - 對應實際物理量的輸入及輸出。資料的單位可能是 RPM, V, Hz, mAmp...。
- SDO 服務資料物件 - 一般來說是組態設定的資料,如節點位置、節點ID、通訊速度、位移、增益等……。
- COB-ID - CAN 物件編號
- CAN ID - CAN Identifier. 是在每個 CAN 訊息前面的訊息識別碼,共 11 位元。
- EDS - 電子資料檔(Electronic data sheet)是 INI 格式的檔案。
- DCF - 設備組態檔案(Device configuration file),是加強版的 EDS,可以設定節點 ID 及通訊速度。
參照 [编辑]
參考資料 [编辑]
- ^ CiA Draft Standard 301,在 CAN in Automation 網站上
- ^ CiA Draft Standard 401
- ^ CiA Draft Standard 402
- ^ SYNC protocol. CAN in Automation(CiA). [2009-08-04].
外部連結 [编辑]
- CAN in Automation 的 CANopen 簡介
- CANopen 簡介 (www.esacademy.com)
- CANopen 的教學網頁 (softing.com)
- CANopen 開發資料 (canopendesign.com)
- CAN-wiki 中 CANopen 的頁面
- CANopen: An Introduction
- 關於 About CANopen (canopensolutions.com)
- CANopen-Lift 社群的 WIKI
- Introduction to CANopen 基礎介紹 (www.canopen-solutions.com)
- CanFestival - 一個開放源碼多平台 CANopen 的計劃