跳到主要内容

CiA 402 -- 伺服驱动器辅助

CiA 402 (IEC 61800-7-204) 是基于 CoE 的伺服驱动器设备协议。SDK 提供两个层级的 CiA 402 支持:

  • CiA402 -- 基础接口,通过 slave.cia402 访问,提供使能/禁用/故障复位等基本操作
  • CiA402Advanced -- 高级接口,独立创建,支持 PDO 映射扫描与类型化位置/速度/转矩访问

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

通过 slave.cia402 访问。从站不支持 CiA 402 时为 None

CiA402Advanced 为高级 API

本页示例中出现的 CiA402Advanced(master._dll, master.master_index, slave_index) 写法属于内部高级 API, 仅在需要 PDO 映射扫描或类型化位置/速度/转矩访问时使用。常规使能/禁用/故障复位/状态查询走 slave.cia402 (基础接口) 即可。 高级 API 的句柄参数后续可能调整, 请勿在生产代码中长期固化该构造形式。

PDO 初始化

scan_pdo_mapping()

def scan_pdo_mapping(self) -> bool

初始化所有 PDO 偏移缓存。读取 0x1C12/0x1C13 PDO Assignment 配置,解析各对象在 IOmap 中的偏移位置。返回 boolTrue 表示至少找到一个已知信号 (扫描成功),False 表示未找到任何映射。

备注

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

示例:

from darra_ethercat import CiA402Advanced

drv = CiA402Advanced(master._dll, master.master_index, 1)
drv.scan_pdo_mapping()

状态控制

enable(max_retries=10)

def enable(self, max_retries: int = 10) -> bool

使能驱动器: SDK 自动按 CiA 402-2 完成 SwitchOnDisabled → ReadyToSwitchOn → SwitchedOn → OperationEnabled 全套时序、Fault 复位、QuickStop 恢复 (含 0x605A 选项码判断)。

参数:

  • max_retries (int) — 最大重试次数 (默认 10)

返回值:

  • boolTrue = 已使能到 OperationEnabled, False = 失败/超时

disable()

def disable(self) -> bool

禁用伺服 (Disable Operation, 写控制字 bit0-3 = 0x07)。返回 boolTrue 表示命令已下发。

disable_operation()

def disable_operation(self) -> bool

禁用运行 (Transition 5: OperationEnabled -> SwitchedOn)。电机仍通电,可快速重新 enable()。返回 boolTrue 表示命令已下发。

备注

此返回类型仅适用于基础 CiA402 (slave.cia402)。CiA402Advanced.disable_operation() 写控制字后返回 None

quick_stop()

def quick_stop(self) -> bool

快速停止 (-> QuickStopActive)。返回 boolTrue 表示命令已下发。

fault_reset()

def fault_reset(self) -> bool

清除故障。发送 Fault Reset 位 (Bit 7),产生上升沿清除驱动器故障。返回 boolTrue 表示复位成功。

示例:

cia = slave.cia402

# 一次性使能 (内部完成状态机)
if not cia.enable():
print(f"使能失败, 当前状态: {cia.state}")

# 禁用驱动器
cia.disable()

# 故障复位
cia.fault_reset()

# 快速停止
cia.quick_stop()

状态读取

state / state_drive

# 基础 CiA402 (slave.cia402)
@property
def state(self) -> CiA402State

# CiA402Advanced
@property
def state_drive(self) -> StateCiA402

解析当前驱动器状态。基础 CiA402.state 返回 CiA402State; CiA402Advanced 另提供 state_drive 返回 StateCiA402 (由状态字 0x6041 实时解析)。

StateCiA402 枚举 (slave/cia402.py, CiA402Advanced.state_drive 用):

