跳到主要内容

CiA 402 — 伺服驱动器辅助

CiA 402 (IEC 61800-7-204) 是基于 CoE 的伺服驱动器设备协议。CiA402 封装了驱动器状态机管理、操作模式切换和运动参数访问功能。

CiA 402 运行在 CoE (SDO) 之上,仅当从站支持 CoE 时可用。

通过 slave.CiA402() 直接访问。

PDO 初始化

InitializePdoOffsets()

public void InitializePdoOffsets()

初始化所有 PDO 偏移缓存。读取 0x1C12/0x1C13 PDO Assignment 配置,解析各对象在 IOmap 中的偏移位置。

备注

通常无需手动调用 -- 首次访问 StateDrive 等 PDO 属性时自动初始化。仅在需要提前确认 PDO 映射正确时手动调用。

示例:

CiA402 drv = slave.CiA402();
drv.InitializePdoOffsets();
drv.OperationMode(CiA402.ModeCiA402.CSP);

状态控制

Enable() 一次性推进到 OperationEnabled (完成完整状态链 + Fault 复位 + QuickStop 恢复 + 0x605A 选项码判断); Disable / DisableOperation / QuickStop / FaultReset 仅写一次 Controlword 后立即返回, 通过 StateDrive() 检查结果。

Enable() / Enable(int maxRetries)

public boolean Enable()                   // 默认 maxRetries=10
public boolean Enable(int maxRetries)

使能驱动器, 一次性按 CiA 402-2 完成 SwitchOnDisabled → ReadyToSwitchOn → SwitchedOn → OperationEnabled 全套时序、Fault 复位、QuickStop 恢复。

参数:

  • maxRetries -- 最大重试次数 (默认 10)

返回值:

  • boolean -- true = 已使能到 OperationEnabled, false = 失败/超时

示例:

