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_I16 | short | 有符号 16 位读失败哨兵 (-32768) |
| READ_FAIL_SENTINEL_U16 | int | 无符号 16 位读失败哨兵 (0xFFFF) |
| READ_FAIL_SENTINEL_INT | int | 返回 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) | boolean | legacy 合并入口的 short 形,保留给旧调用点。本重载只判 i16 域,行为同 isReadFailSentinelI16(short);新代码请改用分域判别 |
| isReadFailSentinel(int v) | boolean | legacy 跨域,有文档化假阳性。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_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_SHUTDOWN_OPTION_CODE | 0x605B | Shutdown 选项码 |
| OD_DISABLE_OPERATION_OPTION_CODE | 0x605C | Disable Operation 选项码 |
| OD_HALT_OPTION_CODE | 0x605D | Halt 选项码 |
| OD_FAULT_REACTION_OPTION_CODE | 0x605E | Fault Reaction 选项码 |
| OD_ERROR_CODE | 0x603F | 当前错误代码 (只读) |
| OD_SUPPORTED_HOMING_METHODS | 0x60E3 | 支持的回零方法列表 |
| 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 | 0x86 | 故障复位 |
状态字位掩码常量
| 常量 | 值 | 说明 |
|---|---|---|
| SW_FAULT | 0x0008 (Bit 3) | 故障 |
| SW_QUICK_STOP | 0x0020 (Bit 5) | 快速停止 |
| 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 |
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("回零错误");
}
});