CiA 402 — 伺服驱动器辅助
CiA 402 (IEC 61800-7-204) 是基于 CoE 的伺服驱动器设备协议。CiA402Instance 封装了驱动器状态机管理、操作模式切换和运动参数访问功能。
CiA 402 运行在 CoE (SDO) 之上,仅当从站支持 CoE 时可用。
通过 slave.CoE.CiA402 访问。从站不支持 CiA 402 时为 null。
伺服使能
Enable(int timeoutMs = 2000)
public (bool success, StateCiA402 finalState) Enable(int timeoutMs = 2000)
执行完整的伺服使能流程,自动处理 故障清除 → Shutdown → Switch On → Enable Operation。
参数:
timeoutMs(int) — 超时时间(毫秒),默认2000
返回值:
success(bool) — 是否使能成功finalState(StateCiA402) — 最终驱动器状态
示例:
var (success, state) = slave.CoE.CiA402.Enable();
if (!success)
Console.WriteLine($"使能失败,当前状态: {state.GetDescription()}");
Disable(int timeoutMs = 2000)
public bool Disable(int timeoutMs = 2000)
禁用伺服 (→ Switch On Disabled)。
参数:
timeoutMs(int) — 超时时间(毫秒),默认2000
返回值:
bool— 是否成功
DisableOperation(int timeoutMs = 1000)
public bool DisableOperation(int timeoutMs = 1000)
禁用运行(Transition 5: Operation Enabled → Switched On)。与 Disable() 不同,此方法保持驱动器在 Switched On 状态,不完全禁用电压。
参数:
timeoutMs(int) — 超时时间(毫秒),默认1000
返回值:
bool— 是否成功
示例:
// 禁用运行但保持驱动器就绪
slave.CoE.CiA402.DisableOperation();
QuickStop(int timeoutMs = 2000)
public bool QuickStop(int timeoutMs = 2000)
执行快速停止。
参数:
timeoutMs(int) — 超时时间(毫秒),默认2000
返回值:
bool— 是否成功
FaultReset(int timeoutMs = 2000)
public bool FaultReset(int timeoutMs = 2000)
清除驱动器故障(发送 Fault Reset 上升沿)。
参数:
timeoutMs(int) — 超时时间(毫秒),默认2000
返回值:
bool— 是否成功
状态读取
StateDrive
public StateCiA402 StateDrive { get; }
解析当前驱动器状态。
返回值:
StateCiA402— 驱动器状态枚举
public enum StateCiA402
{
NotReadyToSwitchOn = 0, // 初始化中
SwitchOnDisabled = 1, // 驱动禁用
ReadyToSwitchOn = 2, // 准备就绪
SwitchedOn = 3, // 已开启
OperationEnabled = 4, // 运行使能
QuickStopActive = 5, // 快速停止
FaultReactionActive = 6, // 故障反应中
Fault = 7, // 故障
Unknown = 99 // 未知状态
}
示例:
var state = slave.CoE.CiA402.StateDrive;
Console.WriteLine(state.GetDescription()); // "运行使能"
Statusword
public ushort Statusword { get; }
读取状态字。
相关属性:
TargetReached(bool) — 目标已到达 (Bit 10)HasFault(bool) — 存在故障 (Bit 3)HasWarning(bool) — 存在警告 (Bit 7)IsRemote(bool) — 远程模式已激活 (Bit 9)
Controlword
public ushort Controlword { get; set; }
读取或写入控制字。
示例:
ushort sw = slave.CoE.CiA402.Statusword;
slave.CoE.CiA402.Controlword = 0x000F;
操作模式
OperationMode
public ModeCiA402 OperationMode { get; set; }
设置或读取操作模式。
返回值:
ModeCiA402— 操作模式枚举
public enum ModeCiA402 : sbyte
{
PP = 1, // 轮廓位置模式
VL = 2, // 速度模式
PV = 3, // 轮廓速度模式
PT = 4, // 轮廓转矩模式
HM = 6, // 回零模式
IP = 7, // 插补位置模式
CSP = 8, // 周期同步位置模式
CSV = 9, // 周期同步速度模式
CST = 10, // 周期同步转矩模式
CSTCA = 11 // 周期同步转矩加速度模式
}
示例:
slave.CoE.CiA402.OperationMode = ModeCiA402.CSP;
var mode = slave.CoE.CiA402.OperationMode;
Console.WriteLine(mode.GetDescription()); // "周期同步位置 (CSP)"
运动参数
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| PositionActual | int | 只读 | 实际位置 (0x6064) |
| VelocityActual | int | 只读 | 实际速度 (0x606C) |
| TorqueActual | short | 只读 | 实际转矩,千分之额定 (0x6077) |
| TargetPosition | int | 读写 | 目标位置 (0x607A) |
| TargetVelocity | int | 读写 | 目标速度 (0x60FF) |
| TargetTorque | short | 读写 | 目标转矩,千分之额定 (0x6071) |
示例:
var drv = slave.CoE.CiA402;
// 读取实际值
Console.WriteLine($"位置: {drv.PositionActual}");
Console.WriteLine($"速度: {drv.VelocityActual}");
// 写入目标值
drv.TargetPosition = 100000;
drv.TargetVelocity = 5000;
轮廓参数
| 属性 | 类型 | 说明 |
|---|---|---|
| ProfileVelocity | uint | 轮廓速度 (0x6081) |
| ProfileAcceleration | uint | 轮廓加速度 (0x6083) |
| ProfileDeceleration | uint | 轮廓减速度 (0x6084) |
示例:
var drv = slave.CoE.CiA402;
drv.ProfileVelocity = 10000;
drv.ProfileAcceleration = 50000;
drv.ProfileDeceleration = 50000;
快速运动控制
NewSetpoint
public void NewSetpoint(int position, bool relative = false)
PP 模式发送新定位命令。设置目标位置并触发 Controlword Bit 4 (New Setpoint)。
参数:
position— 目标位置relative—true= 相对定位,false= 绝对定位(默认)
示例:
var drv = slave.CoE.CiA402;
drv.OperationMode = ModeCiA402.PP;
drv.Enable();
drv.ProfileVelocity = 10000;
drv.ProfileAcceleration = 50000;
drv.NewSetpoint(100000); // 绝对定位到 100000
drv.NewSetpoint(5000, true); // 相对移动 5000
StartHoming
public void StartHoming()
HM 模式启动回零。需先设置 HomingMethod。
相关属性:
HomingMethod(sbyte) — 回零方法 (0x6098)HomeOffset(int) — 回零偏移 (0x607C)HomingAttained(bool) — 回零完成 (Bit 12)HomingError(bool) — 回零错误 (Bit 13)
示例:
var drv = slave.CoE.CiA402;
drv.OperationMode = ModeCiA402.HM;
drv.Enable();
drv.HomingMethod = 35; // 当前位置回零
drv.StartHoming();
// 等待回零完成
while (!drv.HomingAttained && !drv.HomingError)
Thread.Sleep(10);
实时控制
高频率的运动控制应使用 PDO 映射 而非 SDO 读写。SDO 适合参数配置和诊断。
标准对象索引常量
可搭配 slave.CoE.SDORead / SDOWrite 使用:
| 常量 | 值 | 说明 |
|---|---|---|
| OD_CONTROLWORD | 0x6040 | 控制字 |
| OD_STATUSWORD | 0x6041 | 状态字 |
| OD_MODES_OF_OPERATION | 0x6060 | 操作模式设置 |
| OD_MODES_OF_OPERATION_DISPLAY | 0x6061 | 操作模式显示 |
| OD_TARGET_POSITION | 0x607A | 目标位置 |
| OD_POSITION_ACTUAL | 0x6064 | 实际位置 |
| OD_TARGET_VELOCITY | 0x60FF | 目标速度 |
| OD_VELOCITY_ACTUAL | 0x606C | 实际速度 |
| OD_TARGET_TORQUE | 0x6071 | 目标转矩 |
| OD_TORQUE_ACTUAL | 0x6077 | 实际转矩 |
| OD_PROFILE_VELOCITY | 0x6081 | 轮廓速度 |
| OD_PROFILE_ACCELERATION | 0x6083 | 轮廓加速度 |
| OD_PROFILE_DECELERATION | 0x6084 | 轮廓减速度 |
| OD_HOMING_METHOD | 0x6098 | 回零方法 |
| OD_HOMING_SPEEDS | 0x6099 | 回零速度 |
| OD_HOME_OFFSET | 0x607C | 回零偏移 |
| OD_SOFTWARE_POSITION_LIMIT | 0x607D | 软件位置限制 |
控制字命令常量
| 常量 | 值 | 说明 |
|---|---|---|
| CW_SHUTDOWN | 0x06 | 关机命令 |
| CW_SWITCH_ON | 0x07 | 开启命令 |
| CW_ENABLE_OPERATION | 0x0F | 使能运行 |
| CW_DISABLE_VOLTAGE | 0x00 | 禁用电压 |
| CW_QUICK_STOP | 0x02 | 快速停止 |
| CW_FAULT_RESET | 0x80 | 故障复位 |
| CW_HALT | 0x0100 | 暂停位 (Bit 8, 暂停运动但不禁用) |
状态字位掩码常量
| 常量 | 值 | 说明 |
|---|---|---|
| SW_READY_TO_SWITCH_ON | 0x0001 (Bit 0) | 准备就绪 |
| SW_SWITCHED_ON | 0x0002 (Bit 1) | 已开启 |
| SW_OPERATION_ENABLED | 0x0004 (Bit 2) | 运行使能 |
| SW_FAULT | 0x0008 (Bit 3) | 故障 |
| SW_VOLTAGE_ENABLED | 0x0010 (Bit 4) | 电压已使能 |
| SW_QUICK_STOP | 0x0020 (Bit 5) | 快速停止 |
| SW_SWITCH_ON_DISABLED | 0x0040 (Bit 6) | 开启已禁用 |
| SW_WARNING | 0x0080 (Bit 7) | 警告 |
| SW_REMOTE | 0x0200 (Bit 9) | 远程模式 |
| SW_TARGET_REACHED | 0x0400 (Bit 10) | 目标已到达 |
| SW_INTERNAL_LIMIT | 0x0800 (Bit 11) | 内部限位激活 |
| SW_OP_MODE_SPECIFIC_1 | 0x1000 (Bit 12) | 模式相关位 1 |
| SW_OP_MODE_SPECIFIC_2 | 0x2000 (Bit 13) | 模式相关位 2 |
完整示例
var drv = slave.CoE.CiA402;
if (drv == null) return;
// PP 模式定位
drv.OperationMode = ModeCiA402.PP;
drv.ProfileVelocity = 10000;
drv.ProfileAcceleration = 50000;
drv.ProfileDeceleration = 50000;
var (success, state) = drv.Enable();
if (!success) return;
drv.NewSetpoint(100000);
while (!drv.TargetReached) Thread.Sleep(10);
drv.NewSetpoint(-50000, relative: true);
while (!drv.TargetReached) Thread.Sleep(10);
// 回零
drv.OperationMode = ModeCiA402.HM;
drv.HomingMethod = 35;
drv.StartHoming();
while (!drv.HomingAttained && !drv.HomingError) Thread.Sleep(10);
drv.Disable();