# CANopen从站 - 快速开始指南 ## 🎯 5分钟快速上手 ### 第一步:运行示例程序 ```bash cd d:\work\WindowsFormsTest\CanTest # 使用Visual Studio打开项目并运行 # 或使用命令行编译运行 ``` 程序会自动: 1. 创建节点ID为5的CANopen从站 2. 初始化CAN通信(500kbps) 3. 配置PDO映射 4. 生成EDS文件 5. 启动从站并开始通信 ### 第二步:查看生成的EDS文件 运行后会在目录中生成 `CanOpenSlave_Node5.eds` 文件,这就是PLC需要的配置文件。 ### 第三步:在PLC中导入EDS #### 西门子 TIA Portal 1. 打开TIA Portal项目 2. 进入"硬件配置" 3. 右键"CANopen主站" → "导入GSD/EDS文件" 4. 选择 `CanOpenSlave_Node5.eds` 5. 将设备拖到网络拓扑 6. 设置节点ID = 5 7. 编译并下载到PLC #### 三菱 GX Works3 1. 打开网络配置 2. 导入EDS文件 3. 配置主站参数 4. 下载程序 #### 倍福 TwinCAT 1. 扫描设备 2. 导入EDS 3. 配置PDO映射 4. 激活配置 ### 第四步:验证通信 启动PLC后,观察: - ✅ 从站收到NMT Start命令 - ✅ 从站发送心跳报文(0x705) - ✅ PDO数据周期性交换 - ✅ 可以使用CAN分析仪抓包验证 ## 💻 代码示例 ### 最简示例(10行代码) ```csharp using CCDCount.DLL.CanBus; using (var slave = new CanOpenSlave(5)) { slave.Initialize(CanBaudRate.BaudRate_500K); slave.ConfigureTpdo(1, true); slave.SetHeartbeatTime(1000); slave.Start(); // 运行业务逻辑... slave.Stop(); } ``` ### 完整示例 参见 `Program.cs` 中的 `RunCanOpenSlave()` 方法。 ### PDO映射示例 参见 `PdoMappingExample.cs` 文件。 ## 📚 文档导航 | 文档 | 说明 | |------|------| | [README_CANopen_Slave.md](./README_CANopen_Slave.md) | 完整项目说明和技术细节 | | [CANopen从站使用指南.md](./CANopen从站使用指南.md) | 详细使用手册和PLC配置 | | [CANopen使用指南.md](./CANopen使用指南.md) | CANopen协议基础概念 | ## 🔍 核心API速查 ### 初始化和启动 ```csharp // 创建从站 CanOpenSlave slave = new CanOpenSlave(nodeId: 5); // 初始化 slave.Initialize(CanBaudRate.BaudRate_500K); // 启动 slave.Start(); // 停止 slave.Stop(); ``` ### 数据读写 ```csharp // 写入对象字典 slave.SetObjectValue(0x6000, 0x01, (byte)0xAA); // 读取对象字典 var value = slave.GetObjectValue(0x6200, 0x01); ``` ### PDO配置 ```csharp // 配置TPDO(从站→PLC) slave.ConfigureTpdo(pdoNumber: 1, enabled: true, transmissionType: 0xFF); // 配置RPDO(PLC→从站) slave.ConfigureRpdo(pdoNumber: 1, enabled: true); // 发送TPDO slave.SendTpdo(1); ``` ### EDS生成 ```csharp // 生成EDS文件 slave.GenerateEdsFile("MyDevice.eds"); ``` ## ⚙️ 常见配置 ### 配置1:数字IO从站 ```csharp // TPDO1: 发送8位数字输入 slave.ConfigureTpdo(1, true, 0xFF); slave.SetObjectValue(0x1A00, 0x00, (byte)1); slave.SetObjectValue(0x1A00, 0x01, (uint)(0x6000U << 16 | 0x01U << 8 | 0x08U)); // RPDO1: 接收8位数字输出 slave.ConfigureRpdo(1, true); slave.SetObjectValue(0x1600, 0x00, (byte)1); slave.SetObjectValue(0x1600, 0x01, (uint)(0x6200U << 16 | 0x01U << 8 | 0x08U)); ``` ### 配置2:模拟量采集从站 ```csharp // TPDO1: 发送4通道模拟输入(每通道16位) slave.ConfigureTpdo(1, true, 10); // SYNC同步,每10个周期发送 slave.SetObjectValue(0x1A00, 0x00, (byte)4); slave.SetObjectValue(0x1A00, 0x01, (uint)(0x6400U << 16 | 0x01U << 8 | 0x10U)); slave.SetObjectValue(0x1A00, 0x02, (uint)(0x6400U << 16 | 0x02U << 8 | 0x10U)); slave.SetObjectValue(0x1A00, 0x03, (uint)(0x6400U << 16 | 0x03U << 8 | 0x10U)); slave.SetObjectValue(0x1A00, 0x04, (uint)(0x6400U << 16 | 0x04U << 8 | 0x10U)); ``` ### 配置3:混合IO从站 ```csharp // TPDO1: 数字输入 + 模拟输入 // RPDO1: 数字输出 + 模拟输出 // 参见 PdoMappingExample.cs ``` ## 🐛 故障排除 ### 问题1:无法打开CAN设备 **症状:** `Initialize()` 返回 false **解决:** 1. 确认CAN卡已正确插入USB口 2. 检查驱动程序是否安装 3. 确认 `controlcan.dll` 在程序目录 4. 尝试更换USB端口 ### 问题2:PLC找不到从站 **症状:** PLC报"从站离线"或"心跳超时" **解决:** 1. 检查CAN总线接线(CAN_H接CAN_H,CAN_L接CAN_L) 2. 确认波特率一致(都是500kbps) 3. 验证节点ID配置正确 4. 检查终端电阻(总线两端各120Ω) 5. 使用CAN分析仪抓包验证 ### 问题3:PDO无数据 **症状:** PLC收不到PDO数据 **解决:** 1. 确认从站处于Operational状态(收到NMT Start) 2. 检查PDO是否已启用:`ConfigureTpdo(1, true)` 3. 验证PDO映射配置与PLC一致 4. 检查COB-ID是否正确 5. 对于SYNC触发的PDO,确认PLC发送了SYNC ### 问题4:SDO通信失败 **症状:** PLC读写对象字典超时 **解决:** 1. 验证对象索引和子索引是否正确 2. 检查数据类型是否匹配 3. 确认对象存在且可访问 4. 查看SDO响应报文 ## 📞 获取帮助 1. 查看详细文档:[README_CANopen_Slave.md](./README_CANopen_Slave.md) 2. 参考示例代码:`PdoMappingExample.cs` 3. 查阅CANopen标准:CiA 301协议文档 4. 使用CAN分析仪调试 ## ✅ 检查清单 在部署前确认: - [ ] CAN卡驱动已安装 - [ ] `controlcan.dll` 在程序目录 - [ ] CAN总线接线正确 - [ ] 终端电阻已安装(120Ω) - [ ] 波特率与PLC一致 - [ ] 节点ID唯一(不冲突) - [ ] EDS文件已导入PLC - [ ] PDO映射配置一致 - [ ] 从站能收到NMT Start命令 - [ ] 心跳报文正常发送 - [ ] PDO数据正常交换 --- **准备好了吗?开始编码吧!** 🚀