|
|
před 1 měsícem | |
|---|---|---|
| .. | ||
| CANopen主站与EDS文件详解.md | před 1 měsícem | |
| CANopen主站使用指南.md | před 1 měsícem | |
| CANopen从站使用指南.md | před 1 měsícem | |
| CANopen使用指南.md | před 1 měsícem | |
| CanOpenSlave.cs | před 1 měsícem | |
| CanOpenUsageExample.cs | před 1 měsícem | |
| EdsFileGenerator.cs | před 1 měsícem | |
| EdsGeneratorTest.cs | před 1 měsícem | |
| ObjectDictionary.cs | před 1 měsícem | |
| PdoMappingExample.cs | před 1 měsícem | |
| README_CANopen_Master.md | před 1 měsícem | |
| README_CANopen_Slave.md | před 1 měsícem | |
| 快速开始.md | před 1 měsícem | |
| 快速开始_主站.md | před 1 měsícem | |
本项目基于创芯科技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 # 使用文档(新增) ⭐
主要特性:
关键方法:
// 初始化和节点管理
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()
跟踪每个从站节点的状态:
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、心跳、紧急消息
| 功能码 | 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 |
Initializing → PreOperational ↔ Operational
↓
Stopped
using语句或手动调用Dispose()本主站可以与任何符合CANopen标准的从站通信,包括:
CanOpenSlave实现的从站只需确保:
如有问题或建议,请参考:
作者: Lingma (灵码)
创建日期: 2026-05-08
许可证: 根据项目规定