# CANopen主站实现 ## 项目概述 本项目基于创芯科技CAN卡底层库(`CanLibraryClass`)和已有的`CanOpenManager`类,实现了完整的CANopen主站功能。 ## 文件结构 ``` CanTest/ ├── CanLibraryClass.cs # CAN卡底层驱动封装(已存在) ├── CanOpenManager.cs # CANopen基础通信类(已存在) ├── CanOpenMaster.cs # CANopen主站管理器(新增) ⭐ ├── CanOpenSlave.cs # CANopen从站实现(已存在) ├── ObjectDictionary.cs # 对象字典管理(已存在) ├── EdsFileGenerator.cs # EDS文件生成器(已存在) ├── Program.cs # 主程序(已更新) ⭐ └── CANopen主站使用指南.md # 使用文档(新增) ⭐ ``` ## 核心功能 ### 1. CanOpenMaster - 主站管理器 **主要特性:** - ✅ 多节点管理(最多127个节点) - ✅ NMT网络管理(启动/停止/重置节点) - ✅ SDO服务数据对象通信(读写操作) - ✅ PDO过程数据对象通信(TPDO/RPDO) - ✅ SYNC同步对象(单次/周期性) - ✅ 心跳监测和节点在线状态判断 - ✅ 紧急消息处理 - ✅ 后台接收线程自动处理CAN帧 - ✅ 事件驱动的异步数据处理 - ✅ 完善的日志和统计功能 **关键方法:** ```csharp // 初始化和节点管理 Initialize(baudRate) AddNode(nodeId, nodeName) GetNode(nodeId) // NMT控制 NmtStartNode(nodeId) NmtStopNode(nodeId) StartAllNodes() StopAllNodes() // SDO通信 SdoReadAndWait(nodeId, index, subIndex, timeout) SdoWriteAndWait(nodeId, index, subIndex, data, timeout) ReadDeviceType(nodeId) ReadVendorId(nodeId) // PDO通信 SendSync(counter) EnableSync(intervalMs) DisableSync() ConfigureTpdoTransmissionType(nodeId, pdoNumber, type) // 资源管理 Close() Dispose() ``` ### 2. CanOpenNode - 节点信息类 **跟踪每个从站节点的状态:** - 节点ID和名称 - 当前NMT状态 - 心跳时间和计数 - SDO成功/超时统计 - TPDO接收统计 - 紧急消息统计 - 在线状态判断 ## 使用示例 ### 基本用法 ```csharp using CCDCount.DLL.CanBus; // 创建主站 using (CanOpenMaster master = new CanOpenMaster(4, 0, 0)) { // 注册事件 master.OnTpdoReceived += (nodeId, data) => { Console.WriteLine($"TPDO from node {nodeId}"); }; master.OnHeartbeatReceived += (nodeId, status) => { Console.WriteLine($"Heartbeat from node {nodeId}"); }; // 初始化 master.Initialize(CanBaudRate.BaudRate_500K); // 添加节点 master.AddNode(1, "IO_Module"); master.AddNode(2, "Servo"); // 启动节点 master.StartAllNodes(); // 启用SYNC master.EnableSync(10); // 10ms周期 // 主循环 while (running) { // PDO数据通过事件自动接收 // SDO读写 var response = master.SdoReadAndWait(1, 0x1000, 0x00); master.SdoWriteAndWait(1, 0x6200, 0x01, 0x00000001); Thread.Sleep(10); } // 清理 master.DisableSync(); master.StopAllNodes(); } ``` ### 完整示例 参考 `Program.cs` 中的以下方法: - `RunCanOpenMaster()` - 完整的主站示例 - `SimpleCanOpenMasterTest()` - 简单测试示例 ## 技术架构 ### 分层设计 ``` 应用层 (Program.cs) ↓ 主站管理层 (CanOpenMaster.cs) ↓ 协议处理层 (CanOpenManager.cs) ↓ 驱动层 (CanLibraryClass.cs) ↓ 硬件层 (创芯科技CAN卡) ``` ### 线程模型 ``` 主线程: 发送命令、SDO读写、NMT控制 ↓ 接收线程: 持续监听CAN总线,解析帧,触发事件 ↓ 事件回调: 异步处理TPDO、心跳、紧急消息 ``` ## CANopen协议支持 ### 支持的COB-ID | 功能码 | COB-ID范围 | 说明 | |--------|-----------|------| | NMT | 0x000 | 网络管理 | | SYNC | 0x080 | 同步对象 | | EMCY | 0x081-0xFF | 紧急消息 | | TIME | 0x100 | 时间戳(可选) | | SDO Request | 0x600+NodeId | SDO请求 | | SDO Response | 0x580+NodeId | SDO响应 | | Heartbeat | 0x700+NodeId | 心跳/NMT错误控制 | | TPDO1 | 0x180+NodeId | 发送PDO 1 | | TPDO2 | 0x280+NodeId | 发送PDO 2 | | TPDO3 | 0x380+NodeId | 发送PDO 3 | | TPDO4 | 0x480+NodeId | 发送PDO 4 | | RPDO1 | 0x200+NodeId | 接收PDO 1 | | RPDO2 | 0x300+NodeId | 接收PDO 2 | | RPDO3 | 0x400+NodeId | 接收PDO 3 | | RPDO4 | 0x500+NodeId | 接收PDO 4 | ### NMT状态机 ``` Initializing → PreOperational ↔ Operational ↓ Stopped ``` ### SDO服务 - ✅ 快速读取(Upload) - ✅ 快速写入(Download) - ✅ 带超时等待的读写 - ✅ 自动解析响应数据 ### PDO服务 - ✅ TPDO接收(事件驱动) - ✅ RPDO发送 - ✅ SYNC同步触发 - ✅ 传输类型配置 - ✅ 数据统计 ## 性能特性 ### 实时性 - 后台接收线程确保及时响应 - 事件驱动避免轮询开销 - SYNC周期可配置(最小1ms) ### 可靠性 - SDO超时和重试机制 - 心跳监测判断节点在线状态 - 紧急消息即时通知 - 完善的错误处理 ### 可扩展性 - 支持最多127个节点 - 事件回调便于集成到不同应用 - 模块化设计易于扩展 ## 注意事项 ### 1. 线程安全 - 事件回调在接收线程中执行 - UI更新需要使用Invoke/BeginInvoke - 避免在事件回调中执行耗时操作 ### 2. 总线负载 - SDO适合配置和诊断,不适合高速数据 - PDO适合周期性数据传输 - 合理设置SYNC周期 - 多个节点间添加延时 ### 3. 资源管理 - 使用`using`语句或手动调用`Dispose()` - 关闭前先停止SYNC和节点 - 确保CAN卡驱动正确安装 ### 4. 调试技巧 - 启用日志输出查看通信过程 - 使用CAN分析仪监控总线 - 检查节点统计信息 - 验证EDS文件配置 ## 与从站的配合 本主站可以与任何符合CANopen标准的从站通信,包括: - 本项目中的`CanOpenSlave`实现的从站 - 第三方CANopen设备(伺服驱动器、IO模块等) - 汇川PLC作为从站 只需确保: 1. 波特率一致 2. 节点ID不冲突 3. PDO映射正确配置 4. EDS文件正确导入(如需要) ## 测试建议 ### 单元测试 1. 单节点通信测试 2. 多节点并发测试 3. SDO读写测试 4. PDO数据传输测试 5. NMT状态切换测试 6. 异常处理测试 ### 集成测试 1. 与真实从站设备通信 2. 长时间稳定性测试 3. 高负载压力测试 4. 断线重连测试 ## 后续扩展方向 ### 可能的增强功能 - [ ] LSS(层设置服务)支持 - [ ] 时间戳对象支持 - [ ] 更多SDO分段传输支持 - [ ] PDO自动映射配置 - [ ] 图形化监控界面 - [ ] 数据记录和分析工具 - [ ] 配置文件支持 - [ ] 远程诊断功能 ## 相关文档 - [CANopen主站使用指南.md](./CANopen主站使用指南.md) - 详细使用说明 - [CANopen从站使用指南.md](./CANopen从站使用指南.md) - 从站实现说明 - CiA DS 301 - CANopen协议规范 - 创芯科技CAN卡开发文档 ## 版本历史 ### v1.0 (2026-05-08) - ✅ 初始版本发布 - ✅ 实现完整的CANopen主站功能 - ✅ 支持多节点管理 - ✅ 实现NMT/SDO/PDO/SYNC/Heartbeat/EMCY - ✅ 提供完整示例和文档 ## 技术支持 如有问题或建议,请参考: - 项目文档 - 示例代码 - CANopen协议规范 - 创芯科技技术支持 --- **作者**: Lingma (灵码) **创建日期**: 2026-05-08 **许可证**: 根据项目规定