# CANopen从站设备 - 快速开始指南 ## 📋 前提条件 1. **硬件要求** - 创芯科技USBCAN2适配器 - CAN总线连接线 - Windows电脑 2. **软件要求** - Visual Studio 2019或更高版本 - .NET Framework 4.7.2 - controlcan.dll (CAN卡驱动) ## 🚀 5分钟快速上手 ### 步骤1: 准备环境 1. 确保`controlcan.dll`在`bin\Debug`目录下 2. 连接USBCAN2设备到USB端口 3. 连接CAN总线 ### 步骤2: 编译项目 ```bash # 方法1: 使用Visual Studio 打开 CanOpenSlaveTest.sln 按 Ctrl+Shift+B 编译 # 方法2: 使用MSBuild msbuild CanOpenSlaveTest.csproj /p:Configuration=Debug ``` ### 步骤3: 运行程序 ```bash cd bin\Debug CanOpenSlaveTest.exe ``` ### 步骤4: 启动从站 1. 点击 **"启动从站"** 按钮 2. 观察日志输出,确认启动成功 3. 配置心跳时间(建议100ms) 4. 点击 **"配置心跳"** 按钮 ### 步骤5: 测试通信 #### 发送TPDO - 点击 **"发送TPDO1"** 或 **"发送TPDO2"** 按钮 - 或使用CAN分析仪监控总线上的数据 #### 接收RPDO - 使用主站发送RPDO到从站 - 观察日志窗口中的接收信息 ## 📊 界面说明 ``` ┌─────────────────────────────────────────────┐ │ 设备信息 │ │ 节点ID: 1 │ │ 状态: PreOperational │ │ 运行状态: 运行中 │ └─────────────────────────────────────────────┘ ┌─────────────────────────────────────────────┐ │ 控制 │ │ [启动从站] [停止从站] │ │ [发送TPDO1] [发送TPDO2] [发送所有TPDO] │ └─────────────────────────────────────────────┘ ┌─────────────────────────────────────────────┐ │ 心跳配置 │ │ 心跳时间(ms): [100] [配置心跳] │ └─────────────────────────────────────────────┘ ┌─────────────────────────────────────────────┐ │ 日志 │ │ [15:30:45.123] CANopen从站测试程序已启动 │ │ [15:30:45.125] 节点ID: 1 │ │ [15:30:50.456] ✓ 从站启动成功 │ │ [15:30:55.789] ← 收到RPDO1 [节点1]: 12 34 │ │ ... │ └─────────────────────────────────────────────┘ ``` ## 🔧 常用操作 ### 1. 修改节点ID 编辑代码: ```csharp // 在 SlaveTestForm.cs 的 InitializeComponent() 中 m_slaveDevice = new CanOpenSlaveDevice(nodeId: 5); // 改为5 ``` ### 2. 更改波特率 ```csharp // 在 BtnStart_Click 方法中 m_slaveDevice.Start(CanBaudRate.BaudRate_500K); // 500kbps ``` ### 3. 处理RPDO数据 ```csharp private void SlaveDevice_OnRpdoReceived(byte nodeId, byte pdoNumber, byte[] data) { // 解析数据 if (pdoNumber == 1 && data.Length >= 2) { int value = data[0] | (data[1] << 8); Console.WriteLine($"RPDO1数据: {value}"); } } ``` ### 4. 自定义TPDO数据 需要扩展`CanOpenSlaveDevice`类: ```csharp public void SendTpdoWithData(byte pdoNumber, byte[] customData) { if (pdoNumber < 1 || pdoNumber > 4) throw new ArgumentException("PDO编号必须在1-4之间"); uint cobId = m_tpdoConfigs[pdoNumber - 1].CobId; m_canManager.SendCanFrame(cobId, customData); } ``` ## 🎯 典型应用场景 ### 场景1: 数据采集从站 ```csharp // 定期采集传感器数据并通过TPDO发送 private Timer m_dataTimer; private void StartDataCollection() { m_dataTimer = new Timer(state => { if (m_slaveDevice.CurrentState == NmtState.Operational) { // 读取传感器数据 byte[] sensorData = ReadSensorData(); // 通过TPDO1发送 m_slaveDevice.SendTpdo(1); // 需要扩展支持自定义数据 } }, null, 0, 100); // 每100ms采集一次 } ``` ### 场景2: 控制命令接收 ```csharp // 接收主站的控制命令 m_slaveDevice.OnRpdoReceived += (nodeId, pdoNum, data) => { if (pdoNum == 1 && data.Length >= 2) { // 解析控制命令 byte command = data[0]; byte parameter = data[1]; ExecuteCommand(command, parameter); } }; ``` ### 场景3: 参数配置 ```csharp // 通过SDO配置从站参数 m_slaveDevice.OnSdoWriteRequest += (nodeId, index, subIndex, value) => { if (index == 0x2000) // 自定义参数索引 { // 更新内部参数 UpdateParameter(subIndex, value); } }; ``` ## 🐛 故障排查 ### 问题1: 启动失败 **症状**: 点击"启动从站"后显示失败 **解决方案**: 1. 检查USBCAN2是否正确连接 2. 确认`controlcan.dll`存在且版本正确 3. 检查CAN总线终端电阻(120Ω) 4. 验证波特率设置是否与主站一致 ### 问题2: 收不到RPDO **症状**: 主站发送RPDO,但从站没有反应 **解决方案**: 1. 确认COB-ID配置正确(0x200+nodeId等) 2. 检查从站是否处于Operational状态 3. 使用CAN分析仪验证帧是否发送到总线 4. 检查RPDO是否启用 ### 问题3: TPDO发送失败 **症状**: 点击发送按钮无响应 **解决方案**: 1. 确认从站已启动 2. 检查TPDO配置是否启用 3. 验证COB-ID是否正确(0x180+nodeId等) 4. 查看日志是否有错误信息 ### 问题4: 心跳不工作 **症状**: 配置心跳后没有心跳帧 **解决方案**: 1. 确认心跳时间大于0 2. 检查从站状态是否为PreOperational或Operational 3. 验证定时器是否正常创建 4. 查看控制台输出 ## 📚 下一步学习 1. **阅读完整文档**: 查看 `README.md` 2. **研究EDS文件**: 理解 `Nameless.eds` 的配置 3. **学习CANopen协议**: 参考 CiA DS301 标准 4. **扩展功能**: 添加自定义对象字典条目 ## 💡 提示 - ✅ 始终在操作前检查从站状态 - ✅ 使用日志输出来调试通信问题 - ✅ 保持COB-ID配置与主站一致 - ✅ 定期保存和备份配置 - ✅ 在生产环境中添加异常处理 ## 📞 获取帮助 遇到问题? 1. 查看日志窗口的详细输出 2. 使用CAN分析仪诊断总线通信 3. 参考 `README.md` 中的常见问题 4. 检查EDS文件配置是否正确 --- **祝使用愉快!** 🎉