CANopen - PDO映射

CiA402

在這里插入圖片描述

為什么不放到一個PDO中。而是分成幾個PDO?

簡短答案:裝不下 + 解耦時序。

  • PDO負載上限:經典CAN的每個PDO只有8字節。TargetPosition(607A:00=32bit) + ProfileVelocity(60FF:00=32bit) + ModesOfOperation(6060:00=8bit) 共9字節,單個PDO放不下,必須拆分。常見做法是把兩個32位參數放同一PDO,8位的放另一個PDO。
  • 時序與觸發解耦:不同PDO可設不同的Transmission Type、事件/抑制時間(Event/Inhibit)和SYNC策略。把快變、實時性高的量放一個PDO(高頻/同步),慢變量放另一個PDO(低頻/事件),降低總線負載、保證控制環路延遲。
  • 優先級與仲裁:不同COB?ID帶來不同仲裁優先級,關鍵控制量可用更高優先級PDO。
    兼容性與標準建議:CiA 402常見/推薦映射本就將控制字、模式、目標值等分布到多個PDO,便于互操作和廠商預置配置。
  • 例外:若用 CANopen FD(大于8字節),可合并更多對象;但經典CAN的8字節限制仍適用。

IO PDO

RPDO 參數

/* index 0x1400 :   b'Receive PDO 1 Parameter'. */UNS8 masterdic_highestSubIndex_obj1400 = 6; /* number of subindex - 1*/UNS32 masterdic_obj1400_COB_ID_used_by_PDO = 0x181;	/* 385 */UNS8 masterdic_obj1400_Transmission_Type = 0xFF;	/* 255 */UNS16 masterdic_obj1400_Inhibit_Time = 0x64;	/* 100 */UNS8 masterdic_obj1400_Compatibility_Entry = 0x0;	/* 0 */UNS16 masterdic_obj1400_Event_Timer = 0x1;	/* 1 */UNS8 masterdic_obj1400_SYNC_start_value = 0x0;	/* 0 */const CONSTSTORE subindex masterdic_Index1400[] = {{ RO, uint8, sizeof (UNS8), .pObject=&masterdic_highestSubIndex_obj1400 },{ RW, uint32, sizeof (UNS32), .pObject=&masterdic_obj1400_COB_ID_used_by_PDO },{ RW, uint8, sizeof (UNS8), .pObject=&masterdic_obj1400_Transmission_Type },{ RW, uint16, sizeof (UNS16), .pObject=&masterdic_obj1400_Inhibit_Time },{ RW, uint8, sizeof (UNS8), .pObject=&masterdic_obj1400_Compatibility_Entry },{ RW, uint16, sizeof (UNS16), .pObject=&masterdic_obj1400_Event_Timer },{ RW, uint8, sizeof (UNS8), .pObject=&masterdic_obj1400_SYNC_start_value }};

這里定義的是 CANopen 對象字典條目 0x1400,即“接收 PDO1 通信參數”(RPDO1)。代碼為每個子索引分配了內存變量,并通過常量子索引表 masterdic_Index1400 將它們暴露給對象字典。子索引 0(highestSubIndex)為 6,表示實現了子索引 1 到 6。

子索引 1(COB?ID)設為 0x181,這與節點 1 的 TPDO1 標準 COB?ID(0x180 + 0x01)相匹配,因此本 RPDO 會接收該從站的 TPDO1。COB?ID 的最高位(bit31)為 0,表示該 PDO 處于使能狀態。子索引 2(傳輸類型)為 0xFF,表示異步接收(不依賴 SYNC)。其余字段——Inhibit Time(3)、Compatibility Entry(4)、Event Timer(5)和 SYNC start value(6)——在規范中主要對 TPDO 側有意義,RPDO 側通常被忽略,但很多棧會保留相同字段以保持結構一致。

RPDO

