博文

开源连载④|ST_AxisParameter —— 参数配好了,项目就稳了一半

ST/PLC / 轴控

开源连载 ④ | 共 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 = 83886080UdiHomingSlowSpeed = 8388608 就是按这个比例来的。

细节四:默认值本身就是一种设计

你注意到 rAccTime := 0.25 了吗?不是 0.1,也不是 1.0。

0.25 秒是一个经验值——大多数中小型伺服轴,0.25 秒从 0 加速到 3000 rpm 是既快又不抖的折中。

每个参数的默认值都不是随便填的:

参数默认值理由
rAccTime0.25 s中小型轴通用,兼顾效率与平稳
rJogSpeed5.0 unit/s点动对位,慢才安全
SiHomingMethod35挡块+Z脉冲,最通用的回零方式
iMovementType1(直线轴)直线轴比旋转轴更常见

默认值选对了,新手直接用也不会出大问题。

细节五: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 篇。 代码已在笔记中同步,明天最终篇统一开源发布。

你配参数踩过最大的坑是什么?留言说说,一起避坑 👇

← 返回博文列表