4、电子凸轮原理:电子凸轮曲线与ECAM Table
各位好,我是老张。今天咱们聊聊电子凸轮的核心——曲线和表格。说实话,我刚入行那会儿,机械凸轮见得多了,电子凸轮总觉得有点虚。后来亲手调过几台设备,才明白这东西到底有多实用。
电子凸轮,说白了就是用软件模拟机械凸轮的轮廓。你想想看,机械凸轮磨损了要换,加工精度不够就抖,改个曲线还得重新开模。电子凸轮呢?改几个参数就行。我有个项目,客户要求一天换三次产品规格,机械凸轮根本没法搞,上了电子凸轮,半小时搞定切换。
4.1 电子凸轮曲线:三种经典形状
曲线是电子凸轮的灵魂。不同的曲线,决定了从动件的运动特性——速度、加速度、甚至加加速度(Jerk)。我习惯把曲线分成三类:梯形、S型、修正梯形。咱们一个一个说。
4.1.1 梯形曲线(Trapezoidal Curve)
梯形曲线是最简单粗暴的。它的速度曲线像个梯形——匀加速、匀速、匀减速三段。
优点:计算量小,实现容易。早期PLC的算力有限,梯形曲线是主流。
缺点:加速度在拐点处突变。说白了就是有冲击。我在一台高速贴片机上试过,梯形曲线跑到3000rpm,机器抖得跟筛子似的。后来一查,加速度突变产生的冲击力,直接把凸轮从动件的轴承干废了。
适用场景:低速、对冲击不敏感的场合。比如一些简单的搬运、分拣。
4.1.2 S型曲线(S-Curve)
S型曲线就聪明多了。它把加速度也做了平滑处理——加速度本身也是连续变化的。速度曲线像个拉长的S。
优点:加速度连续,没有冲击。加加速度(Jerk)可控。机器运行非常平稳。
缺点:计算复杂,占用CPU资源多。而且同样的行程,S型曲线比梯形曲线花的时间要长一点——因为加减速段更长了。
我记得有个做锂电池卷绕机的项目,要求极片张力波动控制在±1%以内。梯形曲线根本做不到,一加速张力就跳变。换成S型曲线后,张力曲线平滑得像丝绸。嗯,这就是S型的价值。
4.1.3 修正梯形曲线(Modified Trapezoidal)
修正梯形,是我个人比较偏爱的一种。它结合了梯形和S型的优点。
怎么做的呢?在梯形的拐角处,用一段S型曲线做过渡。这样既保留了梯形的高效率(加减速段短),又避免了加速度突变。
说白了就是:梯形曲线的骨架,S型曲线的灵魂。
适用场景:大多数工业场合。尤其是中高速、对平稳性有一定要求,但又不想牺牲太多效率的场景。
我给大家画个对比图,一看就明白:
核心结论:没有最好的曲线,只有最合适的曲线。低速选梯形,高速选S型,中速选修正梯形。这是我多年调试的经验法则。
4.2 电子凸轮表(ECAM Table)的生成
曲线是理论,表格是实践。电子凸轮表,就是把连续的曲线离散化,存成一张表。PLC或者运动控制器查表运行。
为什么要有表?因为控制器是数字的,它只能处理离散的点。你给它一个连续函数,它反而不会算。查表是最快、最确定的方法。
4.2.1 表格的结构
一张标准的ECAM Table,通常包含两列:
| 主轴位置(Master Position) | 从轴位置(Slave Position) |
|---|---|
| 0° | 0 mm |
| 30° | 10 mm |
| 60° | 25 mm |
| 90° | 45 mm |
| ... | ... |
| 360° | 100 mm |
主轴位置通常是角度(0-360°)或者编码器脉冲数。从轴位置是你要控制的输出位置。控制器根据主轴当前的位置,查表插值得到从轴的目标位置。
4.2.2 表格的生成方法
生成表格,我一般用两种方法:
- 公式计算法:根据曲线公式,按固定步长计算每个点的位置。适合梯形、S型这些有解析表达式的曲线。
- 样条插值法:给定几个关键点(比如起点、终点、最高点),用样条曲线插值生成中间点。适合复杂、不规则的曲线。
我曾经在一个项目里,客户给的凸轮曲线是手绘的。我扫描后提取关键点,用三次样条插值生成了ECAM Table。效果出奇的好,比他们原来的机械凸轮还顺滑。
4.2.3 代码示例:生成梯形曲线ECAM Table
下面是我常用的一个Python脚本片段,生成梯形曲线的ECAM Table:
import numpy as np
def generate_trapezoidal_ecam(master_steps=360, slave_max=100, accel_ratio=0.3):
"""
生成梯形曲线ECAM Table
master_steps: 主轴步数(通常360对应一圈)
slave_max: 从轴最大行程
accel_ratio: 加减速段占总行程的比例
"""
table = []
accel_steps = int(master_steps * accel_ratio)
const_steps = master_steps - 2 * accel_steps
for i in range(master_steps):
if i < accel_steps:
# 匀加速段
pos = 0.5 * (slave_max / (accel_steps * const_steps + accel_steps**2)) * (i**2)
elif i < accel_steps + const_steps:
# 匀速段
pos = (slave_max / 2) + (slave_max / const_steps) * (i - accel_steps)
else:
# 匀减速段
decel_i = i - accel_steps - const_steps
pos = slave_max - 0.5 * (slave_max / (accel_steps * const_steps + accel_steps**2)) * ((accel_steps - decel_i)**2)
table.append((i, round(pos, 3)))
return table
# 生成表格
ecam = generate_trapezoidal_ecam()
for master, slave in ecam[:10]: # 打印前10行
print(f"{master:3d} {slave:8.3f}")
我的小技巧:生成表格时,步长不要太大也不要太小。步长太大,插值误差大;步长太小,占用内存多。一般360个点(每度一个点)就够用了。如果主轴是编码器,可以按编码器分辨率来定。
4.3 电子凸轮表的存储
表格生成好了,怎么存?这问题看似简单,坑却不少。
4.3.1 存储格式
常见的存储方式有三种:
- CSV文件:方便查看和修改,但解析慢。适合调试阶段。
- 二进制文件:解析快,占用空间小。适合量产。
- PLC内部数组:直接存在PLC的掉电保持区。适合小表格。
我个人习惯:调试用CSV,定型后转二进制。有一次客户现场改参数,我直接用U盘拷CSV进去,PLC自动解析,5分钟搞定。要是用二进制,还得带个转换工具,麻烦。
4.3.2 存储注意事项
我曾经踩过的坑:
- 精度问题:浮点数存成二进制时,不同平台的精度可能不一样。我建议统一用32位浮点,或者干脆用整数(比如微米为单位)。
- 边界检查:表格的第一个点必须是起点(0,0),最后一个点必须是终点(360,行程)。否则控制器会报错。
- 单调性:主轴位置必须严格递增。我曾经手误写错一个数,导致查表时往回走,机器直接撞限位。嗯,从那以后我加了校验。
4.4 小结
电子凸轮的核心就两件事:选对曲线,做好表格。曲线决定了运动品质,表格决定了实现精度。你想想看,机械凸轮加工一个要几百块,改一次要一周。电子凸轮呢?改几个参数,重新生成表格,下载进去就完事了。
我见过太多工程师,一上来就追求复杂的曲线,结果调了三天三夜。其实很多时候,修正梯形就够用了。先跑起来,再优化,这是工程思维。
好了,这一章就到这儿。下一章咱们聊聊电子凸轮在飞剪、追剪这些典型应用里的实战案例。到时候我会拿出我压箱底的项目经验,保证干货满满。