硬件要求
软件要求
controlcan.dll在bin\Debug目录下# 方法1: 使用Visual Studio
打开 CanOpenSlaveTest.sln
按 Ctrl+Shift+B 编译
# 方法2: 使用MSBuild
msbuild CanOpenSlaveTest.csproj /p:Configuration=Debug
cd bin\Debug
CanOpenSlaveTest.exe
┌─────────────────────────────────────────────┐
│ 设备信息 │
│ 节点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 │
│ ... │
└─────────────────────────────────────────────┘
编辑代码:
// 在 SlaveTestForm.cs 的 InitializeComponent() 中
m_slaveDevice = new CanOpenSlaveDevice(nodeId: 5); // 改为5
// 在 BtnStart_Click 方法中
m_slaveDevice.Start(CanBaudRate.BaudRate_500K); // 500kbps
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}");
}
}
需要扩展CanOpenSlaveDevice类:
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);
}
// 定期采集传感器数据并通过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采集一次
}
// 接收主站的控制命令
m_slaveDevice.OnRpdoReceived += (nodeId, pdoNum, data) => {
if (pdoNum == 1 && data.Length >= 2)
{
// 解析控制命令
byte command = data[0];
byte parameter = data[1];
ExecuteCommand(command, parameter);
}
};
// 通过SDO配置从站参数
m_slaveDevice.OnSdoWriteRequest += (nodeId, index, subIndex, value) => {
if (index == 0x2000) // 自定义参数索引
{
// 更新内部参数
UpdateParameter(subIndex, value);
}
};
症状: 点击"启动从站"后显示失败
解决方案:
controlcan.dll存在且版本正确症状: 主站发送RPDO,但从站没有反应
解决方案:
症状: 点击发送按钮无响应
解决方案:
症状: 配置心跳后没有心跳帧
解决方案:
README.mdNameless.eds 的配置遇到问题?
README.md 中的常见问题祝使用愉快! 🎉