CANopen MPDO:动态对象寻址
CANopen MPDO:动态对象寻址 摘要:解析 MPDO 的 DAM/SAM 寻址、对象列表与报文流程,并结合 Lely、CANopenNode 和 CanFestival 源码说明实现差异及替代方案。 @[toc] 1. MPDO 解决了普通 PDO 的什么问题普通 PDO 的优势是协议开销小、实时性高,但它的对象映射通常在通信前确定:一个 PDO COB-ID 对应一组固定的对象字典条目。收到数据帧后,消费者按照 0x1600~0x17FF 中的映射,把第 1 段、第 2 段数据写到预先配置的本地对象。 当设备存在大量低频、稀疏变化的 8/16/32 位对象时,固定映射会遇到三个问题: 为每组对象分配 PDO,会增加通信参数、映射对象和 COB-ID 管理量。 反复动态重映射 PDO,需要先禁用 PDO、清空映射、修改条目、恢复映射,再重新启用,不能把它当成逐帧选择机制。 改用 SDO 虽然可以逐次携带 Index/Sub-index,但每次访问都有请求、响应和协议状态,语义更可靠,实时性和总线效率却不同于 PDO。 M...
Lely CANopen Node
Lely CANopen coapp::Node:CAN 网络、NMT 服务与 C++ 事件回调的装配机制 摘要:从源码追踪 coapp::Node 如何组合 CAN I/O、对象字典、NMT 服务、定时队列与 C++ 回调,并解释构造、复位和事件分发的完整流程。 @[toc] 1. Node 不是协议重写,而是装配中心阅读 lely-core/include/lely/coapp/node.hpp 和 lely-core/src/coapp/node.cpp 时,最重要的判断不是“Node 实现了多少 CANopen 服务”,而是: lely::canopen::Node 把 CAN I/O、时间源、本地对象字典、NMT 总控和 C++ 应用回调装配成一个可运行节点;具体 PDO、SYNC、TIME、EMCY、LSS 等协议状态机仍由 C 层服务对象实现。 这一判断可以直接从继承关系和内部对象得到: 12345class Node : public io::CanNet, public Device { // ... stru...
Lely CANopen `co_nmt_t`:主从 NMT 总控机制、状态机与运行流程
Lely CANopen co_nmt_t:主从 NMT 总控机制、状态机与运行流程 @[toc] co_nmt_t 不能只理解成“接收 CAN-ID 0x000 后切换 NMT 状态”的对象。Lely 官方库概览直接把它定位为 CANopen 设备的核心服务管理器:它维护本节点 NMT 状态,并按状态创建、启动、停止或销毁 SDO、PDO、SYNC、TIME、EMCY、LSS 等服务。新建对象初始停留在 Initialisation,不立即通信,应用可以先安装回调,再通过 Reset Node 启动完整 boot-up 链路。[1] 结合 src/co/nmt.c、include/lely/co/nmt.h 与 include/lely/co/nmt.hpp,可以把它概括为: 123456789co_nmt_t= 本节点 NMT 有限状态机+ 本地 CANopen 服务生命周期管理+ NMT 命令收发与发送抑制+ Heartbeat / Node Guarding / Life Guarding 总控+ 主站从节点状态表与启动策略+ 对象字典动态配置入口+ Boot Sla...
Lely CANopen LSS:主从状态机、Fastscan 与配置流程
Lely CANopen LSS:主从状态机、Fastscan 与配置流程 @[toc] LSS(Layer Setting Services)用于解决一个基础但特殊的问题:当设备还没有有效 Node-ID,或者整个网络需要切换 CAN 位率时,主站不能依赖普通 SDO 通道完成配置,因为 SDO 本身通常已经依赖有效 Node-ID。LSS 因此使用固定的 CAN-ID,并用对象字典 0x1018 的四个 32 位身份字段识别设备。 在 Lely CANopen 中,co_lss_t 同时承载 LSS master 和 LSS slave 两种角色。它不是一组“发送命令后阻塞等待结果”的同步函数,而是一个依附于 co_nmt_t、can_net_t 和 co_dev_t 的事件驱动有限状态机: 1234567891011应用提交 LSS 请求 ↓co_lss_*_req() 构造首帧或进入内部状态 ↓can_net_send() 发送 0x7E5 ↓can_recv_t 等待 0x7E4,can_timer_t 负责超时与帧间隔 ↓当前状态的 on_...
Lely CANopen SYNC、TIME 与 EMCY学习
Lely CANopen SYNC、TIME 与 EMCY学习 @[toc] SYNC、TIME 和 EMCY 都属于 CiA 301 通信对象,但在 Lely CANopen 中,它们并不是三个“收到 CAN 帧后直接调用用户回调”的简单模块。三者都被实现成依附于 can_net_t 和 co_dev_t 的被动服务对象:对象字典决定角色与 CAN-ID,can_recv_t 接收匹配报文,can_timer_t 驱动周期或抑制时间,最终通过回调或 can_net_send() 把事件交给上层。 三者的触发模型并不相同: co_sync_t 的 producer 周期直接由对象 0x1006 驱动,修改 0x1005/0x1006/0x1019 会立即重配 receiver、timer 和 counter; co_time_t 的 0x1012 只决定 producer/consumer 角色和 COB-ID,实际发送起点与周期仍要由 co_time_start_prod() 显式提交; co_emcy_t 不做周期发送,它把错误变化压入活动错误栈和 CAN 帧...
linux学习笔记系列
linux学习笔记系列 arch 1.1. arm 1.1.1. assembly (个人博客链接) 1.1.2. boot (个人博客链接) 1.1.3. debug (个人博客链接) 1.1.4. include (个人博客链接) 1.1.5. kernel (个人博客链接) 1.1.6. lds (个人博客链接) 1.1.7. lib (个人博客链接) 1.1.8. mm (个人博客链接) 1.1.9. process (个人博客链接) 1.1.10. sys_call_table (个人博客链接) block 2.1. bfq-iosched (个人博客链接) 2.2. bio (个人博客链接) 2.3. blk-core (个人博客链接) 2.4. blk-ioc (个人博客链接) 2.5. blk-mq (个人博客链接) 2.6. block (个人博客链接) 2.7. brd (个人博客链接) 2.8. elevator (个人博客链接) 2.9. fops (个人博客链接) 2.10. genhd (个人博客链接) 2.11. kyber-io...
ai
默认使用简体中文,先给结论,再给必要说明。回答应清晰、直接、准确,避免冗余和机械套模板。内容较长、包含多个独立问题或需区分层级时,使用 Markdown 标题、递进列表和必要表格。 输出与交付预计正文超过 800 个中文字符、包含 3 个及以上独立章节,或涉及生成、修改、交付源码、配置、构建、测试、CI、文档、报告或压缩包时,必须生成可下载文件。聊天中仅提供:一句结论、2~5 条关键摘要、下载链接。 用户明确要求“完整版本”“完整提示词”“完整配置”“完整源码”“可直接替换”或“便于复制”时,不受上述限制,必须在聊天中提供完整可复制内容,不得只给摘要、差异、伪代码或局部片段。 默认文件格式为 Markdown;用户明确指定或内容明显更适合其他格式时,使用 DOCX、PDF、XLSX、PPTX、ZIP 等。 代码修改交付涉及生成、修改、修复、重构、移植或交付源码、脚本、配置、构建文件、CI、测试、驱动、工具等工程文件时,默认且仅交付“修改文件原路径 ZIP”。 ZIP 只包含本次新增或修改后的完整文件,严格保持项目原始相对路径,解压到项目根目录后可直接覆盖;不得包含未修改文件或整个...
git学习笔记系列
git学习笔记系列 1. GitHub 开源项目可以用哪些免费的 AI 代码审核工具?CodeRabbit、Qodo OSS、LlamaPReview 怎么选 (个人博客链接) (CSDN链接) 2. GitHub侦探技巧:如何精确查找特定邮箱地址的所有代码提交(Commit) (个人博客链接) (CSDN链接) 3. Git向本地非裸仓库推送的机制与错误处理 (个人博客链接) (CSDN链接) 4. Git子模块(Submodule)合并冲突的原理与解决方案 (个人博客链接) (CSDN链接) 5. Git实战指南:如何从另一个分支同步文件时完整保留Commit提交历史 (个人博客链接) (CSDN链接) 6. Git文件状态显示异常的解决方案 (个人博客链接) (CSDN链接) 7. 修复 Git 仓库损坏全记录 (个人博客链接) 8. 修复 Git 仓库损坏全记录 (个人博客链接) 9. 如何将Git仓库中的特定文件夹及其历史完整迁移到另一个仓库 (个人博客链接) 10. 将 Git 仓库所有文件移入子目录的正确姿势 (个人博客链接) 11. 解决 git cherry-p...
hpatch学习笔记系列
hpatch学习笔记系列 libdivsufsort 1.1. DivSufSort (个人博客链接) 1.2. sssort (个人博客链接) 1.3. trsort (个人博客链接) SA-IS 2.1. SA-IS (个人博客链接) 3. hdiffpatch (个人博客链接) 4. HPatch (个人博客链接) 5. hpatch_lite (个人博客链接) 6. SuffixString (个人博客链接) 7. tinyuz (个人博客链接)
uboot学习笔记系列
uboot学习笔记系列 other 1.1. [U-BOOT][STM32]SD卡导入导出环境变量 (个人博客链接) (CSDN链接) 1.2. [U-BOOT][STM32]设置使用SD卡中的linux程序启动 (个人博客链接) (CSDN链接) 1.3. [U-BOOT][STM32F40xx]移植与编写 (个人博客链接) (CSDN链接) 1.4. [UBOOT][STM32]编写LED支持教程 (个人博客链接) (CSDN链接) 1.5. [uboot][stm32]配置LTDC屏幕 (个人博客链接) (CSDN链接) 1.6. objdump反汇编失败的解决办法 (个人博客链接) (CSDN链接) 1.7. U-BOOT CLANGD使用 + 避坑注意事项 (个人博客链接) (CSDN链接) 1.8. U-BOOT 配置按钮功能及使用教程 (个人博客链接) (CSDN链接) 1.9. ubantu st-link 调试 (个人博客链接) (CSDN链接) 1.10. UBOOT 早期串口调试功能CONFIG_DEBUG_UART适配教程 (个人博客链接) (CSD...