class StateCiA402(IntEnum):
NOT_READY_TO_SWITCH_ON = 0 # 初始化中
SWITCH_ON_DISABLED = 1 # 驱动禁用
READY_TO_SWITCH_ON = 2 # 准备就绪
SWITCHED_ON = 3 # 已开启
OPERATION_ENABLED = 4 # 运行使能
QUICK_STOP_ACTIVE = 5 # 快速停止
FAULT_REACTION_ACTIVE = 6 # 故障反应中
FAULT = 7 # 故障
UNKNOWN = 99 # 未知状态

CiA402State 枚举 (darra_ethercat 顶层, CiA402.state 用):

class CiA402State(IntEnum):
NOT_READY = 0 # 未就绪
SWITCH_ON_DISABLED = 1 # 使能关闭
READY_TO_SWITCH_ON = 2 # 准备使能
SWITCHED_ON = 3 # 已使能
OPERATION_ENABLED = 4 # 运行
QUICK_STOP_ACTIVE = 5 # 快速停止
FAULT_REACTION = 6 # 故障反应中
FAULT = 7 # 故障
UNKNOWN = 99 # 未知

示例:

state = slave.cia402.state          # CiA402State 枚举
print(f"驱动器状态: {state.name}")

status_word

@property
def status_word(self) -> int

读取状态字 (0x6041)。

control_word

@property
def control_word(self) -> int

@control_word.setter
def control_word(self, value: int) -> None

读取或写入控制字 (0x6040)。

相关属性:

  • target_reached (bool) — 目标已到达 (Bit 10)
  • has_fault (bool) — 存在故障 (Bit 3)
  • has_warning (bool) — 存在警告 (Bit 7)
  • is_remote (bool) — 远程模式已激活 (Bit 9)

示例:

cia = slave.cia402
sw = cia.status_word
print(f"StatusWord: 0x{sw:04X}")

if cia.target_reached:
print("目标已到达")
if cia.has_fault:
print("存在故障")

操作模式

操作模式属性

操作模式通过属性读写, 不是 set_mode()/get_mode() 方法:

# 基础 CiA402 (slave.cia402)
@property
def mode(self) -> int
@mode.setter
def mode(self, value: int) -> None

# CiA402Advanced
@property
def operation_mode(self) -> int
@operation_mode.setter
def operation_mode(self, value: int) -> None

设置或读取操作模式 (0x6060 / 0x6061)。CiA402Advanced 另有只读属性 modes_of_operation_display 直读 0x6061。

ModeCiA402 枚举:

class ModeCiA402(IntEnum):
PP = 1 # 轮廓位置模式
VL = 2 # 速度模式
PV = 3 # 轮廓速度模式
PT = 4 # 轮廓转矩模式
HM = 6 # 回零模式
IP = 7 # 插补位置模式
CSP = 8 # 周期同步位置模式
CSV = 9 # 周期同步速度模式
CST = 10 # 周期同步转矩模式
CSTCA = 11 # 周期同步转矩加速度模式

示例:

from darra_ethercat import ModeCiA402

cia = slave.cia402
cia.mode = ModeCiA402.CSP # 基础 CiA402: mode 属性
print(f"操作模式: {cia.mode}")

# CiA402Advanced 用 operation_mode 属性
# drv.operation_mode = ModeCiA402.CSP

运动参数

属性类型访问说明
actual_positionint只读实际位置 (0x6064)
velocity_actualint只读实际速度 (0x606C)
torque_actualint只读实际转矩,千分之额定 (0x6077)
target_positionint读写目标位置 (0x607A)
target_velocityint读写目标速度 (0x60FF)
target_torqueint读写目标转矩,千分之额定 (0x6071)

示例:

drv = CiA402Advanced(master._dll, master.master_index, 1)
drv.scan_pdo_mapping()

# 读取实际值
print(f"位置: {drv.actual_position}")
print(f"速度: {drv.velocity_actual}")

# 写入目标值
drv.target_position = 100000
drv.target_velocity = 5000

轮廓参数

属性类型访问说明
profile_velocityint读写轮廓速度 (0x6081)
profile_accelerationint读写轮廓加速度 (0x6083)
profile_decelerationint读写轮廓减速度 (0x6084)

