简介:这份资源面向已具备一定PLC基础的自动化工程师与运动控制学习者,围绕西门子S7-1200实现编码器反馈下的随动控制展开,涵盖高速计数器采集、脉冲输出驱动伺服或步进电机、PID调节跟随误差等核心环节,并附带pocket welting machine_V14工程实例,可用于理解缝纫类设备的定位与速度跟随逻辑。压缩包共41个文件,约1.25MB,以png截图、xml配置与转换日志、cfg与cfs工程配置、dat与db数据文件为主,另有ap14项目归档及索引类文件,基本保留了TIA Portal工程的原始结构,便于直接打开对照学习。目前已有1042人学习下载。读者可从中获取随动系统的硬件选型思路、编程框架与参数整定参考,借助工程文件还原控制逻辑,缩短从概念理解到实际调试的距离。
1. 西门子1200PLC随动程序:一套能直接跑在产线上的编码器跟随逻辑
产线上有个很常见的场景:主轴上挂了个编码器,工件在传送带上走,喷码、贴标、切割这些动作必须跟着工件位置走,不能等工件到位再动。很多做电气的人第一反应是用高速计数器读编码器,再拿定时中断去算位置,结果一上机就发现跟随滞后、脉冲丢数、换向时位置跳变。这套西门子1200PLC随动程序,解决的就是“编码器读进来之后怎么变成可用的跟随轴位置”这件事,核心是高速计数器组态、位置换算、跟随指令和同步误差处理四块。适合已经会基本梯形图、正在做运动控制或飞剪飞锯类项目的电气工程师,也适合刚接触1200工艺对象、想搞清楚编码器跟随到底怎么落地的新手。下面按“资源是什么、怎么配、坑在哪”的顺序拆开讲。
2. 编码器信号进PLC:高速计数器组态与位置换算
2.1 为什么不用普通输入点读编码器
编码器输出的是差分或推挽脉冲,频率动辄几十千赫兹,普通DI点的扫描周期根本追不上,读进来就是丢脉冲。1200的板载高速计数器(HSC)是独立于程序扫描周期工作的,能硬件计数,这是随动程序能成立的前提。常见做法是把编码器A/B相接到CPU本体或信号板上的HSC专用点,比如1214C本体支持最多6个HSC,具体可用数量和最高频率要查对应CPU的技术数据,不同型号差别不小,别照抄别人的点号。
组态在TIA Portal里做,设备视图里打开CPU属性,找到“高速计数器”,启用HSC1,计数类型选“计数”,工作模式选“A/B相正交计数”,这样能自动识别方向,换向时位置连续不跳变。输入滤波可以适当调大一点抗干扰,但别调太大,否则高速时丢脉冲。组态完HSC,还要在程序里用CTRL_HSC指令使能,否则计数器不工作。
2.2 位置换算:脉冲数怎么变成毫米
编码器给的是脉冲,机械要的是毫米,中间差一个换算系数。假设编码器每转2500线,A/B正交四倍频后每转10000个计数,丝杠导程5mm,那每个计数对应0.0005mm。这个系数不要写死在程序里,做成DB里的变量,换机械时只改参数不改逻辑。
// 位置换算功能块,输入原始计数值,输出工程单位位置 FUNCTION_BLOCK "FB_PosScale" VAR_INPUT RawCount : DINT; // HSC当前计数值 CountsPerRev : DINT := 10000; // 每转计数(四倍频后) PitchMM : REAL := 5.0; // 丝杠导程 mm END_VAR VAR_OUTPUT PosMM : REAL; // 换算后位置 mm END_VAR VAR MM_Per_Count : REAL; END_VAR BEGIN // 每个计数对应的毫米数,除零保护 IF CountsPerRev = 0 THEN MM_Per_Count := 0.0; ELSE MM_Per_Count := PitchMM / DINT_TO_REAL(CountsPerRev); END_IF; PosMM := DINT_TO_REAL(RawCount) * MM_Per_Count; END_BLOCK这段逻辑的关键在两点:一是用DINT_TO_REAL转换,别直接拿DINT参与实数运算,否则编译报类型不匹配;二是除零保护,CountsPerRev如果被误改成0,没有这个判断程序会直接报错停机。PitchMM和CountsPerRev都做成输入参数,调试时在线改就行,不用重新下载硬件组态。实际项目里我一般还会加一个偏移量OffsetMM,用来对零点,工件放上去按一下“设零”就把当前位置写进Offset,后面所有位置都减这个值。
2.3 用工艺对象还是自己算
1200做跟随有两条路:一是用工艺对象里的“同步轴”,配置主值互联,让从轴跟着主轴走;二是自己用HSC读数加指令算。工艺对象的好处是同步误差、超调这些参数有现成接口,坏处是组态步骤多、对CPU资源占用大,1211C这种小CPU跑多轴会吃力。自己算的好处是轻量、逻辑透明,坏处是同步精度靠程序扫描周期保证,高速场合要配合中断。
这套随动程序走的是自己算的路子,适合跟随精度要求不是微米级、但要求逻辑可控的场合,比如传送带喷码、包装机追标。如果做飞剪这种要求毫秒级同步的,建议还是上工艺对象同步轴,或者换1500T。选型上别硬扛,先看节拍要求再定方案。
3. 跟随逻辑落地:从位置差到输出修正
3.1 跟随的核心是一个位置闭环
随动本质是让从动执行机构的位置跟着主轴位置走,中间允许一个固定的相位差。程序里每个扫描周期做三件事:读主轴位置、算目标位置、算偏差并输出。目标位置等于主轴位置乘传动比加相位偏移,偏差等于目标减实际,偏差经过增益和限幅后给到输出(模拟量给变频器,或者走PROFINET给伺服)。
// 跟随运算,放在循环中断OB30里执行,周期设4ms // 主轴位置来自FB_PosScale输出,从轴位置来自伺服反馈 #TargetPos := #MasterPos * #GearRatio + #PhaseOffset; #Error := #TargetPos - #SlavePos; // 比例修正,Kp需要现场整定 #Correction := #Error * #Kp; // 输出限幅,防止修正量过大导致飞车 IF #Correction > #MaxCorr THEN #Correction := #MaxCorr; ELSIF #Correction < -#MaxCorr THEN #Correction := -#MaxCorr; END_IF; // 叠加到速度给定上,实现位置跟随 #SpeedSetpoint := #BaseSpeed + #Correction;GearRatio是传动比,主从同速就是1.0,主轴转一圈从轴走半圈就是0.5。PhaseOffset是相位,喷码场景里就是喷头到编码器零点的距离换算值。Kp是比例增益,这个参数最玄学,给大了振荡,给小了跟随滞后,一般从0.5开始试,观察偏差曲线逐步加。MaxCorr是限幅,这个必须有,编码器断线或者干扰导致位置突变时,限幅能防止执行机构猛冲,是保命的后悔药。
3.2 循环中断周期决定跟随精度
跟随运算放在OB30循环中断里,不要放在主程序OB1。OB1的扫描周期受程序长短影响,可能几毫秒到几十毫秒波动,跟随运算周期不稳定,偏差就算不准。OB30的周期是固定的,设4ms就是4ms,跟随的实时性有保证。周期设多少要看机械响应,伺服响应快可以设2ms,变频器带异步电机响应慢,设4到10ms都行,设太快反而因为执行跟不上而振荡。
注意OB30里不要放太重的逻辑,中断程序执行时间必须小于中断周期,否则会触发时间错误。读HSC、算位置、算偏差、写输出,这几步够了,别在里面做通信或者字符串处理。
3.3 相位偏移的在线调整
调试时最费时间的是对相位。工件到了喷头下方,喷头要立刻动作,这个“立刻”对应的主轴位置就是相位偏移。做法是手动把工件送到动作点,读当前主轴位置,把这个值写进PhaseOffset,然后低速跑一遍看偏差。偏差曲线在触摸屏上做个趋势图,看是超前还是滞后,超前就减相位,滞后就加相位。别一次调太多,每次调0.5mm左右,调完跑两件看效果。
4. 避坑排查:编码器跟随最容易翻车的五个地方
4.1 现象:低速正常,高速丢步
原因:HSC输入滤波设太大,或者编码器供电不足导致脉冲幅值下降。1200的HSC输入滤波默认值在高速时会把窄脉冲滤掉。
解决:把HSC输入滤波调到最低档,检查编码器供电是不是24V稳定,长距离传输用差分信号而不是单端。用示波器看编码器输出波形,幅值不够就换编码器或加信号调理。
4.2 现象:换向时位置突然跳一大截
原因:HSC工作模式选成了“单相计数”而不是“A/B相正交计数”,方向识别不对,换向瞬间计数方向错乱。
解决:回设备组态把HSC模式改成A/B相正交,重新下载硬件组态。改完用在线监控看计数值,手动正反转,数值应该连续增减不跳变。
4.3 现象:跟随偏差一直在累积,越跑越偏
原因:传动比GearRatio算错,或者从轴反馈的工程单位跟主轴不一致。比如主轴是毫米,从轴反馈是脉冲,直接相减没意义。
解决:统一单位。主轴和从轴都换算成毫米再比较,从轴反馈如果是编码器脉冲,先用同样的FB_PosScale换算。传动比用实测法验证:主轴走100mm,看从轴实际走多少,反推比例。
4.4 现象:一启动就振荡,输出来回摆
原因:Kp给太大,或者OB30周期太短而机械响应跟不上。也可能是MaxCorr限幅太大,修正量没有约束。
解决:Kp先降到0.1,慢慢往上加,加到刚好不振荡再回退20%。MaxCorr按最大允许偏差的2到3倍设,别设成满量程。OB30周期跟机械响应匹配,伺服可以快,变频器别太快。
4.5 现象:编码器断线后执行机构飞车
原因:没有做编码器信号有效性判断,断线后HSC计数值停在原地或乱跳,偏差瞬间变大,修正量直接拉满。
解决:加断线检测。HSC有状态位可以读,或者用主轴位置在固定时间内变化量判断,超过阈值认为信号异常,立即把SpeedSetpoint切到安全值并报警。这个保护逻辑比跟随逻辑本身还重要,血泪经验,别省。
5. 进阶:用凸轮表做非线性跟随与验证方法
线性跟随只能处理传动比固定的场合,遇到包装机追标这种主轴匀速、从轴要变速的,就得用凸轮表。1200的工艺对象支持凸轮盘,也可以自己用数组做查表插值。自己做的思路是把主轴位置分成若干段,每段对应一个从轴位置,运行时用线性插值算当前目标。段数越多越平滑,但内存和扫描负担也越大,一般64到256段够用。
// 凸轮表查表插值,CamTable是DB里的二维数组 // CamTable[i,0]存主轴位置,CamTable[i,1]存从轴位置 #Idx := 0; FOR #i := 0 TO #TableSize - 2 DO IF #MasterPos >= #CamTable[#i, 0] AND #MasterPos < #CamTable[#i + 1, 0] THEN #Idx := #i; EXIT; END_IF; END_FOR; // 线性插值 #Span := #CamTable[#Idx + 1, 0] - #CamTable[#Idx, 0]; IF #Span > 0.0 THEN #Ratio := (#MasterPos - #CamTable[#Idx, 0]) / #Span; #TargetPos := #CamTable[#Idx, 1] + #Ratio * (#CamTable[#Idx + 1, 1] - #CamTable[#Idx, 1]); ELSE #TargetPos := #CamTable[#Idx, 1]; END_IF;验证凸轮表对不对,别直接上机跑。先在PLC里做仿真,手动改MasterPos从0走到最大行程,看TargetPos是不是单调、有没有跳变。再在触摸屏上把两条曲线画出来叠在一起看,形状对不上就是表填错了。上机先空载低速跑,用示波器或者Trace功能抓MasterPos和SlavePos两条曲线,看跟随误差是否在允许范围内。
我自己的习惯是每次改完凸轮表或者跟随参数,都强制走一遍“空载低速—半载中速—满载额定速度”三段验证,每段抓一次Trace存盘,出问题能回溯。这套随动程序逻辑不复杂,难的是参数整定和边界保护,把限幅、断线检测、单位统一这三件事做扎实,现场翻车概率能降一大半。希望帮到你。
本文还有配套的精品资源,点击获取