# 在Visual Studio中打开CanTest项目
# 或者使用命令行编译
msbuild CanTest.csproj
// Program.cs中的Main方法已经配置为运行主站示例
// 直接运行即可
static void Main(string[] args)
{
RunCanOpenMaster(); // 已启用
// RunCanOpenSlave(); // 已注释
}
程序会执行以下操作:
如果只想测试基本功能,可以使用简化版本:
static void SimpleTest()
{
using (CanOpenMaster master = new CanOpenMaster(4, 0, 0))
{
// 注册事件
master.OnHeartbeatReceived += (id, status) =>
Console.WriteLine($"HB from {id}");
// 初始化
master.Initialize(CanBaudRate.BaudRate_500K);
// 添加节点
master.AddNode(1);
// 等待
Thread.Sleep(2000);
// 读取设备类型
uint type = master.ReadDeviceType(1);
Console.WriteLine($"Device Type: 0x{type:X8}");
// 启动节点
master.NmtStartNode(1);
Console.WriteLine("Done!");
}
}
// 监控数字输入
master.OnTpdoReceived += (nodeId, data) =>
{
if (nodeId == 1 && data.Length >= 2)
{
byte di1 = data[0];
byte di2 = data[1];
Console.WriteLine($"DI1={di1}, DI2={di2}");
}
};
// 控制数字输出
master.SdoWriteAndWait(1, 0x6200, 0x01, 0x000000FF);
// 读取位置
var response = master.SdoReadAndWait(3, 0x6064, 0x00);
if (response != null)
{
int position = BitConverter.ToInt32(response, 4);
Console.WriteLine($"Position: {position}");
}
// 设置目标位置
master.SdoWriteAndWait(3, 0x607A, 0x00, 10000);
// 启动运动
master.SdoWriteAndWait(3, 0x6040, 0x00, 0x000F);
// 存储所有节点的数据
Dictionary<byte, List<byte[]>> nodeData = new Dictionary<byte, List<byte[]>>();
master.OnTpdoReceived += (nodeId, data) =>
{
if (!nodeData.ContainsKey(nodeId))
nodeData[nodeId] = new List<byte[]>();
nodeData[nodeId].Add(data);
// 每100条数据保存一次
if (nodeData[nodeId].Count % 100 == 0)
{
SaveData(nodeId, nodeData[nodeId]);
}
};
症状: Initialize() 返回 false
解决:
症状: 没有心跳事件触发
解决:
症状: SdoReadAndWait() 返回 null
解决:
症状: 没有TPDO事件触发
解决:
master.OnLogMessage += msg => Console.WriteLine(msg);
while (running)
{
foreach (var nodeId in master.NodeIds)
{
var node = master.GetNode(nodeId);
Console.WriteLine($"{nodeId}: {node.GetStateString()}, " +
$"Online={node.IsOnline()}, " +
$"HB={node.HeartbeatCount}");
}
Thread.Sleep(1000);
}
推荐使用CAN分析仪工具:
// ❌ 不好 - 频繁SDO读写
while (true)
{
master.SdoReadAndWait(1, 0x6000, 0x01);
Thread.Sleep(10);
}
// ✅ 好 - 使用PDO
master.EnableSync(10); // PDO自动传输
master.OnTpdoReceived += (nodeId, data) =>
{
// 将数据放入队列,后台线程处理
dataQueue.Enqueue(new { NodeId = nodeId, Data = data });
};
// 根据应用需求选择
master.EnableSync(1); // 高速控制(1ms)
master.EnableSync(10); // 一般应用(10ms)
master.EnableSync(100); // 慢速监控(100ms)
Program.cs 中的完整示例祝你使用愉快! 🚀