示例:

drv.profile_velocity = 10000
drv.profile_acceleration = 50000
drv.profile_deceleration = 50000

极性与轮廓配置

属性类型访问说明
polarityint读写极性配置 (0x607E)。位 6 = 速度极性反转,位 7 = 位置极性反转
motion_profile_typeint读写运动轮廓类型 (0x6086)。0 = 梯形,1 = S 形
quick_stop_decelerationint读写快速停止减速度 (0x6085)
quick_stop_option_codeint读写快速停止选项码 (0x605A)

示例:

# 反转位置方向
drv.polarity = 0x80 # 位 7 = 位置极性反转

# 设置 S 形轮廓
drv.motion_profile_type = 1

# 设置快速停止减速度
drv.quick_stop_deceleration = 100000

触探功能 (Touch Probe)

configure_touch_probe()

def configure_touch_probe(self, function: int) -> None

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

参数:

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

相关属性:

  • touch_probe_status (int, 只读) — 触探状态 (0x60B9)
  • touch_probe_positive_value (int, 只读) — 上升沿捕获位置 (0x60BA)
  • touch_probe_negative_value (int, 只读) — 下降沿捕获位置 (0x60BB)

示例:

# 启用触探 1,上升沿触发
drv.configure_touch_probe(0x0001)

# 读取触探结果
if (drv.touch_probe_status & 0x0002) != 0: # 上升沿已捕获
captured_pos = drv.touch_probe_positive_value
print(f"触探捕获位置: {captured_pos}")

回零速度与加速度

属性类型访问说明
homing_methodint读写回零方法 (0x6098)
home_offsetint读写回零偏移 (0x607C)
homing_speed_searchint读写回零搜索速度 (0x6099:01),快速搜索参考信号
homing_speed_zeroint读写回零零位速度 (0x6099:02),慢速精确定位零位
homing_accelerationint读写回零加速度 (0x609A)

start_homing()

def start_homing(self) -> None

HM 模式启动回零。需先设置 homing_method

相关属性:

  • homing_attained (bool) — 回零完成 (Bit 12)
  • homing_error (bool) — 回零错误 (Bit 13)

示例:

drv.operation_mode = ModeCiA402.HM
drv.homing_method = 35 # 当前位置回零

# 设置回零速度和加速度
drv.homing_speed_search = 5000 # 搜索速度
drv.homing_speed_zero = 500 # 零位速度
drv.homing_acceleration = 10000 # 回零加速度

# 使能后启动回零
drv.enable()
drv.start_homing()
# 后续检查 drv.homing_attained / drv.homing_error

扩展运动参数

属性类型访问说明
max_torqueint读写最大转矩 (0x6072),千分之额定转矩
motor_rated_torqueint读写电机额定转矩 (0x6076),单位 mNm
position_offsetint读写位置偏移 (0x60B0),CSP 模式下叠加到目标位置
velocity_offsetint读写速度偏移 (0x60B1),CSV 模式下叠加到目标速度
interpolation_time_period_valueint读写插补时间周期值 (0x60C2:01)
interpolation_time_period_indexint读写插补时间周期指数 (0x60C2:02),实际周期 = Value x 10^Index 秒

示例:

# 转矩配置
drv.max_torque = 1000 # 最大转矩 = 100% 额定
rated = drv.motor_rated_torque

# CSP 模式偏移叠加
drv.position_offset = 100 # 位置附加偏移
drv.velocity_offset = 50 # 速度附加偏移

# 插补时间周期 (1ms = 1 x 10^(-3) 秒)
drv.interpolation_time_period_value = 1
drv.interpolation_time_period_index = -3

力矩限制

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

示例:

# 限制正负方向转矩为额定的 50%
drv.positive_torque_limit = 500
drv.negative_torque_limit = 500

数字 IO

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

示例:

# 读取数字输入
inputs = drv.digital_inputs
limit_switch = (inputs & 0x01) != 0 # 位 0

