CANopen從站協(xié)議的設計與實(shí)現
2.3.1 PDO模塊
PDO服務(wù)主要用來(lái)實(shí)現實(shí)時(shí)數據的傳輸,基于生產(chǎn)者和消費者模式,它的通信行為由通信參數決定,傳送的數據由映射參數來(lái)決定。本文實(shí)現的PDO模塊包含了三個(gè)子模塊,如圖3所示。本文引用地址:http://dyxdggzs.com/article/153471.htm
建立PDO報文模塊被其他兩個(gè)模塊調用,他的任務(wù)是根據映射參數表把對象字典中對象的數據復制進(jìn)PDO報文中,交由其他模塊處理,建立過(guò)程中需注意PDO報文的剩余容量。接收PDO模塊的任務(wù)是完成PDO數據的解析,將數據放入指定對象中;發(fā)送模塊負責根據CANopen協(xié)議規范,依據PDO通信參數,實(shí)現各種PDO傳輸方式,包括同步周期、同步事件預觸發(fā)、異步事件觸發(fā)等方式。
2.3.2 SDO模塊
SDO模塊是對象字典的遠程訪(fǎng)問(wèn)接口,一般被用來(lái)進(jìn)行節點(diǎn)參數配置和獲取。它基于客戶(hù)端服務(wù)器模式,每個(gè)訪(fǎng)問(wèn)請求都必須應答,實(shí)現了可靠的點(diǎn)對點(diǎn)數據傳輸。CANopen為SDO服務(wù)設計了5個(gè)請求/應答子協(xié)議,分別是:?jiǎn)?dòng)域下載/上傳、域分段下載\上傳、中止域傳送。
本文設計的SDO模塊包含了訪(fǎng)問(wèn)發(fā)起模塊和應答模塊。訪(fǎng)問(wèn)發(fā)起模塊的任務(wù)是根據上層的調用發(fā)起SDO通信,實(shí)現了5個(gè)訪(fǎng)問(wèn)子協(xié)議中的請求部分;應答模塊則解析收到的SDO報文中攜帶的命令字,實(shí)現了5個(gè)訪(fǎng)問(wèn)子協(xié)議中的應答部分。
2.3.3 NMT模塊
每個(gè)CANopen節點(diǎn)內都運行著(zhù)一個(gè)狀態(tài)機,狀態(tài)轉換由主節點(diǎn)控制,不同的狀態(tài)對應不同的節點(diǎn)任務(wù),也對應了不同的模塊可用性。狀態(tài)轉換如圖4所示。
本文實(shí)現的從節點(diǎn)NMT模塊的任務(wù)是響應主站的NMT控制命令,并反饋自身狀態(tài),匯報錯誤信息。狀態(tài)轉換模塊的流程:接收到NMT命令后,首先解析NMT命令字,檢查狀態(tài)轉換合法性,然后設置節點(diǎn)狀態(tài),啟停各功能模塊:狀態(tài)反饋模塊采用了CiA組織推薦使用的心跳模式,即從節點(diǎn)周期性地向網(wǎng)絡(luò )上發(fā)送包含自身狀態(tài)信息的心跳報文,供主站和其他節點(diǎn)監視。
2.3.4 總體流程
借助于狀態(tài)機,設計了如圖5的程序運行總體流程。
從節點(diǎn)上電啟動(dòng)后,先進(jìn)行必要的硬件初始化,如系統時(shí)鐘、port、CAN接口、定時(shí)器、AD等,完成后設置節點(diǎn)狀態(tài)為initialization,進(jìn)入狀態(tài)機,軟件在狀態(tài)機內循環(huán)運行。通信初始化函數主要負責初始化從節點(diǎn)的對象字典,節點(diǎn)初始化函數則負責將節點(diǎn)的輸出置為上電值,設置完成后設置節點(diǎn)狀態(tài)為pre-operational,軟件運行至preoperational函數,這個(gè)函數的功能是協(xié)助主站完成對從節點(diǎn)的通信配置。當從節點(diǎn)收到start remote node命令后,進(jìn)入operational狀態(tài),此狀態(tài)包含了從節點(diǎn)的控制程序,即從節點(diǎn)開(kāi)始正常運行,執行指定的底層任務(wù),如數據采集、控制輸出等。若節點(diǎn)接收到主站的stop remote node命令,則進(jìn)入stopped函數,在此狀態(tài)下從節點(diǎn)停止執行底層任務(wù),等待主節點(diǎn)的啟動(dòng)命令。
3 實(shí)驗
3.1 測試實(shí)驗平臺的搭建
為了測試本文的CANopen從節點(diǎn)協(xié)議,搭建了基于USB-CAN模塊的測試平臺,結構如圖6所示。主站是裝有ZLGCANTest的計算機,以USB-CAN通信模塊作為CAN網(wǎng)絡(luò )接口,實(shí)現與從站的連接。示波器監視總線(xiàn)波形,通信波特率設置為500kb/s。
評論