跳到主要内容

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 boolean disable()

禁用伺服 (-> SwitchOnDisabled)。完全断电。

返回值:

  • boolean — true = 控制字写入成功;false = 写失败(禁用未下发,可查 lastWriteAbortCode() 定位原因)

disableOperation()​

public boolean disableOperation()

禁用运行 (Transition 5: OperationEnabled -> SwitchedOn)。电机仍通电,可快速重新 enable()。

返回值:

  • boolean — true = 控制字写入成功;false = 写失败(命令未下发,可查 lastWriteAbortCode())

quickStop()​

public boolean quickStop()

快速停止 (-> QuickStopActive)。

返回值:

  • boolean — true = 控制字写入成功;false = 写失败(可查 lastWriteAbortCode())

faultReset()​

public boolean faultReset()

清除故障。发送 Fault Reset 位 (Bit 7),产生上升沿清除驱动器故障。

返回值:

  • boolean — true = 两次控制字写入均成功;false = 任一相位写失败或被中断(复位信号不完整,故障不会被清除;失败原因见 lastWriteAbortCode())

状态读取​

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 boolean controlword(short value)

读取或写入控制字。

controlword(short) 的返回值:

  • boolean — true = 写入成功;false = 写失败(命令未下发,可查 lastWriteAbortCode())

示例:

short sw = slave.cia402().statusword();
slave.cia402().controlword((short) 0x000F);

操作模式​

operationMode()​

public ModeCiA402 operationMode()
public boolean operationMode(ModeCiA402 mode)

设置或读取操作模式。

返回值:

  • ModeCiA402 — 读取时返回操作模式枚举
  • boolean — 写入时 true = 写入成功;false = 写失败(可查 lastWriteAbortCode())
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 boolean configureTouchProbe(short function)

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

参数:

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

返回值:

  • boolean — true = 写入成功;false = 写失败(可查 lastWriteAbortCode())

相关属性:

  • 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 boolean newSetpoint(int position, boolean relative)

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

参数:

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

返回值:

  • boolean — true = 目标位置与控制字都写入成功;false = 任一次写失败(命令未生效,可查 lastWriteAbortCode() 定位是哪一笔失败)

示例:

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 boolean clearNewSetpoint()

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

返回值:

  • boolean — true = 写入成功;false = 写失败

示例:

if (drv.targetReached()) {
drv.clearNewSetpoint();
}

startHoming()​

public boolean startHoming()

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

返回值:

  • boolean — true = 写入成功;false = 写失败

相关属性:

  • 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。读失败返回 -32768(非合法取值);判别见下方选项码与错误码

示例:

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

选项码与错误码​

五类驱动器选项码决定各状态转换时的减速/停止行为;错误码反映驱动器当前故障。

类别方法类型读写返回值
选项码quickStopOptionCode() / quickStopOptionCode(short)short读写0x605A。正常 = 真值(合法选项码为小值含 0);读失败返回 -32768(非合法取值,请勿当真实数值,按失败处理)
选项码shutdownOptionCode() / shutdownOptionCode(short)short读写0x605B。同上
选项码disableOperationOptionCode() / disableOperationOptionCode(short)short读写0x605C。同上
选项码haltOptionCode() / haltOptionCode(short)short读写0x605D。同上
选项码faultReactionOptionCode() / faultReactionOptionCode(short)short读写0x605E。同上
错误errorCode()int只读0x603F。正常 = 真值(0x0000 表无错误);读失败返回 0xFFFF(非合法取值,请勿当真实数值,按失败处理)
错误tryReadErrorCode()CiA402ReadResult<Integer>只读0x603F。三态结果(成功 / 不支持 / 读失败),见下方可观测读取

读失败哨兵(与原生直读导出同一口径):有符号 16 位选项码读失败 = -32768 (INT16_MIN);无符号 16 位错误码读失败 = 0xFFFF。两者都不是合法取值(合法选项码为小值含 0;错误码 0x0000 表无错误),请勿当作真实数值使用,应按读取失败处理。返回 int 的读取接口(如错误历史)读失败整体返回 -1,调用方按失败处理。

判别常量与帮助方法(CiA402 类内):

