向羽 孟 2448685770 添加项目文件。 1 月之前
..
CANopen主站与EDS文件详解.md 2448685770 添加项目文件。 1 月之前
CANopen主站使用指南.md 2448685770 添加项目文件。 1 月之前
CANopen从站使用指南.md 2448685770 添加项目文件。 1 月之前
CANopen使用指南.md 2448685770 添加项目文件。 1 月之前
CanOpenSlave.cs 2448685770 添加项目文件。 1 月之前
CanOpenUsageExample.cs 2448685770 添加项目文件。 1 月之前
EdsFileGenerator.cs 2448685770 添加项目文件。 1 月之前
EdsGeneratorTest.cs 2448685770 添加项目文件。 1 月之前
ObjectDictionary.cs 2448685770 添加项目文件。 1 月之前
PdoMappingExample.cs 2448685770 添加项目文件。 1 月之前
README_CANopen_Master.md 2448685770 添加项目文件。 1 月之前
README_CANopen_Slave.md 2448685770 添加项目文件。 1 月之前
快速开始.md 2448685770 添加项目文件。 1 月之前
快速开始_主站.md 2448685770 添加项目文件。 1 月之前

README_CANopen_Master.md

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帧
  • ✅ 事件驱动的异步数据处理
  • ✅ 完善的日志和统计功能

关键方法:

// 初始化和节点管理
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接收统计
  • 紧急消息统计
  • 在线状态判断

使用示例

基本用法

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自动映射配置
  • 图形化监控界面
  • 数据记录和分析工具
  • 配置文件支持
  • 远程诊断功能

相关文档

版本历史

v1.0 (2026-05-08)

  • ✅ 初始版本发布
  • ✅ 实现完整的CANopen主站功能
  • ✅ 支持多节点管理
  • ✅ 实现NMT/SDO/PDO/SYNC/Heartbeat/EMCY
  • ✅ 提供完整示例和文档

技术支持

如有问题或建议,请参考:

  • 项目文档
  • 示例代码
  • CANopen协议规范
  • 创芯科技技术支持

作者: Lingma (灵码)
创建日期: 2026-05-08
许可证: 根据项目规定