工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

CANopen個人之所見,所想

CANopen個人之所見,所想

  TonyZhou: 一直想寫一篇關(guān)于CANopen的文章,鑒于個人知識能力沒有動筆,今天做了一番思想斗爭,斗膽發(fā)表一下自己對CANOPEN的膚淺認(rèn)識。

  計劃從銷售人員,技術(shù)人員角度都分析一下CANopen的優(yōu)勢,文章可能沒有什么章法,只是想到哪里說哪里,歡迎拍磚。

背景:CANopen四問

1. CANopen的起源,CANopen從何而來?

  德國Bosch公司于1983年研發(fā)CAN協(xié)議,用于汽車傳動系統(tǒng)的網(wǎng)絡(luò)通訊。之后稱為國際標(biāo)準(zhǔn)ISO11898,目前CANopen由非營利組織CiA(CAN in Automaion)進(jìn)行標(biāo)準(zhǔn)的起草及審核工作,基本的 CANopen 設(shè)備及通訊子協(xié)定定義在 CAN in Automation (CiA) draft standard 301. 中。針對個別設(shè)備的子協(xié)定以 CiA 301 為基礎(chǔ)再進(jìn)行擴充,如針對 I/O 模組的 CiA401 及針對運動控制的 CiA402。

2. CANopen硬件的優(yōu)勢?

   CAN協(xié)議最大的突出特點是錯誤檢測,限制和處理。當(dāng)CAN設(shè)備檢測到總線錯誤時,會拒絕之前接收到的位序列,然后發(fā)送“錯誤幀”,其完全由CAN芯片本身處理,不需要人為編程。

   支持多主站,類似Profibus DP,總線上每個設(shè)備都是主站,也是從站,免除了人為仲裁的過程,方便用戶開發(fā)。

   報文短幀結(jié)構(gòu),CAN報文通常只有8個字節(jié),數(shù)據(jù)幀非常短,在抗干擾能力上具有先天的優(yōu)勢。解釋一下,為什末短幀結(jié)構(gòu)抗干擾好?如果通訊報文長,發(fā)送一幀耗時也就長,加入遇到干擾,辛辛苦苦好不容發(fā)送了一條報文,結(jié)果因為干擾對方還沒有收到,只能嚎啕大哭。

  成本低廉,CAN外設(shè)基本在現(xiàn)在主流芯片上都可以找到,20幾塊錢的MCU都支持CAN外設(shè),有的還支持兩個CAN。這里有CiA的積極推廣作用。

3. CANopen軟件優(yōu)勢?

   CANopen主要有CiA在推廣,是非盈利組織,CANopen協(xié)議資料,網(wǎng)上一堆,任何人都可以下載到,我們常用的DS301(Draft Standand),DS402,CAN粉絲幾乎人手一本,猶如葵花寶典,一定要珍藏一本。

   CANopen協(xié)議開發(fā),開源項目非常多,CanFestival就是其中一個,我做過移植,在步科MT4414TE-CAN觸摸屏,用在8位單片機上,此源碼有點耗費資源,網(wǎng)上有很多基于MCU的精簡源碼。

   開發(fā)完整的CANopen協(xié)議棧,是很艱辛的工作,想要做好非常難。難點就在于你對CANopen協(xié)議的理解上,比如EMCY,復(fù)位節(jié)點,是否需要“NO Initialization”,heartbeat,Node guard是否需要?如何處理?這條不能算是其優(yōu)點。

