PROJECT_OVERVIEW.md 7.9 KB

CANopen从站设备项目

🎯 项目简介

基于Nameless.eds文件实现的CANopen从站设备,使用创芯科技USBCAN2适配器。

主要特性:

  • ✅ 4个RPDO + 4个TPDO
  • ✅ SDO通信(读/写)
  • ✅ NMT网络管理
  • ✅ 心跳机制
  • ✅ SYNC同步
  • ✅ 图形化测试界面

📂 项目结构

CanOpenSlaveTest/
│
├── 📄 核心代码文件
│   ├── CanLibraryClass.cs        # CAN卡驱动接口(P/Invoke)
│   ├── CanOpenManager.cs         # CANopen协议管理器(基础层)
│   ├── CanOpenSlaveDevice.cs     # ⭐ CANopen从站设备(核心实现)
│   ├── EdsValidator.cs           # EDS文件验证器
│   ├── Program.cs                # 应用程序入口
│   └── SlaveTestForm.cs          # ⭐ Windows Forms测试界面
│
├── 📋 配置文件
│   ├── CanOpenSlaveTest.csproj   # C#项目文件
│   ├── CanOpenSlaveTest.sln      # Visual Studio解决方案
│   └── App.config                # 应用配置
│
├── 📚 文档
│   ├── README.md                 # 完整使用文档
│   ├── QUICKSTART.md             # 5分钟快速上手指南
│   └── IMPLEMENTATION_SUMMARY.md # 实现总结和技术细节
│
├── 📁 资源目录
│   ├── bin/Debug/
│   │   ├── controlcan.dll       # CAN卡驱动库
│   │   └── Nameless.eds         # EDS配置文件
│   ├── Properties/
│   │   └── AssemblyInfo.cs      # 程序集信息
│   └── Dll/                     # 其他DLL文件
│
└── 📝 其他
    └── obj/                     # 编译中间文件

🚀 快速开始

1️⃣ 环境准备

# 确保以下文件存在
✓ controlcan.dll 在 bin\Debug\ 目录
✓ USBCAN2设备已连接
✓ CAN总线已正确接线

2️⃣ 编译运行

# 方法1: Visual Studio
打开 CanOpenSlaveTest.sln → F5运行

# 方法2: 命令行
msbuild CanOpenSlaveTest.csproj
cd bin\Debug
CanOpenSlaveTest.exe

3️⃣ 基本操作

1. 点击 [启动从站] 按钮
2. 设置心跳时间 (建议100ms)
3. 点击 [配置心跳]
4. 测试发送TPDO或接收RPDO

📖 详细文档

文档 用途 适合人群
QUICKSTART.md 5分钟快速上手 新手用户
README.md 完整使用说明和API参考 开发者
IMPLEMENTATION_SUMMARY.md 技术实现细节 高级开发者

🔧 核心类说明

CanOpenSlaveDevice(⭐ 核心类)

// 创建从站
var slave = new CanOpenSlaveDevice(nodeId: 1);

// 注册事件
slave.OnRpdoReceived += (id, num, data) => { /* 处理RPDO */ };
slave.OnNmtStateChanged += (old, newState) => { /* 状态变化 */ };

// 启动
slave.Start(CanBaudRate.BaudRate_1M);

// 配置心跳
slave.ConfigureHeartbeat(100);

// 发送TPDO
slave.SendTpdo(1);

// 停止
slave.Stop();
slave.Dispose();

主要功能模块

CanOpenSlaveDevice
├── NMT管理
│   ├── 启动/停止节点
│   ├── 预操作状态
│   └── 重置功能
│
├── PDO通信
│   ├── RPDO1-4 (接收)
│   ├── TPDO1-4 (发送)
│   └── 事件驱动/同步触发
│
├── SDO服务
│   ├── 对象字典读取
│   ├── 对象字典写入
│   └── 错误处理
│
├── 心跳机制
│   ├── 可配置时间
│   └── 自动状态报告
│
└── SYNC同步
    ├── SYNC帧接收
    └── 同步TPDO发送

📊 COB-ID速查表

类型 COB-ID 示例(ID=1)
NMT 0x000 0x000
SYNC 0x080 0x080
TPDO1 0x180+ID 0x181
TPDO2 0x280+ID 0x281
TPDO3 0x380+ID 0x381
TPDO4 0x480+ID 0x481
RPDO1 0x200+ID 0x201
RPDO2 0x300+ID 0x301
RPDO3 0x400+ID 0x401
RPDO4 0x500+ID 0x501
SDO请求 0x600+ID 0x601
SDO响应 0x580+ID 0x581
Heartbeat 0x700+ID 0x701

🎨 界面预览

┌────────────────────────────────────────────────────┐
│            CANopen从站设备测试                       │
├────────────────────────────────────────────────────┤
│ 设备信息                                            │
│ ├─ 节点ID: 1                                       │
│ ├─ 状态: Operational                               │
│ └─ 运行状态: 运行中                                 │
├────────────────────────────────────────────────────┤
│ 控制                                                │
│ [启动从站] [停止从站]                               │
│ [发送TPDO1] [发送TPDO2] [发送所有TPDO]              │
├────────────────────────────────────────────────────┤
│ 心跳配置                                            │
│ 心跳时间(ms): [100 ▼] [配置心跳]                    │
├────────────────────────────────────────────────────┤
│ 日志                                                │
│ ┌────────────────────────────────────────────────┐ │
│ │ [15:30:45.123] CANopen从站测试程序已启动        │ │
│ │ [15:30:50.456] ✓ 从站启动成功                   │ │
│ │ [15:30:55.789] ← 收到RPDO1: 12 34 56 78        │ │
│ │ [15:31:00.012] → 已发送TPDO1                    │ │
│ │ ...                                             │ │
│ └────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────┘

💡 常见场景

场景1: 数据采集

// 定期通过TPDO发送传感器数据
slave.OnNmtStateChanged += (old, state) => {
    if (state == NmtState.Operational) {
        StartSensorPolling();
    }
};

场景2: 命令接收

// 处理主站发送的控制命令
slave.OnRpdoReceived += (id, num, data) => {
    if (num == 1) {
        ExecuteCommand(data[0], data[1]);
    }
};

场景3: 参数配置

// 通过SDO动态配置参数
slave.OnSdoWriteRequest += (id, idx, subIdx, val) => {
    if (idx == 0x2000) {
        UpdateCustomParameter(val);
    }
};

❓ 常见问题

Q: 启动失败怎么办?
A: 检查controlcan.dll是否存在,USBCAN2是否连接,CAN总线是否正确接线。

Q: 如何修改节点ID?
A: 在代码中修改:new CanOpenSlaveDevice(nodeId: 5)

Q: 收不到RPDO?
A: 确认COB-ID配置、从站状态、波特率设置是否与主站一致。

Q: 如何自定义TPDO数据?
A: 需要扩展SendTpdo方法,添加自定义数据参数。

更多问题请查看 README.md 的"常见问题"章节。

🛠️ 开发环境

  • IDE: Visual Studio 2019+
  • 框架: .NET Framework 4.7.2
  • 语言: C#
  • 硬件: 创芯科技USBCAN2

📞 技术支持

  • 📖 查看完整文档: README.md
  • 🚀 快速上手: QUICKSTART.md
  • 🔍 技术细节: IMPLEMENTATION_SUMMARY.md
  • 📋 EDS配置: bin\Debug\Nameless.eds

📄 许可证

本项目仅供学习和研究使用。


版本: v1.0
更新日期: 2026-05-09
开发工具: Lingma (灵码) - Alibaba Cloud

祝您使用愉快! 🎉