禾川 X3E · 500µs CSP
单轴 CiA 402 CSP 使用案例。一台禾川 X3E,总线周期 500 µs(2000 Hz)。主站每个周期写目标位置 0x607A。
多轴齿轮 / 凸轮见 运动控制。
做什么
界面三个按钮:连接 → 使能 → 开始。
开始后电机按节拍转:100 ms 走 1/4 圈,停 400 ms,再走下一圈。每个 500 µs 周期都要写出 0x607A(停顿时也写,保持终点)。
| 项 | 值 |
|---|---|
| 驱动 | 禾川 X3E |
| 周期 | 500 µs |
| 模式 | CSP(0x6060 = 8) |
| 轴数 | 1 |
| 配置 | 主站工具导出的 .deni 放到程序目录 |
使能顺序:0x6040 按 06 → 07 → 0F。停止:0x6040 = 0。
PDO
- 输出 9 字节:
6040、6060、607A、60B8 - 输入 25 字节:
603F、6041、6064、6061、60B9、60BA、60F4、60FD、213F
过程映像映射成结构体。改字段就是改 PDO。
周期回调
using System;
using System.Runtime.InteropServices;
using DarraEtherCAT_Master;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct X3eIn
{
public ushort ErrorCode;
public ushort StatusWord;
public int ActualPosition;
public sbyte ModeDisplay;
public ushort ProbeStatus;
public int ProbePos1;
public int FollowingError;
public uint DigitalInputs;
public ushort VendorStatus;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct X3eOut
{
public ushort ControlWord;
public sbyte Mode;
public int TargetPosition;
public ushort ProbeFunction;
}
master.Config.LoopCycle = 500000;
var t0 = DateTime.UtcNow;
int origin = 0;
int quarter = ppr / 4;
bool originLocked = false;
master.Events.ProcessDataCyclicSync += _ =>
{
ref var input = ref master.Slaves[0].PDO.InputsMapping<X3eIn>();
ref var output = ref master.Slaves[0].PDO.OutputsMapping<X3eOut>();
if (!originLocked) { origin = input.ActualPosition; originLocked = true; }
long ms = (long)(DateTime.UtcNow - t0).TotalMilliseconds;
int target = QuarterTarget(origin, quarter, ms);
output.ControlWord = 0x000F;
output.Mode = 8;
output.TargetPosition = target;
};
QuarterTarget 在开源工程 PdoQuarterStep.cs。