4. 為什么如此多公司在推廣CANopen?

   CANopen對于運動控制來說是一款優(yōu)秀的通訊協(xié)議,采用了面向?qū)ο蟮囊恍┰O(shè)計思路,比如對象字典,過程數(shù)據(jù)對象(PDO),服務(wù)數(shù)據(jù)對象(SDO)等等。

   CANopen在歐洲已成為最普通的協(xié)議,任何一家自動化公司都有CANopen的通訊接口,也成了低配。低配并不代表不好,只是說明其性價比更高。CANopen定義了完整的同步控制機制,使其成為主流的運動控制協(xié)議,除了在CAN總線上運行外,還被搬到了以太網(wǎng)上(CANopen over Ethernet),形成了著名的PowerLink,EtherCat工業(yè)以太網(wǎng)協(xié)議。

   在這里多廢話幾句,所謂的運動控制總線標(biāo)準(zhǔn),沒有多大意義,因為運動控制技術(shù)都掌握在各個廠商手里,每一個稍微大一點的廠商,都有自己的專用運動控制協(xié)議,如三菱的SSCNET,安川的MECHATROLINK,倍福的CANOPEN以及EtherCat,施耐德的CANopen,西門子的SiMotion,貝加萊的PowerLink,博世力士樂的SERCOS。

   由于CANopen(可以看DS402,伺服控制標(biāo)準(zhǔn))在運動控制的優(yōu)勢,尤其是同步控制,不管幾流的廠商,在運動控制系統(tǒng)中,多多少少都加入了自己的東西,導(dǎo)致運動控制系統(tǒng)通常是封閉的,很少走互聯(lián)路線,事實上要做到互聯(lián)也非常困難。

   二三流廠家,開發(fā)自己的CANopen協(xié)議,根據(jù)自己的需求,將其移至到不同的物理層上去運行,形成自己的運動控制系統(tǒng),其性能優(yōu)劣就在于其對CANopen協(xié)議的理解程度了。

基礎(chǔ):CANopen世界里的九個晦澀概念

1. DCF

   是CAN網(wǎng)絡(luò)的配置(Config)的數(shù)據(jù)存檔文件。其作用不大,在Codesys軟件里就有此選項。

2. EDS

   電子數(shù)據(jù)表格,是描述一臺從站設(shè)備的屬性,參數(shù)的文件,是對從站設(shè)備對象字典的描述。比如一臺伺服驅(qū)動器,如果其內(nèi)部參數(shù)(每個參數(shù)對應(yīng)對象字典中的一個位置,由index,sub-index決定)沒有更改,其對應(yīng)的EDS文件就不會更改。多說一句,不是所有的主控制器都需要使用EDS,比如Beckhoff就不需要,他需要你對CANopen DS301,DS402足夠熟悉,人工對齊配置;步科FD,JD伺服按照DS402標(biāo)準(zhǔn)制定EDS文件,用戶可直接配置,降低開發(fā)周期。

3. 復(fù)位節(jié)點

   當(dāng)設(shè)備遇到異常(如從站斷線后重連,使用M258測試步科FD伺服),主控會發(fā)送“復(fù)位節(jié)點”,步科的ED伺服復(fù)位節(jié)點,驅(qū)動器恢復(fù)出廠值,而且連CAN通訊參數(shù)也恢復(fù)成默認(rèn)值。FD,JD伺服是除了CAN通訊參數(shù)外,其他配置參數(shù)恢復(fù)出廠值。

4. EMCY

   緊急報文,從站如伺服,在斷電后會發(fā)送一條緊急報文,告訴主控其狀態(tài),一般伺服斷電后,其電容電量能保證其發(fā)送該條報文。

5. 心跳,節(jié)點保護(hù)

   配置心跳參數(shù),設(shè)置心跳周期,心跳消費時間,這個消費者時間實際上是作為一個超時參數(shù)。主站收到一個心跳后,開始計時,如果在超時時間內(nèi)沒有收到下一個心跳,則認(rèn)為從站離線,并報告錯誤,按照用戶配置的錯誤處理方法處理。

網(wǎng)絡(luò)中的每個節(jié)點都可以配置心跳,主站可以監(jiān)聽從站,從站可以監(jiān)聽主站,從站還可以監(jiān)聽從站。這里有一個生產(chǎn)者、消費者的概念,總線上的設(shè)備定義自己是心跳的生產(chǎn)者,還是消費者。生產(chǎn)者產(chǎn)生心跳,消費者監(jiān)聽心跳,然后在捕捉到異常后?做出對應(yīng)的處理。

   個人認(rèn)為心跳作用不大,假設(shè)某個設(shè)備斷線,重連后復(fù)位節(jié)點,而此設(shè)備剛好是使用了原點功能的伺服呢?斷電上電后,原點位置改變。所以在一些客戶應(yīng)用中,出現(xiàn)此情況,小伙子,你麻利的,趕快斷電重啟吧。

   節(jié)點保護(hù),其作用類似心跳,但可以讀取從站設(shè)備的CANopen通訊狀態(tài)(初始化,預(yù)操作,操作中,停止),屬于DS301的范疇。