名称类型说明
READ_FAIL_SENTINEL_I16short有符号 16 位读失败哨兵 (-32768)
READ_FAIL_SENTINEL_U16int无符号 16 位读失败哨兵 (0xFFFF)
READ_FAIL_SENTINEL_INTint返回 int 的读取接口读失败哨兵 (-1, fail-closed)
isReadFailSentinelI16(short v)boolean分域判别:只认有符号 16 位选项码域哨兵 (-32768),不覆盖另两档
isReadFailSentinelU16(int v)boolean分域判别:只认无符号 16 位错误码域哨兵 (0xFFFF),不覆盖另两档。Java 无 unsigned 16,u16 以 int 承载
isReadFailSentinelInt(int v)boolean分域判别:只认返回 int 的计数形读取域哨兵 (-1, fail-closed),不覆盖另两档
isReadFailSentinel(short v)booleanlegacy 合并入口的 short 形,保留给旧调用点。本重载只判 i16 域,行为同 isReadFailSentinelI16(short);新代码请改用分域判别
isReadFailSentinel(int v)booleanlegacy 跨域,有文档化假阳性。Java 无 unsigned 16,u16 与 int 计数同以 int 承载,故本重载并含两档 (-1 与 0xFFFF),归因不出哨兵来自哪一档;int 计数域的合法计数值 65535 会被误判为读失败。新代码请改用 isReadFailSentinelU16(int) / isReadFailSentinelInt(int)

分域判别按被测返回形取同档谓词:选项码取 isReadFailSentinelI16,errorCode() 取 isReadFailSentinelU16,返回 int 的计数形读取取 isReadFailSentinelInt。

byte 方法编号(0x60E3 列表项,-128..-1 为厂商自定义方法)是真实取值,不属哨兵,请勿用上述判别方法判别。

示例:

// 选项码: 读失败 = -32768 哨兵 (非合法取值), 判真按失败处理
short qs = drv.quickStopOptionCode();
if (CiA402.isReadFailSentinelI16(qs)) {
/* 读失败, 按失败处理 */
} else {
/* qs 为真值 (合法选项码为小值含 0) */
}

// 错误码: errorCode() 读失败 = 0xFFFF 哨兵; 需三态区分用 tryReadErrorCode()
int ec = drv.errorCode();
if (CiA402.isReadFailSentinelU16(ec)) {
/* 读失败, 按失败处理 */
} else {
/* ec 为真值 (0x0000 表无错误) */
}

力矩限制​

类别属性类型读写说明
转矩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()
@Deprecated
public byte[] SupportedHomingMethods() // 兼容旧名

读取驱动器支持的回零方法列表 (0x60E3),返回方法编号数组;supportedHomingMethods() 为正名,SupportedHomingMethods() 为保留兼容的旧名。

返回值:

  • byte[] — 方法编号数组

三种情形各返什么:

  • 失败(SDO 超时 / 通讯异常 / 其它 abort)— 返 null,按失败处理
  • 空集(SI0=0 且读成功,从站真返回 0 条)— 返空数组
  • 不支持(从站无 0x60E3 或 0x60E3:00,SDO abort 0x06020000 对象不存在 / 0x06090011 子索引不存在)— 返 null,与失败同档

本方法任一子项读失败即整体读失败。

备注

失败与不支持都按失败处理,禁止当成「支持 0 种回零方法」。对应导出 CiA402_GetSupportedHomingMethods 读失败整体返回 -1(fail-closed),本方法按 Java 惯例映射为 null,不返回 -1。

示例:

byte[] methods = drv.supportedHomingMethods();
if (methods == null) {
/* 读失败, 按失败处理 */
} else {
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_SHUTDOWN_OPTION_CODE0x605BShutdown 选项码
OD_DISABLE_OPERATION_OPTION_CODE0x605CDisable Operation 选项码
OD_HALT_OPTION_CODE0x605DHalt 选项码
OD_FAULT_REACTION_OPTION_CODE0x605EFault Reaction 选项码
OD_ERROR_CODE0x603F当前错误代码 (只读)
OD_SUPPORTED_HOMING_METHODS0x60E3支持的回零方法列表
OD_QUICK_STOP_DECELERATION0x6085快速停止减速度
OD_SUPPORTED_DRIVE_MODES0x6502支持的驱动模式位掩码

控制字命令常量​

常量值说明
CW_SHUTDOWN0x06关机命令
CW_SWITCH_ON0x07开启命令
CW_ENABLE_OPERATION0x0F使能运行
CW_DISABLE_VOLTAGE0x00禁用电压
CW_QUICK_STOP0x02快速停止
CW_FAULT_RESET0x86故障复位

状态字位掩码常量​

常量值说明
SW_FAULT0x0008 (Bit 3)故障
SW_QUICK_STOP0x0020 (Bit 5)快速停止
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

Bit 0 / 1 / 2 / 4 / 6(ReadyToSwitchOn / SwitchedOn / OperationEnabled / VoltageEnabled / SwitchOnDisabled)没有对应的 SDK 常量,不按单个位读 —— 整体状态用 parseState(statusword()) 读成 StateCiA402。

完整示例​

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("回零错误");
}
});