运动控制(Motion Control) -- 轴(Axis)
mcLREAL axis_pos_cmd_, axis_vel_cmd_, axis_acc_cmd_, axis_torque_cmd_:当前下发命令(最终输出给 Servo)。mcLREAL axis_pos_, axis_vel_, axis_acc_, axis_jerk_:当前测量位置/速度/加速度/跃度(用户单位或编码器单位,取决实现)。AxisParamInfo* param_tab
轴(Axis)的定义
概述
- Axis 是对单个物理自由度(电机+驱动+编码器等)的软件抽象。它聚合硬件接口、状态机、运动命令队列、轨迹内核(MotionKernel / planner)与安全/限制逻辑。
- 职责:接收功能块(FB)并排队、调用 planner 生成时间参数化轨迹、在实时周期内采样轨迹并把命令下发到 Servo(或把关键点上传到驱动),管理轴的状态与错误、执行单位转换与保护逻辑。
为什么要抽象出轴?
-
轴(Axis)是把运动控制系统中与单一物理驱动/自由度相关的所有职责封装成一个概念单元:状态、命令、限制、与伺服/编码器的接口、功能块队列、以及与轨迹/内核的交互。
-
抽象轴可以把“通用的运动逻辑”与“具体硬件/协议”分离,便于设计、测试、复用与多轴协同。
-
映射到物理:每个轴对应一个实际电机/驱动/编码器,轴对象把这些硬件资源和 IO 映射到软件接口上(读位置、写命令、处理限位等)。
-
聚合状态与命令:集中保存位置/速度/加速度测量、当前命令、控制模式(CSP/CSV/PP/CST)、错误状态、使能/力矩等,便于一致性检查与状态机管理。
-
职责分离:planner(轨迹生成器)只负责计算时间参数化轨迹;Axis 负责把轨迹采样、限幅、前馈叠加、转换成伺服可接受的命令并下发。
-
多模式支持:通过 Axis 的控制模式接口,可以在 CSP(每周期下发位置/前馈)、PP(上传关键点由驱动执行)等模式间切换,而不改变 planner 实现。
-
实时/资源管理:Axis 可以维护固定大小的 node_buffer、避免实时线程分配、做 double-buffer 同步,保证实时性与内存安全。
-
安全与保护:统一实现限速、软限位、急停、错误恢复、回零逻辑等,避免每个调用者重复实现。
-
多轴同步与协调:上层可以以 Axis 为单位进行同步插补、同步停止或协调速度缩放,实现多轴联动。
-
易于测试与仿真:Axis 可指向仿真 Servo 对象,便于在无硬件时进行回归测试。
Axis在系统中的典型职责
- 持有 AxisConfig(单位转换、编码器分辨率、限值)并提供 toUser/toEncoder 单位转换。
- 接收功能块(FB)或运动命令并排队(node_buffer_),由 MotionKernel/Planner 生成时间参数化轨迹或按需重规划(replanUnderlyingMotion)。
- 周期运行(runCycle)中:从轨迹采样(position/vel/acc/jerk),做限制/叠加(override、superimposed),并通过 Servo 接口下发到驱动(updateMotionCmdsToServo)。这决定系统是以 CSP(每周期下发)还是以 PP(上传轨迹点)运行。
- 管理使能、伺服状态、错误、原点/限位输入与恢复。
与PLCopen关系
- 概念上受 PLCopen MC 影响(有 MC_Power/Move/Home 等对应功能块思想),Axis 提供类似的状态与命令语义,但实现为 C++ 类和本地接口,不是 IEC FB 的逐字实现。通常会在上层做一层适配,把 PLCopen 的 FB 映射到 Axis 的方法与队列。
和 planner(如 offline_scurve_planner)的交互
- planner 生成时间参数化轨迹(pos/vel/acc/jerk 随时间),Axis 负责按控制周期从该轨迹采样并下发(CSP)或把轨迹转换为驱动可接受的关键点上传(PP)。选择哪种方式由 Axis/Servo 层和目标硬件能力决定。
主要成员
-
标识与元数据
mcUSINT axis_id_:轴的唯一标识号。
mcLREAL stamp_, delta_time_:时间戳与当前周期时间步长(s)。状态机与控制状态 -
MC_AXIS_STATES axis_state_:轴高层状态(idle, running, homing, error 等)。
MC_ERROR_CODE axis_error_:当前错误码。
mcBOOL power_on_, power_status_:电源/使能状态。
MC_SERVO_CONTROL_MODE axis_mode_ / axis_mode_cmd_:当前与期望的控制模式(CSP, CSV, PP, CST 等)。 -
测量量(来自硬件/仿真)
mcLREAL axis_pos_, axis_vel_, axis_acc_, axis_jerk_:当前测量位置/速度/加速度/跃度(用户单位或编码器单位,取决实现)。
mcLREAL axis_torque_:当前扭矩/力矩测量。
mcLREAL overflow_count_:编码器回绕统计。 -
命令量(目标)
mcLREAL axis_pos_cmd_, axis_vel_cmd_, axis_acc_cmd_, axis_torque_cmd_:当前下发命令(最终输出给 Servo)。
mcLREAL axis_underlying_pos_cmd_, axis_underlying_vel_cmd_ 等:由 planner/内核生成的“底层”命令。
mcLREAL axis_sup_pos_cmd_ 等:叠加(superimposed)运动命令(教导/手动叠加)。 -
配置与参数
AxisConfig* config_:参数结构体(encoder_count_per_unit、vel_limit、acc_limit、frequency、param_table 等)。
AxisParamInfo* param_table_、param_table_num_:轴参数表(可用于对象字典或PDO映射)。
AxisCheckDoneFactor factor_:判定完成的阈值(pos/vel)。 -
运动内核与执行节点
MotionKernel motion_kernel_(或指针):封装 planner、轨迹缓存、采样接口。
ExecutionNode node_buffer_[NODE_BUFFER_MAX_SIZE]:固定大小节点池,用于存放待执行的功能块(避免 realtime 分配)。
ExecutionNode* it_ / node_num_:当前迭代指针、节点计数。
ExecutionNode* superimposed_node_ptr_:叠加运动对应节点。 -
伺服/硬件接口
Servo* servo_:底层伺服/驱动接口(读 IO / 写命令 / 上传轨迹等)。
mcBOOL axis_in_simulation_:是否仿真模式开关。 -
覆盖/保护控制因子
OverrideFactors axis_override_factors_:速度/加速度缩放因子(用于平滑停止或限幅)。
mcBOOL axis_superimposed_enable_:是否启用叠加运动。
CSP(Cyclic Synchronous Position)
CSP(Cyclic Synchronous Position)适用于对闭环位置指令需要“周期性、低延迟、主控端插补/前馈”的场景;即主控制器每个控制周期向伺服下发目标位置(常同时带速度/加速度前馈)
典型适用场景
- 高动态伺服控制:要求很短响应时间、高带宽跟踪(机器人关节、并联机器人、直接驱动轴)。
- 多轴时间同步/插补:需要主控对多轴做严格时间同步(插补器在主控端),例如直线/圆弧插补、多轴联动。
- 需要前馈控制与在线修改轨迹:利用速度/加速度前馈降低误差,或者实时重新规划并逐周期下发。
- 分布式实时总线(如 EtherCAT CSP/DS402 模式、PROFINET IRT 等)可支持短周期传输并保证确定性。
更多推荐

所有评论(0)