CANopen協議開發梳理總結筆記教程

0、提醒

????????CANOpen使用時,需要清楚什么是大端和小端,這對于CANOpen數據發送及解析時,有很大的幫助。且學習開發CANOpen時,需要具備一定的CAN基礎。

1、CANOpen協議介紹

①、什么是CANOpen協議

????????CANOpen協議是一種架構在控制局域網絡(Controller Area Network, CAN)上的高層通信協議,它廣泛應用于工業自動化、機械工程和汽車電子等領域。CANOpen協議通過對象字典、服務數據對象(SDO)、過程數據對象(PDO)等機制,為機器人、運動控制、過程控制、樓宇自動化、交通運輸等行業提供了一種標準化的通信解決方案。

????????CANOpen協議的標準由非營利組織CiA(CAN in Automation)進行起草、審核及維護工作。

????????CANOpen協議本身是一個單一的標準,它定義了設備間的通信協議和接口規范。

????????CANOpen協議支持從10kbps到1Mbps的波特率,具體包括10k、20k、50k、125k、250k、500k、800k和1Mbps。

????????簡單來說,CANOpen協議是一個基于CAN協議的的一個應用層協議。

②、CANOpen協議的特性

????????開放性:CANOpen是一個公開的標準,任何公司都可以使用它來開發產品,無需支付許可費用。

????????網絡管理:CANOpen協議定義了網絡管理功能,如節點自診斷、網絡監控等,使得網絡維護更加方便。

????????對象字典:CANOpen使用對象字典來描述設備的功能和狀態,使得設備之間的通信更加標準化。

????????服務:CANOpen定義了一系列的服務,如NMT(Network Management)、TPDO(Time-Triggered Protocol Data Object)、RPDO(Real-Time Protocol Data Object)等,以滿足不同的應用需求。

????????PDO(Process Data Object):PDO是CANOpen中用于快速傳輸過程數據的數據對象,可以實時地傳輸控制和狀態信息。

????????SDO(Service Data Object):SDO用于訪問設備的對象字典,可以讀取或寫入設備的狀態和配置信息。

????????緊急消息:CANOpen還定義了緊急消息,用于在發生嚴重故障時立即通知網絡中的其他設備。

????????心跳消息:心跳消息用于監測網絡中設備的運行狀態,如果一段時間內沒有收到某個設備的心跳消息,網絡管理系統會認為該設備已經離線。

????????CANOpen常用縮寫

③、CANOpen協議應用場景

????????在CANOpen協議中,對于不同類型的CANopen 設備和應用場景分別有不同的子協議,如CiA301、CiA401、CiA402、CiA421、CiA423、CiA424、CiA426、CiA430、CiA433等眾多子協議構成了CANopen協議。

2、CANOpen字典

????????CANOpen字典(Object Dictionary, OD)是CANopen協議的核心組成部分,它是一個有序的對象組,用于描述CANopen節點的所有參數,包括通訊數據的存放位置。

????????CANOpen字典的結構由索引和子索引組成:

????????索引:每個對象采用一個16位的索引值來尋址,范圍在0x0000到0xFFFF之間。

????????子索引:在某些索引下,為了訪問數據結構中的單個元素,定義了一個8位的子索引,范圍是0x00到0xFF之間。

????????CANOpen的SDO模式下的數據傳輸時,也是按如下格式進行發送和接收。其中字典中的部分索引可能沒有子索引。

3、CANOpen通信

????????CANOpen通信有兩種模式,分別是SDO通信、和PDO通信,如下圖所示為CANOpen通信的設備模型圖。

①、SDO通信

????????SDO 全稱為服務數據對象,其通過對象索引和子索引與CANOpen字典建立聯系,通過SDO可以讀取對象數據,在允許的情況下,也可以修改寫入對象數據。

????????SDO 傳輸方式遵循客戶端—服務器模式(CS),即一應一答方式。由 CAN 總線網絡中的 SDO 客戶端發起,SDO 服務器作出應答。

????????SDO 傳輸報文由COB-ID數據段組成,數據段采用小端模式,即低位在前,高位在后排列。所有的 SDO 報文數據段都必須是 8 個字節。

????????SDO發送數據的COB-ID都是0x600+節點ID

????????SDO接收數據的COB-ID都是0x580+節點ID

SDO讀數據報文格式

SDO寫數據報文格式

②、PDO通信

????????PDO 全稱為 過程數據對象, 其用來傳輸實時的數據,是 CANopen 中最主要的數據傳輸方式。通過SDO配置PDO后,可以實現設備端的數據周期性自動上傳到服務器,也可以實現控制發送的數據小于8字節,由于PDO發送的數據無返回,因此可以極大的提升數據傳輸速度。

