开源连载②|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 的位置:
| 谁负责 | 怎么设 |
|---|---|
| Command | bAbs := TRUE(绝对定位模式) |
| Parameter | rAutoPos[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 := TRUE | bPowerOn = TRUE |
bHome := TRUE | bHomeDone = TRUE |
bJogP := TRUE | bJogBusy = TRUE |
bStop := TRUE | bErrorStop = TRUE(或轴停止) |
这也是为什么 Command 和 Message 要成对设计——发了什么指令,就检查对应的状态位,调试的时候一目了然。
小结
ST_AxisCommand 设计要点:
① 指令 = 干什么,参数 = 怎么干 → 分离
② bRel / bAbs / bVel 互斥 → 优先级裁决
③ 所有指令上升沿触发 → 安全
④ 预留 6 位扩展 → 按需启用
⑤ 指令与状态一一对应 → 可追溯
下一篇聊 ST_AxisMessage——如何用 11 个布尔位读懂轴的”心跳”。
本文是「轴控三件套开源计划」连载第 2 篇。 代码已在笔记中同步,最终会在 Day 5 统一开源发布。
你的项目里踩过哪些指令设计的坑?留言聊聊 👇