简介:这份资源面向已具备一定S7-1200基础、希望掌握运动控制与随动实现的自动化工程师及工控学习者,围绕编码器反馈驱动伺服或步进电机的跟随控制展开,涉及高速计数器采集、脉冲输出、PID调节以及TIA Portal下的SCL与梯形图编程逻辑,并关联到pocket welting machine_V14设备工程,可用于理解从硬件选型、系统配置到跟随性能调试的完整思路。压缩包为rar格式,共41个文件,约1.25MB,以png截图、xml工程配置与转换日志、cfg与cfs配置文件为主,另有dat、db等数据文件及少量索引与选项文件,整体为TIA Portal工程目录结构,便于按模块查阅。目前已有1042人学习下载,适合作为随动控制项目的参考样例,帮助读者对照工程组织方式、梳理编码器反馈与电机跟随的实现路径,并借鉴其参数配置与调试思路。
1. 从一台编码器到一条轴:随动程序到底要解决什么
产线上有一台小车,编码器装在主动辊上,PLC 每 1 ms 读一次脉冲,小车要跟着辊子转多少就走多少,误差不能超过 2 mm。这个需求听起来简单,真正动手写才发现坑不少:编码器计数会溢出、高速计数器和循环中断周期对不上、跟随启动瞬间会“蹿”一下、停机再启动位置就丢了。西门子1200PLC跟随编码器的随动程序,本质上就是解决“主轴位置实时采集 + 从轴位置闭环跟随”这一套链路。它适合正在做运动控制课设、毕设,或者要给包装、输送、追剪类设备写随动逻辑的人。下面这份方案按需求、架构、模块、避坑、验收的顺序拆开,代码和参数都能直接改。
2. 需求与选型:为什么用高速计数器而不是普通输入
2.1 先把跟随精度拆成可计算的指标
随动系统的核心指标不是“跟得上”,而是“跟得准、跟得稳”。我一般先把需求翻译成三个可测量:跟随误差(从轴实际位置与目标位置的差值)、同步建立时间(从启动到误差进入允许带的时间)、丢步率(长时间运行后累计偏差)。以主动辊直径 100 mm、编码器 1024 线、四倍频为例,一个脉冲对应约 0.077 mm 的线位移,若要求跟随误差 ≤ 2 mm,意味着位置环的采样与计算周期必须远小于误差累积速度。通常的做法是把 PLC 循环中断设为 4 ms 或 2 ms,让位置更新频率至少是机械响应频率的 5 倍以上,否则误差会像滚雪球一样越滚越大。
2.2 硬件组态:HSC 通道与工艺对象的分工
S7-1200 的板载高速计数器最多支持若干路,具体路数取决于 CPU 型号,组态时在设备视图里启用 HSC 并选择“计数”模式,信号类型按编码器实际输出选单相、双相或 A/B 相正交。正交模式下四倍频由硬件完成,不需要在程序里做边沿判断,这一点很关键——用普通数字量输入加中断去数脉冲,高速时必然丢脉冲,这是血泪经验。编码器接线建议用屏蔽双绞线,A、B 相与电源分开走线,屏蔽层单端接地。HSC 的计数方向可以通过组态固定,也可以在程序里用控制位切换,随动场景一般固定正向计数,反向由机械或软件限位处理。
2.3 工艺对象与普通 HSC 的取舍
如果从轴是西门子伺服或支持工艺对象的驱动,优先用“工艺对象 + 运动控制”做位置跟随,PLC 只负责把主轴位置换算成从轴设定值,同步精度和插补由驱动侧保证。如果从轴是普通变频器加编码器,或者只是液压比例阀,那就得自己在 PLC 里写位置闭环:HSC 读主轴、模拟量或通信给从轴速度/位置指令、PID 或前馈补偿修正误差。两种路线的代码结构差别很大,选型阶段就要定死,中途换方案等于重写。下面的实现以“PLC 内做位置换算 + 速度指令输出”为主线,工艺对象路线只需把输出段替换成 MC_MoveAbsolute 或齿轮同步指令即可。
3. 总体架构:三层结构与四个模块的职责划分
3.1 三层结构:采集层、运算层、输出层
整套程序按三层组织。采集层只做一件事:把 HSC 的当前计数值读进 DB,并做溢出处理和单位换算,不掺任何控制逻辑。运算层拿主轴位置算从轴目标位置,包含传动比换算、跟随使能、软限位、误差计算。输出层把目标位置或速度指令送到驱动,同时回读从轴实际位置做闭环修正。三层之间用全局 DB 传递数据,不直接跨层调用 FC,这样调试时可以在监控表里一眼看到每一层的关键变量,出问题能快速定位是采集丢了、算错了还是输出没跟上。
3.2 四个模块:HSC 读取、位置换算、跟随控制、状态管理
四个模块对应四个 FB/FC。HSC 读取模块负责读 ID1000 的计数值并处理 32 位溢出;位置换算模块把脉冲数乘以“每脉冲位移”得到工程单位;跟随控制模块实现使能、目标位置生成和误差修正;状态管理模块用状态机管 Idle、Homing、Following、Fault 四个状态,任何异常都往 Fault 跳并锁存。模块划分的原则是:每个模块的输入输出都能在接口上写清楚,模块内部不访问别的模块的静态变量。这样后面加追剪、加凸轮曲线,只需要在运算层插新逻辑,采集和输出不用动。
3.3 数据流与扫描周期预算
数据流是单向的:HSC → 原始计数 DB → 换算 DB → 目标位置 DB → 输出 DB → 驱动。每个扫描周期这条链只走一遍,循环中断里走运算层,主程序里走状态管理和 HMI 交互。扫描周期预算要提前算:1200 的循环中断最小可设 1 ms,但实际能跑多快取决于程序量,我一般把跟随运算放在 4 ms 中断里,主程序放 10 ms 以上,HMI 读写放主程序末尾。中断里只做算术和赋值,不做通信、不做字符串处理,否则周期抖动会让跟随曲线出现毛刺。
// 循环中断 OB30 内调用,周期 4 ms // 输入:主轴原始计数(DINT)、使能标志、传动比 // 输出:从轴目标位置(REAL,工程单位 mm) #rawCount := "HSC_DB".MainAxisCount; // 采集层读值 #pulseDelta := #rawCount - "HSC_DB".LastCount; // 本周期增量 "HSC_DB".LastCount := #rawCount; // 溢出处理:32 位计数器回绕时增量会突变 IF #pulseDelta > 1000000 OR #pulseDelta < -1000000 THEN #pulseDelta := 0; // 丢弃异常增量,等待下一周期 END_IF; // 位置换算:每脉冲位移 = 辊周长 / (线数 × 倍频) #posDelta := DINT_TO_REAL(#pulseDelta) * "Param_DB".MmPerPulse; "Pos_DB".MainPos := "Pos_DB".MainPos + #posDelta; // 跟随使能时生成目标位置 IF "State_DB".FollowEnable THEN "Pos_DB".SlaveTarget := "Pos_DB".MainPos * "Param_DB".GearRatio + "Param_DB".Offset; END_IF;这段代码的关键点在溢出判断和增量累加。直接拿绝对计数值乘系数,计数器回绕时目标位置会瞬间跳变几万毫米,驱动直接报警。用增量累加则回绕只影响一个周期,丢弃异常增量后下一周期自动恢复。MmPerPulse 由辊径和编码器参数算出,GearRatio 是主从传动比,Offset 用于对刀或零点偏置。参数全部放 DB,HMI 可改,改完不需要重新下载程序。
4. 跟随控制实现:使能、同步与误差修正
4.1 跟随使能的时序:先对齐再使能
最常见的翻车是“一使能就蹿”。原因是从轴目标位置在使能瞬间直接等于主轴当前位置乘传动比,而从轴实际位置还停在零位,误差一下子变成全行程,控制器输出饱和。正确的时序是:使能前先把从轴目标位置预置为从轴实际位置,使能后目标位置从预置值开始随主轴增量累加,这样启动瞬间误差为零。代码上就是使能上升沿时执行一次SlaveTarget := SlaveActual,之后每个周期只加增量,不重新赋值绝对位置。
4.2 同步建立与误差带判断
同步是否建立,用误差带判断:连续 N 个周期内 |SlaveTarget − SlaveActual| 小于允许误差,才置“同步完成”标志,HMI 上才允许显示运行。N 取 5 到 10 个周期,太少会被单周期抖动误判,太多则响应迟钝。误差带大小按机械精度定,一般取允许跟随误差的 1.5 倍作为进入带、0.8 倍作为保持带,形成回差,避免标志在边界反复跳。这个回差逻辑看起来是玄学,实际是防止 HMI 指示灯闪烁和上位机误报警的后悔药。
4.3 前馈与闭环修正的配合
纯位置闭环在加减速段必然滞后,滞后量跟加速度成正比。工程上的做法是加速度前馈:把主轴速度的微分乘一个前馈系数加到输出上,系数从 0 开始逐步加大,直到跟随误差在加减速段基本对称。前馈给多了会超调,给少了滞后明显,调试时看趋势图最直观。如果从轴是变频器,输出的是速度指令,那就用“位置误差 PID + 速度前馈”的结构;如果从轴接受位置指令,前馈直接加在目标位置上。两种结构的前馈系数物理意义不同,不能混用同一组参数。
// 跟随控制 FB 的核心段,4 ms 周期调用 // 输入:SlaveTarget, SlaveActual, Kp, Kff, MaxOut // 输出:SpeedCmd(-100.0 ~ 100.0 %) #err := "Pos_DB".SlaveTarget - "Pos_DB".SlaveActual; // 误差积分,带抗饱和 #integral := #integral + #err * 0.004; IF #integral > 50.0 THEN #integral := 50.0; END_IF; IF #integral < -50.0 THEN #integral := -50.0; END_IF; // 速度前馈:主轴速度 × 传动比 × 前馈系数 #ff := "Pos_DB".MainSpeed * "Param_DB".GearRatio * #Kff; // PID 输出 + 前馈 #out := #Kp * #err + #Ki * #integral + #ff; // 限幅 IF #out > #MaxOut THEN #out := #MaxOut; END_IF; IF #out < -#MaxOut THEN #out := -#MaxOut; END_IF; "Out_DB".SpeedCmd := #out;Kp 决定响应快慢,Ki 消除稳态误差但太大会振荡,Kff 补偿动态滞后。调试顺序是先 Kp 后 Ki 再 Kff,每步只动一个参数,动完看趋势图确认再动下一个。MaxOut 按驱动允许的最大速度百分比设,不要设 100%,留 10% 余量给修正。积分抗饱和的上下限按实际工况调,设太大等于没限,设太小稳态误差消不掉。
4.4 停机、复位与位置保持
停机分三种:正常停止、急停、故障停止。正常停止时先撤跟随使能,从轴按减速曲线停,主轴位置继续记录但不再生成目标;急停直接断输出,位置保持当前值;故障停止锁存 Fault 状态,必须手动复位。复位动作包括清积分、清误差、把目标位置重新对齐到实际位置,然后才允许重新使能。位置保持的关键是停机期间不要清主轴累计位置,否则再启动时 Offset 对不上,工件位置全错。我一般把主轴累计位置和 LastCount 都放在保持性 DB 里,断电重启后先做一次回零再恢复跟随。
5. 避坑与排查:五条最容易翻车的点
5.1 现象:低速正常,高速跟随误差突然变大
原因通常是 HSC 计数模式或滤波参数不对。组态里 HSC 有输入滤波选项,滤波太强会吃掉高频脉冲,表现为高速丢计数。解决是把滤波调到与编码器最高频率匹配的档位,或者关闭滤波靠屏蔽线抗干扰。另一个可能是循环中断周期不够,运算跟不上,看 OB30 的实际循环时间是否接近设定值,接近就说明程序太重,要把非关键逻辑挪出中断。
5.2 现象:计数器每隔一段时间跳变一次
32 位计数器回绕,或者编码器供电受干扰导致丢脉冲。先确认程序里有没有做增量溢出判断,没有就加上;有判断还跳,查编码器屏蔽层接地和走线,A/B 相与变频器输出线分开。还有一种隐蔽情况:HSC 的计数方向被外部信号误触发反转,检查方向控制位是否被别的程序段误写。
5.3 现象:使能瞬间从轴猛冲一下
使能时序错误,目标位置在使能瞬间被赋了绝对值。按 4.1 的做法,使能上升沿先对齐再累加。如果用了工艺对象,检查 MC_Power 和 MC_GearIn 的调用顺序,齿轮同步的 Master 值要在使能前预置好,不能使能后再改。
5.4 现象:跟随误差在零附近高频抖动
Kp 太大或积分太强,也可能是编码器分辨率太低导致量化噪声被放大。先把 Kp 降一半看抖动是否减小,减小说明是增益问题;不变则查编码器每脉冲位移是否过大,必要时换更高线数编码器或在程序里做位置滤波。位置滤波会引入滞后,滤波系数要小,一般不超过 0.2。
5.5 现象:断电重启后位置全错
主轴累计位置没做保持,或者回零逻辑没执行就恢复跟随。解决是把累计位置、LastCount、Offset 放保持性 DB,上电后状态机强制进 Homing,回零完成才允许 Following。回零方式按机械结构选,有原点开关用原点开关,没有就用扭矩或电流堵转检测,但堵转检测的回零精度差,随动场景不建议。
6. 验收与答辩:用趋势图和误差统计说话
验收随动程序,别只看“能动”。我一般准备三样东西:趋势图、误差统计表、边界工况记录。趋势图在 TIA Portal 的监控表里录主轴位置、从轴目标、从轴实际三条曲线,覆盖启动、匀速、加减速、停止四个阶段,图上能直接看出同步建立时间和加减速段的滞后量。误差统计表按匀速段和加减速段分别记录最大误差、平均误差、超差次数,采样周期与循环中断一致,数据从 DB 里导出。边界工况至少测三组:最低速、最高速、带载启停,每组连续跑 10 分钟看累计偏差。
答辩时老师或评审最常问的是“误差怎么来的、怎么证明你的方案能压住”。回答顺序建议先讲误差源分解:编码器量化、采样周期滞后、传动间隙、控制增益不足,每一源对应一个参数或一段代码。然后现场演示改一个参数看趋势图变化,比如把 Kff 从 0 调到 0.8,加减速段误差明显收窄,这比念PPT有说服力。表格里把“允许误差”和“实测最大误差”并排列出,超差项标注原因和已采取的补偿措施,评审一看就知道你是真调过。
| 验收项 | 方法 | 合格标准 |
|---|---|---|
| 同步建立时间 | 趋势图测使能到误差进带 | ≤ 200 ms |
| 匀速跟随误差 | 连续 10 分钟统计 | ≤ 允许误差的 60% |
| 加减速最大误差 | 录加减速段峰值 | ≤ 允许误差 |
| 断电恢复 | 断电重启后回零再跟随 | 位置偏差 ≤ 1 个脉冲当量 |
| 急停响应 | 急停后输出归零 | 无位置跳变、无报警 |
最后说个习惯:每次改完参数,我都会把趋势图截图和参数组一起存档,文件名带日期和工况。有次现场调试,客户说“昨天还好好的”,翻出前一天的参数存档一对比,发现是有人把滤波档位改了,十分钟定位。从那以后我每次交付随动程序都强制走一遍“参数存档 + 趋势图留证”,希望帮到你。
本文还有配套的精品资源,点击获取