????????按照接收與發送的不同,PDO又分為TPDO和RPDO,其中RPDO用于服務器給設備端發送控制數據TPDO為設備端周期性上傳數據到服務器

????????PDO 的傳輸遵循的是生產者消費者模型,即 CAN 總線網絡中生產者產生的 TPDO 可根據COB-ID 由網絡上一個或者多個消費者 RPDO 接收。每個PDO由通信參數和映射參數共同決定最終傳輸的方式及內容。

????????如下是所使用的電機控制器中實現 PDO 的傳輸的4 個 RPDO 和4 個 TPDO。注意,不同控制器的PDO數量可能不一致,需要根據實際產品進行手冊參考。

????????PDO使用時,需要進行映射配置操作,如下所示為PDO映射操作的流程圖。

????????因PDO映射內容較多,因此將在下一篇博客中詳細介紹PDO映射操作。

3、CANOpen應用

①、設置CiA402模式

????????發送:601 2B 02 20 01 00 00 00 00 (設置為 CiA402 模式)

//2B 02 20 01 00 00 00 00   (CiA402 模式)
#define WRITE_2_BYTE        0x2B
#define WRITE_60_CTRL_PARAM 0x2002
#define CTRL_MODE_SELECT    0x01
#define CIA402_MODE         0x00//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_PARAM & 0xFF;
data[2] = WRITE_60_CTRL_PARAM >> 8 & 0xFF;
data[3] = CTRL_MODE_SELECT;
data[4] = CIA402_MODE;serve_motor_send_data(0x601, data);
//成功會返回數據:60 02 20 01 00 00 00 00 

②、循環同步位置模式

????????發送:601 2F 60 60 00 08 00 00 00 (循環同步位置模式)

//2F 60 60 00 08 00 00 00 (循環同步位置模式)
#define WRITE_1_BYTE         0x2F   
#define WRITE_60_RUN_MODE    0x6060
#define CYCLIC_SYNC_POS_MODE 0x08//將數據按規定填充到CAN的8字節數據區
char data[8] = {0};   
data[0] = WRITE_1_BYTE;
data[1] = WRITE_60_RUN_MODE & 0xFF;
data[2] = WRITE_60_RUN_MODE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = CYCLIC_SYNC_POS_MODE;serve_motor_send_data(0x601, data);
//成功會返回數據: 60 60 60 00 00 00 00 00 

③、電機準備

????????發送: 601 2B 40 60 00 06 00 00 00 (設置 6040h為 0x6, 使電機準備)

//2B 40 60 00 06 00 00 00
#define WRITE_2_BYTE           0x2B
#define WRITE_60_CTRL_STATE    0x6040
#define MOTOR_READY            0x06//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_READY;servo_motor_send_data(0x601, data);
//正常會返回數據:60 40 60 00 00 00 00 00 

③、電機鎖軸使能

????????發送: 601 2B 40 60 00 0F 00 00 00 (設置 6040h為 0xF, 使電機使能)

//2B 40 60 00 0F 00 00 00
#define WRITE_2_BYTE          0x2B
#define WRITE_60_CTRL_STATE   0x6040 
#define MOTOR_ENABLE          0x7F//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_ENABLE;servo_motor_send_data(0x601, data);
//正常會返回數據:60 40 60 00 00 00 00 00 

④、電機松軸失能

????????發送: 601 2B 40 60 00 07 00 00 00 (設置 6040h為 0x7, 使電機失能)

//2B 40 60 00 07 00 00 00
#define WRITE_2_BYTE           0x2B
#define WRITE_60_CTRL_STATE    0x6040    
#define MOTOR_DISABLE          0x07//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_DISABLE;servo_motor_send_data(0x601, data);
//正常會返回數據:60 40 60 00 00 00 00 00 

⑤、設置電機目標位置

????????發送: 601 23 7A 60 00 10 27 00 00 (設置目標位置 607Ah為 10000)

//目標位置    :   23 7A 60 00 10 27 00 00 (設置 607Ah為 10000)
#define WRITE_4_BYTE         0x23   
#define WRITE_60_POSITION    0x607Aint pos = 90;//90度
int pos_pulse = (int)(pos * 10000.0 / 360);//數值單位轉換(角度值數據轉換為脈沖)
char data[8] = { 0 };//將數據按規定填充到CAN的8字節數據區
data[0] = WRITE_4_BYTE;
data[1] = WRITE_60_POSITION & 0xFF;
data[2] = WRITE_60_POSITION >> 8 & 0xFF;
data[3] = 0x00;
data[4] = pos_pulse & 0xFF;
data[5] = pos_pulse >> 8 & 0xFF;
data[6] = pos_pulse >> 16 & 0xFF;
data[7] = pos_pulse >> 24 & 0xFF;servo_motor_send_data(0x601, data);
//正常會返回到數據
//例如:60 7A 60 00 00 00 00 00 

