博文

开源连载②|ST_AxisCommand —— 指令的取舍艺术

ST/PLC / 轴控

开源连载 ② | 共 5 篇

开源连载②|ST_AxisCommand —— 指令的取舍艺术

11 个布尔位,如何用最少的信号覆盖轴控的全场景?

上一篇我们聊了开源固化的意义。今天深入第一套结构体——ST_AxisCommand,看看这 11 个布尔指令位背后的设计思路。


源码一览

TYPE ST_AxisCommand :
STRUCT
    bPower  : BOOL ;  (* 上电使能:TRUE = 轴使能/上电 *)
    bReset  : BOOL ;  (* 故障复位:TRUE = 清除轴故障状态 *)
    bStop   : BOOL ;  (* 急停:TRUE = 立即停止轴运动 *)
    bHalt   : BOOL ;  (* 暂停:TRUE = 暂停当前运动,恢复时清除 *)
    bHome   : BOOL ;  (* 回零:TRUE = 触发轴回原点操作 *)
    bSetPos : BOOL ;  (* 位置设定:TRUE = 将当前位置设为指定值 *)
    bJogP   : BOOL ;  (* 正向点动:TRUE = 正向连续点动运行 *)
    bJogN   : BOOL ;  (* 负向点动:TRUE = 负向连续点动运行 *)
    bRel    : BOOL ;  (* 相对模式:TRUE = 运动指令按相对位移解释 *)
    bAbs    : BOOL ;  (* 绝对模式:TRUE = 运动指令按绝对位置解释 *)
    bVel    : BOOL ;  (* 速度模式:TRUE = 仅速度控制,无位置闭环 *)

    //--- 以下为扩展指令(预留,暂未启用)---
    //bConfig : BOOL ;  (* 配置模式 *)
    //bExJogP : BOOL ;  (* 扩展正向点动 *)
    //bExJogN : BOOL ;  (* 扩展负向点动 *)
    //bExAbsP : BOOL ;  (* 扩展正向绝对定位 *)
    //bExAbsN : BOOL ;  (* 扩展负向绝对定位 *)
    //bExRelP : BOOL ;  (* 扩展正向相对定位 *)
END_STRUCT
END_TYPE

三个设计原则

原则一:指令与参数分离

这是最核心的一条。

很多驱动器把”速度""位置""方向”全塞在一个指令结构体里,结果就是:发一个指令要同时操心十几个字段。

我们的做法是拆开

ST_AxisCommand → 只负责"干什么"(指令类型)
ST_AxisParameter → 只负责"怎么干"(运动参数)

比如你要让轴走到 100mm 的位置:

谁负责怎么设
CommandbAbs := TRUE(绝对定位模式)
ParameterrAutoPos[0] := 100.0(目标位置)

指令是开关,参数是旋钮。开关只管方向,旋钮管大小。

原则二:互斥保护

bRel(相对)、bAbs(绝对)、bVel(速度)三种模式天然互斥。不能说”既要相对又要绝对”——这在物理上不成立。

所以在驱动层必须做优先级裁决

IF bAbs THEN
    // 执行绝对定位
ELSIF bRel THEN
    // 执行相对定位
ELSIF bVel THEN
    // 执行速度模式
END_IF

优先级:绝对 > 相对 > 速度。这样即使 HMI 层误操作同时置位了两个,轴也不会乱跑。

原则三:上升沿触发

所有指令位都应该上升沿触发,而非电平触发。

什么意思?

电平触发:bPower = TRUE 就一直尝试上电 → 容易重复触发
上升沿触发:只在 FALSE→TRUE 的瞬间执行一次 → 安全

驱动层加上沿检测,一个简单的 R_TRIG 就能搞定。


预留扩展位的考量

你可能会问:为什么注释掉 6 个字段,不直接用?

因为不是所有项目都需要

扩展位使用场景
bConfig需要在线切换轴参数组时
bExJogP/N双速点动(慢速对位 + 快速快移)
bExAbsP/N双目标绝对定位
bExRelP双目标相对定位

对于 90% 的项目,11 个基础指令位已经够用。扩展位不参与基础编译,零额外开销,需要时取消注释即可。


指令与状态的对应关系

每条指令都有对应的状态反馈,一一映射

指令期望状态
bPower := TRUEbPowerOn = TRUE
bHome := TRUEbHomeDone = TRUE
bJogP := TRUEbJogBusy = TRUE
bStop := TRUEbErrorStop = TRUE(或轴停止)

这也是为什么 Command 和 Message 要成对设计——发了什么指令,就检查对应的状态位,调试的时候一目了然。


小结

ST_AxisCommand 设计要点:

① 指令 = 干什么,参数 = 怎么干 → 分离
② bRel / bAbs / bVel 互斥 → 优先级裁决
③ 所有指令上升沿触发 → 安全
④ 预留 6 位扩展 → 按需启用
⑤ 指令与状态一一对应 → 可追溯

下一篇聊 ST_AxisMessage——如何用 11 个布尔位读懂轴的”心跳”

本文是「轴控三件套开源计划」连载第 2 篇。 代码已在笔记中同步,最终会在 Day 5 统一开源发布。

你的项目里踩过哪些指令设计的坑?留言聊聊 👇

← 返回博文列表