# 设置数字输出
drv.digital_outputs = 0x03 # 输出位 0 和位 1

软件位置限位

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

示例:

# 设置运动范围限制
drv.software_position_limit_min = -1000000
drv.software_position_limit_max = 1000000

快速运动控制

new_setpoint()

def new_setpoint(self, position: int, relative: bool = False) -> None

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

参数:

  • position (int) — 目标位置
  • relative (bool) — True = 相对定位,False = 绝对定位(默认)

示例:

drv.operation_mode = ModeCiA402.PP
drv.profile_velocity = 10000
drv.profile_acceleration = 50000

drv.enable()

# 发送定位命令
drv.new_setpoint(100000) # 绝对定位到 100000
# drv.new_setpoint(5000, True) # 或相对移动 5000

clear_new_setpoint()

def clear_new_setpoint(self) -> None

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

示例:

if drv.target_reached:
drv.clear_new_setpoint()

驱动器信息

supported_drive_modes

@property
def supported_drive_modes(self) -> int

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

is_mode_supported()

def is_mode_supported(self, mode: ModeCiA402) -> bool

检查驱动器是否支持指定操作模式。

示例:

if drv.is_mode_supported(ModeCiA402.CSP):
drv.operation_mode = ModeCiA402.CSP

supported_homing_methods

@property
def supported_homing_methods(self) -> List[int]

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

示例:

methods = drv.supported_homing_methods
print(f"支持 {len(methods)} 种回零方法: {methods}")

可观测只读 (round33CC)

常规 getter (如 supported_drive_modeserror_codeactual_position) 读取失败时返回 None/0,无法区分"从站真返 0"与"读失败/不支持被吞成 0"。try_read_* 系列方法真去读一次 SDO,把结果如实分成三态 (成功 / 不支持 / 读失败),绝不把失败静默吞成 0。

备注

try_read_* 强制走 SDO 只读 (即使该对象已 PDO 映射),以便拿到 SDO Abort Code 区分状态。实时高频读仍请用对应 PDO 优先属性 (如 actual_positionstatusword)。

CiA402ReadStatus 枚举

class CiA402ReadStatus(IntEnum):
NOT_ATTEMPTED = 0 # 尚未尝试读取
SUCCESS = 1 # 读取成功, 返回的是从站真值
NOT_SUPPORTED = 2 # 从站不支持该对象 (SDO abort 0x06020000/0x06090011)
READ_FAILED = 3 # SDO 读取失败 (超时 / 通讯异常 / 其它 abort)

CiA402ReadResult

try_read_* 方法返回的带状态结果 (NamedTuple)。

成员类型类别读写说明
valueOptional[int]字段只读读到的值 (仅 status==SUCCESS 时有意义, 否则为 None)
statusCiA402ReadStatus字段只读读取状态枚举
abort_codeSDOError字段只读SDO Abort Code (NO_ERROR = 无 abort)
okbool属性只读是否读取成功且值可信 (status == SUCCESS)
not_supportedbool属性只读从站是否不支持该对象 (status == NOT_SUPPORTED)

try_read_object()

def try_read_object(self, index: int, subindex: int = 0,
dtype: str = 'u32') -> CiA402ReadResult

通用可观测只读 — 对任意 CiA402 对象做一次 SDO 只读尝试,返回带状态的结果。纯只读无副作用。dtype'u8'/'i8'/'u16'/'i16'/'u32'/'i32'/'u64'/'i64'

专用 try_read_* 方法

方法对象返回值宽度说明
try_read_operation_mode_display()0x6061i8操作模式显示 (强制 SDO, 不取 PDO)
try_read_supported_drive_modes()0x6502u32支持的驱动模式位掩码 (ETG.6010 mandatory)
try_read_error_code()0x603Fu16当前错误代码
try_read_torque_actual()0x6077i16实际转矩 (千分之额定)
try_read_digital_inputs()0x60FDu32数字输入
try_read_position_actual()0x6064i32实际位置 (SDO 路径)
try_read_velocity_actual()0x606Ci32实际速度 (SDO 路径)
try_read_statusword()0x6041u16状态字 (SDO 路径)
try_read_drive_data(subindex)0x6510u32厂商特定驱动数据 (子索引由 ESI 定义)

