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软件包总结…