/* index 0x1600 :   b'Receive PDO 1 Mapping'. */UNS8 masterdic_highestSubIndex_obj1600 = 1; /* number of subindex - 1*/UNS32 masterdic_obj1600[] = {0x20100110	/* 537919760 */};ODCallback_t masterdic_Index1600_callbacks[] = {NULL,NULL,};const CONSTSTORE subindex masterdic_Index1600[] = {{ RW, uint8, sizeof (UNS8), .pObject=&masterdic_highestSubIndex_obj1600 },{ RW, uint32, sizeof (UNS32), .pObject=&masterdic_obj1600[0] }};

這段代碼定義了 CANopen 對象字典條目 0x1600,即“接收 PDO1 映射參數”(RPDO1 Mapping)。子索引 0(masterdic_highestSubIndex_obj1600)設為 1,表示當前這路 RPDO 只映射了 1 個對象。具體的映射項以 32 位整型保存于 masterdic_obj1600 數組中。

唯一的映射值 0x20100110 按照“Index(16 位) | SubIndex(8 位) | LengthInBits(8 位)”編碼:

Index = 0x2010
SubIndex = 0x01
Length = 0x10(16 位) 含義是:這路 RPDO1 攜帶的前 16 位數據將寫入本地對象 0x2010:01(即 Application_data_Input_16bit[0])。映射總長度為 2 字節,符合經典 CAN 幀 8 字節上限。
masterdic_Index1600 將 0x1600:00(映射條目數)和 0x1600:01(第一條映射詞)導出到對象字典,均為可寫(RW),對應的回調為 NULL,修改這些條目不會觸發回調。

映射變量

/* index 0x2010 :   Mapped variable b'Application data Input 16bit' */UNS8 masterdic_highestSubIndex_obj2010 = 8; /* number of subindex - 1*/const CONSTSTORE subindex masterdic_Index2010[] = {{ RO, uint8, sizeof (UNS8), .pObject=&masterdic_highestSubIndex_obj2010 },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[0] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[1] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[2] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[3] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[4] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[5] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[6] },{ RO, uint16, sizeof (UNS16), .pObject=&Application_data_Input_16bit[7] }};

這段代碼定義了對象字典條目 0x2010,名稱為“Application data Input 16bit”。子索引 0 的值為 8(highestSubIndex=8),表示該對象包含 8 個有效的子索引,即 0x2010:01 到 0x2010:08。

masterdic_Index2010 將每個子索引發布到對象字典:子索引 0 是只讀的數量字段,子索引 1~8 分別指向數組 Application_data_Input_16bit 的 8 個 16 位元素(均為只讀)。這意味著外部通過 SDO 只能讀取這些值,不能寫入;它們通常由應用邏輯或通過 RPDO 接收過程來更新。

實務上,每個 0x2010:n 都是一個 16 位輸入量,可被映射到 RPDO 中。例如,你的 RPDO1 映射 0x20100110(索引 0x2010、子索引 0x01、長度 16 位)就對應這里的第一個元素。為了避免并發訪問問題,如果這些值可能在中斷或通信回調中更新,可考慮在應用側使用合適的同步或將數據聲明為 volatile。

Other

心跳

心跳生產者(使能/周期=200ms)

  • 對應:0x1017 Producer Heartbeat Time
  • 本文件變量:masterdic_obj1017
  • 設置:0x1017 = 200 即每200ms發送心跳;設置為0關閉
  • 心跳COB-ID固定為 0x700 + NodeID(無需單獨配置)
    在這里插入圖片描述

緊急消息(EMCY)

  • 對應:0x1014 Emergency COB-ID
  • 本文件變量:masterdic_obj1014(注意:當前未加入 objdict 表,運行時不可通過SDO改)
  • 設置:0x1014 = 0x80 + NodeID;將 bit31 置1可禁用(0x80000000 | COB-ID)
  • 相關只讀信息:0x1001 Error Register,0x1003 Pre-defined Error Field(錯誤日志)

節點保護(Guarding) 使能、保護時間、生命周期因子

  • 對應:0x100C Guard Time(ms)、0x100D Life Time Factor
  • 本文件變量:masterdic_obj100C、masterdic_obj100D(同樣未加入 objdict,SDO不可改)
  • 使能:兩者都>0;禁用:任一為0
  • 提醒:節點保護與心跳機制互斥,按CiA 301應二選一(推薦使用心跳)
    在這里插入圖片描述

