跳到主要内容

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)"

运动参数

属性类型访问说明
PositionActualint只读实际位置 (0x6064)
VelocityActualint只读实际速度 (0x606C)
TorqueActualshort只读实际转矩,千分之额定 (0x6077)
TargetPositionint读写目标位置 (0x607A)
TargetVelocityint读写目标速度 (0x60FF)
TargetTorqueshort读写目标转矩,千分之额定 (0x6071)

示例:

var drv = slave.CoE.CiA402;

// 读取实际值
Console.WriteLine($"位置: {drv.PositionActual}");
Console.WriteLine($"速度: {drv.VelocityActual}");

// 写入目标值
drv.TargetPosition = 100000;
drv.TargetVelocity = 5000;

轮廓参数

属性类型说明
ProfileVelocityuint轮廓速度 (0x6081)
ProfileAccelerationuint轮廓加速度 (0x6083)
ProfileDecelerationuint轮廓减速度 (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 — 目标位置
  • relativetrue = 相对定位,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_CONTROLWORD0x6040控制字
OD_STATUSWORD0x6041状态字
OD_MODES_OF_OPERATION0x6060操作模式设置
OD_MODES_OF_OPERATION_DISPLAY0x6061操作模式显示
OD_TARGET_POSITION0x607A目标位置
OD_POSITION_ACTUAL0x6064实际位置
OD_TARGET_VELOCITY0x60FF目标速度
OD_VELOCITY_ACTUAL0x606C实际速度
OD_TARGET_TORQUE0x6071目标转矩
OD_TORQUE_ACTUAL0x6077实际转矩
OD_PROFILE_VELOCITY0x6081轮廓速度
OD_PROFILE_ACCELERATION0x6083轮廓加速度
OD_PROFILE_DECELERATION0x6084轮廓减速度
OD_HOMING_METHOD0x6098回零方法
OD_HOMING_SPEEDS0x6099回零速度
OD_HOME_OFFSET0x607C回零偏移
OD_SOFTWARE_POSITION_LIMIT0x607D软件位置限制

控制字命令常量

常量说明
CW_SHUTDOWN0x06关机命令
CW_SWITCH_ON0x07开启命令
CW_ENABLE_OPERATION0x0F使能运行
CW_DISABLE_VOLTAGE0x00禁用电压
CW_QUICK_STOP0x02快速停止
CW_FAULT_RESET0x80故障复位
CW_HALT0x0100暂停位 (Bit 8, 暂停运动但不禁用)

状态字位掩码常量

常量说明
SW_READY_TO_SWITCH_ON0x0001 (Bit 0)准备就绪
SW_SWITCHED_ON0x0002 (Bit 1)已开启
SW_OPERATION_ENABLED0x0004 (Bit 2)运行使能
SW_FAULT0x0008 (Bit 3)故障
SW_VOLTAGE_ENABLED0x0010 (Bit 4)电压已使能
SW_QUICK_STOP0x0020 (Bit 5)快速停止
SW_SWITCH_ON_DISABLED0x0040 (Bit 6)开启已禁用
SW_WARNING0x0080 (Bit 7)警告
SW_REMOTE0x0200 (Bit 9)远程模式
SW_TARGET_REACHED0x0400 (Bit 10)目标已到达
SW_INTERNAL_LIMIT0x0800 (Bit 11)内部限位激活
SW_OP_MODE_SPECIFIC_10x1000 (Bit 12)模式相关位 1
SW_OP_MODE_SPECIFIC_20x2000 (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();