ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

S7-1200流水灯移位循环程序设计:梯形图实现上电延时与循环移位

S7-1200流水灯移位循环程序设计:梯形图实现上电延时与循环移位 前些日子在设备现场调试一台小设备客户提了个很典型的需求一上电先别急着动作等个三秒钟然后指示灯依次点亮像流水一样循环走起来。我下意识就想到了S7-1200的移位循环。这种需求在工控圈里太常见了说白了就是流水灯效果用PLC来做毫无难度但真要写得漂亮、稳定、好扩展还是有点门道。这篇文章就把我当时用梯形图实现的完整思路拆给大家看核心就两个词上电延时触发、移位循环。无论你是刚摸PLC的新手还是在用自复位定时器硬堆的老手这篇内容都能给你点新东西。我会从方案选型一直讲到TIA Portal里的实操步骤再附上几个我在现场真实踩过的坑。废话不多说直接进入正题。1. 项目整体拆解与方案选型1.1 需求解析龙师傅要的流水灯到底是什么效果先把这个需求翻译成PLC能听懂的人话。所谓流水灯效果就是多个指示灯按固定顺序依次点亮和熄灭形成一种光带流动的视觉感受。常见的工业场景包括设备运行状态指示、故障报警光带、生产线工序进度显示等。这次客户的具体要求是设备上电后先保持全灭状态延时约3秒然后从第1个灯开始点亮每隔固定时间间隔比如1秒向后移动一位走到最后一个灯后折返或循环周而复始。拆解成PLC的控制逻辑就是三件事一是上电延时用定时器实现二是产生固定频率的移位脉冲让数据移动有节奏三是数据本身的移动方式也就是移位循环。很多人一上来就想着搞一堆定时器串联比如T1延时1秒置位Q0.0T2延时2秒置位Q0.1……这思路没错但只适用于灯数少且逻辑永远不变的场合。一旦要改速度、改顺序、加灯数代码改到你怀疑人生。我这次直接选择了移位寄存器方案用一个1数据位在寄存器里不断移动灯的亮灭状态完全由这一位数据的位置决定逻辑和硬件绑定关系降到最低。这种设计的好处在于状态集中、扫描周期一致、扩展性好。8个灯和16个灯的区别只是数据宽度不同程序框架几乎不用动。你想想这要是用一堆定时器堆16个灯就得16套定时器加16套互锁逻辑哪个方案省事不言而喻。1.2 方案对比移位循环为什么比定时器堆叠更靠谱我遇到过不少电工师傅做流水灯第一反应就是定时器堆叠。我承认对于三五组灯的小型控制堆定时器确实直观一个定时器Q端触发一个灯后面再串联下一个定时器。但这里有几个硬伤第一定时器本身有数量限制S7-1200虽然定时器资源比老款S7-200充裕但也不能无限用下去第二每个定时器的PT值都是独立设置的想整体调速就得一个个改不小心漏改一个流水节奏就乱了第三定时器堆叠本质上是链式触发一个环节的定时器复位逻辑稍有瑕疵整条链就断了排查起来非常痛苦。移位循环的逻辑完全绕开了这些麻烦。它的核心思路是准备一个数据容器寄存器让一个1在里面按固定节拍移动。数据每次移动一拍灯就跟着跳一位。为什么这个方案优雅因为亮哪个灯完全由数据位置决定修改灯序只是改数据移动方向或输出映射修改速度只改节拍脉冲的周期。而且这种思路的工程化价值远不止流水灯顺序启动多台电机、多工位装配线的流转、信号灯的相序切换本质都是移位循环。从扫描周期的角度看移位循环是并行的状态刷新所有输出在同一个扫描周期内统一更新定时器堆叠则是串行触发容易出现一个周期内多个灯同时闪烁的鬼影。做控制的人都知道状态切换不一致是现场调试的大忌尤其是带接触器、带变频器的场合前后几个周期输出不一致轻则指示灯乱跳重则设备误动作。2. 核心指令与梯形图设计原理2.1 上电延时触发的实现TON定时器的正确用法S7-1200的定时器是IEC风格的实例化定时器和S7-200那种定时器编号的写法完全两个思路。你在编程过程中使用TON指令时系统会提示创建一个定时器实例这个实例可以放在数据块DB中也可以放在函数块FB的背景数据块中。很多刚接触TIA Portal的人会被这个特性和以前写三菱的习惯搞混——别慌道理其实一样。TON的全称是On-Delay Timer接通延时定时器。它的逻辑很简单IN端从0变成1后定时器开始计时当前时间ET从0往PT方向累加当ET累计到PT设定值Q端输出置1。关键点在于只要IN端还维持1Q端就一直保持1只有IN端断开ET才会清零Q端才会复位。这意味着TON本身不是脉冲发生器它只是一个可复位的延时开关。实现上电延时触发有两种常见接法。第一种是把一个常真信号比如系统常量TRUE或一个启动位接到TON的IN端这样程序一运行定时器就开始计时3秒后Q端置1。第二种是接一个启动按钮信号比如I0.0按下才开始计时适合需要人为介入的场合。我这次用第一种因为客户要的就是上电自动延时启动。这里要提醒一点TON的Q端置1后不能直接用来触发移位否则PLC每个扫描周期都会执行一次移位程序一运行数据瞬间就移完了根本看不出流水效果。正确的做法是把TON的Q端当作总使能再配合一个节拍脉冲信号去做边沿触发。这个组合是整套程序的关键环节理解了它后面的移位逻辑就顺理成章了。2.2 移位循环的核心S7-1200的移位指令与循环控制S7-1200在TIA Portal里提供的移位指令主要分两类逻辑移位SHL/SHR和循环移位ROL/ROR。逻辑移位是挤出去就扔了数据移出最高位或最低位后直接丢弃另一端补0循环移位则是从一端挤出去又从另一端塞回来像一个环形跑道数据永远在寄存器里打转。流水灯用哪种答案是循环移位也就是ROL或ROR。原因很简单流水灯要求最后一个灯亮完以后下一步回到第一个灯重新开始正好对应循环移位的环形特性。用逻辑移位反而麻烦你还得额外写补位逻辑把溢出的位手动加到另一端多此一举。具体到指令操作数S7-1200支持对整数、双整数和位序列执行移位。对于8个灯的情况一个BYTE8位刚刚好16个灯就用WORD16位32个灯用DWORD。以8路流水灯为例我定义一个BYTE类型的变量ShiftValue初始值设为B#16#01也就是二进制0000_0001代表第1个灯先亮。每次执行ROL循环左移1位数据就变成0000_0010第2个灯亮以此类推。移到1000_0000后再左移一位就变回0000_0001循环闭合。如果你手头恰好没有ROL指令或者习惯用逻辑移位也能实现循环效果就是多两条补位逻辑先把最高位或最低位保存到一个临时变量执行SHL或SHR再把临时变量补到另一端。我早年用S7-200做类似功能时就是这么干的因为S7-200没有现成的8位循环左移指令只能靠SHB指令加手工补位。现在S7-1200直接提供ROL/ROR省事多了。3. 实操过程TIA Portal中的完整编程步骤3.1 建立项目与变量表先把场地码好这次演示我用的软件是TIA Portal V16CPU型号选的是CPU 1214C DC/DC/DC订货号6ES7214-1AG40-0XB0这个型号在中小型设备里很常用。建项目的步骤我就不啰嗦了重点说变量和存储区的规划。S7-1200没有三菱那种字元件和位元件完全分开的概念它强调数据类型。建议把流水灯相关的核心变量放在一个独立的全局数据块里我习惯命名为DB_FlowWater。这个数据块里至少要有这几个变量ShiftValueBYTE存放当前的灯状态数据ShiftEnableBOOL上电延时完成的使能信号PulseEdgeBOOL节拍脉冲的边沿存储位SecondsFlagBOOL循环过程中用到的标志位。变量建好以后每个变量都有一个绝对地址比如DB_FlowWater.ShiftValue在梯形图里可以直接引用。还有一个关键配置时钟存储字节。这是S7-1200很方便的一个功能说白了就是系统自动生成一组固定频率的脉冲信号你可以直接拿来用不用自己写定时器产生方波。在CPU属性里找到系统和时钟存储器勾选启用时钟存储器字节然后指定一个字节地址比如MB1。这样M1.0到M1.7就分别对应不同的频率0.5Hz、1Hz、2Hz、5Hz、10Hz等等。我做1秒一步的流水灯就用M1.51Hz脉冲。这个配置经常被人忽略但你一旦用上就会发现很多需要闪烁的场景都可以靠它解决连定时器都省了。3.2 梯形图逐行拆解从首扫描到循环脉冲程序结构我用四个网络Network搞定逻辑非常清爽。第一个网络做上电延时。Network 1里放一个常真触点在TIA里可以用TRUE系统常量接到TON定时器的IN端。定时器实例我命名为DelayTimerPT设为T#3S。TON的Q端输出到DB_FlowWater.ShiftEnable。这样PLC运行后3秒内ShiftEnable为0所有输出保持熄灭3秒后ShiftEnable变为1流水逻辑开始工作。第二个网络做节拍脉冲边沿检测。这里的关键是虽然时钟存储字节M1.5本身已经是1Hz方波但我们不能直接用它的电平状态去触发移位否则在方波高电平的这段时间里每个扫描周期都会移一次。必须把方波通过一个上升沿检测R_TRIG转换成一个瞬间脉冲。我在网络2里串联三个触点ShiftEnable、M1.5然后接R_TRIG。R_TRIG的CLK端接M1.5Q端输出到PulseEdge。这样当ShiftEnable为1、且M1.5出现上升沿的那一刻PulseEdge只会导通一个扫描周期正好作为移位的触发信号。第三个网络执行移位。ROL指令要设置三个参数EN使能端接PulseEdgeIN端接ShiftValueN端设1每次移动1位OUT端还是接到ShiftValue。这里有个知识点ROL的输出不能直接接到输入上需要用一个MOVE或者通过中间变量回写。实际上TIA里用指令的INOUT接线方式也可以但为了新手看得清楚我在IN端接ShiftValueOUT端输出到一个同等类型的中间变量再用MOVE把它赋值回ShiftValue。虽然多了一步但数据流转一目了然排查问题也方便。第四个网络做输出映射。我用MOVE指令把ShiftValue传送到QB0。这里有个细节如果ShiftValue是BYTE类型QB0也是字节地址两者类型匹配直接传就行。如果用的是WORD类型想输出到QB0就需要取低字节或高字节我建议不要搞这么麻烦8路流水灯直接用BYTE。接线的时候Q0.0到Q0.7分别接8个指示灯注意晶体管输出和继电器输出的区别详见后面的硬件注意事项。3.3 扩展技巧速度可调流水灯与方向切换程序跑通以后客户往往会提两个额外的要求速度能不能调方向能不能反过来我在这次项目里也遇到了一并说下我的做法。调速最简单的方式是修改TON的PT值。但如果你不想改程序想在触摸屏或面板上直接调可以把PT改成变量比如DB_FlowWater.DelayTime类型为TIME。面板上输入1.5延时就是1.5秒。需要注意的是如果PT值在运行中被改成小于ET当前值的数定时器Q会立即置位这可能引起跳变所以实际应用中我会限制可调范围比如限到3秒到10秒之间。方向切换也很直观。用ROL指令是左移灯从Q0.0往Q0.7方向跑换成ROR指令就是右移方向反过来了。如果你想实现碰壁反弹就是走到头再折返回去那就不能单纯用循环移位了得换成逻辑移位同时判断最高位和最低位的状态切换移位方向。我在另一个设备上做过类似来回扫描的效果原理就是在移位的瞬间检查ShiftValue等于128还是1然后动态修改IN方向的指令。说白了移位指令本身没有记忆能力方向要靠程序逻辑去维持。4. 常见问题与排查技巧实录4.1 现象一上电后灯全亮没有流水效果这个故障我见得太多了十有八九是移位使能逻辑出了问题。最典型的情况是TON的Q端直接接到了ROL的EN端而不是通过边沿触发。这样一来上电延时完成后每个扫描周期ROL都在执行数据哗哗地移CPU一眨眼完成了几百上千次移位最终停在某个状态上。因为移位速度远快于视觉分辨你看到的要么是全亮要么是某个灯常亮完全没有流动感。解决办法是把ROL的EN端接在边沿脉冲后面而不是接在TON的Q上。另外还要检查一下ShiftValue的初始值。如果初始值是0那哪怕移位一万次数据还是0灯自然是全灭如果初始值被写成255全1那移位时每个位都是1灯就会表现出全亮或奇怪的跳变。合理的初始值就是B#16#01代表第一个灯先亮。4.2 现象二移位一次后不再动作这个现象通常是R_TRIG的边沿检测没有持续触发。R_TRIG这个指令的特性是它内部会记住CLK端上一次的旧状态只有当前状态为1且上一次状态为0也就是存在上升沿时Q才输出一个扫描周期的1。如果CLK端一直是1或者一直是0它都不会输出。我遇到过的实际情况是有人把M1.5时钟脉冲接到了R_TRIG的CLK端但忘了勾选启用时钟存储器字节导致M1.5永远是0边沿检测永远不触发。第一种表现就是上电后第一次延时完成TON的Q置1的那一刻可能因为某些巧合让R_TRIG误触发了一次于是只亮了第一个灯之后就彻底卡住。排查方法很直接在监控表里强制监控M1.5看它是否有规律地跳变再监控PulseEdge看它是否每个周期都闪一次。如果M1.5不动就去CPU属性里勾选时钟存储器字节如果M1.5在跳但PulseEdge不动检查R_TRIG的实例变量是否重复使用或未正确关联。4.3 现象三脉冲时间不准确灯走得忽快忽慢流水灯的速度取决于移位脉冲的频率。用时钟存储字节时不同地址对应的频率是固定的但很多人会记错。我常用的几个M1.0是0.5Hz2秒周期M1.1是1Hz1秒周期M1.2是2Hz0.5秒周期M1.3是4HzM1.4是8HzM1.5是16Hz不对这里得说清楚。实际上S7-1200时钟存储字节的频率分配是这样的字节地址的最后一位如M1.0是0.5Hz往上是1Hz、2Hz、4Hz、8Hz、16Hz、32Hz、64Hz不同固件版本可能有微调必须在软件里看提示。我在V16里勾选后系统会弹出一个小窗口显示每一位对应的频率照着选就行千万别凭记忆硬背。如果你需要不标准的频率比如0.8Hz那时钟存储字节满足不了就得自己写一个周期脉冲发生器用TON或TP定时器组合。还有一种忽快忽慢的错觉其实是扫描周期和输出刷新周期叠加造成的。如果程序段里有大量其他逻辑CPU扫描周期可能出现波动导致定时器精度受影响。S7-1200的扫描周期一般在毫秒级对流水灯这种秒级应用影响不大但如果追求极致的稳定建议把流水灯逻辑单独放到一个循环中断OB里比如OB30设定固定的中断周期如100ms在中断块里做移位处理。这样无论主程序扫描周期怎么波动移位节奏始终稳定。4.4 排错思路总结与硬件接线要点排错这件事我一贯的做法是先软后硬、先内后外。软件上用TIA Portal的监控功能在梯形图里实时看TON的ET有没有累加、ROL的IN和OUT数据对不对、QB0的值和实际灯状态是否一致。只要把这几个点的状态捋清楚问题基本能定位到具体某一行。如果监控表里看到QB0的值在按1、2、4、8、16、32、64、128的顺序变化但灯没有亮那问题十有八九出在硬件。硬件方面有几点容易踩雷。第一确认CPU型号是晶体管输出还是继电器输出这会直接影响外部接线方式。S7-1200晶体管输出一般是源型输出高电平有效公共端接电源负极负载一端接输出端子、另一端通过限流电阻接24V而继电器输出的公共端相当于一个开关触点极性相对灵活但带载能力较弱。第二LED指示灯必须串接限流电阻S7-1200输出点允许的电流虽然够带小功率指示灯但LED本身的伏安特性决定了它需要限流否则一上去就烧。一般24V电源串一个2.2kΩ左右的电阻具体看LED额定电流计算。第三检查输出通道的公共端是否接线牢固很多某一路灯不亮的怪故障其实就是公共端端子松了。如果你暂时没有实物硬件可以用TIA Portal自带的PLCSIM仿真软件在电脑上跑这个程序。仿真状态下QB0的值变化一样能看得清清楚楚唯一注意PLCSIM对时钟存储字节的支持需要勾选对应选件否则M1.5不会翻转。我在仿真环境里调试通过以后再下载到实物PLC整个流程顺畅很多。5. 从流水灯到工程应用我的几点体会5.1 移位循环在顺序控制中的真实价值流水灯看似是个练手小项目但移位循环的思想在工业控制里随处可见。举个我做过的事一条生产线有5台风机要求按顺序间隔5秒启动停机时反过来按顺序停。用移位循环做就是把风机启动信号依次排列在一个寄存器里一个定时脉冲触发一次移位每移到哪一位就启动对应的风机停机时换个方向移位顺起逆停一次到位程序清爽、逻辑直观。热搜词里那些多台变频器通讯控制星三角降压启动之类的内容本质上也是顺序控制的一种变形只是把灯换成了接触器或变频器启动命令。所以我的建议是别把流水灯当成一个玩具它其实是状态机和步进控制的最简模型。你把它吃透了再去接触顺序功能图SFC/GRRAPH、状态机编程甚至复杂运动控制里的循环移位找原点会有一种融会贯通的感觉。5.2 梯形图还是SCL按场景选别迷信这次程序我用梯形图写原因是客户阵营里有人后续要维护梯形图直观易读。但如果是我自己写新项目这种纯数据处理逻辑用SCL其实更短用一行ShiftValue : ROL(IN : ShiftValue, N : 1)就完成了移位配合IF语句判断使能和边沿代码量比梯形图少一半。这不代表梯形图不如SCL而是两者擅长领域不同。梯形图更适合触点-线圈逻辑、硬件联锁控制SCL更适合算法、数据处理和复杂数学运算。真正的高手不会纠结哪个语言高级而是看哪个语言能把问题描述得最简洁、最不容易出错。我个人现在的做法是主程序负责顺序控制和联锁用梯形图数据运算和通讯解析丢给SCL函数块顺控流程如果步骤多直接用GRRAPH。这次流水灯只是个小例子但它让我又复习了一遍R_TRIG、TON、ROL这几个高频指令的配合方式也再次验证了先想清楚数据结构再动手写程序这句话的价值。你把这个程序在电脑上敲一遍、仿真一遍再用实物跑一遍相信我你对S7-1200的定时器、脉冲边沿和数据移位的理解会往上走一个台阶。
返回列表