拓冰建站拓冰建站
首页 / 资讯中心 / 正文

S7-1200仿真实现八位流水灯:计数器+比较器实战

简介面向零基础电气自动化学习者这份西门子S7-1200/1500仿真教程围绕八位流水灯/跑马灯案例介绍通过按键控制LED灯的方法重点学习移位和循环指令也适用于中职、高职及本科电气相关专业课后实操。项目要求设置启动、停止按钮和8个圆形LED灯按下启动后按0.5秒间隔依次点亮或成组跑马4秒循环一次形成直观的流水/跑马效果便于理解程序时序与HMI面板的配合方式。压缩包共48个文件包含博途V15.1项目文件、HMI仿真配置和运行截图等核心文件涵盖PLC程序、触摸屏界面定义与仿真数据整体约7MB需使用V15.1及以上版本打开。已有4420人学习该资源。学习后可获得可直接运行的PLC程序与HMI仿真工程无需实物即可观察实际运行效果同时理解移位循环指令与组态软件的基本用法适合日常练习和教学演示。 流水灯这个练习玩过 PLC S7-1200 仿真的朋友基本都绕不过去。它看着就是八个灯轮流亮可真要自己从头到尾写出来定时器怎么自复位、计数器怎么循环、输出怎么映射每一步都在考察你是不是真正理解了扫描周期和位逻辑。这一篇是零基础无实物系列第九次更新继续用仿真环境把八位流水灯完整跑一遍。全程不需要任何实体 PLC只要电脑上装了 TIA Portal 和 PLCSIM 就能跟着做。我会直接按实际操作的顺序走先把方案思路讲透再一步步搭梯形图最后把仿真运行、调试观察、常见坑都过一遍。这套程序我会刻意用“计数器 比较器”的方式写虽然看着比移位指令啰嗦但对零基础来说每条网路在做什么一清二楚逻辑上不容易绕晕。1. 一到八位流水灯为什么值得专门练一次1.1 流水灯不是炫技是PLC基础指令的综合体检很多初学者学完位逻辑、定时器、计数器之后总觉得这些指令是散的不知道它们怎么配合。流水灯恰好把这几样东西串了起来定时器负责产生稳定的时间节拍计数器在这个节拍下做 0 到 7 的循环比较器再把计数值翻译成 8 个输出点的亮灭。这样一个程序里既有时间的控制又有数据的转换还有输出驱动的概念比单独练某一条指令有意义得多。从实际应用角度来说流水灯的逻辑和传送带工位指示、设备状态轮流显示、多步骤动作顺序启动都是一路的。你把这个八位循环写明白了后面做顺序控制、工步切换的时候思路会顺很多。这也是为什么很多培训课都把流水灯当成“入门毕业设计”它不是让你背指令而是逼你把程序的执行流程捋清楚。1.2 三种实现思路对比新手先别急着用最省事的我见过不少群里讨论流水灯怎么写主流方案大概有三种方案核心指令优点缺点适合人群计数器比较器CTU、CMP逻辑直白每行程序都能看懂程序段较多输出点多了会有点啰嗦零基础、刚接触PLC编程移位寄存器SHRB程序简洁几条网络就搞定要理解移位方向、数据流入流出首尾循环容易接错有一定基础后优化使用数据块循环赋值SHL/SHR、MOVE代码量少扩展方便涉及数据位操作概念抽象不适合第一遍学熟悉数据存取后进阶这次我选择第一种原因很简单仿真环境下没有硬件IO可以观察程序写得太“高级”反而容易出问题。计数器 比较器的写法每个扫描周期做了什么你打开监控表一眼就能看穿。等这套跑通了你想优化成 SHRB 移位寄存器写法那就是顺手的事。1.3 核心控制逻辑先画在脑子里动手写程序之前先把整个循环的节奏想明白。我的目标很简单八个灯 Q0.0 到 Q0.7从左到右轮流点亮每个灯亮 0.5 秒然后无限循环。这个需求拆成三个步骤就很清晰第一步产生一个周期性的脉冲每隔 0.5 秒来一次。第二步用一个计数器数这个脉冲数到 8 就归零重来。第三步根据计数器的当前值决定哪个输出点得电。为什么计数器要 0 到 7 循环而不是 1 到 8 循环因为八位流水灯最方便的是让计数值和输出位一一对应计数 0 对应 Q0.0计数 1 对应 Q0.1以此类推。这样后面写比较器的时候每个网络都是“如果当前值等于几就点亮第几个灯”思路不会乱。2. 仿真前的准备工作和项目搭建2.1 软件环境TIA Portal PLCSIM缺一不可做无实物仿真主力工具就是西门子的 TIA Portal博途和 PLCSIM。我以 TIA Portal V17 为例操作如果你用的是 V15.1、V16、V18步骤基本一样只是界面细节略有区别。需要说明的是PLCSIM 是包含在博途安装包里的不需要额外找破解版。安装博途的时候勾选对应组件装好之后桌面会多一个“S7-PLCSIM”图标。我这个系列一直强调无实物靠的就是这个仿真器——它能在电脑里模拟出一个完整的 S7-1200 CPU 运行环境梯形图程序下载进去之后变量状态、定时器、计数器全部真实运行。2.2 新建项目并添加 S7-1200 设备打开 TIA Portal第一步是“创建新项目”。项目名称建议写成“FlowLight_8bit”这类一眼能看懂的路径尽量不要带中文有些人电脑上博途对中文路径支持不好容易出现莫名其妙的编译问题。项目建好后进入“添加设备”向导控制器类型选择“SIMATIC S7-1200”。CPU型号选 CPU 1214C DC/DC/DC。固件版本选你 PLCSIM 支持的最高版本比如 V4.5。确认后系统会生成一个默认的 PLC 站点。选 CPU 1214C 是因为它带 8 路数字量输出Q0.0 到 Q0.7 正好齐全不会出现输出端子不够的情况。实际上你选 1211C 这类小型 CPU 也能做逻辑仿真但输出点不够八路不方便观察。2.3 定义变量把仿真里的输入输出规划好打开 PLC 变量表我习惯先把要用到的变量建好避免写程序的时候一边写一边翻地址。这个案例的变量表可以做成这样变量名称数据类型地址注释StartBool%I0.0启动按钮仿真中强制为TRUEClockPulseBool%M1.0定时器产生的0.5秒脉冲CountValueInt%MW10计数器当前值0~7循环ResetCounterBool%M4.0计数器复位标志Q0_0 ~ Q0_7Bool%Q0.0 ~ %Q0.7八位流水灯输出这里有个细节流水灯的输出点能不能直接用 Q0.0 到 Q0.7可以。虽然在真实设备中输出点对应端子但在 PLCSIM 仿真中它们会被模拟成一个变量你可以像观察 M 变量一样查看它们的状态。3. 核心程序一步一步搭出来3.1 网络1自复位定时器生成 0.5 秒脉冲流水灯的速度控制本质上是定时器的定时时间控制。我在 OB1 的第一个网络里放一个 TON 定时器用它产生 0.5 秒的脉冲。最常见的写法是“定时器常闭触点接到定时器输入”%M1.0 是定时器 T1 的 Q 输出。把 T1.Q 的常闭触点接到 T1 的 IN 输入。PT 定时时间设为 T#500ms。逻辑是这样走的定时器初始 Q0常闭触点闭合IN1定时开始经过 500ms 后 Q 变为 1下一扫描周期常闭触点断开IN0Q 又变回 0再下一周期常闭触点重新闭合又开始新的一轮定时。结果就是 %M1.0 每隔 0.5 秒接通一个扫描周期形成固定节拍。如果你在博途里直接写这个电路系统会提示你用“定时器”类型的背景数据块。可以在 PLC 数据类型里先建一个“MyTimer”变量类型选 TON然后在程序里把定时器指令实例指过去。这个背景数据块是定时器正常运行的工作区不要删除。3.2 网络2计数器开始数脉冲把网络1生成的脉冲 %M1.0 作为计数器的计数输入。我使用 CTU 加计数器PV预设值设为 8。CTU 指令有四个关键端口CU计数脉冲输入端。R复位端R 为 1 时计数值清零。Q输出端当当前值大于等于 PV 时为 1。CV当前值输出到变量 %MW10。现在计数器会随着脉冲从 0 往上数数到 8 之后要重置回 0否则就停在那里不循环了。所以我在网络3里专门做计数复位判断。3.3 网络3计数值到 8 就复位这一步是循环的关键。我在网络3里写一个比较指令比较 %MW10 8。比较结果输出到 %M4.0ResetCounter。把 %M4.0 接回网络2 CTU 的 R 端。大致的逻辑链是计数器计到 8 时%MW10等于8比较器输出 %M4.01于是计数器复位%MW10 会被清零清零之后比较器条件不成立%M4.0 变回 0计数器开始下一轮计数。很多初学者会在这里踩坑为什么计数器到 8 之后不停一下因为 CTU 在 R 端为 1 时复位是一个即时行为不需要等一个特殊信号。所以你看到的现象就是 0→1→2→3→4→5→6→7→0→1→2……无限循环不会像普通加法那样一直涨上去。3.4 网络4到网络11把计数值变成 8 个输出接下来是输出的映射。我在后续的网络里连续放 8 个比较指令每个网络对应一个输出位。网络4比较 %MW10 0输出 Q0.0。网络5比较 %MW10 1输出 Q0.1。网络6比较 %MW10 2输出 Q0.2。网络7比较 %MW10 3输出 Q0.3。网络8比较 %MW10 4输出 Q0.4。网络9比较 %MW10 5输出 Q0.5。网络10比较 %MW10 6输出 Q0.6。网络11比较 %MW10 7输出 Q0.7。这里的“输出”在梯形图里直接用普通的输出线圈写 Q0.0 到 Q0.7 就行。因为当前值在一个扫描周期内只有一个确定数值所以任意时刻最多只有一个比较指令条件成立也就只有一个灯会亮不会出现两个灯同时亮的混乱情况。如果你觉得 8 个网络太占地方后面可以使用“选择性置位”或“SCL 的 CASE 语句”来优化。但第一次练习我不建议你为了省网络把逻辑写得很花哨直白一点反而容易查错。3.5 完整的程序段清单把整个 OB1 里的网络按顺序拉出来应该是这样网络号功能关键逻辑输出1自复位定时器TONPT500ms%M1.02脉冲计数CTUPV8R接%M4.0%MW103计数复位比较%MW108%M4.04输出灯0比较%MW100Q0.05输出灯1比较%MW101Q0.16输出灯2比较%MW102Q0.27输出灯3比较%MW103Q0.38输出灯4比较%MW104Q0.49输出灯5比较%MW105Q0.510输出灯6比较%MW106Q0.611输出灯7比较%MW107Q0.7这个结构看着长但每段做什么一目了然。编译时如果某条指令报错你只需要检查对应网络里的变量名是不是写错了排查成本非常低。4. 仿真运行、观察与验证4.1 编译下载把程序灌进仿真PLC程序写完之后先点一下“编译”让博途检查有没有语法错误。编译通过后点击“下载”按钮博途会提示你要选择一个设备。这时候如果你还没启动 PLCSIM就先打开 S7-PLCSIM创建一个新的仿真 PLC然后在博途里刷新设备列表选中仿真节点后下载。下载成功之后把 PLCSIM 里的运行状态切换到 RUN。你可能会注意到仿真 PLC 面板上有 STOP/RUN 按钮手动点成 RUN 会让程序开始循环扫描。这里有个小提示如果下载时提示“硬件配置不一致”多半是 PLCSIM 里选的 CPU 型号和博途项目里的不一致。删掉 PLCSIM 的旧实例重新创建一个再下载一次就好了。4.2 用监控表观察数据流程序跑起来后我习惯先在“监控表”里添加几行观察变量Start、ClockPulse、CountValue、ResetCounter以及 Q0.0 到 Q0.7。把视图切到“全部在线”就能看到变量值实时变化。你看到的现象应该是这样%MW10 从 0 跳到 1、2、3……一直到 7然后跳回 0每秒变化两次因为 0.5 秒一次脉冲。同时 Q0.0 到 Q0.7 跟着 %MW10 的数值轮流变 TRUE。这就是一个标准的八位流水灯。如果你的 Start 变量接在某个触发条件上先强制 Start 为 TRUE 再观察。仿真器里强制变量很快在监控表那一行右键“修改为1”即可。4.3 修改速度把 0.5 秒改成你想要的节奏这个程序最让人舒服的地方就是调速非常方便。调速度不需要改梯形图结构只修改网络1 TON 定时器的 PT 参数就行。我试过几种不同的时间定时时间效果100ms快速跑动频繁跳变500ms清晰可见的逐位点亮1000ms像老式跑马灯节奏明显2000ms适合拍视频演示建议新手先用 500ms 或 1000ms看得清楚逻辑是否正常。等你确认逻辑没问题了再改成 200ms 体验高速流水效果顺便感受一下扫描周期和定时精度的关系。5. 常见问题与排查技巧实录5.1 灯不亮或者只有一个灯常亮这个情况大概率不是输出比较写错而是定时器没有正常产生脉冲。去监控表里看 %M1.0 有没有变化。如果 %M1.0 一直是 0检查网络1的自复位定时器回路T1.Q 的常闭触点有没有接对IN 之前是不是漏掉了启动条件如果你在自复位回路前还加了一个 Start 常开触点记得要在监控表里强制 Start 为 TRUE否则定时器永远不会开始工作。如果 %M1.0 有脉冲但灯不亮再查计数器 %MW10 是否变化。如果 %MW10 一直在 0 不动那就是 CTU 的 CU 端没有接上 %M1.0或者 R 端被某个常量置 1 了导致计数器一直处于复位状态。5.2 计数到 7 之后不回到 0这问题十有八九出在网络3的比较指令上。可能是你比较条件写成了“大于 7”也可能是比较结果没有接到 CTU 的 R 端。我个人踩过的坑是CTU 的 Q 输出直接接自己的 R 端结果仿真时出现逻辑竞争计数器复位不稳定。后来改成独立比较指令输出到中间变量 %M4.0再用 %M4.0 去复位计数器问题就消失了。建议你也按这个方式写作为中间标志位的课程顺便就练了。5.3 下载程序后运行状态自动变回 STOPS7-1200 在程序异常时可能会进入 STOP 状态常见原因是数组越界、访问了不存在的地址。如果你用的是我上面的变量表基本不会触发。但如果你自己扩展时把 %MW10 改成了不连续的数据区就要检查一下地址是否有重叠。另外PLCSIM 里默认的 CPU 属性可能会检查某些安全设置如果你下载时勾选了“下载前复位”程序下载成功后会先把 CPU 停一下再启动这时候你手动切到 RUN 即可。5.4 为什么我把定时器时间改成 10ms灯反而不正常了这里要明白一个概念S7-1200 的扫描周期通常是毫秒级极短。如果你把定时器时间设得比扫描周期还短或者非常接近输出变化的节奏就不稳定看起来像卡顿、跳变。流水灯这种演示程序建议用 100ms 以上的时间。低于 50ms 用人眼已经很难分辨了而且容易让人误以为程序有 bug。仿真不是为了把速度做到极限而是把逻辑验证准确。6. 这个程序还能怎么玩出花6.1 改成双向流水灯把 CTU 替换成加/减计数器CTUD再用一个方向开关控制加计数还是减计数就能实现从左往右、从右往左的双向流动。方向控制的思路是当方向位为 TRUE 时允许加计数为 FALSE 时允许减计数。减到 0 之后要跳回 7 继续反向流动这里需要在比较逻辑上多写两个分支。6.2 用变量调节速度现在 PT 是固定值 T#500ms你可以把 PT 改成数据块里的一个 Time 变量然后用监控表或者 HMI 画面在线修改变量的值。这样就能在没有实体按钮的情况下实现“速度随便调”。比如建一个全局 DB里面放一个“Speed”变量类型为 Time然后网络1的 PT 直接引用 DB.Speed。仿真时用监控表往里写 T#300ms流水速度立刻变化比改一次程序下载一次方便多了。6.3 组合成花样跑马灯八位流水灯只是起点。你可以用两个计数器交替工作或者用多个定时器分段点亮做出“先亮一半再亮一半”“从两边往中间聚拢”“波浪式闪烁”这些效果。我最推荐练的进阶方向是把输出映射从“比较器一个输出”改成“表格映射”在数据块里放 8 个数值代表 8 个输出状态然后循环读取表格。这种做法稍微复杂但已经是小型分时控制程序的雏形了。这个流水灯程序我前前后后在仿真环境里跑了很多遍。从一开始照着别人的梯形图抄都抄不对到后来闭着眼睛能画出自复位定时器中间最大的体会就是不要嫌程序啰嗦直接写最简单的版本先把每个网络的执行顺序搞清楚再想着精简。计数器 比较器的方式看起来笨但它最能让你看到扫描周期是怎么把一条条梯形图串起来的。等哪天你能不看别人例子、自己从头到尾写出来并一次运行成功S7-1200 基础这块就算真的过了。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门