使能同步產生

  • 0x1005 COB-ID SYNC
    低 11 位為 CAN-ID(通常 0x80)
    置 bit30=1 啟用“本設備產生 SYNC”;bit30=0 表示僅消費 SYNC

  • 0x1006 Communication cycle period
    0 則按該周期(μs)發送 SYNC;=0 則不周期發送

  • 0x1007 Sync window length(可選)

  • 0x1019 Synchronous counter overflow value(可選)
    在這里插入圖片描述

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

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

相關文章

北理工提出僅依賴機載傳感器針對IAP的控制與狀態估計框架

近日,度量用戶、北京理工大學俞玉樹老師團隊在IEEE RAL,IEEE TRO和IEEE TASE期刊上分別發表論文,研究著力于解決多飛行器集聯平臺(Integrated Aerial Platforms, IAPs)的相對位姿和全局定位問題,提出IAP的控…

13年測試老鳥,性能測試-618與雙11大促銷壓測(二)

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 1、準備工作 準備…

StreamCap(直播錄制) v1.0.2 綠色版

StreamCap 是一個基于FFmpeg和StreamGet的多平臺直播流錄制客戶端,覆蓋 40 國內外主流直播平臺,支持批量錄制、循環監控、定時監控和自動轉碼等功能。軟件特色 多端支持:支持Windows/MacOS/Web運行。循環監控:實時監控直播間狀態&…

OpenCV:圖像拼接(SIFT 特征匹配 + 透視變換)

目錄 一、核心技術原理與對應 API 解析 1.1 SIFT 特征檢測與描述(尺度不變特征提取) 1.1.1 灰度圖轉換:cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 1.1.2 SIFT 檢測器初始化:cv2.SIFT_create() 1.1.3 特征點檢測與描述符計算&…

日語學習-日語知識點小記-進階-JLPT-N1階段藍寶書,共120語法(10):91-100語法+考え方13

日語學習-日語知識點小記-進階-JLPT-N1階段藍寶書,共120語法(10):91-100語法1、前言(1)情況說明(2)工程師的信仰(3)高級語法N1語法和難點2、知識點-語法&…

繼承與組合:C++面向對象的核心

C 繼承:從基礎到實戰,徹底搞懂面向對象的 “代碼復用術” 在面向對象編程(OOP)的世界里,“繼承” 是實現代碼復用的核心機制 —— 就像現實中孩子會繼承父母的特征,C 的子類也能 “繼承” 父類的成員&#…

Matplotlib定制:精解顏色、字體、線型與標記

Matplotlib定制:精解顏色、字體、線型與標記導語 Matplotlib 是 Python 數據可視化領域的基石。雖然它的默認樣式足以滿足快速分析的需求,但要創作出具有專業水準、信息清晰、視覺美觀的圖表,就必須掌握其強大的定制功能。本文將深入探討 Mat…

Qt開發經驗 --- Qt監聽文件/文件夾改變(17)

文章目錄[toc]1 概述2 演示效果3 簡單使用示例4 帶界面的使用示例5 源代碼地址更多精彩內容👉內容導航 👈👉Qt開發經驗 👈1 概述 QT實現實時監控文件的創建、修改、刪除操作 跟蹤文件夾內容的增刪改變化 可用于文件發生變化時自…

數據分析:合并一

🔷 DA37:統計運動會項目報名人數(僅輸出有人報名的項目)? 題目描述給定兩個 CSV 文件:items.csv:包含項目信息(item_id, item_name, location)signup.csv:包含員工報名信…

WWW‘25一通讀 |圖Anomaly/OOD檢測相關文章(1)

寫在前面:進入新一輪學習階段,從閱讀開始。 本文分享的是WWW2025收錄的與作者研究相近的graph-based xx相關paper的閱讀筆記,含個人理解,僅供參考😄 0x01 HEI:利用不變性原理實現異配圖結構分布偏移學習 J…

static_cast:C++類型系統的“正經翻譯官”