⑥、讀取電機實際位置

????????發送:601 40 63 60 00 00 00 00 00

#define READ_60_CMD      0x40
#define READ_60_POSITION 0x6063//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_POSITION & 0xFF;
data[2] = READ_60_POSITION >> 8 & 0xFF;servo_motor_send_data(0x601, data);
//正常會返回到讀取到的位置數據
//例如:43 63 60 00 F1 2D C0 01 

⑦、讀取電機實際速度

????????發送:601 40 6C 60 00 00 00 00 00

//40 6C 60 00 00 00 00 00
#define READ_60_CMD    0x40
#define READ_60_SPEED  0x606C//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_SPEED & 0xFF;
data[2] = READ_60_SPEED >> 8 & 0xFF;servo_motor_send_data(0x601, data);
//正常會返回到讀取到的速度數據
//例如:43 6C 60 00 7C F6 FF FF 

⑧、讀取電機實際電流

????????發送:601 40 78 60 00 00 00 00 00

//40 78 60 00 00 00 00 00
#define READ_60_CMD 0x40
#define READ_60_CURRENT 0x6078//將數據按規定填充到CAN的8字節數據區
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_CURRENT & 0xFF;
data[2] = READ_60_CURRENT >> 8 & 0xFF;servo_motor_send_data(0x601, data);
//正常會返回到讀取到的電流數據
//例如:4B 78 60 00 FC FF 00 00 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40840.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于CLIP特征的多模態大模型中的視覺短板問題

【論文極速讀】 基于CLIP特征的多模態大模型中的視覺短板問題 FesianXu 20240706 at Tencent WeChat search team 前言 今天讀到篇CVPR 24’的論文 [1],討論了常見的多模態大模型(大多都基于CLIP語義特征,以下簡稱為MLLM)中的視覺…

若依 / ruoyi-ui:執行yarn dev 報錯 esnext.set.difference.v2.js in ./src/utils/index.js

一、報錯信息 These dependencies were not found: * core-js/modules/esnext.set.difference.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.intersection.v2.js in ./src/utils/index.js * core-js/modules/esnext.set.is-disjoint-from.v2.js in ./src/utils…

Python處理表格數據常用的 N+個操作

Python作為一種強大且易用的編程語言,其在數據處理方面表現尤為出色。特別是當我們面對大量的表格數據時,Python的各類庫和工具可以極大地提高我們的工作效率。以下,我將詳細介紹Python處理表格數據常用的操作。 首先,我們需要安…

2024.7.5總結

今晚的總結是在圖書館前的梯子上寫的,我多次輾轉,可能是我最后一次看看這個學校了,明天就要踏上回家的旅途了。還有半個月入職,干脆回家看看,畢竟,工作以后機會不多了。 下午的時候,用順豐寄了…

復現YOLO_ORB_SLAM3_with_pointcloud_map項目記錄

文章目錄 1.環境問題2.遇到的問題2.1編譯問題1 monotonic_clock2.2 associate.py2.3 associate.py問題 3.運行問題 1.環境問題 首先環境大家就按照github上的指定環境安裝即可 環境怎么安裝網上大把的資源,自己去找。 2.遇到的問題 2.1編譯問題1 monotonic_cloc…

ASP.NET Core----基礎學習01----HelloWorld---創建Blank空項目

文章目錄 1. 創建新項目--方式一: blank2. 程序各文件介紹(Project name :ASP.Net_Blank)(1)launchSettings.json 啟動方式的配置文件(2)appsettings.json 基礎配置file參數的讀取&a…

ChatGPT:SpringBoot解決跨域問題方法-手動設置請求頭

ChatGPT:SpringBoot解決跨域問題方法-手動設置請求頭 這里的設置響應頭是為了發送請求方還是接收請求方 設置響應頭是為了發送請求方。具體來說,添加 Access-Control-Allow-Origin 頭部是為了告訴瀏覽器,哪些域名可以訪問資源。當設置為 * 時…

Java求自然常數e的近似值(課堂實例1)

??引言🎃🎃 ?點關注編程夢想家(大學生版)-CSDN博客不迷路~~~~~~? 自然常數 𝑒e 是數學中一個非常重要的常數,約等于 2.71828,它在自然對數、復合利息計算等領域有著廣泛的應用。本文將介紹如…

