开源连载④|ST_AxisParameter —— 参数配好了,项目就稳了一半
开源连载 ④ | 共 5 篇
开源连载④|ST_AxisParameter —— 参数配好了,项目就稳了一半
编码器、减速比、回零方式……90% 的轴控问题出在参数配置上。
前两篇聊了指令和状态。但真正让工程师头疼的,往往是参数配置。
电子齿轮比算不对 → 轴跑飞了。 回零方式选错了 → 每次开机都要重新找原点。 加速时间设太短 → 抖动、过载报警。
所以 ST_AxisParameter 是三件套里字段最多、也是最需要设计好的。
源码一览
TYPE ST_AxisParameter :
STRUCT
(*===** 基本属性 **===*)
bVirtual : BOOL := FALSE ; (* 虚实轴:FALSE=实轴,TRUE=虚轴 *)
bMotorDirection : BOOL := FALSE ; (* 电机方向:FALSE=正向,TRUE=反向 *)
bEncoderAbs : BOOL := FALSE ; (* 编码器:FALSE=增量,TRUE=绝对值 *)
(*===** 断电保持 **=***)
PersistentData : SMC3_PersistPosition_Data ; (* 断电位置保持数据 *)
bHomeDoneMark : BOOL ; (* 回零标记 *)
(***=** 编码器与齿轮比 **===*)
rEncoderPUU : REAL := 1.0; (* 编码器分辨率 [P/R] *)
rTurnsEncoder : REAL := 1.0; (* 电机每圈脉冲数 *)
rMotorTurns : REAL := 1.0; (* 电机圈数 *)
rGearTurns : REAL := 1.0; (* 减速机输入圈数 *)
rTurnsGear : REAL := 1.0; (* 减速机输出圈数 *)
(*===** 轴类型 **===*)
iMovementType : INT := 1; (* 0=旋转轴,1=直线轴 *)
fPositionPeriod : REAL := 1.0; (* 位置周期(仅旋转轴有效)*)
(*===** 回零参数 **===*)
SiHomingMethod : SINT := 35; (* 回零方式,默认35=挡块+Z脉冲 *)
UdiHomingAcc : UDINT := 83886080; (* 回零加速度 *)
UdiHomingFastSpeed : UDINT := 83886080; (* 回零快速 *)
UdiHomingSlowSpeed : UDINT := 8388608; (* 回零慢速 *)
(*===** 运动学参数 **===*)
rMotorMaxSpeed : REAL := 3000.0; (* 最大速度 [unit/s] *)
rAccTime : REAL := 0.25; (* 加速时间 [s] *)
rDecTime : REAL := 0.25; (* 减速时间 [s] *)
rJogSpeed : REAL := 5.0; (* 点动速度 [unit/s] *)
(*===** 齿轮比(可选表达)**===*)
rInOfGear : REAL := 1.0; (* 电子齿轮输入齿数 *)
rOutOfGear : REAL := 1.0; (* 电子齿轮输出齿数 *)
rUserPUU : REAL := 1.0; (* 用户单位 [Pulse/Unit] *)
(*===** 自动运行 **===*)
rAutoVel : ARRAY [0..9] OF REAL ; (* 10段自动速度 *)
rAutoPos : ARRAY [0..9] OF REAL ; (* 10段自动位置 *)
END_STRUCT
END_TYPE
五个设计细节
细节一:参数按业务分组
32 个字段如果平铺在一起,看着就头大。所以我们用分组注释把它们隔开:
基本属性 → 3 个字段
断电保持 → 2 个字段
编码器/齿轮 → 5 个字段
轴类型 → 2 个字段
回零参数 → 4 个字段
运动学 → 4 个字段
齿轮比(备选)→ 3 个字段
自动运行 → 20 个字段
调试的时候哪个环节出问题,就去哪个分组找参数,不用满屏乱翻。
细节二:两种电子齿轮比表达方式
这是最容易踩坑的地方。
同一个轴,不同品牌的驱动器对电子齿轮比的定义不一样:
| 方式 | 计算逻辑 | 适用场景 |
|---|---|---|
| 方式A(编码器参数) | rEncoderPUU × rMotorTurns × rGearTurns / (rTurnsEncoder × rTurnsGear × rUserPUU) | 通用伺服 |
| 方式B(输入/输出齿数) | rInOfGear / rOutOfGear | 步进驱动器习惯 |
两种方式都保留着,互斥使用:
IF 驱动器是伺服 THEN
用方式A(编码器参数)
ELSE
用方式B(输入/输出齿数)
END_IF
细节三:回零参数的”快慢搭配”
回零有两个关键速度:
- 快速速度:轴快速找挡块,提高效率
- 慢速速度:离开挡块找 Z 脉冲,保证精度
速度曲线:
快速(找挡块)
╱━━━━━━━━╲
╱ ╲← 慢速(找Z脉冲)
╱ ╲
─────────────────▶ 时间
搭配建议:慢速 = 快速 ÷ 10,默认值 UdiHomingFastSpeed = 83886080、UdiHomingSlowSpeed = 8388608 就是按这个比例来的。
细节四:默认值本身就是一种设计
你注意到 rAccTime := 0.25 了吗?不是 0.1,也不是 1.0。
0.25 秒是一个经验值——大多数中小型伺服轴,0.25 秒从 0 加速到 3000 rpm 是既快又不抖的折中。
每个参数的默认值都不是随便填的:
| 参数 | 默认值 | 理由 |
|---|---|---|
rAccTime | 0.25 s | 中小型轴通用,兼顾效率与平稳 |
rJogSpeed | 5.0 unit/s | 点动对位,慢才安全 |
SiHomingMethod | 35 | 挡块+Z脉冲,最通用的回零方式 |
iMovementType | 1(直线轴) | 直线轴比旋转轴更常见 |
默认值选对了,新手直接用也不会出大问题。
细节五:10 段预置位置/速度表
rAutoPos[0..9] 和 rAutoVel[0..9] 是两个数组,支持最多 10 段自动运行。
为什么是 10 段?不是 8 段也不是 16 段?
因为工控场景中常见的位置序列:上料 → 加工 → 检测 → 下料,一般不会超过 6 段。10 段留有余量,又不浪费内存。
参数配置的工程顺序
调试一台新轴时,建议按这个顺序配参数:
Step 1: 基本属性
→ bVirtual / bMotorDirection / bEncoderAbs
→ 3 分钟
Step 2: 机械参数
→ 编码器分辨率 + 减速比 + 用户单位
→ 10 分钟(算清楚,别急)
Step 3: 运动学参数
→ 最大速度 + 加减速时间 + 点动速度
→ 5 分钟
Step 4: 回零参数
→ 回零方式 + 快慢速 + 加速度
→ 10 分钟(一次配好,以后不用动)
Step 5: 自动运行
→ 预置位置 + 预置速度
→ 按工艺需求配置
按这个顺序走,一套参数配下来不超过半小时,而且不容易漏。
小结
ST_AxisParameter 设计要点:
① 按业务分组 → 定位快,不乱
② 两种齿轮比表达 → 适配不同驱动器
③ 回零快慢速比例 10:1 → 效率+精度兼顾
④ 默认值有讲究 → 拿来就能用
⑤ 10 段预置位置表 → 覆盖常见工艺
⑥ 参数配置有顺序 → 半小时搞定一台轴
下一篇大结局——三件套合体 + 开源发布,用一个完整的示例演示它们如何协同工作。
本文是「轴控三件套开源计划」连载第 4 篇。 代码已在笔记中同步,明天最终篇统一开源发布。
你配参数踩过最大的坑是什么?留言说说,一起避坑 👇