简介:西门子1200PLC随动程序资源包,聚焦编码器反馈下伺服/步进电机的实时跟随控制,适合工业自动化工程师、PLC编程人员及运动控制初学者参考。资源内含基于TIA Portal V14的完整项目工程,涉及高速计数器、脉冲输出、PID调节及SCL/梯形图逻辑,并附组态截图与转换日志,便于对照理解程序结构和调试思路。压缩包共41个文件,以png图片、xml配置、cfg/cfs项目文件为主,包含程序数据与日志记录,整体仅1.25MB,轻量而关键要素齐全。目前已有1038人学习浏览,可帮助读者快速掌握随动程序的设计方法,并迁移至实际设备中。 做设备调试这几年,我最常被问到的问题之一,就是“PLC怎么做随动”。尤其在包装、印刷、锂电、线材这类连续运动的产线上,西门子1200PLC随动程序几乎是绕不开的活——传送带一直往前走,机械手或者切割机构必须跟着跑起来,才能完成抓取、贴标、裁切这些动作。这类动作如果做得不好,轻则废品率上升,重则直接撞机。这篇文章我就把我在1200上做随动控制的一套完整思路、程序和调试经验摊开讲一讲。
这套内容适合刚接触1200运动控制的工程师,也适合做飞剪、追剪、同步传送、电子凸轮这类设备的老手,因为很多坑不是看手册能看出来的,你得真到现场被设备“咬”一口才长记性。我尽量按一个完整项目的顺序讲:从需求分析、硬件选型、核心原理,到博图里的具体组态和SCL编程,再到现场最常见的故障排查,照着这个思路走,至少能让你少走几个月的弯路。
1. 随动程序到底解决什么问题:先把需求说透
1.1 随动的本质是“让从轴跟着主轴走”
很多人一听“随动程序”觉得很高深,其实拆开看就一句话:让从动轴实时跟随主动轴的位置和速度,始终保持一个预设的同步关系。这里有两个关键点:一是“实时”,不能等主轴的信号过来了再慢慢反应,必须提前算、提前动;二是“同步关系”,这个关系可能是固定比例、固定相位差,也可能是随位置变化的凸轮曲线。
我习惯用跑步来打比方。两个人并排跑,一个人忽快忽慢,另一个人要始终保持固定间距,那他不能光靠眼睛看了再追,必须预判前一个人的速度变化,提前调整自己的步频。随动程序也是这个道理,它要把“前一个人的速度变化”实时算出来,再换算成“从轴该跑多快”的命令。
1.2 典型应用场景几乎覆盖所有连续生产线
- 飞剪/追剪:管材、板材、线缆连续挤出或牵引,飞剪机构在材料不停顿的情况下追上材料速度,完成切断或冲孔,切完再快速返回。这是最典型的随动场景,对位置同步和速度同步的要求都很高。
- 同步贴标/套印:瓶子在传送带上连续运动,贴标头或者印刷辊必须与瓶子的瞬时位置对齐,贴完或印完再退回原点。
- 电子凸轮:用PLC程序替代机械凸轮,从轴的位置是主轴位置的一个函数关系,比如某个角度区间内从轴快进,另一个区间内从轴停止。
- 视觉纠偏:康耐视之类的视觉相机检测出产品位置偏差后,通过Profinet或者串口把偏差量发给PLC,PLC换算成修正量,让纠偏轴跟着主轴实时调整位置。
这些场景在1200上都能做,但提前把需求弄清楚特别重要。比如是位置随动还是速度随动、同步精度要求到多少毫米、加减速过程允许多大误差,这些参数直接决定后面的硬件选型和程序架构。
1.3 为什么用1200来做,而不是1500或者独立运动控制器
S7-1200的优势在于集成度高、成本友好,中小型设备上用起来很顺手。它自带高速计数器HSC,可以直接接增量编码器;自带PTO/Pulse输出,可以发脉冲给伺服驱动器;FW4.0以上的固件还支持基本的运动控制工艺对象,配合Profinet总线可以控制V90、S210这类伺服。对大多数单轴或两轴随动的产线设备来说,1200完全够用。
但也要说句实话:1200毕竟属于中小型PLC,如果你要做四轴以上、要求整周期小于1ms的精密电子凸轮,或者多轴插补,那就别硬扛了,直接看1500或者独立运动控制器。选型这关过不好,后面程序写得再漂亮也是白搭。
2. 硬件选型与通讯方案:动手前必须想明白的事
2.1 主轴位置从哪来:编码器还是伺服反馈
主轴信号一般有两个来源。
第一个是增量编码器,接1200板载高速计数器。这种方案适合主轴本身是普通电机拖动、没有伺服反馈的场合,比如传送带拖轮、挤出机牵引轮。编码器选型要注意线数,比如500线、1000线、2500线,接A/B相的话按4倍频计算,实际分辨率就是线数乘以4。还要注意是HTL还是TTL信号,HTL是24V电平,抗干扰好,适合现场环境;TTL是5V差分,适合短距离高速场合。1200的HSC输入到底支持哪种,要看具体的CPU型号和输入点,组态的时候要仔细确认。
第二个来源是伺服驱动器的实际位置反馈。如果主轴本身也是一个伺服轴,那就没必要在外面额外装编码器,直接把伺服驱动器的实际位置通过Profinet或者脉冲口读回来就行。这种方式少了一个中间环节,精度和稳定性会更好,但前提是主轴伺服和PLC之间的通讯必须可靠。
2.2 从轴执行机构:伺服、变频还是步进
从轴是整个随动系统的执行端,选择直接决定跟随效果。
伺服电机+伺服驱动器:最推荐,响应快、过载能力强、转速范围宽。1200和伺服之间可以用三种方式连接,分别是PTO脉冲+方向、Profinet通讯、以及模拟量+变频器的组合。脉冲方式简单直接,但频率上限受PLC限制,一般单路PTO在100~200kHz;Profinet方式接线少、能回读伺服状态和实际位置,但受IO更新时间影响;模拟量+变频器适合低速、精度要求不高的场合,响应比较慢。
步进电机:如果负载小、速度低、精度要求又不高,步进也能做随动,但要注意高速丢步的问题,最好加编码器做闭环。
我把常见的几种从轴控制方式整理成一张表,方便大家对照选型:
| 控制方式 | 响应速度 | 定位精度 | 成本 | 适用场景 |
|---|---|---|---|---|
| PTO脉冲+伺服 | 快 | 高 | 中 | 中小型设备、单轴/双轴随动 |
| PROFINET通讯+伺服 | 较快 | 高 | 中高 | 需要回读状态、多轴网络控制 |
| 模拟量+变频器 | 慢 | 低 | 低 | 大惯量、低速、精度要求低的场合 |
| 脉冲+步进 | 中 | 中 | 低 | 轻负载、低成本设备 |
2.3 选型细节和总线周期的坑
选CPU的时候,至少要考虑一路HSC和一路PTO,1214C起步基本够用,带以太网和更多PN从站需求的选1215C。要注意固件版本,早于FW4.0的1200运动控制功能会比较弱,条件允许的话尽量用新固件,有些指令和工艺对象只有新版本才有。
还有一点容易被忽略:Profinet的IO更新周期。1200和伺服通过Profinet通讯时,默认的IO周期可能是4ms甚至8ms,这个延迟对随动控制来说太长了。实际调试时我会把IO更新周期设到2ms左右,如果伺服和PLC都支持,甚至可以到1ms。总线周期太长的话,主轴位置传过来的那一刻就已经是“旧数据”了,程序再聪明也追不上,现场表现就是跟随动作像在拉橡皮筋,一顿一顿的。
3. 核心原理:电子齿轮、前馈与中断任务
3.1 电子齿轮比是最基础的数学关系
随动控制的核心公式非常简单:从轴目标位置等于主轴位置乘以齿轮比,再加上偏移量;从轴目标速度等于主轴速度乘以齿轮比。齿轮比可以是正的也可以是负的,负值代表从轴与主轴反向运行。
我举个实际算例。假设主轴编码器是1000线,接A/B相4倍频,也就是4000个脉冲/圈;传送带驱动轮周长200mm,那么每个脉冲对应的主轴位移就是200除以4000,等于0.05mm。再看从轴,伺服电机2500线,4倍频10000脉冲/圈,滚珠丝杠导程10mm,每个脉冲对应的从轴位移是0.001mm。如果工艺要求主轴走100mm、从轴走20mm,那齿轮比就是20除以100,等于0.2。注意,这里用的是工程单位,不是脉冲数,换算关系一定要理清,不然程序里的单位乱七八糟,最终输出必然出错。
3.2 光有反馈不够:前馈才是随动的灵魂
很多新手做随动,上来就写一个PID,把目标位置和实际位置的误差算出来,再用误差输出速度。这种纯反馈方案有一个天然问题:稳态时必须有误差才能维持输出,因为负载阻力、摩擦这些扰动需要偏差来“抵着”,所以从轴永远慢半拍。
解决办法就是加前馈。前馈的思路是把主轴速度直接折算成从轴速度,作为命令的主要部分;PID只负责补偿那些前馈没覆盖到的扰动和模型误差。公式可以写成:命令速度等于主轴速度乘以齿轮比再乘以前馈系数,再加上Kp乘以位置误差。前馈系数一般调在1.0左右,实际调试时会让它略大于1,用来补偿系统摩擦和机械间隙。
用一个生活化的比喻:你开车跟车,不能等前车刹车灯亮了才踩刹车,得看着前车速度变化提前松油门、提前带刹车。随动里的前馈,就是让你“预判”主轴的下一步动作。
3.3 为什么必须在中断里做,而不是放在主循环
这是整个程序架构里最关键的一步。OB1主循环的扫描周期是不稳定的,如果你的PLC程序除了随动还要处理触摸屏、报警、通讯、气缸逻辑,那扫描周期可能一会儿2ms一会儿20ms。把随动计算放在这种时间不确定的地方,主轴位置读取就会忽快忽慢,跟随误差自然就大了。
正确做法是单独开一个循环中断组织块,比如OB30或者OB31,把位置环计算放在里面,固定周期执行。我常用2ms到8ms的周期,具体看机械惯量和伺服响应能力。高速计数器的值在中断里读取、计算、输出速度命令,一气呵成。主循环只管外部逻辑和状态切换,不要碰位置环的实时计算。
这种“控制任务分层”的思路,才是从入门到进阶的分水岭。学会了它,你以后写任何实时性要求高的程序都能扛得住。
4. 博图实操:从组态到随动功能块
4.1 高速计数器的组态方法
在博图左侧项目树里打开设备组态,选中CPU,在属性里找到高速计数器HSC。以1214C DC/DC/DC为例,通道0对应输入点I0.0和I0.1,可以组态为A/B相计数器,也就是4倍频模式。工作模式选“计数”,计数方向根据编码器接线设置,地址默认是ID1000,程序里直接读ID1000就能拿到当前计数值。
有个容易被忽略的参数是输入滤波时间,默认6.4微秒。如果现场有变频器、接触器这类干扰源,编码器读数可能会跳变,可以把滤波时间提高到20微秒甚至更大。但要注意,滤波时间越大,最高计数频率就越低,这个是此消彼长的关系,得根据实际速度来平衡。
Z相脉冲如果编码器有,一定要接进来。Z相每圈出一个脉冲,可以用来做高精度回零,或者定期清零消除累计误差。
4.2 创建运动控制工艺对象
如果从轴用的是PTO脉冲方式,在项目树里右键“工艺对象”→“新增对象”→“运动控制”→“轴”,创建一个轴对象。组态时要设置驱动类型为“脉冲+方向”,电机每转脉冲数按伺服驱动器参数填,负载每转行程按机械传动比填。单位可以选mm、度或者脉冲,建议直接用工程单位,后面调试看监控数据会更直观。
轴对象创建好后,先不要直接跑随动。我习惯用调试面板里的点动、绝对定位、相对定位功能,先把从轴的基本动作验证一遍,确认方向对不对、速度上下限是否合理、急停是否生效。轴的基本动作都不稳的话,随动逻辑想都不用想。
4.3 随动功能块的SCL实现
下面给出一段可以跑通的核心骨架,用SCL写的。它实现了一个带前馈和位置反馈修正的速度随动控制,适合直接抄进自己的FB里再改。
FUNCTION_BLOCK FB_Follow VAR_INPUT bEnable : BOOL; // 使能 iMasterPos : DINT; // 主轴计数值(HSC读到的值) rGearRatio : REAL; // 电子齿轮比 rOffset : REAL; // 位置偏移量 rKP : REAL; // 位置误差比例系数 rFeedForward : REAL; // 前馈系数,通常略大于1 rDeadband : REAL; // 死区,单位与从轴一致 END_VAR VAR_OUTPUT rSpeedCmd : REAL; // 从轴速度命令 rFollowError : REAL; // 当前跟随误差 END_VAR VAR iLastMasterPos : DINT; // 上次采样的主轴位置 rMasterSpeed : REAL; // 滤波后的主轴速度 rPosRef : REAL; // 目标位置(工程单位) rSlavePos : REAL; // 从轴实际位置,由伺服反馈换算 END_VAR IF #bEnable THEN // 1. 用相邻两次中断的差值计算主轴速度,并做一阶滤波 #rMasterSpeed := 0.9 * #rMasterSpeed + 0.1 * REAL((#iMasterPos - #iLastMasterPos)); #iLastMasterPos := #iMasterPos; // 2. 目标位置 = 主轴位置 × 齿轮比 + 偏移 #rPosRef := REAL(#iMasterPos) * #rGearRatio + #rOffset; // 3. 跟随误差 #rFollowError := #rPosRef - #rSlavePos; IF ABS(#rFollowError) < #rDeadband THEN #rFollowError := 0.0; END_IF; // 4. 速度命令 = 前馈 + 反馈修正 #rSpeedCmd := #rMasterSpeed * #rGearRatio * #rFeedForward + #rKP * #rFollowError; ELSE #rSpeedCmd := 0.0; #iLastMasterPos := #iMasterPos; END_IF;这里面的从轴实际位置rSlavePos,实际项目里一般从伺服驱动器的反馈报文里读到,换算成工程单位后赋值进来。如果是脉冲方式,也可以在从轴电机上加编码器反馈给PLC,用第二路HSC来读。代码里的速度计算用的是相邻两次中断的主轴位移差值,因为是周期固定的,转速就成了比例值,后面再乘一个换算系数就好。一阶滤波系数0.9和0.1可以根据实际速度波动来调,速度信号太毛糙就加大0.9的比例。
4.4 参数整定的步骤
把功能块下载进去之后,不要急着设一个很大的Kp就完事。我调参的顺序是这样的:先给主轴一个固定的速度,比如200mm/s,观察跟随误差的稳态值。这时候主要靠前馈,先把前馈系数从平时的值开始微调,让稳态误差尽量接近0。前馈偏小,从轴会一直落后;前馈偏大,从轴会冲到前面去。
然后才开始加Kp,一点点增大,观察动态误差的变化。当从轴出现轻微振荡的时候,把Kp退回80%左右,留出一点裕量。如果机械负载有周期性波动,可以考虑加一个很弱的积分项,但积分太强会导致振荡,一般能不加就不加。全部调完以后,用博图的Trace功能同时抓主轴位置、从轴位置和目标位置三条曲线,一眼就能看出是纯滞后、超调还是振荡。
我实测过一个项目:主轴传送带速度200mm/s,Kp取0.5,前馈系数取1.05,跟随误差稳定在0.3mm以内;主轴急加速到500mm/s时,误差会短暂拉到1mm左右,这时候就需要增加加速度前馈或者加一点积分来压住动态误差。
5. 现场常见问题与调试实录
5.1 跟随滞后,像在拉橡皮筋
这个现象我碰到太多次了。设备一跑起来,从轴动作肉眼可见地“慢半拍”,要么跟不上,要么一顿一顿的。排查的时候先看程序结构:HSC的值是不是在OB1主循环里被读的?如果是,那大概率就是扫描周期不稳定导致的。
解决办法就是把读取HSC和随动计算全部搬进循环中断OB31,把中断周期设置成2ms或者4ms,IO访问和中断对齐。再检查一下Profinet的IO更新周期,如果伺服是走总线通讯的,IO周期和中断周期太接近会产生叠加延迟,可以试着把IO周期缩短到和中断周期一样,或者调整中断周期避开总线刷新时刻。
5.2 编码器读数跳变,设备不动也在跳
主轴编码器信号受到干扰,是最隐蔽的故障之一。现象是触摸屏上监控的主轴位置在设备静止时也会上下跳,跳几十个脉冲甚至更多。先看编码器信号线是不是双绞屏蔽线,屏蔽层有没有单端接地;再看编码器供电和PLC是不是共用一个开关电源,如果共用,变频器启停瞬间容易把干扰串进来,最好给编码器单独供电。
还可以检查HSC输入滤波时间。把滤波时间从6.4微秒调到20微秒,很多毛刺信号直接就被滤掉了。但要注意,滤波时间提高了,最高计数频率会降低,如果主轴速度很快,编码器频率本身就高,调滤波时间就要谨慎权衡。
5.3 碰到Modbus轮询和Profinet通讯挤占时间
有一次设备上既要做随动,又要和几台仪表做Modbus轮询。我把MB_MASTER指令放在主循环里,结果发现OB1扫描周期被拉到了几十毫秒,随动控制直接废了。问题在于Modbus轮询是串行通讯,一次读写几百个字节要等从站响应,几十毫秒就没了。
解决办法是把Modbus轮询从主循环里拆出去,放到一个慢速循环中断里,比如500ms周期执行一次,或者让它按条件触发,不是每一扫都去轮询。慢速任务和快速任务各走各的中断,互不干扰。如果有视觉相机通过Profinet传数据,也要注意数据一致性,读照片结果不要在主循环里反复读,而是在中断里一次性读取。
5.4 回零和初始相位没对齐
很多随动系统调试阶段挺正常,一断电重启就出问题,十有八九是原点丢了。上电后,从轴必须回一次机械原点,同时主轴编码器的零点也要有一个明确的参考关系。做法可以是:上电后从轴先回原点,然后把当前主轴编码器值记录下来作为偏置量;或者把编码器的Z相脉冲也利用起来,主轴每转到零位就清零一次。
如果编码器没有Z相,可以在材料经过的位置装一个接近开关,做一次软回零,每次经过时把HSC清零。这样至少能把累计误差和断电丢零点的问题规避掉。
最后说点个人体会。随动程序听起来挺高深,实际拆解下来,就是“读主轴、算偏差、控从轴”三个动作,难的是各种工程细节——中断周期选多少、前馈怎么调、编码器干扰怎么滤。我在现场调试时最有效的办法,就是用博图的Trace功能同时抓主轴位置、从轴位置和目标位置三条线,一眼就能看出是纯滞后还是超调。新手建议先在仿真环境把虚拟主轴和从轴跑通逻辑,再上真机,能省不少现场时间。这篇文章里的FB骨架你可以直接抄走,但如果要投到产线上,一定记得加限幅、加速度前馈和急停逻辑——稳定永远比花哨重要。
本文还有配套的精品资源,点击获取