其實3年前在21ic就準備做這篇文章了,那時,canopen也只是剛剛在國內推廣,所以幾乎沒有專案用到。現在有了實際的專案,完全確認了以前移植和測試的**,所以列舉一些canopen的底層操作以及資料。當然,列舉的都是一些簡單的基本的canopen通訊,不包括其他canopen應用協議中的內容。
1.心跳
canopen節點會以乙個固定的頻率傳送心跳報文。用於告訴主機,偶還活著。。。心跳報文的格式很簡單,cob-id為0x700+node_id,資料為一位元組的狀態資料:
圖中,id為706,表示06號節點的心跳,狀態是0x7f,表示pre-operational狀態(節點初始化完成後,進入pre-operational狀態)。檢視時間,每個心跳報文時間間隔大概1秒。
2.nmt
nmt是管理報文,用於實現一些管理操作,比如,節點重啟、進入operational狀態等等。nmt報文格式很簡單,id為000,資料為一位元組命令+一節節點號(0表示廣播)。
第2號報文就是讓06號節點,進入operational狀態,執行完成後,節點心跳報文中的節點狀態也變為operational狀態
同上,傳送stop remote node命令,進入stopped狀態,當然,心跳還是有的,只是節點不幹活了
這個是reset node命令,用於讓節點復位。復位之後,會首先進入initializing狀態(對於於心跳報文中的0x00),初始化完成後,進入pre-operational狀態(對應心跳報文中的0x7f)。
3.sdo
sdo 主要用來訪問節點的物件字典(od),canopen的節點至少需要支援sdo_server。物件字典是canopen節點的資料組織形式,包含了 canopen節點的各個引數和資料,比如,心跳報文的傳送頻率、系統啟動次數、節點的通訊引數等等等等。可以說,sdo是用來設定canopen節點的各個執行引數的。
圖中,1號報文0606: 40 17 10 00 00 00 00 00就是乙個sdo_read報文,告訴節點,要讀取的od索引和子索引,包括資料長度。然後節點會傳送對應的資料(後面的那個8位元組報文)。第乙個位元組是一些命令的設定包括引數的設定,後2個位元組是od的索引,再後面乙個位元組是od的子索引,最後4個位元組是資料。上圖中,主機傳送的是乙個讀取od中 1017:00位置的資料命令,這個位置存放的是心跳頻率,讀取的結果是0x03eb(1000ms)。
9號報文就是sdo_write,寫od中1017:00位置的資料,也就是修改心跳頻率。收到完成應答後,心跳頻率就變了(檢視時間)。
4.pdo
pdo 是用來傳送(tpdo)或者接收(rpdo)資料的,有幾種不同的觸發方式,比如:事件觸發、同步觸發等等。資料內容一般有canopen的各個應用協議規定,比如401文件中的ai(analog input)資料等。pdo的資料內容是通過對映的方式在定義在od中的,乙個節點可以有多個pdo通道。pdo的通訊引數也可以通過sdo訪問od的方式來修改。
5.應急報文
應急報文用於返回乙個節點上的錯誤,可以是canopen命令解析錯誤,等等。
待續。。。。。。
舊文備份 CANopen協議PDO的幾種傳輸方式
由於pdo所傳輸的資料內容是無協議的且分配的識別符號範圍較sdo靠前,因此,其效率和優先順序都是較高的,通常用於實時過程資料的傳輸.pdo是生產 消費型別的通訊方式,資料只有乙個生產者 傳送 但是消費者 接收 可以有多個,生產者和消費者事先都已知道資料的型別和內容 通過設定pdo對映來管理 對pdo...
google Set的幾種操作
最近在專案中用到了這個功能,感覺還行,寫了乙個demo測試了一下.sets1 sets.newhashset 1 2 3 5 sets2 sets.newhashset 2 3 4 5 返回在s1中存在,但不在s2中存在的 system.out.println sets.difference s1,...
iOS路徑的幾種操作
nsstring path users tarena documents core ios 1.加路徑內容,自動加上 nsstring model and storage nslog path newpath 2.拆分路徑 nsarray conponents newpath pathcompone...