CANopen

**CANopen** 是一種架構在控制器區域網路（Controller Area Network, CAN）上的高層通訊協定，包括通訊子協定及設備子協定常在嵌入式系統中使用，也是工業控制常用到的一種現場總線。

CANopen 實作了 OSI 模型中的網路層以上（包括網路層）的協定。CANopen 標準包括定址方案、數個小的通訊子協定及由設備子協定所定義的應用層。CANopen 支援網路管理、設備監控及節點間的通訊，其中包括一個簡易的傳輸層，可處理資料的分段傳送及其組合。一般而言資料鏈結層及實體層會用 CAN 來實作。除了 CANopen 外，也有其他的通訊協定（如 POWERLINK 及 EtherCAT）實作 CANopen 的設備子協定。

基本的 CANopen 設備及通訊子協定定義在 CAN in Automation (CiA) draft standard 301.。針對個別設備的子協定以 CiA 301 為基礎再進行擴充。如針對 I/O 模組的 CiA401 及針對運動控制的 CiA402。

## 設備模型

以下是所有 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（通訊行規區）。此區域的前幾項如下：

若配合適當的工具，可以用編輯電子資料表（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 頁框（frame）：

在 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 頁框的資料欄位內容如下：

* **ccs** 是 SDO 傳輸時 client 指令的識別碼，可分為以下幾種：
  * 0：SDO 區域下載
  * 1：啟始下載
  * 2：啟始上傳
  * 3：SDO 區域上傳
  * 4：中斷 SDO 傳輸
* **n** 為此訊息中實際資料的長度，只有在 e 和 s 設定時有效
* **e** 若設為 1，表示是快速傳輸（expedited transfer），目前訊息即包括了所有要傳輸的資料。若設為 0，表示要傳輸的資料無法用一個訊息傳送，會分割為數個訊息。
* **s** 若設為 1，且 **e** 也設為 1，表示資料長度記錄在 **n**。若 **e** 設為 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）使用。當同步消費者收到訊號，即可進行已規劃好的同步工作。

同步訊號會定時產生，若有 PDO 是由同步訊號引發，透過 PDO 傳送時間及同步訊號傳送週期之間的調整，可以使感測器定期的取様，而致動器也可以根據最新的輸入訊號產生對應的輸出。

在物件字典中，同步物件的索引為 0x1005，可透過編輯此物件啟動同步協定。

#### 時間標記物件（TIME）協定

一般而言，時間標記物件的內容是從 1984 年 1 月 1 日午夜之後到現在之間經過的時間，單位為毫秒。為一個 48 位元（6 位元組）的數值。

不過有些應用會要求時間要非常精確，這種情形會需要精準的同步，尤其是在大型網路，通訊速度受限時更是如此。此時需要將各設備的時鐘同步，精準度要到毫秒的等級。這個要求可透過高解析度的同步信號達成，在同步信號中也包括了另一種時間標記，可供各設備調整時鐘用。

同步信號中的時間標記型態為 unsigned32，單位為 1 毫秒，因此時間標記會在每 72 分鐘歸零重新計數。

#### 緊急物件（EMCY）協定

### 初始化

以下是在 master 初始化 2 個壓力感測器（ID 分別為 1 和 2）中，通訊的資料。

## 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 及通訊速度。

## 參照

* 控制器區域網路（CAN）
* DeviceNet（另一種使用 CAN 的工業通訊定）

## 參考資料

## 外部連結

* 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 的計劃（頁面存檔備份，存於網際網路檔案館）