CANopen通訊協(xié)議介紹
總述
CANopen是一種架構(gòu)在控制局域網(wǎng)路(Control Area Network, CAN)上的高層通訊協(xié)定,包括通訊子協(xié)定及設(shè)備子協(xié)定常在嵌入式系統(tǒng)中使用,也是工業(yè)控制常用到的一種現(xiàn)場總線。
CANopen 實(shí)作了OSI模型中的網(wǎng)絡(luò)層以上(包括網(wǎng)絡(luò)層)的協(xié)定。CANopen 標(biāo)準(zhǔn)包括尋址方案、數(shù)個小的通訊子協(xié)定及由設(shè)備子協(xié)定所定義的應(yīng)用層。 CANopen 支援網(wǎng)絡(luò)管理、設(shè)備監(jiān)控及節(jié)點(diǎn)間的通訊,其中包括一個簡易的傳輸層,可處理資料的分段傳送及其組合。一般而言資料鏈結(jié)層及實(shí)體層會用CAN來實(shí)作。除了 CANopen 外,也有其他的通訊協(xié)定(如EtherCAT)實(shí)作 CANopen 的設(shè)備子協(xié)定。
基本的 CANopen 設(shè)備及通訊子協(xié)定定義在 CAN in AutomaTIon (CiA) draft standard 301. 中。針對個別設(shè)備的子協(xié)定以 CiA 301 為基礎(chǔ)再進(jìn)行擴(kuò)充。如針對 I/O 模組的 CiA401 及針對運(yùn)動控制的 CiA402。
設(shè)備模型
以下是所有 CANopen 設(shè)備都要具備的功能:
通訊單元 處理和網(wǎng)絡(luò)上其他模組通訊所需要的通訊協(xié)定。 設(shè)備的啟動及重置由狀態(tài)機(jī) (state machine)控制。狀態(tài)機(jī)需包括以下的幾個狀態(tài):IniTIalizaTIon, Pre-operaTIonal, Operational 及 Stopped。當(dāng)接收到網(wǎng)絡(luò)管理 (NMT) 通訊對象,狀態(tài)機(jī)會轉(zhuǎn)換到對應(yīng)的狀態(tài)。 對象字典 (Object Dictionary) 是一個有 16 位元索引 (Index) 的變量陣列。每個變量可以(但非必須)有 8 位元的子索引 (Subindex)。變量可用來調(diào)整設(shè)備的組態(tài),也可以對應(yīng)設(shè)備量測的資料或設(shè)備的輸出。 當(dāng)狀態(tài)機(jī)設(shè)定為 operational 之后,設(shè)備的應(yīng)用 (application) 部份就會實(shí)現(xiàn)設(shè)備預(yù)期的機(jī)能。此部份可以由對象字典中的變量調(diào)整其設(shè)定,而資料由通訊層傳收或接收。
對象字典
CANopen 設(shè)備都需要具備對象字典,用來設(shè)定設(shè)備組態(tài)及進(jìn)行非即時的通訊。對象字典的entry 定義如下:
索引 (Index):對象 16 位元的位址。 對象名稱 (Object name):一個代表對象的 symbolic type,可以是陣列、紀(jì)錄或只是一個變量。 名稱 (Name):描述此 entry 的字串。 形態(tài) (Type):變量的資料形態(tài)。 屬性 (Attribute):提供此 entry 是否可讀/可寫的資料,有下列四種:可讀/寫、只讀、唯寫、只讀常數(shù)。 必須 (Mandatory)/可選 (Optional)字段定義屬于特定設(shè)備規(guī)范下的設(shè)備,是否必須實(shí)現(xiàn)某些對象。 在 CANopen 標(biāo)準(zhǔn)中定義了對象字典中的基本資料型態(tài),包括邏輯值、整數(shù)及浮點(diǎn)數(shù)。也定義了復(fù)合對象:如陣列、記錄及字串。復(fù)合對象用一個 8 位元的數(shù)值作為其子索引(subindex)。記錄或陣列中子索引 0 的位置記錄此數(shù)據(jù)結(jié)構(gòu)的元素個數(shù),資料型態(tài)為 UNSIGNED8。
通訊
通訊對象
CANopen 的物理層 CANbus 每次傳送的資料量不大,其中包括 11 位元的 ID、遠(yuǎn)端傳輸請求(RTR)位元及大小不超過8位元的資料。CANopen 將 CANbus 11 位元的 ID 分為 4 位元的功能碼及 7 位元的 CANopen 節(jié)點(diǎn) ID。7 位元的 ID 共有 128 種不同的組合,其中 ID 0 不使用,因此一個 CANopen 網(wǎng)絡(luò)上最多允許 127 臺設(shè)備。CANbus 在 CAN 2.0 B 規(guī)格中允許 29 位元的 ID,因此若配合 CAN 2.0 B 使用,CANopen 網(wǎng)絡(luò)上可以超過127 臺設(shè)備,不過在實(shí)際運(yùn)用中,大多數(shù)的 CANopen 網(wǎng)絡(luò)上設(shè)備數(shù)量均低于此數(shù)值。
CANopen 將 CANbus 的 11 位元 ID 稱為通訊對象 ID (COB-ID)。當(dāng)傳輸資料出現(xiàn)碰撞時,CANbus 的仲裁機(jī)制會使 COS-ID 最小的訊息繼續(xù)傳送,不用等待或重傳。COB-ID 的前 4 個位元是 CANopen 的功能碼,因此數(shù)值小的功能碼表示對應(yīng)的功能重要,允許的延遲時間較短。
在 CANopen 標(biāo)準(zhǔn)中,部份 COB-ID 被保留作網(wǎng)絡(luò)管理及 SDO 通訊用。而在設(shè)備初始化后,有些功能碼和 COB-ID 會對映到標(biāo)準(zhǔn)的功能,不過后續(xù)仍可以規(guī)劃為其他用途。
通訊模型
CANopen 設(shè)備間的通訊可分為以下三種通訊模型。
在 master/slave 模型中,一個 CANopen 設(shè)備為 master,負(fù)責(zé)傳送或接收其他設(shè)備(稱為 slave)的資料。NMT 協(xié)定就使用了 master/slave 模型。 主從(client/server)模型定義在 SDO 協(xié)定中,SDO client 將對象字典的索引及子索引傳送給 SDO server,因此會產(chǎn)生一個或數(shù)個需求資料(對象字典中,索引及子索引對應(yīng)的內(nèi)容)的 SDO 封包。 生產(chǎn)者/消費(fèi)者(producer/consumer)模型 用在 Heartbeat and Node Guarding 協(xié)定。由一個生產(chǎn)者送出資料給消息者,同一個生產(chǎn)者的資料可能給一個以上的消息者。又可分為二種: push-model:生產(chǎn)者會自動送出資料給消費(fèi)者。 pull-model:消費(fèi)者需送出請求訊息,生產(chǎn)者才會送出資料。