6. DS301和DS402的區(qū)別

   DS301就是一個通訊協(xié)議棧,DS402是建立在DS301的上層協(xié)議,屬于伺服類的控制協(xié)議,協(xié)議中規(guī)定好每個對象字典值得作用,比如0x6040,是控制字。DS402把一個伺服應(yīng)該具有的功能都定義好了,開發(fā)廠家按照協(xié)議定義即可。

7. 對象字典

   從軟件的角度來說,對象字典本質(zhì)就是一些數(shù)據(jù)結(jié)構(gòu)的集合。可以這么理解,把對象字典看做是一本書,CANopen設(shè)備的行為準(zhǔn)則是要參考這本書的,不管它做什么,只要它的行為要參考對象字典,就必須先查閱字典,再決定要不要做。比如它什么時候發(fā)送TPDO,這個行為是需要查詢對象字典中對應(yīng)于TPDO的傳輸類型以及Event timer。還有就是像PDO映射的原理,比如我要發(fā)送的數(shù)據(jù),都是去查詢這本書,看下它那里寫的什么內(nèi)容,然后我在把這部分內(nèi)容以PDO的形式發(fā)送出去。

   例如你的程序收到了一筆CAN報文,由于可以訪問對象字典的對象是SDO,首先要判斷它是SDO對象,那么你的程序就需要按照SDO中指定的索引和子索引去查找對象字典(一個排好序的數(shù)據(jù)結(jié)構(gòu)集),找到相應(yīng)的對象后按照SDO中的指令去操作這個對象,例如把一個值賦給字典中的變量。

8. SDO

  這個很簡單,就是類似串口的一發(fā)一回模式,主站發(fā)送請求幀,從站回復(fù)應(yīng)答幀。

  大家看幾個例子就明白了。

To write the 1 byte data : 0xFD in the object dictionary of node 5, at index 0x1400, subindex 2, sends :

605 2F 00 14 02 FD 00 00 00

If success, the node 5 responds :

585 60 00 14 02 00 00 00 00

To write the 4 bytes data : 0x60120208 in the object dictionary of node 5, at index 0x1603, subindex 1, sends :

605 23 03 16 01 08 02 12 60

If success, the node 5 responds :

585 60 03 16 01 00 00 00 00

9. PDO

分為TX-PDO,RX-PDO。

上圖,這就是PDO的配置過程,0x1402(接收PDO通訊參數(shù)),PDO使用的cob-id,傳輸類型,Inhibit time,EventTimer。

0x1602(映射對象),上例中映射為Controlword,Target position。

這里著重講一下Transmission Type,上述是codesys中支持的集中方式:

acyclic sync(數(shù)值為0):同步PDO,同步方式由具體設(shè)備協(xié)議定義

Cyclic sync(數(shù)值為1-240):同步PDO,每個N個SYNC周期后,發(fā)送PDO

Sync rtr(數(shù)值253):同步PDO,收到遠(yuǎn)程幀請求后發(fā)送PDO

Async(數(shù)值253):異步PDO,收到遠(yuǎn)程幀后發(fā)送PDO

最后兩個Async(254,255),都是設(shè)備廠家定義的,也是大家最常用的,當(dāng)事件發(fā)生時發(fā)送。各個廠家在這里基本都是使用數(shù)據(jù)變化時發(fā)送方式,F(xiàn)D,JD伺服兩種方法是一樣的,都是數(shù)據(jù)變化發(fā)送。要注意設(shè)置“禁止時間”,降低CANOPEN通訊帶寬。

具體案例

主控制器寫target position,mode of operation給伺服,此PDO的cob-id為0x200 node id。傳輸方式為255或者254,禁止時間為100,也就是10ms。

   先寫到這里吧,看看反響再寫下篇文章(想寫寫codesys與CANopen)。此文得到了步科孫志武的修正,溝通了心跳報文和節(jié)點復(fù)位,再次表示感謝。歡迎智友留言交流,拍磚狠砸!

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

步科iWMC集成式伺服輪模組

智能生物存儲設(shè)備,成為抗疫堅強后盾!|行業(yè)案例

高歌猛進(jìn)|步科股份榮獲工控網(wǎng)CAIMRS“年度十佳企業(yè)”獎!

沒有廚師的面館,煮面全程絲滑!|行業(yè)案例

快來B站學(xué)習(xí)!您訂閱的步科培訓(xùn)課已更新