前阵子整理项目资料,翻到去年做的一套分度台程序,正好是S7-200SMART控制步进电机的完整案例。前面几篇我把硬件接线、脉冲输出指令、正反转控制这些基础框架都梳理过了,这一篇继续往深处写:加减速曲线怎么做、回原点怎么回、手动点动怎么实现,再加上现场调试时最容易踩的几个坑。如果你手头正有类似项目,或者刚把S7-200SMART的定位控制玩到一半,这篇应该能帮你省不少事。
内容偏进阶一些,默认你已经会用运动控制向导建轴、能写出最基本的GOTO定位程序。如果这些还不熟,建议先把前三篇翻一遍再回来看。
1. 系列回顾与本篇定位
1.1 前面几篇解决了什么
整个系列的逻辑是从硬到软、从跑到快的顺序。最开始是选型与接线,讲步进驱动器的脉冲口、方向口、使能口怎么和PLC的晶体管输出点对接,以及为什么必须用晶体管输出的ST系列CPU,继电器输出的SR系列根本发不了高速脉冲。第二篇讲的是脉冲输出指令,PTO和PWM的区别、PLS指令怎么用、运动控制向导怎么建轴。第三篇进入定位控制,用AXIS0_GOTO实现了几个基本的点位运动,讲了绝对定位和相对定位的差别。
到这里,一台步进电机已经能按照你的指令走起来了,指哪打哪。但实际设备跑起来之后,问题就来了:启停瞬间电机会抖,速度一快就丢步,回原点每次都差那么一两个脉冲。这些问题靠前面那点基础解决不了,必须往运动控制的细节里钻。
1.2 本篇要啃的硬骨头
这一篇集中在三个点上。
加减速控制。为什么电机一快就丢步,为什么启停会有冲击,怎么用查表法实现平滑的速度过渡。这是步进电机项目从“能跑”到“跑得稳”的关键一步。
回原点控制。绝对定位的前提是有一个可靠的机械零点,回零方式选错了,后面的定位精度全白搭。我会对比几种常用的回零方案,并给出我实际验证过的配置流程。
手动点动与完整控制段。设备调试时最喜欢用的就是手动正反转点动,这部分的程序写法跟自动定位完全不一样,需要考虑暂停、停止、急停的信号优先级。
最后一部分是问题排查,我把这几年现场遇到过的丢步、失步、发烫、振动、干扰问题集中整理成一套排查思路,比单讲指令用法实用得多。
2. 加减速控制:为什么我用查表而不是默认斜坡
2.1 步进电机为什么必须加减速
先说原理,越简单越好。步进电机的输出扭矩随着转速升高是下降的,转速越高扭矩越小,而启停瞬间需要克服的惯性又是最大的。如果你一上来就给电机一个很高的脉冲频率,电机转子跟不上定子磁场的变化,就叫丢步,轻则定位不准,重则直接堵转报警。
反过来,到位时如果突然停掉脉冲,电机带着负载惯性冲过头,同样会过冲。所以从低速到高速、再从高速到低速,必须有一个过渡过程,这就是加减速存在的意义。
拿生活里的事打比方,你开手动挡车,起步挂一档慢慢走,速度起来了再逐级升档,停车时先松油门踩刹车减速,不会直接挂倒挡往后拽。步进电机的加减速就是这个逻辑。
2.2 运动向导内置加减速的局限
S7-200SMART运动控制向导里确实有加减速时间的设置,可以设定加速时间和减速时间。但我用了几次之后发现,它做的是线性加减速,也就是速度随时间均匀变化,加速度恒定。
线性加减速在低速小惯量的场合够用,可一旦负载惯量偏大、运行速度偏高,启停瞬间的冲击还是很明显。现场表现就是电机啸叫、机身抖动,严重的时候丢步咕咕响。
这时候就需要S形加减速。所谓的S形,就是速度变化率本身也是渐变的,加速初期加速度从零慢慢变大,快到目标速度时加速度再慢慢归零。整个速度曲线看起来像字母S,冲击小、噪音低、定位更稳。
工业伺服电机普遍内置S形加减速,但S7-200SMART的运动向导没给你这个选项。想实现S形,就得自己动手,用查表法来做。
2.3 查表法怎么建表
查表法的核心思路很直接:把加减速过程中的每一个速度段对应的时间间隔预先算好,存到一个数组里,PLC运行时按顺序查表改变脉冲频率。
这里的“脉冲频率”其实可以用“脉冲间隔时间”来表示。假设目标速度对应的脉冲周期是T,加速起点对应的脉冲周期是T0,我们把加速过程分成N段,每一段的脉冲周期都按S形曲线的规律算出来,存成一张表。运行时先按T0发若干个脉冲,再按T1发若干个脉冲,依次递增,减速时从表尾往回走。
表是怎么算出来的,我一般用Excel生成,关键公式如下。
先确定加速时间t_acc、起始频率f0、终止频率f1,把加速段分成N步。第i步的时间节点为:
ti = t_acc × i / N
用余弦插值来近似S形,第i步对应的脉冲频率为:
fi = f0 + (f1 - f0) × (1 - cos(π × ti / t_acc)) / 2
频率确定了,脉冲周期自然就是:
Pi = 1 / fi
这张表就是运行时的核心数据。减速表跟加速表是对称的,不用另算,从表尾倒着用就行。
需要说明的是,这是我的常用做法,不代表唯一答案。你也可以直接用五次多项式或者查标准数据手册里的曲线,思路完全相同,就是把每段的速度值预处理好。
2.4 PLC端的执行方式
表建好之后,PLC端怎么跑是重点。S7-200SMART产生高速脉冲靠的是硬件PTO输出,你不可能用普通定时器去翻转Q点,速度一高根本来不及。
我的做法是用PLS指令逐步修改PTO输出的频率。程序里维护两个关键变量:一个是当前查表索引,一个是当前表项需要维持的脉冲数。每隔若干毫秒触发一次查表更新,把新的频率值写进去。
大致的逻辑如下:
- 启动时,设置起始频率f0对应的周期值。
- 一个低频定时中断(比如10ms)里做一次查表,索引加1。
- 每次更新时把脉冲周期转换成频率值,修改PTO对应的特殊寄存器。
- 走到表尾后直接切到匀速段,由高速计数器或者位置变量来判断是否进入减速段。
- 减速开始后索引反向递减,最终停在目标位置。
有几个细节要注意。第一,PTO运行中写频率寄存器是允许的,S7-200SMART会按新频率继续发脉冲,但过于频繁的改写可能导致波形毛刺,所以查表更新的间隔不要太短,实测10ms到20ms比较稳。第二,表项之间的频率差不要太大,不然又变成了阶梯加速,失去S形平滑的意义。一般步数取100到200段就够用了。
这种查表方式比运动向导自带斜坡复杂一些,但换来的是可控性。你想改成S形、指数形还是自定义曲线,只需换一张表,程序主体完全不用动。
3. 回原点控制:方案选型与实操
3.1 三种回零方式怎么选
绝对定位用的坐标值必须建立在已知原点的前提上。每次上电后,PLC不知道当前机械位置在哪,必须先找一个物理参考点回零。
工程上常见的回零方式有三种。
第一种,靠限位开关回零。机构朝一个方向运动,碰到限位开关后停止,把这个位置当作零点。成本最低,但重复精度一般,因为机械触点的重复响应位置会有偏差,开关本身的安装位置也决定了原点精度。
第二种,原点开关加高速计数回零。机构先以较快的速度找原点开关,碰到后减速,再利用高速计数器对编码器或光栅信号计数,找第一个Z相脉冲或者等间隔的索引信号,把精确位置锁存为原点。这种方式精度很高,但要求电机带编码器反馈,成本高一些,通常用于闭环步进或伺服。
第三种,原点开关加软件补偿。用原点开关确定大致零点,然后在程序里做一个固定的偏移量,把这个偏移补偿掉。简单说,物理上回零到开关位置后,再自动移动一个预设的距离,最终停靠点才是真正的原点。这种方式适用于开关位置不容易精确调整的场合。
对S7-200SMART控制普通开环步进电机的项目来说,我强烈建议第三种方式。理由很简单:步进电机没有编码器反馈,Z相脉冲无从谈起,硬要用第一种方式,回零精度完全看开关的重复性和安装手艺,做不出稳定的设备。
3.2 硬件接线与输入点分配
回原点方案确定后,接线就跟着确定了。原点开关一般用NPN型接近开关或者机械限位开关,接到运动控制向导里指定的输入点。
这里要注意,S7-200SMART的运动控制向导里有专门的停止输入、限位输入配置。建轴的时候,向导会问你是否使用STP停止输入和LIM限位输入。我建议把原点开关信号接到STP输入上,同时把限位开关接到LIM输入上,这样硬件上就有了双重保护。
我自己常用的分配是:
- 原点开关:接近开关,NPN常开,接STP输入点。
- 正限位:机械开关,常闭,接正方向LIM输入。
- 负限位:机械开关,常闭,接负方向LIM输入。
为什么原点开关用常开、限位开关用常闭,这里有个逻辑在。限位开关用常闭,断线了系统会报限位触发,不会继续运动造成撞机,这是安全设计里很重要的原则。原点开关用常开则更直观有效,感应到铁块才导通,程序判断上升沿即可。
3.3 向导配置与AXISx_HOME使用要点
在运动控制向导里配置好STP输入后,回原点程序就有了硬件基础。运行时调用的指令块是AXIS0_HOME。
AXIS0_HOME的触发逻辑要简单得多,START给一个脉冲上升沿,指令块会自动执行找原点序列。但找原点序列具体怎么走,取决于向导里的配置和程序里设定的速度。
向导里需要设置两个关键速度:找原点开关的速度(一般中速,比如最大频率的30%)和离开原点开关后的定位速度(低速,寻Z相或找停止点)。如果用的是我说的第三种方式,还需要在程序中额外计算偏移距离,在回零完成后自动执行一次相对定位。
实际调试时我习惯把回零过程分成两段来观察。第一段看电机是否朝正确方向寻找开关,方向反了会直接撞限位,必须在程序里设置好回零方向。第二段看回零完成后是否停在我们期望的原点位置,如果每次都差一段固定的距离,那问题多半出在偏移值上,补上这个偏移即可。
回零完成信号用AXIS0_HOME的Done输出,程序里要等这个Done置位之后再允许自动定位,否则坐标基准没建立,后续的绝对定位都是错的。
还有一个我踩过的坑,运动轴向导里配置了STP停止输入后,找一个急停程序也会用到这个输入点,两者会冲突。后来我在向导里把STP的使用方式改成仅作为原点开关,急停信号单独接普通输入点,通过程序控制运动使能,问题才彻底解决。
4. 手动点动与相对定位的完整控制段
4.1 用AXIS0_RUN实现连续运行
设备的调试阶段,手动点动是最常用的功能。操作员按着正转按钮,电机连续正转,松开停止;或者用旋钮控制低速运行,观察机械动作。这个功能用AXIS0_GOTO做并不合适,因为GOTO是一次性定位指令,你没法让它“一直走”。
S7-200SMART的运动控制指令里,AXIS0_RUN可以解决这个问题。AXIS0_RUN有两种模式,一种是连续运行,一种是单段运行。点动用的就是连续运行模式。
程序逻辑不复杂:正转按钮按下时,给AXIS0_RUN的RUN端子置位,同时把速度设成点动速度。按钮松开时,RUN端子复位,指令块内部会执行减速停止。
这里有一个细节必须注意,RUN端子是电平触发的,不是边沿触发的。这意味着你只要保持置位,电机就会一直运行,不会像GOTO那样跑完一段就自己停。按钮松开之后要记得把RUN端子复位,同时要等AXIS0_RUN的Done信号出现,才能进行下一次运动指令。我见过有人在这个地方犯过迷糊,Done信号没复位就发下一条指令,结果轴卡在那里不动。
4.2 相对定位与绝对定位的选择
点动之外,自动过程中最常用的是绝对定位和相对定位。
绝对定位的目标位置是相对于原点的坐标值,例如回到零点、走到第10号工位,这种场景用AXIS0_GOTO的Mode为0。相对定位的目标位置是相对于当前坐标的增量,比如当前位置往前走200个脉冲,用Mode为1。
好多初学的朋友搞不清什么时候用哪个。我总结的经验是:你的目标位置是否依赖当前环境。如果工位位置是固定的、坐标系是从零点开始建立的,用绝对定位。如果只是要“再往前走一小段”,比如排料机构每次推一个料,用相对定位。
两种方式混着用也常见。设备上电回原点后,坐标系从零点开始,自动流程里用绝对定位走到各个工位,工位完成后用相对定位走一个小距离的补偿推进。做程序架构时要把这两种运动指令分开封装,方便维护。
4.3 启停逻辑与急停处理
手动和自动模式的切换,必须在程序里做严格的互锁。我的做法是加一个运行模式标志位,手动模式下自动定位指令的启动条件不成立,自动模式下点动按钮失效。
急停处理比模式切换更重要。急停按钮按下后,电机必须立即停止,不受加减速过程影响。这时有两个方案:一是把急停信号接进运动向导的STP输入,由硬件直接中断脉冲输出;二是在程序里调用AXIS0_STOP指令,执行减速停止。
我的建议是硬件急停和软件停止都用起来。紧急停止时,PLC通过硬件STP输入立即停止脉冲,而不是等软件扫描周期反应过来,这一步能避免高速运行时的撞机。等急停复位后,还需要一个重新建立坐标原点的流程,因为急停瞬间机械位置和PLC记录的坐标可能已经不一致了。
如果设备做的是单轴步进控制,整个启停逻辑的控制程序我通常控制在60行梯形图以内就能完成。模式切换、点动、定位、急停、报警复位,这些功能不要堆在一条指令上,拆成独立的网络,调试时每条指令单独使能,排错效率高很多。
5. 常见问题与排查技巧实录
5.1 丢步失步的排查思路
丢步是步进电机项目里最烦人的问题,现象就是定位位置一次比一次偏,或者运行过程中电机咔咔响。排查顺序我一般按下面几步走。
第一,看频率。步进电机的启动频率是有限制的,如果你直接以高频启动,丢步几乎是必然。解决办法就是加减速,把启动频率降到电机能可靠启动的范围,再逐步加速。
第二,看扭矩。选型时电机扭矩一定留够余量,负载惯性大了,电机瞬间输出扭矩不够,一样丢步。排查时用手转一下负载,感受阻力和转动惯量,觉得明显偏重,就得换大一号电机或驱动器。
第三,看驱动电流。驱动器上的拨码开关设定电流如果低于电机额定电流,输出扭矩不够。把电流调到电机额定值附近实测一下,很多丢步问题其实出在驱动电流设置上。
第四,看脉冲信号质量。干扰是高频丢步的常见原因。脉冲线要双绞,最好是屏蔽线,屏蔽层单端接地。走线要远离动力线,驱动器和PLC共地,不能浮空。
5.2 干扰与接线问题
S7-200SMART和步进驱动器在同一个控制柜里,干扰问题最容易出现在脉冲线上。脉冲频率越高,线长越长,越容易被变频器、接触器这些设备干扰。
具体表现就是偶发性丢步、偶尔多走一段、位置偏差没有规律。收拾这种问题我有一套固定操作:
- 脉冲线、方向线用双绞屏蔽线,屏蔽层在PLC侧单端接地。
- 脉冲线尽量短,超过两米就要考虑加分线器或转成差分信号。
- 驱动器电源加滤波器,PLC和驱动器分开供电,避免DC24V共用产生压降和纹波。
- 接触器线圈并联RC吸收或压敏电阻,防止拉弧干扰。
做完这几步,大部分干扰问题都能解决。如果还有问题,就要怀疑是不是驱动器没接地或者接地电阻太大,重新打一根接地线试试。
5.3 温度与噪音问题
步进电机的温度高是正常现象,但太高就不正常了。驱动器输出的是恒流,电机静止时电流一直在绕组里,发热如果控制不住,会影响力矩和寿命。
解决思路有两个。一是降低驱动电流,在满足力矩的前提下电流调到偏小一档,发热明显下降。二是启用驱动器的自动半流功能,电机静止超过设定时间后,驱动器自动把电流降到一半,这个功能在多数驱动器上都默认有,只是很多人没注意。
噪音问题通常和电机运行频率有关系,某个速度区间会有一个共振点,表现为电机嗡嗡响、震动大。解决办法是调整加减速曲线的速度段,或者把工作速度避开共振区间。偶尔也会遇到驱动器内部斩波频率产生的电磁噪音,换一个静音模式的驱动器能改善不少。
5.4 经验小技巧
最后分享几个我自己的习惯做法,不算什么高深技术,但能省不少事。
第一,程序的坐标单位最好统一成实际物理单位。比如丝杆导程是5mm,电机转一圈需要200个整步或者更细的细分,那就把每个脉冲对应的移动距离算清楚,程序里直接用mm,不要一直用脉冲数。这样操作界面显示直观,调试时不用脑内换算。
第二,回原点之前不要进入自动模式。我在设备上电初始化逻辑里会强制要求先执行回原点,否则自动模式无法启动。这能避免找不到坐标系就开始干活导致的撞机。
第三,运动控制向导建轴之后,把生成的指令块封装成自己定义的子程序,接口统一用速度、位置、启动、完成状态。以后换设备、换电机,只要改向导配置就行了,主程序不用动。
第四,现场调试时高频脉冲能不能稳定输出,可以用S7-200SMART的高速计数器接一个脉冲输出口回测,验证硬件链路是否正常。这招排查硬件问题特别快。
实际做下来,S7-200SMART控制步进电机的水准完全够用,只要把接线、加减速、回原点这几个环节处理妥当,稳定性和精度都不输给大牌专用运动控制器。调试遇到问题时,按照我上面这套排查顺序走一遍,十有八九能定位到源头。