每个方法签名均为 def try_read_xxx(self) -> CiA402ReadResult (除 try_read_drive_data(self, subindex: int))。

可观测状态属性

属性类型类别读写说明
last_read_statusCiA402ReadStatus状态只读最近一次 SDO 只读尝试的状态
last_read_abort_codeSDOError状态只读最近一次失败/不支持时的 Abort Code (NO_ERROR=成功)
last_read_objectTuple[int, int]状态只读最近一次尝试的 (对象索引, 子索引)
supported_drive_modes_readablebool状态只读从站是否真支持 0x6502 对象 (据只读尝试结果)

示例:

from darra_ethercat import CiA402ReadStatus

# 区分"从站真返 0" vs "读失败被吞成 0"
result = drv.try_read_supported_drive_modes()
if result.ok:
print(f"支持的驱动模式位掩码: 0x{result.value:08X}")
elif result.not_supported:
print("从站不支持 0x6502 对象")
else:
print(f"读取失败, abort=0x{int(result.abort_code):08X}")

# 查询最近一次只读尝试的诊断信息
idx, sub = drv.last_read_object
print(f"最近读取 0x{idx:04X}:{sub:02X}, 状态={drv.last_read_status.name}")

TxPDO 数据有效性

txpdo_data_invalid

@property
def txpdo_data_invalid(self) -> bool

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

示例:

if not drv.txpdo_data_invalid:
pos = drv.actual_position # 数据有效,可安全使用

同步功能

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

示例:

# 读取驱动器同步状态
sync_status = drv.drive_sync_status
print(f"同步状态: 0x{sync_status:04X}")

# 配置同步设置
drv.synchronization_settings = 0x0001

深度合规 API (ETG.6010 + CiA 402-2)

以下方法/属性把状态机推进、选项码判断、错误历史等逻辑下沉到 native DLL,Python 层仅做类型转换与友好包装。适用于需要严格 CiA 402-2 状态转换校验、选项码 (0x605A-0x605E) 读写、驱动器内部错误历史 (0x1003) 的场景。

request_transition()

def request_transition(self, target: StateCiA402) -> bool

请求指定状态转换,合法性由 DLL 按 CiA 402-2 Fig.3 T1-T16 校验。非法转换 (如 FAULT → OPERATION_ENABLED 直跳) 返回 False 且不发命令。

参数:

  • target (StateCiA402) — 目标状态

返回值:

  • boolTrue = 转换命令已下发, False = 非法转换 / 失败

get_transition_command()

@staticmethod
def get_transition_command(dll: DarraCoreDLL, current: StateCiA402,
target: StateCiA402) -> int

查询 (当前状态 → 目标状态) 的合法控制字,0xFFFF = 非法转换。纯计算,故为静态方法,需传入 dll 实例。

fault_reset_step()

def fault_reset_step(self, step: int) -> bool

非阻塞 Fault Reset 单步 (PDO 回调两周期分别调 step=0/step=1,避免 fault_reset() 内的 sleep 阻塞 RT)。step=0 清 Bit7 (低电平),step=1 置 Bit7 (产生上升沿)。

supported_drive_modes_dll / is_mode_supported_dll()

@property
def supported_drive_modes_dll(self) -> int

def is_mode_supported_dll(self, mode: int) -> bool

通过 DLL 查询支持的驱动模式位掩码 (0x6502) 与模式支持判断,由 native 做 PDO/SDO 分流与位运算,与 supported_drive_modes / is_mode_supported() 等价。

选项码属性 (0x605A-0x605E)