1. 背景與核心概念 1.1 C的“類型安全”哲學 想象一下,你所在的世界突然失去了所有規則:文字可以隨意變成數字,人可以瞬間變成椅子,汽車能飛上天變成飛機… 這聽起來像是瘋狂的夢境,但對于早期C語言來說,這…

【嵌入式原理系列-第八篇】USART從原理到配置全解析

目錄 一.通信領域基礎知識介紹 1.1 串行和并行通信 1.2 同步和異步傳輸 1.3 串口和COM口 1.4 通信協議標準以及物理層定義 1.5 物理層協議之TTL / RS-232 / RS-485 二.USART介紹 2.1 USART特點介紹 2.2 UART和TTL / RS-232 / RS-485 2.3 USART硬線流控介紹 2.4 USAR…

MariaDB介紹和MariaDB包安裝

文章目錄MariaDB介紹和安裝1.MariaDB介紹1.1 起源與背景1.2 核心特性1.2.1 高度兼容 MySQL1.2.2 優化的存儲引擎1.2.3 企業級功能增強1.2.4 性能優化1.2.5 安全增強1.3 社區與生態1.4 應用場景1.5 總結2.MariaDB安裝2.1 主機初始化2.1.1 設置網卡名2.1.2 設置ip地址2.1.3 配置鏡…

雙指針與滑動窗口算法精講:從原理到高頻面試題實戰

引言:算法選擇的十字路口 在算法面試中,雙指針和滑動窗口如同兩把瑞士軍刀,能高效解決80%以上的數組和字符串問題。本文將深入解析這兩種技術的核心差異,結合力扣高頻題目,提供可直接復用的代碼。 一、算法核心思想解析…

蘋果MAC、MacBook air和pro安裝windows雙系統與iOS分發

文章目錄1. main1.1 準備工作1.2 啟動轉換助理1.3 Windows安裝1.4 蘋果電腦安裝Windows雙系統切換2. 蘋果(iOS)分發/上架2.1 上架App Store2.2 上架TestFlight2.3 webClip免簽上架2.4 超級簽名2.5 企業證書2.6 app分發系統Reference1. main 蘋果電腦安裝windows雙系統 https:…

ArcGIS定向影像(1)——非傳統影像輕量級解決方案

常常聽到這樣的需求,ArcGIS能讓用戶自己低成本的做出谷歌街景嗎?現在 _ArcGIS Pro 3.2 和 ArcGIS Enterprise 11.2 _能夠讓用戶不使用任何插件和擴展的情況下完成街景數據集的構建,數據管理,發布服務和調用的完整解決方案。非常體…

uni-app 網絡之封裝實戰HTTP請求框架

前言在uniapp開發中,網絡請求是每個應用都必不可少的功能模塊。一個優秀的網絡請求封裝不僅能提高開發效率,還能增強代碼的可維護性和可擴展性。本文將基于實際項目經驗,詳細介紹如何封裝一個高效、可維護的Uniapp網絡請求框架,并…

架構師成長之路-架構方法論

文章目錄前言一、先搞懂:架構師不僅僅是“技術大佬”,更是“問題解決者”1.1 架構師的分類:不止“開發架構師”一種1.2 架構師要關注什么?別只盯著技術1.3 架構師解決問題的4步心法:從定義到落地1.4 架構師的成長攻略&…

uniapp在微信小程序中實現 SSE 流式響應

前言 最近需要使用uniapp開發一個智能對話頁面,其中就需要使用SSE進行通信。 本文介紹下在uniapp中如何基于uni.request實現SSE流式處理。 在線體驗 #小程序:yinuosnowball SSE傳輸格式 返回輸出的流式塊: Content-Type為text/event-stream 每個流式塊均為 d…

STM32N6AI資料匯總

文章目錄前言一、STM32N6硬件資源1.1 NUCLEO-N657X0-Q1.2 STM32N6570-DK1.3 正點原子STM32N647二、STM32N6軟件資源2.1 STM32CubeN6例程資源包2.2 STM32圖像信號處理器(ISP)調優軟件2.3 正點原子N6開發板配套軟件三、AI軟件資源3.1 STM32N6 AI軟件包總結…