自動批量將阿里云盤文件發布成WordPress文章腳本源碼(以RiPro主題為例含付費信息下載地址SEO等自動設置)源碼

背景 很多資源下載站,付費資源下載站,付費內容查看等都可以用WordPress站點發布內容,這些站點一般會基于一個主題,付費信息作為文章附屬的信息發布,底層存儲在WP表里,比如日主題,子比主題等。 …

掌握IPython的`%%debug`:深入交互式調試的藝術

IPython是一個功能豐富的交互式Python解釋器,它為Python開發者提供了許多便捷的功能,其中之一就是%%debug魔法命令。%%debug是IPython提供的一種快速進入調試模式的方法,它允許用戶在代碼執行出錯時立即開始調試,而無需單獨啟動調…

Apache Seata tcc 模塊源碼分析

本文來自 Apache Seata官方文檔,歡迎訪問官網,查看更多深度文章。 本文來自 Apache Seata官方文檔,歡迎訪問官網,查看更多深度文章。 一 .導讀 spring 模塊分析中講到,Seata 的 spring 模塊會對涉及到分布式業務的 b…

《夢醒蝶飛:釋放Excel函數與公式的力量》9.2 FV函數

9.2 FV函數 FV函數是Excel中用于計算投資或貸款在若干期后的未來值的函數。它是一個非常實用的財務函數,能夠幫助我們快速計算投資的最終價值或貸款的期末余額。 9.2.1 函數簡介 FV函數用于計算基于定期固定支付和固定利率的投資或貸款的未來值。未來值是指在一定…

cs224n作業3 代碼及運行結果

代碼里要求用pytorch1.0.0版本,其實不用也可以的。 【刪掉run.py里的assert(torch.version “1.0.0”)即可】 代碼里面也有提示讓你實現什么,弄懂代碼什么意思基本就可以了,看多了感覺大框架都大差不差。多看多練慢慢來,加油&am…

中英雙語介紹美國的州:阿肯色州(Arkansas)

中文版 阿肯色州簡介 阿肯色州(Arkansas)位于美國南部,以其多樣的自然景觀、豐富的文化遺產和不斷發展的經濟而聞名。以下是對阿肯色州的詳細介紹,包括其地理位置、人口、經濟、教育、文化和主要城市。 地理位置 阿肯色州東臨…

文件、文本閱讀與重定向、路徑與理解指令——linux指令學習(一)

前言:本節內容標題雖然為指令,但是并不只是講指令, 更多的是和指令相關的一些原理性的東西。 如果友友只想要查一查某個指令的用法, 很抱歉, 本節不是那種帶有字典性質的文章。但是如果友友是想要來學習的,…

PD虛擬機怎么聯網?PD虛擬機安裝Win11無法上網 pd虛擬機連不上網怎么解決 mac安裝windows虛擬機教程

PD虛擬機既可以聯網使用,也可以單機使用。如需將PD虛擬機聯網,可以共享Mac原生系統的網絡,其使用體驗與真實系統無異。本文會詳細講解PD虛擬機如何聯網,并會進一步解決PD虛擬機安裝Win10無法上網的問題。 如果有網絡相關問題的小伙…

游戲服務器搭建選VPS還是專用服務器?

游戲服務器搭建選VPS,VPS能夠提供控制、性能和穩定性。它不僅僅是讓游戲保持活力。它有助于減少延遲問題,增強您的游戲體驗。 想象一下:你正沉浸在一場游戲中。 勝利在望。突然,屏幕卡住——服務器延遲。 很崩潰,對…

C語言實現【程序設計與實踐】實驗三:自動售貨機

聲明:著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 附上c版http://t.csdnimg.cn/BbDSL https://blog.csdn.net/As_sBomb/article/details/105485940 實驗三:自動售貨機 題目: 圖所示為簡易自動售貨…

1493. 刪掉一個元素以后全為 1 的最長子數組

1493. 刪掉一個元素以后全為 1 的最長子數組 題目鏈接&#xff1a;1493. 刪掉一個元素以后全為 1 的最長子數組 代碼如下&#xff1a; class Solution { public://滑動窗口int longestSubarray(vector<int>& nums){int res 0;int count 0;//記錄碰到0的個數int …

【MYSQL】事務隔離級別以及InnerDB底層實現

事務隔離級別 讀未提交&#xff08;Read Uncommitted&#xff09; 允許事務讀取其他事務未提交的數據&#xff0c;可能會導致臟讀。 讀已提交&#xff08;Read Committed&#xff09; 一個事務只能看見已經提交的事務所做的更改&#xff0c;可以避免臟讀&#xff0c;但可能…