CiA402 drv = slave.CiA402();
// 一次性使能 (内部完成完整状态机)
if (drv.Enable()) {
drv.TargetPosition(nextPosition);
} else {
System.out.println("使能失败, 当前状态: " + 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()

解析当前驱动器状态。

返回值:

  • StateCiA402 -- 驱动器状态枚举
public enum StateCiA402 {
NotReadyToSwitchOn, // 初始化中
SwitchOnDisabled, // 驱动禁用
ReadyToSwitchOn, // 准备就绪
SwitchedOn, // 已开启
OperationEnabled, // 运行使能
QuickStopActive, // 快速停止
FaultReactionActive, // 故障反应中
Fault, // 故障
Unknown // 未知状态
}

示例:

CiA402.StateCiA402 state = slave.CiA402().StateDrive();
System.out.println("驱动器状态: " + state);

Statusword()

public short Statusword()

读取状态字。

相关属性:

  • TargetReached() (boolean) -- 目标已到达 (Bit 10)
  • HasFault() (boolean) -- 存在故障 (Bit 3)
  • HasWarning() (boolean) -- 存在警告 (Bit 7)
  • IsRemote() (boolean) -- 远程模式已激活 (Bit 9)

Controlword()

public short Controlword()
public void Controlword(short value)

读取或写入控制字。

示例:

short sw = slave.CiA402().Statusword();
slave.CiA402().Controlword((short) 0x000F);

操作模式

OperationMode()

public ModeCiA402 OperationMode()
public void OperationMode(ModeCiA402 mode)

设置或读取操作模式。

返回值:

  • ModeCiA402 -- 操作模式枚举
public enum ModeCiA402 {
PP(1), // 轮廓位置模式
VL(2), // 速度模式
PV(3), // 轮廓速度模式
PT(4), // 轮廓转矩模式
HM(6), // 回零模式
IP(7), // 插补位置模式
CSP(8), // 周期同步位置模式
CSV(9), // 周期同步速度模式
CST(10), // 周期同步转矩模式
CSTCA(11); // 周期同步转矩加速度模式
}

示例:

slave.CiA402().OperationMode(CiA402.ModeCiA402.CSP);
CiA402.ModeCiA402 mode = slave.CiA402().OperationMode();

IsModeSupported(ModeCiA402 mode)

public boolean IsModeSupported(ModeCiA402 mode)

检查驱动器是否支持指定操作模式。基于 SupportedDriveModes (0x6502) 判断。

运动参数

属性类型访问说明
PositionActual()int只读实际位置 (0x6064)
VelocityActual()int只读实际速度 (0x606C)
TorqueActual()short只读实际转矩,千分之额定 (0x6077)
TargetPosition() / TargetPosition(int)int读写目标位置 (0x607A)
TargetVelocity() / TargetVelocity(int)int读写目标速度 (0x60FF)
TargetTorque() / TargetTorque(short)short读写目标转矩,千分之额定 (0x6071)

示例:

CiA402 drv = slave.CiA402();

// 读取实际值
System.out.println("位置: " + drv.PositionActual());
System.out.println("速度: " + drv.VelocityActual());

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

轮廓参数

属性类型说明
ProfileVelocity() / ProfileVelocity(long)long轮廓速度 (0x6081)
ProfileAcceleration() / ProfileAcceleration(long)long轮廓加速度 (0x6083)
ProfileDeceleration() / ProfileDeceleration(long)long轮廓减速度 (0x6084)

示例:

CiA402 drv = slave.CiA402();
drv.ProfileVelocity(10000);
drv.ProfileAcceleration(50000);
drv.ProfileDeceleration(50000);

极性与轮廓配置

属性类型访问说明
Polarity() / Polarity(byte)byte读写极性配置 (0x607E)。位 6 = 速度极性反转,位 7 = 位置极性反转
MotionProfileType() / MotionProfileType(short)short读写运动轮廓类型 (0x6086)。0 = 梯形,1 = S 形
QuickStopDeceleration() / QuickStopDeceleration(long)long读写快速停止减速度 (0x6085)

示例:

CiA402 drv = slave.CiA402();

// 反转位置方向
drv.Polarity((byte) 0x80); // 位 7 = 位置极性反转

// 设置 S 形轮廓
drv.MotionProfileType((short) 1);

// 设置快速停止减速度
drv.QuickStopDeceleration(100000);

触探功能 (Touch Probe)

ConfigureTouchProbe(short function)

public void ConfigureTouchProbe(short function)

配置触探功能 (0x60B8)。通过设置功能位启用/禁用触探及其触发条件。

参数:

  • function -- 触探功能字。位 0 = 启用探针 1,位 1 = 上升沿/下降沿选择,等

相关属性:

  • TouchProbeStatus() (short) -- 触探状态 (0x60B9),只读
  • TouchProbePositiveEdge() (int) -- 上升沿捕获位置 (0x60BA),只读
  • TouchProbeNegativeEdge() (int) -- 下降沿捕获位置 (0x60BB),只读

示例:

CiA402 drv = slave.CiA402();

// 启用触探 1,上升沿触发
drv.ConfigureTouchProbe((short) 0x0001);

// 读取触探结果
if ((drv.TouchProbeStatus() & 0x0002) != 0) { // 上升沿已捕获
int capturedPos = drv.TouchProbePositiveEdge();
System.out.println("触探捕获位置: " + capturedPos);
}

回零速度与加速度

属性类型访问说明
HomingSpeedSearch() / HomingSpeedSearch(long)long读写回零搜索速度 (0x6099:01),快速搜索参考信号
HomingSpeedZero() / HomingSpeedZero(long)long读写回零零位速度 (0x6099:02),慢速精确定位零位
HomingAcceleration() / HomingAcceleration(long)long读写回零加速度 (0x609A)

示例:

CiA402 drv = slave.CiA402();
drv.OperationMode(CiA402.ModeCiA402.HM);
drv.HomingMethod((byte) 1);

// 设置回零速度和加速度
drv.HomingSpeedSearch(5000); // 搜索速度
drv.HomingSpeedZero(500); // 零位速度
drv.HomingAcceleration(10000); // 回零加速度

数字 IO

属性类型访问说明
DigitalInputs()int只读数字输入 (0x60FD),32 位位图
DigitalOutputs() / DigitalOutputs(int)int读写数字输出 (0x60FE),32 位位图

示例:

CiA402 drv = slave.CiA402();

// 读取数字输入
int inputs = drv.DigitalInputs();
boolean limitSwitch = (inputs & 0x01) != 0; // 位 0

// 设置数字输出
drv.DigitalOutputs(0x03); // 输出位 0 和位 1

软件位置限位

属性类型访问说明
SoftwarePositionLimitMin() / SoftwarePositionLimitMin(int)int读写软件位置限位下限 (0x607D:01)
SoftwarePositionLimitMax() / SoftwarePositionLimitMax(int)int读写软件位置限位上限 (0x607D:02)

示例:

CiA402 drv = slave.CiA402();

// 设置运动范围限制
drv.SoftwarePositionLimitMin(-1000000);
drv.SoftwarePositionLimitMax(1000000);

快速运动控制

NewSetpoint(int position, boolean relative)

public void NewSetpoint(int position, boolean relative)

PP 模式发送新定位命令。设置目标位置并触发 Controlword Bit 4 (New Setpoint)。

参数:

  • position -- 目标位置
  • relative -- true = 相对定位,false = 绝对定位

示例:

CiA402 drv = slave.CiA402();
drv.OperationMode(CiA402.ModeCiA402.PP);
drv.ProfileVelocity(10000);
drv.ProfileAcceleration(50000);

// 在 PDO 回调中: 先使能,使能后发送定位命令
if (drv.StateDrive() == CiA402.StateCiA402.OperationEnabled) {
drv.NewSetpoint(100000, false); // 绝对定位到 100000
}

ClearNewSetpoint()

public void ClearNewSetpoint()

PP 模式清除 NewSetpoint 标志(Controlword Bit4=0)。在 TargetReached() 后调用,完成 SetPointAck 握手。

示例:

if (drv.TargetReached()) {
drv.ClearNewSetpoint();
}

StartHoming()

public void StartHoming()

HM 模式启动回零。需先设置 HomingMethod()

相关属性:

  • HomingMethod() / HomingMethod(byte) -- 回零方法 (0x6098)
  • HomeOffset() / HomeOffset(int) -- 回零偏移 (0x607C)
  • HomingAttained() (boolean) -- 回零完成 (Bit 12)
  • HomingError() (boolean) -- 回零错误 (Bit 13)

示例:

CiA402 drv = slave.CiA402();
drv.OperationMode(CiA402.ModeCiA402.HM);
drv.HomingMethod((byte) 35); // 当前位置回零

// 在 PDO 回调中:
if (drv.StateDrive() == CiA402.StateCiA402.OperationEnabled) {
drv.StartHoming();
// 后续周期检查 drv.HomingAttained() / drv.HomingError()
}

扩展运动参数

属性类型访问说明
MaxTorque() / MaxTorque(int)int读写最大转矩 (0x6072),千分之额定转矩
MotorRatedTorque() / MotorRatedTorque(long)long读写电机额定转矩 (0x6076),单位 mNm
PositionOffset() / PositionOffset(int)int读写位置偏移 (0x60B0),CSP 模式下叠加到目标位置
VelocityOffset() / VelocityOffset(int)int读写速度偏移 (0x60B1),CSV 模式下叠加到目标速度
InterpolationTimePeriodValue() / InterpolationTimePeriodValue(byte)byte读写插补时间周期值 (0x60C2:01)
InterpolationTimePeriodIndex() / InterpolationTimePeriodIndex(byte)byte读写插补时间周期指数 (0x60C2:02),实际周期 = Value x 10^Index 秒
QuickStopOptionCode() / QuickStopOptionCode(short)short读写快速停止选项码 (0x605A)。0=禁用驱动, 1/2=减速停止, 5/6=减速后保持在 QuickStopActive

示例:

CiA402 drv = slave.CiA402();

// 转矩配置
drv.MaxTorque(1000); // 最大转矩 = 100% 额定
long rated = drv.MotorRatedTorque();

// CSP 模式偏移叠加
drv.PositionOffset(100); // 位置附加偏移
drv.VelocityOffset(50); // 速度附加偏移

// 插补时间周期 (1ms = 1 x 10^(-3) 秒)
drv.InterpolationTimePeriodValue((byte) 1);
drv.InterpolationTimePeriodIndex((byte) -3);

// 快速停止选项 (5=减速后保持, 允许直接恢复)
drv.QuickStopOptionCode((short) 5);

力矩限制

属性类型访问说明
PositiveTorqueLimit() / PositiveTorqueLimit(int)int读写正方向力矩限制 (0x60E0),千分之额定转矩
NegativeTorqueLimit() / NegativeTorqueLimit(int)int读写负方向力矩限制 (0x60E1),千分之额定转矩

示例:

CiA402 drv = slave.CiA402();

// 限制正负方向转矩为额定的 50%
drv.PositiveTorqueLimit(500);
drv.NegativeTorqueLimit(500);

同步功能

属性类型访问说明
SynchronizationSettings() / SynchronizationSettings(int)int读写同步设置 (0x60D9:01),同步使能位掩码
DriveSyncStatus()int只读驱动同步状态 (0x60DA),指示驱动器是否已同步到主站时钟

示例:

CiA402 drv = slave.CiA402();

// 读取驱动器同步状态
int syncStatus = drv.DriveSyncStatus();
System.out.printf("同步状态: 0x%04X%n", syncStatus);

// 配置同步设置
drv.SynchronizationSettings(0x0001);

TxPDO 数据有效性

TxPdoDataInvalid()

public boolean TxPdoDataInvalid()

TxPDO 数据是否无效 (0x603E)。非零表示驱动器 TxPDO 数据不可信,例如编码器未就绪时位置值无意义。

示例:

CiA402 drv = slave.CiA402();
if (!drv.TxPdoDataInvalid()) {
int pos = drv.PositionActual(); // 数据有效,可安全使用
}

驱动器信息

SupportedDriveModes()

public long SupportedDriveModes()

支持的驱动模式位掩码 (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。

SupportedHomingMethods()

public byte[] SupportedHomingMethods()

读取驱动器支持的回零方法列表 (0x60E3)。返回所有支持的回零方法编号数组。

示例:

byte[] methods = drv.SupportedHomingMethods();
System.out.println("支持 " + methods.length + " 种回零方法");

PDO 偏移管理

drv.InitializePdoOffsets();          // 初始化 PDO 偏移缓存
drv.ResetPdoOffsets(); // 重置 PDO 偏移缓存
boolean ready = drv.PdoInitialized(); // PDO 偏移是否已初始化

静态工具

ParseState(short statusword)

public static StateCiA402 ParseState(short statusword)

从状态字解析驱动器状态。

标准对象索引常量

可搭配 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_MAX_TORQUE0x6072最大转矩
OD_MOTOR_RATED_TORQUE0x6076电机额定转矩
OD_HOME_OFFSET0x607C回零偏移
OD_SOFTWARE_POSITION_LIMIT0x607D软件位置限制
OD_POLARITY0x607E极性
OD_MAX_PROFILE_VELOCITY0x6080最大轮廓速度
OD_MOTION_PROFILE_TYPE0x6086运动轮廓类型
OD_HOMING_METHOD0x6098回零方法
OD_HOMING_SPEEDS0x6099回零速度
OD_HOMING_ACCELERATION0x609A回零加速度
OD_POSITION_OFFSET0x60B0位置偏移 (CSP)
OD_VELOCITY_OFFSET0x60B1速度偏移 (CSV)
OD_TORQUE_OFFSET0x60B2转矩偏移
OD_TOUCH_PROBE_FUNCTION0x60B8Touch Probe 功能控制
OD_TOUCH_PROBE_STATUS0x60B9Touch Probe 状态
OD_TOUCH_PROBE_POS_EDGE0x60BATouch Probe 正边沿位置
OD_TOUCH_PROBE_NEG_EDGE0x60BBTouch Probe 负边沿位置
OD_INTERPOLATION_TIME_PERIOD0x60C2插补时间周期
OD_DIGITAL_INPUTS0x60FD数字输入
OD_DIGITAL_OUTPUTS0x60FE数字输出
OD_QUICK_STOP_OPTION_CODE0x605A快速停止选项码
OD_QUICK_STOP_DECELERATION0x6085快速停止减速度
OD_SUPPORTED_DRIVE_MODES0x6502支持的驱动模式位掩码

控制字命令常量

常量说明
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

完整示例

CSP 模式 -- 周期同步位置控制

CiA402 drv = slave.CiA402();

// 初始化 (OP 状态后调用一次)
drv.InitializePdoOffsets();
drv.OperationMode(CiA402.ModeCiA402.CSP);

// 一次性使能 (内部完成完整状态机)
if (!drv.Enable()) { System.out.println("使能失败: " + drv.StateDrive()); return; }

// PDO 回调中每周期下发目标
master.Events().addProcessDataCyclicSyncListener((masterIndex) -> {
drv.TargetPosition(calculateNextPosition());
});

PP 模式 -- 轮廓位置控制

CiA402 drv = slave.CiA402();

drv.InitializePdoOffsets();
drv.OperationMode(CiA402.ModeCiA402.PP);
drv.ProfileVelocity(10000);
drv.ProfileAcceleration(50000);
drv.ProfileDeceleration(50000);

// 一次性使能
if (!drv.Enable()) { System.out.println("使能失败: " + drv.StateDrive()); return; }

// 发送定位命令
drv.NewSetpoint(100000, false);

// PDO 回调等待目标到达后清标志
boolean[] homing = {false};
master.Events().addProcessDataCyclicSyncListener((masterIndex) -> {
if (!homing[0] && drv.TargetReached()) {
drv.ClearNewSetpoint();
homing[0] = true;
}
});

HM 模式 -- 回零控制

CiA402 drv = slave.CiA402();

drv.InitializePdoOffsets();
drv.OperationMode(CiA402.ModeCiA402.HM);
drv.HomingMethod((byte) 35); // 当前位置回零
drv.HomingSpeedSearch(5000);
drv.HomingSpeedZero(500);
drv.HomingAcceleration(10000);

// 一次性使能
if (!drv.Enable()) { System.out.println("使能失败: " + drv.StateDrive()); return; }

// 启动回零
drv.StartHoming();

master.Events().addProcessDataCyclicSyncListener((masterIndex) -> {
if (drv.HomingAttained()) {
System.out.println("回零完成");
} else if (drv.HomingError()) {
System.out.println("回零错误");
}
});