CiA 402 — 伺服驱动器辅助
CiA 402 (IEC 61800-7-204) 是基于 CoE 的伺服驱动器设备协议。CiA402Instance 封装了驱动器状态机管理、操作模式切换和运动参数访问功能。
CiA 402 运行在 CoE (SDO) 之上,仅当从站支持 CoE 时可用。
通过 slave.CoE.CiA402 访问。从站不支持 CiA 402 时为 null。
PDO 初始化
InitializePdoOffsets()
public void InitializePdoOffsets()
初始化所有 PDO 偏移缓存。读取 0x1C12/0x1C13 PDO Assignment 配置,解析各对象在 IOmap 中的偏移位置。
通常无需手动调用 — 首次访问 StateDrive 等 PDO 属性时自动初始化。仅在需要提前确认 PDO 映射正确时手动调用。
示例:
var drv = slave.CoE.CiA402;
drv.InitializePdoOffsets();
drv.OperationMode = ModeCiA402.CSP;
状态控制
Enable() 一步推进到 OperationEnabled (自动完成完整状态链 + Fault 复位 + QuickStop 恢复); Disable / DisableOperation / QuickStop / FaultReset 仅写一次 Controlword 后立即返回, 通过 StateDrive 检查结果。
Enable(int maxRetries = 10)
public bool Enable(int maxRetries = 10)
使能驱动器: 一步按 CiA 402-2 完成 SwitchOnDisabled → ReadyToSwitchOn → SwitchedOn → OperationEnabled 全套时序,自动处理 Fault 复位与 QuickStop 恢复。
参数:
maxRetries— 最大重试次数 (默认 10)
返回值:
bool—true= 已使能到 OperationEnabled,false= 失败/超时
示例:
// 进入 OP 后调用一次, 内部一步完成全套状态机
if (drv.Enable())
{
drv.TargetPosition = nextPosition;
}
else
{
Console.WriteLine($"使能失败, 当前状态: {drv.StateDrive}");
}
Disable()
public void Disable()
禁用伺服 (→ SwitchOnDisabled)。完全断电。
DisableOperation()
public void DisableOperation()
禁用运行 (Transition 5: OperationEnabled → SwitchedOn)。电机仍通电,可快速重新 Enable()。
QuickStop()
public void QuickStop()
快速停止 (→ QuickStopActive)。
FaultReset()
public void FaultReset()
清除故障。发送 Fault Reset 位 (Bit 7),产生上升沿清除驱动器故障。
状态读取
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;
极性与轮廓配置
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| Polarity | byte | 读写 | 极性配置 (0x607E)。位 6 = 速度极性反转,位 7 = 位置极性反转 |
| MotionProfileType | short | 读写 | 运动轮廓类型 (0x6086)。0 = 梯形,1 = S 形 |
| QuickStopDeceleration | uint | 读写 | 快速停止减速度 (0x6085) |
示例:
var drv = slave.CoE.CiA402;
// 反转位置方向
drv.Polarity = 0x80; // 位 7 = 位置极性反转
// 设置 S 形轮廓
drv.MotionProfileType = 1;
// 设置快速停止减速度
drv.QuickStopDeceleration = 100000;
触探功能 (Touch Probe)
ConfigureTouchProbe(ushort function)
public void ConfigureTouchProbe(ushort function)
配置触探功能 (0x60B8)。通过设置功能位启用/禁用触探及其触发条件。
参数:
function— 触探功能字。位 0 = 启用探针 1,位 1 = 上升沿/下降沿选择,等
相关属性:
TouchProbeStatus(ushort) — 触探状态 (0x60B9),只读TouchProbePositiveEdge(int) — 上升沿捕获位置 (0x60BA),只读TouchProbeNegativeEdge(int) — 下降沿捕获位置 (0x60BB),只读
示例:
var drv = slave.CoE.CiA402;
// 启用触探 1,上升沿触发
drv.ConfigureTouchProbe(0x0001);
// 读取触探结果
if ((drv.TouchProbeStatus & 0x0002) != 0) // 上升沿已捕获
{
int capturedPos = drv.TouchProbePositiveEdge;
Console.WriteLine($"触探捕获位置: {capturedPos}");
}
回零速度与加速度
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| HomingSpeedSearch | uint | 读写 | 回零搜索速度 (0x6099:01),快速搜索参考信号 |
| HomingSpeedZero | uint | 读写 | 回零零位速度 (0x6099:02),慢速精确定位零位 |
| HomingAcceleration | uint | 读写 | 回零加速度 (0x609A) |
示例:
var drv = slave.CoE.CiA402;
drv.OperationMode = ModeCiA402.HM;
drv.HomingMethod = 1;
// 设置回零速度和加速度
drv.HomingSpeedSearch = 5000; // 搜索速度
drv.HomingSpeedZero = 500; // 零位速度
drv.HomingAcceleration = 10000; // 回零加速度
扩展运动参数
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| MaxTorque | ushort | 读写 | 最大转矩 (0x6072),千分之额定转矩 |
| MotorRatedTorque | uint | 读写 | 电机额定转矩 (0x6076),单位 mNm |
| PositionOffset | int | 读写 | 位置偏移 (0x60B0),CSP 模式下叠加到目标位置 |
| VelocityOffset | int | 读写 | 速度偏移 (0x60B1),CSV 模式下叠加到目标速度 |
| InterpolationTimePeriodValue | byte | 读写 | 插补时间周期值 (0x60C2:01) |
| InterpolationTimePeriodIndex | sbyte | 读写 | 插补时间周期指数 (0x60C2:02),实际周期 = Value x 10^Index 秒 |
| QuickStopOptionCode | short | 读写 | 快速停止选项码 (0x605A)。0=禁用驱动, 1/2=减速停止, 5/6=减速后保持在 QuickStopActive |
示例:
var drv = slave.CoE.CiA402;
// 转矩配置
drv.MaxTorque = 1000; // 最大转矩 = 100% 额定
uint rated = drv.MotorRatedTorque;
// CSP 模式偏移叠加
drv.PositionOffset = 100; // 位置附加偏移
drv.VelocityOffset = 50; // 速度附加偏移
// 插补时间周期 (1ms = 1 × 10^(-3) 秒)
drv.InterpolationTimePeriodValue = 1;
drv.InterpolationTimePeriodIndex = -3;
// 快速停止选项 (5=减速后保持, 允许直接恢复)
drv.QuickStopOptionCode = 5;
力矩限制
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| PositiveTorqueLimit | ushort | 读写 | 正方向力矩限制 (0x60E0),千分之额定转矩 |
| NegativeTorqueLimit | ushort | 读写 | 负方向力矩限制 (0x60E1),千分之额定转矩 |
示例:
var drv = slave.CoE.CiA402;
// 限制正负方向转矩为额定的 50%
drv.PositiveTorqueLimit = 500;
drv.NegativeTorqueLimit = 500;
数字 IO
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| DigitalInputs | uint | 只读 | 数字输入 (0x60FD),32 位位图 |
| DigitalOutputs | uint | 读写 | 数字输出 (0x60FE),32 位位图 |
示例:
var drv = slave.CoE.CiA402;
// 读取数字输入
uint inputs = drv.DigitalInputs;
bool limitSwitch = (inputs & 0x01) != 0; // 位 0
// 设置数字输出
drv.DigitalOutputs = 0x03; // 输出位 0 和位 1
软件位置限位
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| SoftwarePositionLimitMin | int | 读写 | 软件位置限位下限 (0x607D:01) |
| SoftwarePositionLimitMax | int | 读写 | 软件位置限位上限 (0x607D:02) |
示例:
var drv = slave.CoE.CiA402;
// 设置运动范围限制
drv.SoftwarePositionLimitMin = -1000000;
drv.SoftwarePositionLimitMax = 1000000;
快速运动控制
NewSetpoint(int position, bool relative = false)
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.ProfileVelocity = 10000;
drv.ProfileAcceleration = 50000;
// 在 PDO 回调中: 先使能,使能后发送定位命令
if (drv.StateDrive == StateCiA402.OperationEnabled)
{
drv.NewSetpoint(100000); // 绝对定位到 100000
// drv.NewSetpoint(5000, true); // 或相对移动 5000
}
ClearNewSetpoint()
public void ClearNewSetpoint()
PP 模式清除 NewSetpoint 标志(Controlword Bit4=0)。在 TargetReached 后调用,完成 SetPointAck 握手。
示例:
if (drv.TargetReached)
{
drv.ClearNewSetpoint();
}
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.HomingMethod = 35; // 当前位置回零
// 在 PDO 回调中:
if (drv.StateDrive == StateCiA402.OperationEnabled)
{
drv.StartHoming();
// 后续周期检查 drv.HomingAttained / drv.HomingError
}
标准对象索引常量
可搭配 OD 属性访问或 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_MAX_TORQUE | 0x6072 | 最大转矩 |
| OD_MOTOR_RATED_TORQUE | 0x6076 | 电机额定转矩 |
| OD_HOME_OFFSET | 0x607C | 回零偏移 |
| OD_SOFTWARE_POSITION_LIMIT | 0x607D | 软件位置限制 |
| OD_POLARITY | 0x607E | 极性 |
| OD_MAX_PROFILE_VELOCITY | 0x6080 | 最大轮廓速度 |
| OD_MOTION_PROFILE_TYPE | 0x6086 | 运动轮廓类型 |
| OD_HOMING_METHOD | 0x6098 | 回零方法 |
| OD_HOMING_SPEEDS | 0x6099 | 回零速度 |
| OD_HOMING_ACCELERATION | 0x609A | 回零加速度 |
| OD_POSITION_OFFSET | 0x60B0 | 位置偏移 (CSP) |
| OD_VELOCITY_OFFSET | 0x60B1 | 速度偏移 (CSV) |
| OD_TORQUE_OFFSET | 0x60B2 | 转矩偏移 |
| OD_TOUCH_PROBE_FUNCTION | 0x60B8 | Touch Probe 功能控制 |
| OD_TOUCH_PROBE_STATUS | 0x60B9 | Touch Probe 状态 |
| OD_TOUCH_PROBE_POS_EDGE | 0x60BA | Touch Probe 正边沿位置 |
| OD_TOUCH_PROBE_NEG_EDGE | 0x60BB | Touch Probe 负边沿位置 |
| OD_INTERPOLATION_TIME_PERIOD | 0x60C2 | 插补时间周期 |
| OD_DIGITAL_INPUTS | 0x60FD | 数字输入 |
| OD_DIGITAL_OUTPUTS | 0x60FE | 数字输出 |
| OD_QUICK_STOP_OPTION_CODE | 0x605A | 快速停止选项码 |
| OD_QUICK_STOP_DECELERATION | 0x6085 | 快速停止减速度 |
| OD_SUPPORTED_DRIVE_MODES | 0x6502 | 支持的驱动模式位掩码 |
控制字命令常量
| 常量 | 值 | 说明 |
|---|---|---|
| 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 |
驱动器信息
SupportedDriveModes
public uint SupportedDriveModes { get; }
支持的驱动模式位掩码 (0x6502, 只读)。Bit 0=PP, Bit 1=VL, Bit 2=PV, Bit 3=PT, Bit 5=HM, Bit 6=IP, Bit 7=CSP, Bit 8=CSV, Bit 9=CST。
IsModeSupported(ModeCiA402 mode)
public bool IsModeSupported(ModeCiA402 mode)
检查驱动器是否支持指定操作模式。
参数:
mode— 要检查的操作模式
示例:
var drv = slave.CoE.CiA402;
if (drv.IsModeSupported(ModeCiA402.CSP))
drv.OperationMode = ModeCiA402.CSP;
SupportedHomingMethods
public sbyte[] SupportedHomingMethods { get; }
读取驱动器支持的回零方法列表 (0x60E3)。返回所有支持的回零方法编号数组。
示例:
var methods = drv.SupportedHomingMethods;
Console.WriteLine($"支持 {methods.Length} 种回零方法: {string.Join(", ", methods)}");
TxPDO 数据有效性
TxPdoDataInvalid
public bool TxPdoDataInvalid { get; }
TxPDO 数据是否无效 (0x603E)。非零表示驱动器 TxPDO 数据不可信,例如编码器未就绪时位置值无意义。
示例:
var drv = slave.CoE.CiA402;
if (!drv.TxPdoDataInvalid)
{
int pos = drv.PositionActual; // 数据有效,可安全使用
}
同步功能
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| SynchronizationSettings | ushort | 读写 | 同步设置 (0x60D9:01),同步使能位掩码 |
| DriveSyncStatus | ushort | 只读 | 驱动同步状态 (0x60DA),指示驱动器是否已同步到主站时钟 |
示例:
var drv = slave.CoE.CiA402;
// 读取驱动器同步状态
ushort syncStatus = drv.DriveSyncStatus;
Console.WriteLine($"同步状态: 0x{syncStatus:X4}");
// 配置同步设置
drv.SynchronizationSettings = 0x0001;
完整示例
CSP 模式 — 周期同步位置控制
var drv = slave.CoE.CiA402;
if (drv == null) return;
// 初始化 (OP 状态后调用一次)
drv.InitializePdoOffsets();
drv.OperationMode = ModeCiA402.CSP;
// 一次性使能 (内部完成完整状态机)
if (!drv.Enable()) { Console.WriteLine($"使能失败: {drv.StateDrive}"); return; }
// PDO 回调中每周期下发目标
master.Events.ProcessDataCyclicSync += (masterIndex) =>
{
drv.TargetPosition = CalculateNextPosition();
};
PP 模式 — 轮廓位置控制
var drv = slave.CoE.CiA402;
if (drv == null) return;
drv.InitializePdoOffsets();
drv.OperationMode = ModeCiA402.PP;
drv.ProfileVelocity = 10000;
drv.ProfileAcceleration = 50000;
drv.ProfileDeceleration = 50000;
// 一次性使能
if (!drv.Enable()) { Console.WriteLine($"使能失败: {drv.StateDrive}"); return; }
// 发送定位命令
drv.NewSetpoint(100000);
// 在 PDO 回调中等待目标到达后清标志
bool homing = false;
master.Events.ProcessDataCyclicSync += (masterIndex) =>
{
if (!homing && drv.TargetReached)
{
drv.ClearNewSetpoint();
homing = true;
}
};