属性类型类别读写对象说明
quick_stop_optionint配置读写0x605AQuick Stop 选项码 (5/6/7/8=减速后保持, 允许 T16 → OperationEnabled)
shutdown_optionint配置读写0x605BOperationEnabled → ReadyToSwitchOn 减速行为
disable_operation_optionint配置读写0x605COperationEnabled → SwitchedOn 行为
halt_optionint配置读写0x605DCW Bit8 Halt 行为 (1=轮廓斜坡, 2=QS 减速, 3=转矩停止)
fault_reaction_optionint配置读写0x605E故障检测后行为 (-1=厂商, 0=直接切断, 1/2/3=减速)

均经 native 直读/直写 (CiA402_GetXxxOption / CiA402_SetXxxOption)。

error_code / 错误历史

@property
def error_code(self) -> int

def get_error_history(self, max_count: int = 32) -> List[int]

def clear_error_history(self) -> bool
  • error_code — 当前 Error Code (0x603F, CiA 402 附录),经 native 直读。
  • get_error_history() — 读取 Pre-defined Error Field (0x1003),返回驱动器内部持久错误历史 (Error Code 低 16 位),空列表 = 无历史/读取失败。
  • clear_error_history() — 清除驱动器内部错误历史 (0x1003:00 = 0)。

回零方法 DLL 接口

@property
def homing_method_dll(self) -> int

def get_supported_homing_methods_dll(self, max_count: int = 64) -> List[int]

@staticmethod
def is_standard_homing_method(dll: DarraCoreDLL, method: int) -> bool
  • homing_method_dll — 经 native 直读/直写回零方法 (0x6098, sbyte),与 homing_method 属性等价。
  • get_supported_homing_methods_dll() — 读取支持的回零方法列表 (0x60E3, sbyte 列表, 可含负值厂商扩展)。
  • is_standard_homing_method() — 校验回零方法是否属于 ETG.6010 标准 35 方法 (1..35 或 37)。纯计算静态方法,需传入 dll

示例:

from darra_ethercat import StateCiA402

# 按 CiA 402-2 校验的状态转换 (非法转换返回 False, 不发命令)
if not drv.request_transition(StateCiA402.OPERATION_ENABLED):
print("非法转换 / 失败")

# 读取驱动器内部错误历史
history = drv.get_error_history()
print(f"错误历史 ({len(history)} 条): {[hex(e) for e in history]}")
print(f"当前错误码: 0x{drv.error_code:04X}")

# 配置 Quick Stop 选项码 (6 = 减速后保持 QuickStopActive)
drv.quick_stop_option = 6

高级接口 (CiA402Advanced)

CiA402Advanced 继承自 CiA402,额外支持 PDO 映射扫描与类型化访问。

from darra_ethercat import CiA402Advanced

drv = CiA402Advanced(master._dll, master.master_index, 1)

PDO 映射扫描

# 扫描 PDO 映射 (0x1C12 / 0x1C13)
drv.scan_pdo_mapping()
print(f"PDO 映射完成: {drv.is_pdo_mapped}")
print(f"映射信号: {drv.pdo_offsets}")

扫描完成后,读写运动参数会优先通过 PDO(零延迟),无映射时回退到 SDO。

相关属性:

  • status_word_pdo (int, 只读) — 通过 PDO 读取状态字 (0x6041)
  • control_word_pdo (int, 读写) — 通过 PDO 读写控制字 (0x6040)

标准对象索引常量

