1 引言
在上期文章中我們了解了一種嵌入式CANopen協議轉換模塊及其使用方法,本期文章將介紹一種支持二次開發的CANopen從站模塊的使用方法。
CANopen協議作為CAN總線的應用層協議,擁有復雜的網絡管理(Network Management)、實時過程數據對象(Process Data Object)、服務數據對象(Service Data Object)、預定義連接和特殊功能對象等基本功能,另外CANopen協議還定義了指示燈規范、通信安全架構、在線配置、EDS文件規范、標準設備規范等一系列的協議規范。因此開發基于CANopen協議的設備有著非常高的難度以及較長的開發周期。
2 TinyARM簡介
TinyARM模塊內置了CANopen從站協議,為用戶靈活快速設計CANopen從站,構建符合國際標準的工業現場總線及分布式網絡提供了更多、更好的選擇。TinyARM模塊外觀如圖1所示。

TinyARM CANopen從站模塊提供了網絡管理(NMT)、實時數據發送(TPDO)、實時數據接收(RPDO)、服務數據對象(SDO/Server)、同步報文(SYNC)、緊急事件(EMCY)等支持,同時還能夠根據需求支持不同的協議描述規范。使用Tiny-
ARM CANopen從站模塊可快速開發基于CANopen協議的控制設備、數據采集設備等,配合CANopen系列主站設備組建CANopen網絡,迅速搭建工業現場總線分布式監控系統。
3 TinyARM CANopen協議棧配置
TinyARM是一款可二次開發的嵌入式模塊,提供API函數庫。CANopen協議棧也是以API函數庫形式提供,使開發者在開發CANopen設備的時候使用起來非常方便。由于CANopen協議棧會使用到相應的硬件資源,因此開發者首先需要配置CANopen協議棧硬件資源,例如CANopen RUN和ERROR指示燈所對應的I/O端口等,正確的硬件配置可使協議棧穩定可靠地運行。
3.1 CANopen協議棧硬件資源配置
(1)指示燈端口配置
按照CANopen協議DS303-3的定義,CANopen從站需要使用兩種顏色的LED指示燈來指示運行和錯誤狀態,運行指示燈使用綠色,錯誤指示燈使用紅色,根據實際硬件來設置LED控制端口。協議棧通過調用如表1所示的3個函數來實現,配置文件與協議棧結構如圖2所示。

(2)參數存儲函數
參數存儲相對來說更復雜一些,需要根據實際硬件條件來修改相應的實現函數,其中的_TgtCavInit、_TgtCavOpen、_TgtCavClose、_TgtCavDelete、_TgtCavCreate、_TgtCavShutDown等函數執行對存儲器進行初始化或關閉存儲器等操作,在協議棧初始化或關閉時被調用。函數_TgtCavStore、_TgtCavRestore主要負責參數的存儲與讀取,CANopen協議棧的參數存儲以對象字典為最小單位,每存儲或恢復一次對象字典的參數都會調用存儲或恢復參數函數,存儲、恢復函數與協議棧的關系如圖2所示。
3.2 設計對象字典
設計CANopen的對象字典主要分為以下兩個步驟,其與協議棧結構關系如圖2所示。
(1)生成對象字典
對象字典是CANopen的核心,不同的設備描述規范或不同的應用就有不同的對象字典,因此對于一款能支持二次開發的模塊來說,根據具體需求生成相應的對象字典也是必不可少。TinyARM 中的CANopen對象字典可以通過ODBuilder軟件來生成,生成的對象字典為3個標準C文件,文件名分別為:obdcfg.h,、objdict.c、objdict.h,把工程中的同名文件覆蓋即可將CANopen的對象字典項目更改為新設定的對象字典項目,CANopen所支持的設備規范也可隨之改變。
(2)對象字典的變量定義
對于對象字典索引在0x1000~0x1FFF范圍內的對象字典,其變量存儲地址已經在協議棧中預定義,不需要開發者再次定義。索引在0x2000~0x9FFF之間的索引,需要重新映射變量地址,否則對象字典無法正確存儲數據。在TinyARM CANopen中,為了使開發者方便映射對象字典變量,在文件名為usrcoppardef.c的文件中定義了一個參數數組__VarTabg,將需要定義的對象字典變量地址添加到該表格中即可,其格式與使用示例如圖3所示。

3.3 預定義連接設置
在CANopen運行時通常采用DS301所建議的預定義連接COB-ID(通信對象標識),其中預定義連接集包括PDO、SDO、NMT、SYNC以及EMCY等服務。協議棧在啟動時已經將(除RPDO和TPDO以外)一些服務的COB-ID設定為預定義連接,開發者只需要重新設定RPDO和TPDO的預定義連接即可。同樣開發者只需要在PDO預定義表格中添加項目即可,實現示例如圖4所示。

4 TinyARM CANopen API函數編程
如圖5所示為CANopen協議棧工作流程圖,其中CopInit為初始化CANopen協議棧,CopBootUp發送CANopen啟動信息并且進入預操作狀態,CopThread 為CANopen協議棧線程函數,需要應用程序循環調用。開發者可以通過CopODRead和CopODWrite對對象字典進行讀寫操作。

實現實例:圖6展示了如何啟動CANopen協議棧并使之處于運行狀態。

開發者利用TinyARM CANopen可完全自主進行二次開發,方便地實現各種標準CANopen從站設備。例如,數字量輸入輸出設備、電機控制設備、數字傳感器設備、織布機設備、充電設備等各種設備。使開發者在最短的時間內開發出CANopen從站設備,搶占市場先機。
廣州致遠電子有限公司提供各種接口的CANopen接口卡、CANopen終端設備(包括數據采集,電機控制等)、CANopen分析儀、網關及網橋、OPC服務器以及基于CANopen協議的整套組網方案及應用開發。
