很長一段時間以來,很多人問我CANopen總線優(yōu)勢到底在什么地方,我也大體的給了口頭的講述,但是比較籠統(tǒng),沒辦法做到詳細(xì)解釋,加上純技術(shù)的話語比較晦澀,遇上內(nèi)行還能多聊幾句,如果是剛接觸的,那就是云里霧里了。這次正好要進(jìn)行公司業(yè)務(wù)員培訓(xùn),要講講CANopen,在整理過程中把我的講義貼出來,希望能幫到大家,以下內(nèi)容是我講課的口述內(nèi)容,比較白話,不能作為資料,大家見諒,鑒于我整理也比較辛苦,也算個小小的知識產(chǎn)權(quán),所以PPT我就不貼出來了。^-^
講義內(nèi)容: 通常CANopen協(xié)議相關(guān)的一些資料相對來說比較晦澀,非專業(yè)人士看起來比較困難。我盡量以淺顯易懂的方式將CANopen協(xié)議的框架和它在實(shí)際應(yīng)用中存在的優(yōu)缺點(diǎn)展示給大家。 我按照最先接觸的內(nèi)容由淺入深的講解,直接講CANopen協(xié)議會有點(diǎn)跳躍的感覺,所以,我以產(chǎn)品作為切入點(diǎn),分析一下如何使用,在這個過程中,讓大家理解什么是CANopen協(xié)議。首先,我們拿到一個產(chǎn)品,比方說是編碼器,它的用途是作為位置傳感器,那我們就需要將編碼器送出的數(shù)據(jù)進(jìn)行采集。一般自然界中存在的信號有多種形式,大多以模擬量形式存在,類似于人感覺到溫度的高低、水流的快慢、風(fēng)力的大小等等。但這是很模糊的概念,今天熱了還是冷了,風(fēng)大風(fēng)小,沒有比較是很難界定的,為了規(guī)范這些量,方便描述時的統(tǒng)一性,溫度計(jì)量標(biāo)準(zhǔn)有華氏和攝氏、水流有每秒多少立方、風(fēng)力有級數(shù)。這些,就是數(shù)字量。數(shù)字量在人與人之間傳遞時,可以通過嘴和耳,語言和聽力,在設(shè)備之間如何來傳遞呢?學(xué)過數(shù)電的人知道,燈泡有兩種狀態(tài),亮和暗,在最基礎(chǔ)的電路回路里,“通”和“斷”是兩個最基本的狀態(tài),我們可以把他理解為“1”和“0”,這樣,就有了表述的方法。但是單獨(dú)使用這兩種狀態(tài)是無法傳遞信息的,如何把編碼器的數(shù)據(jù)傳遞出去,就需要使用到協(xié)議,下面我就講講協(xié)議。 我們知道,人與人交流需要用到語言,我們要表達(dá)出一個完整的意思就要使用一句話,一句話內(nèi)會包含很多的字,每個字又由筆畫構(gòu)成。這樣,我們協(xié)議的基本框架就出來了,在整個CANopen協(xié)議傳遞過程中,最大的單位稱為“幀”,類似于一句話,“幀”由“字節(jié)”組成,就代表了字,每個“字節(jié)”由“位”組成,我們稱為筆畫。那地球上還有英語、法語、德語、還有聽不懂的鳥語呢!那就是各個通訊協(xié)議,比如Profibus-DP、DeviceNet、CC-Link、Hart、Modbus等。讓DP和CANopen通訊,那就是相當(dāng)于一個講德語的與講中文的對話,雞同鴨講,能溝通嗎?需要翻譯,對吧?;剡^頭來我們講講CANopen的幀格式,CANopen一幀數(shù)據(jù)由一個COB-ID(報(bào)文頭)和最大8字節(jié)數(shù)據(jù)組成,其中COB-ID可以是11位(CAN2.0),也可以是29位(CAN2.0B),當(dāng)然,CAN2.0B需要向下兼容11位CAN報(bào)文。對于每字節(jié)數(shù)據(jù)由哪些位組成,這里就不再贅述,因?yàn)檫@部分內(nèi)容不在OSI模型的第七層應(yīng)用層內(nèi)描述,開發(fā)人員也不必過多考慮這塊內(nèi)容。由于CANopen協(xié)議內(nèi)對COB-ID的各個地址段報(bào)文有詳細(xì)規(guī)范,這里就花點(diǎn)時間講一下,當(dāng)然也沒時間全部討論,只選一些重要內(nèi)容來說。 以前我們培訓(xùn)一直在說CANopen協(xié)議好,速度快,廣播報(bào)文,這些關(guān)鍵字聽的多了,但是大家可能不是很理解這些內(nèi)容。現(xiàn)在就來解釋一下。在編碼器應(yīng)用中,CAN報(bào)文我們常用的有SDO(Service Data Object服務(wù)數(shù)據(jù)對象)和PDO(Process Data Object過程數(shù)據(jù)對象),從字面描述意義看,通常數(shù)據(jù)的發(fā)送讀取是采用PDO來實(shí)現(xiàn)的,CAN參數(shù)的修改是通過SDO來實(shí)現(xiàn)的(當(dāng)然這不是絕對的,具體的如果有興趣可以會后詢問)。先來說說PDO,我們在很多資料上會看到這樣一張表
注意:PDO/SDO 發(fā)送/接收是由(slave)CAN節(jié)點(diǎn)方觀察的 表一:CANopen主/從連接集對象
假設(shè)我們讀取到一組編碼器數(shù)據(jù)是這樣的《0x181 0x30 0x1F 0x00 0x00》,我們應(yīng)該如何理解呢?首先,“0x”只是一個符號,它代表了緊跟著的數(shù)據(jù)是十六進(jìn)制的(等同于在數(shù)據(jù)后面直接標(biāo)“H”,上述表達(dá)式也可以表述為《181H 30H 1FH 00H 00H》),“181”我們查看上表后發(fā)現(xiàn),它包含在PDO1(發(fā)送)里面,它代表了是由編碼器發(fā)出的過程數(shù)據(jù)對象,表上顯示是“181H~1FFH”,這是因?yàn)镃OB-ID包含了節(jié)點(diǎn)號信息,地址1對應(yīng)著181H,地址2對應(yīng)了182H,以此類推,最大127個節(jié)點(diǎn)?!?x30 0x1F 0x00 0x00”就代表了數(shù)據(jù)內(nèi)容,在CAN協(xié)議內(nèi),幀數(shù)據(jù)是低位在前,高位在后的。所以上述數(shù)據(jù)直接讀取后得出編碼器送出1F30H,這就代表了編碼器的當(dāng)前位置值。那在總線上面,多個節(jié)點(diǎn)同時發(fā)送數(shù)據(jù)不會產(chǎn)生沖突么?以前我們說過,CAN協(xié)議具有仲裁,這里簡單介紹一下仲裁是如何實(shí)現(xiàn)的。上面說了,COB-ID包含了節(jié)點(diǎn)號信息,也就是說,只要總線上的設(shè)備節(jié)點(diǎn)號不同,所送出的廣播報(bào)文的COB-ID肯定是不同的,如果一個是182H,一個是183H,仲裁時怎么做?本文最開始的時候介紹了每個字由筆畫組成,現(xiàn)在就要用到位(bit)的概念了,182H換算成二進(jìn)制是0001 1000 0010(B),“B”代表了二進(jìn)制,183H換算成二進(jìn)制是0001 1000 0011(B),關(guān)于顯性位、隱形位這里不再贅述,這個有興趣可以找我要資料看,這里我就簡單描述為“0”比“1”的優(yōu)先級高,可以理解為拖后腿,“0”為低電平,“1”為高電平,在線上低電平會把高電平拉低,一旦183H發(fā)現(xiàn)數(shù)據(jù)傳輸過程中與自身數(shù)據(jù)不符合,就終止上傳,保證了182H的數(shù)據(jù)先上總線。 我們在實(shí)踐中會發(fā)現(xiàn),編碼器的數(shù)據(jù)在不斷的更新輸出,那輸出周期如何定義呢?這個我們就來討論一下引申的PDO傳送方式。我們以前在培訓(xùn)時一直介紹CANopen協(xié)議與DP協(xié)議相比的好處在于DP是輪詢的,問答方式浪費(fèi)了大量的時間,而CAN協(xié)議是廣播的,可以將1MHz的速率發(fā)揮至極致。這種說法形象,一般可以解釋給初步接觸CANopen的人聽。其實(shí)CANopen的報(bào)文形式很多樣化,在不同的應(yīng)用場合可以采取不同的方式,上面說的稱為異步方式,異步方式也分兩種,一種是上面的內(nèi)部時鐘觸發(fā),也就是按照固定時間間隔發(fā)送,另一種是事件觸發(fā),假設(shè)編碼器發(fā)生轉(zhuǎn)動,數(shù)據(jù)相應(yīng)送出。還有一種同步方式,我們也可以口述為踏拍方式,當(dāng)主站要求報(bào)數(shù)是,所有從節(jié)點(diǎn)按照仲裁的優(yōu)先順序進(jìn)行數(shù)據(jù)發(fā)送。這三種報(bào)文方式分別在哪些場合適用呢?我們以車輛來舉例。車輛開在路上,在整個車輛控制內(nèi),最重要的,具有高優(yōu)先級的,應(yīng)該是牽涉到安全的制動(剎車),安全氣囊等等。其次是轉(zhuǎn)向、車燈。再次是音響、影視系統(tǒng)(當(dāng)然,我對車不是很熟悉,這是我的主觀認(rèn)識,作為一個例程)。我們可以把小的節(jié)點(diǎn)號分配給制動系統(tǒng),以保證數(shù)據(jù)能及時送達(dá)控制器,并采用定時報(bào)數(shù),實(shí)時監(jiān)測車輛制動系統(tǒng)的情況。對于音箱什么的,我們可以采用事件觸發(fā)方式,在有輸入控制時(比方說打開收音機(jī))進(jìn)行響應(yīng)。同步數(shù)據(jù)一般用在實(shí)時數(shù)據(jù)監(jiān)測方面,比方是在同一時間點(diǎn)查閱角度、位置、重量、壓力、流量等等信息,保證所監(jiān)測的各個數(shù)據(jù)在很小的時間變化范圍內(nèi)。當(dāng)然CANopen不可能摒棄問答方式的數(shù)據(jù)采集,這可以通過SDO訪問OD來實(shí)現(xiàn)。 講到SDO——服務(wù)數(shù)據(jù)對象,我們可以這么理解,PDO報(bào)文在發(fā)送出去后不需要反饋信號,總線上能消化這個數(shù)據(jù)的都可以消化,所以白話叫廣播報(bào)文。而SDO報(bào)文是需要響應(yīng)的,每一幀SDO發(fā)出后需要等待反饋。那這會不會引起無反饋時總線死機(jī)呢?不會,CAN數(shù)據(jù)鏈路內(nèi)規(guī)定了超時,在一定時間內(nèi)得不到回答,總線將進(jìn)行后面的作業(yè),多次詢問無果,總線會對錯誤節(jié)點(diǎn)進(jìn)行屏蔽處理。SDO的幀格式和PDO的幀格式是一致的,但對有些字節(jié)的定義不同,下面就簡單介紹一些編碼器修改參數(shù)時用到的幀格式。 SDO中實(shí)現(xiàn)了5個請求/應(yīng)答協(xié)議,這里我只講講啟動域下載與上傳,其他的有興趣可以問我要資料看。
我來解釋一下上表,COB-ID引用第一張表的SDO地址段。假設(shè)主站需要讀取1號編碼器對象字典(OD)6200H內(nèi)的參數(shù),我們應(yīng)該如何做呢?我們需要發(fā)送 0x601 0x40 0x00 0x62 0x00 0x00 0x00 0x00 0x00 我們得到編碼器的反饋數(shù)據(jù)是 0x581 0x4B 0x00 0x62 0x00 0x0A 0x00 0x00 0x00 上述命令的解釋是,控制器通過SDO指令讀取1號編碼器OD為6200H的編碼器發(fā)送數(shù)據(jù)周期的參數(shù),得到編碼器的回答是每隔10ms發(fā)送一次。40H和4BH是啟動域上傳的命令字。 如果需要將6200H的參數(shù)修改為20ms一次數(shù)據(jù),我們應(yīng)該怎么做? 發(fā)送:0x601 0x22 0x00 0x62 0x00 0x14 0x00 0x00 0x00 反饋:0x581 0x60 0x00 0x62 0x00 0x00 0x00 0x00 0x00
未完待續(xù)。。。 |
|