常量说明
OD_CONTROLWORD0x6040控制字
OD_STATUSWORD0x6041状态字
OD_QUICK_STOP_OPTION_CODE0x605A快速停止选项码
OD_MODES_OF_OPERATION0x6060操作模式设置
OD_MODES_DISPLAY0x6061操作模式显示
OD_POSITION_ACTUAL0x6064实际位置
OD_TARGET_TORQUE0x6071目标转矩
OD_MAX_TORQUE0x6072最大转矩
OD_MOTOR_RATED_TORQUE0x6076电机额定转矩
OD_TORQUE_ACTUAL0x6077实际转矩
OD_TARGET_POSITION0x607A目标位置
OD_HOME_OFFSET0x607C回零偏移
OD_SOFTWARE_POSITION_LIMIT0x607D软件位置限制
OD_POLARITY0x607E极性
OD_MAX_PROFILE_VELOCITY0x6080最大轮廓速度
OD_PROFILE_VELOCITY0x6081轮廓速度
OD_PROFILE_ACCELERATION0x6083轮廓加速度
OD_PROFILE_DECELERATION0x6084轮廓减速度
OD_QUICK_STOP_DECEL0x6085快速停止减速度
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_VELOCITY_ACTUAL0x606C实际速度
OD_DIGITAL_INPUTS0x60FD数字输入
OD_DIGITAL_OUTPUTS0x60FE数字输出
OD_TARGET_VELOCITY0x60FF目标速度
OD_TXPDO_DATA_INVALID0x603ETxPDO 数据无效标志
OD_ERROR_CODE0x603F当前错误代码 (只读)
OD_SYNCHRONIZATION_SETTINGS0x60D9同步设置
OD_DRIVE_SYNC_STATUS0x60DA驱动同步状态 (只读)
OD_POSITIVE_TORQUE_LIMIT0x60E0正方向力矩限制
OD_NEGATIVE_TORQUE_LIMIT0x60E1负方向力矩限制
OD_SUPPORTED_HOMING_METHODS0x60E3支持的回零方法列表
OD_SUPPORTED_MODES0x6502支持的驱动模式位掩码
OD_DRIVE_DATA0x6510厂商特定驱动数据 (RECORD, 只读)

控制字命令常量

常量说明
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 模式 -- 周期同步位置控制

from darra_ethercat import EtherCATMaster, EcState, CiA402Advanced

with EtherCATMaster() as master:
master.set_network(r"\\Device\\NPF_{GUID}")
master.set_state(EcState.OP)
master.start()

# 创建 CiA402 高级接口
drv = CiA402Advanced(master._dll, master.master_index, 1)

# 扫描 PDO 映射
drv.scan_pdo_mapping()

# 设置 CSP 模式
drv.operation_mode = ModeCiA402.CSP

# 一次性使能 (内部完成完整状态机)
if not drv.enable():
print(f"使能失败, 当前状态: {drv.state}")
return

# PDO 周期回调中控制
def on_pdo(mi):
drv.target_position = calculate_next_position()

master.on_pdo_cycle(on_pdo)

import time
time.sleep(10)
drv.disable()
master.stop()

PP 模式 -- 轮廓位置控制

drv = CiA402Advanced(master._dll, master.master_index, 1)
drv.scan_pdo_mapping()

drv.operation_mode = ModeCiA402.PP
drv.profile_velocity = 10000
drv.profile_acceleration = 50000
drv.profile_deceleration = 50000

drv.enable()

# 发送定位命令
drv.new_setpoint(100000)

# 等待到达
import time
while not drv.target_reached:
time.sleep(0.01)
drv.clear_new_setpoint()
print("定位完成")

通过 SDO 直接控制

slave = master[1]

# 设置操作模式 (CSP)
slave.coe.sdo_write_value(0x6060, 0, 8, dtype='i8')

# 写入控制字: Shutdown
slave.coe.sdo_write_value(0x6040, 0, 0x06, dtype='u16')

# 写入控制字: Switch On
slave.coe.sdo_write_value(0x6040, 0, 0x07, dtype='u16')

# 写入控制字: Enable Operation
slave.coe.sdo_write_value(0x6040, 0, 0x0F, dtype='u16')

# 读取状态字
sw = slave.coe.sdo_read_value(0x6041, 0, dtype='u16')
print(f"StatusWord: 0x{sw:04X}")

# 写入目标位置
slave.coe.sdo_write_value(0x607A, 0, 100000, dtype='i32')