2026/10/28 13:57:54

S7-1200 PLC八段LED与交通红绿灯实验工程解析

S7-1200 PLC八段LED与交通红绿灯实验工程解析 简介这份PLC实验文档面向电气工程及其自动化专业学生及PLC课程设计初学者围绕八段LED编程与智能交通红绿灯控制两条主线帮助读者在TIA Portal V13中完成从项目创建、梯形图编写到HMI画面设计与仿真验证的完整练习。内容覆盖S7-1200变量表配置、定时器与MOVE指令实现0—8循环显示、八段LED触摸屏图形组态及按钮事件关联并延伸到交通灯手/自动运行逻辑、通行与黄灯时间设定、PLC与HMI数据交换等环节。压缩包共1个docx文件约1.62MB以实验指导书形式组织实验目的、设备材料、步骤、思考题与反思总结便于按章节对照操作。已有449人学习适合需要参考完整实验流程、排查定时器编号冲突等问题并借助思考题拓展多位数码管显示设计的读者。1. 实验箱上电之后这套资源能跑通什么实验箱上电八段数码管从 0 跳到 8一秒一格切到第二个工程路口红绿灯按设定时间自己走完六步循环触摸屏上还能改通行时长。这套 PLC 八段LED 与交通红绿灯实验资源本质是一份能在 TIA Portal V13 里从零跑通的 S7-1200 可编程控制器 KTP700 触摸屏双实验包变量表、梯形图、HMI 程序、仿真验证一步不落还带了八段 LED 编码表和手自动交通灯逻辑。它适合两类人一类是电气工程及其自动化专业做课程设计、手上只有实验箱和一份语焉不详的指导书的人另一类是刚接手 S7-1200 平台、需要一份能对上物理点位、能直接下载运行的工程参照的工程师。读完你应该能自己搭出变量表、写出循环显示和六步状态机、把 HMI 变量绑对并且知道哪几个地方最容易翻车。2. 拆开工程骨架CPU1214C 与 KTP700 怎么连、变量怎么排拿到一个 TIA Portal 工程先看设备组态和变量表这两处决定了后面所有程序能不能落地。指导书里写的是 CPU1214 DC/DC/DC订货号 6ES7 214-1AG40-0XB0配 KTP700 触摸屏两者走 PROFINET。这个组合在实验箱上很常见DC/DC/DC 意思是数字量输入输出都是 24V 直流继电器型不要选错否则输出点位和接线端子对不上。2.1 硬件组态与 PROFINET 地址先把网段统一了新建项目后第一件事是添加设备。在项目视图里点“添加新设备”选 PLC 时按订货号过滤不要凭型号名硬找——同一代 CPU 有 AC/DC/RLY 和 DC/DC/DC 多个变体选错了编译不报错但下载到实物会提示固件不匹配。HMI 侧选 KTP700 Basic PN加完后在“设备和网络”视图里用 PROFINET 连线把 PLC 的绿色网口拖到 HMI 上TIA 会自动分配子网。地址分配是新手最容易漏的一步。指导书给的方案是 PLC 192.168.0.200、HMI 192.168.0.201同一网段、不冲突这是能直接用的组合。我一般会把电脑也设成 192.168.0.10 之类避免和两个设备抢地址。改完 IP 必须点“下载到设备”之前先编译一次否则组态里的 IP 只停在项目里实物还是出厂默认。设备型号/订货号IP 地址连接方式PLCCPU1214 DC/DC/DC6ES7 214-1AG40-0XB0192.168.0.200PROFINETHMIKTP700 Basic PN192.168.0.201PROFINET编程电脑任意装 TIA Portal V13 的机器192.168.0.x网线直连或经交换机注意实验箱上如果 PLC 和 HMI 已经用出厂网线接好改 IP 时不要只改一个两个都改完再一起下载否则 HMI 会一直报“连接中断”。2.2 变量表与全局 DB把“灯”和“段”变成符号变量表是整个工程的字典。八段 LED 实验里输入只有启动、停止两个按钮输出是一整个字节 QB0 驱动八段交通灯实验里输入扩到四个启动 I0.0、手自动 I0.1、南北通行 I0.2、东西通行 I0.3输出是六个灯 Q0.0 到 Q0.5。这两组地址不要混着用我在一个工程里同时做两个实验时会把八段 LED 放 QB0交通灯放 QB1 和 Q0.0-Q0.5通过输出映像区分开。全局 DB 用来放需要跨块共享、又不需要掉电保持的量。交通灯实验里建一个“交通灯_DB”至少放这几个量绿灯时长、黄灯时长、当前步序号、步内计时。绿灯时长和黄灯时长要能被 HMI 的 IO 域写入所以必须是 DB 里的变量不能是 FC 的临时变量。八段 LED 实验里建一个“段码_DB”放一个 Array[0..9] of Byte 的段码表后面查表直接索引。变量名地址/路径数据类型用途Start_BtnI0.0Bool启动常开Stop_BtnI0.1Bool停止/手自动切换实验二里复用NS_GreenQ0.2Bool南北绿灯EW_RedQ0.3Bool东西红灯Seg_OutQB0Byte八段数码管段码输出GreenTime交通灯_DB.GreenTimeTimeHMI 可写的绿灯时长2.3 OB1 与 FC 的分工主循环只做调用程序结构上MainOB1不要塞逻辑只做块调用和必要的初始化。八段 LED 用一个 FB 或者带背景 DB 的 FC 实现循环显示交通灯用一个 FC 实现六步状态机两个块都在 OB1 里各占一个程序段。这样做的好处是仿真时能单独监控某一段出问题不用在几百行梯形图里翻。TIA Portal V13 里 FC 没有静态变量定时器实例必须显式指定背景 DB或者干脆改用 FB。我早期图省事在 FC 里直接拖 TON编译能过但下载后定时器不动作原因就是实例被当成临时对象每次扫描重建。改用 FB 之后这个问题消失所以后面的代码示例都按 FB 写。OB1 里每个扫描周期调用一次不要放在循环中断里1 秒的节拍用普通循环完全够。3. 八段 LED 的编码与梯形图落地从段码表到 1s 自增循环八段数码管看着简单实际是这套实验里最容易“显示乱码”的部分。核心就两件事段码表对不对、输出位序和物理接线对不对。指导书要求实现 0 到 8 每秒自动跳转再通过 HMI 输入一个数字直接跳过去这两件事用同一个段码表和同一个输出字节就能覆盖。3.1 共阴共阳与八段编码表0x3F 为什么是 0八段数码管由 a 到 g 七段加一个小数点 dp 组成每段一个 LED。共阴接法是所有段阴极接地对应 IO 输出高电平点亮共阳反过来输出低电平点亮。实验箱上的八段模块一般已经串了限流电阻PLC 的 24V 输出直接驱动接线前先用万用表蜂鸣档确认公共端接的是 0V 还是 24V这一步搞反后面所有段码都要按位取反。按 a 对应 bit0、b 对应 bit1 一直到 g 对应 bit6、dp 对应 bit7 的顺序共阴接法下 0 到 9 的段码如下。0 需要点亮 a、b、c、d、e、f 六段二进制 0011 1111也就是十六进制 0x3F。这个表就是指导书里那张“八段 LED 编码表”把它抄进 DB 的数组里后面查表只需要一个索引。数字点亮段二进制dp g f e d c b a十六进制0a b c d e f0011 11110x3F1b c0000 01100x062a b d e g0101 10110x5B3a b c d g0100 11110x4F4b c f g0110 01100x665a c d f g0110 11010x6D6a c d e f g0111 11010x7D7a b c0000 01110x078a b c d e f g0111 11110x7F9a b c d f g0110 11110x6F注意如果实验箱是共阳接法把上表每个值按位取反再送输出例如 0 变成 0xC0。不要试图在程序里临时算直接建两张表切换更省事。3.2 定时器 计数器 MOVE1s 自增循环的骨架指导书里的做法是“接通延时定时器 PT 设 1s1s 后自动接通”再配合计数器加一把结果 MOVE 到输出字节。这个思路没问题但直接用 TON 自复位写法容易踩两个坑一是定时器实例重复二是计数器到 8 之后不回零。下面这段 SCL 是等效实现用 FB 写定时器和计数都放在静态变量里。SCL 比梯形图更适合表达“自复位定时器 查表”这种结构梯形图里同样能写只是要三个程序段加一个 MOVE 指令。// FB LED8_Cycle —— 1s 节拍循环显示 0~8 VAR timer : TON_TIME; // IEC 定时器实例静态 count : Int : 0; // 当前显示数字 segCode : Byte; // 查表结果 run : Bool; // 运行标志对应启动/停止 END_VAR // 自复位定时器Q 为 1 时复位自身 IN产生宽度一个扫描周期的脉冲 #timer(IN : #run AND NOT #timer.Q, PT : T#1S); IF #timer.Q THEN #count : #count 1; IF #count 8 THEN #count : 0; // 0~8 循环到 9 之前回零 END_IF; END_IF; // 查表索引即数字表在全局 DB 里 #segCode : 段码_DB.segTable[#count]; QB0 : #segCode; // 整字节送输出这段逻辑的关键参数有三个。PT 设为 T#1S 就是指导书要求的 1 秒间隔想改成 0.5 秒直接改这里不用动别的。比较条件是#count 8而不是 9因为需求是循环显示 0 到 8如果写成 9会多出一格显示 9 再回零和实验要求对不上。#run这个标志接启动/停止按钮的自锁回路停止时定时器的 IN 为假计数停在当前值再启动会从当前数字继续如果想每次启动都从 0 开始就在#run的上升沿里给#count赋 0。3.3 触摸屏输入数字直接跳转用 MOVE 覆盖计数值指导书最后一条要求是“在触摸屏上输入 6LED 会输出 6”。做法是在 HMI 上放一个 IO 域关联一个 Int 型的 DB 变量比如“段码_DB”.SetValue再在 PLC 里加一段当这个变量的值发生变化时把它赋给#count下一周期查表自然就显示对应数字。这里有个细节如果直接把 SetValue 当成显示索引循环显示就没法工作了因为两个来源在抢同一个变量。常见做法是加一个“手动设定”按钮按下时把 SetValue 拷进 count 并暂停自动循环再按启动才恢复。也有人在 IO 域的“数值更改”事件里直接写 PLC 变量效果一样但 HMI 事件里的脚本不好调试我一般放在 PLC 侧做。// 手动设定上升沿把 HMI 输入值写入显示计数 IF #setEdge(#manualSet) THEN IF 段码_DB.SetValue 0 AND 段码_DB.SetValue 9 THEN #count : 段码_DB.SetValue; END_IF; END_IF;参数上要注意两点。HMI 的 IO 域必须设成“输入/输出”模式只设“输出”的话触摸屏上点不动数据类型选 Int和 DB 变量一致选成 Byte 会在写入大于 127 时溢出。范围判断不能省否则输入 12 会去索引数组第 12 个元素直接触发数组越界CPU 报错停机。3.4 三个数码管显示学号后三位一次写好、调用三次课后作业要求在触摸屏上用三个八段管显示学号后三位指导书给的例子是 394。很多人的做法是复制三段几乎一样的程序改改地址结果定时器和中间变量全撞在一起。正确的做法是把“一个数码管显示一个数字”抽成带参数的 FC三个管调用同一个 FC只换输入数字和输出字节。// FC SEG_One —— 单个数码管输出指定位序的段码 VAR_INPUT digit : Int; // 要显示的数字 0~9 END_VAR VAR_IN_OUT outByte : Byte; // 该管对应的输出字节如 QB1 END_VAR VAR_TEMP idx : Int; END_VAR BEGIN // 限幅防止越界 idx : LIMIT(MN : 0, IN : digit, MX : 9); outByte : 段码_DB.segTable[idx]; END_FUNCTION调用时三个实例分别是SEG_One(digit : 3, outByte : QB1)、(digit : 9, outByte : QB2)、(digit : 4, outByte : QB3)前提是实验箱有三组独立的八段输出。如果只有一个字节的输出口就得加分时扫描每 5ms 切换一个管靠视觉暂留看成三个数字同时亮这时三个管的公共端要各自受一个 Q 点控制程序里用定时器轮流点亮扫描周期太慢会看到闪烁一般 1kHz 以上才稳。4. 智能交通灯控制六步状态机、手自动互锁与 HMI 动画交通灯实验比八段 LED 多了一层“时序 互锁”指导书里的描述是按灯一个个写实际写起来用状态机更清楚。核心是把一个完整周期拆成有限个步骤每一步只关心“这步哪些灯亮、亮多久、下一步是谁”而不是在一个大梯形图里堆一堆定时器串联。4.1 六步循环与定时器把灯的状态写成 CASE按常见的路口逻辑一个完整周期是南北绿 东西红 → 南北黄 东西红 → 南北红 东西绿 → 南北红 东西黄 → 回到第一步。指导书里给的地址是南北红 Q0.0、南北黄 Q0.1、南北绿 Q0.2、东西红 Q0.3、东西绿 Q0.5中间 Q0.4 没用到并且文本里有一处写成“南北方向绿灯输出 Q0.5”对照实物接线时要以实验箱端子标注为准别硬套文字描述。步序号南北东西持续时间说明0绿灯 Q0.2红灯 Q0.3GreenTime南北通行1黄灯 Q0.1红灯 Q0.3YellowTime南北过渡2红灯 Q0.0绿灯 Q0.5GreenTime东西通行3红灯 Q0.0黄灯 Q0.4YellowTime东西过渡// FC Traffic_Step —— 单定时器 步序号状态机 #stepTimer(IN : #running AND NOT #stepTimer.Q, PT : #stepTime); // 步时长由当前步决定 IF #stepTimer.Q THEN #step : #step 1; IF #step 3 THEN #step : 0; END_IF; END_IF; // 步时长选择绿灯步用 GreenTime黄灯步用 YellowTime IF #step 0 OR #step 2 THEN #stepTime : 交通灯_DB.GreenTime; ELSE #stepTime : 交通灯_DB.YellowTime; END_IF; // 输出打包用一个字节写六盏灯避免逐位置位漏灯 CASE #step OF 0: QB1 : 16#0C; // 南北绿 东西红 1: QB1 : 16#0A; // 南北黄 东西红 2: QB1 : 16#21; // 南北红 东西绿 3: QB1 : 16#11; // 南北红 东西黄 END_CASE;这段代码里最关键的是“单定时器”这个选择。按指导书的字面做法每一步配一个 TON四个定时器串起来能跑但手自动切换时要复位四个实例漏一个就会出现“灯灭了计时还在走”的怪现象。用一个定时器加步序号切换时只要把#running拉低、#step清 0状态自然归位。PT 的赋值放在定时器调用之后上一个扫描周期的值会在下一个周期生效对于秒级的交通灯完全无感。4.2 手自动切换的互锁切换沿必须全复位指导书定义 I0.1 为低电平时自动、高电平时手动手动状态下 I0.2 高电平南北通行、I0.3 高电平东西通行。这里的坑在于“切换瞬间”——自动运行到南北绿灯时切手动如果只是把输出交给手动逻辑东西红灯可能还亮着两个方向同时绿的画面在仿真里一眼就能看出来在实物上就是接线短路。// 手自动切换上升沿或下降沿都做一次全复位 IF #manualSw #manualSwOld THEN QB1 : 16#00; // 六灯全灭 #step : 0; #stepTimer(IN : FALSE); // 定时器复位 END_IF; #manualSwOld : #manualSw; // 手动分支 IF #manualSw THEN IF I0.2_NS THEN QB1 : 16#04; // 南北绿东西全灭 ELSIF I0.3_EW THEN QB1 : 16#20; // 东西绿南北全灭 ELSE QB1 : 16#00; END_IF; END_IF;互锁的判断顺序很重要。南北和东西同时为高时代码走IF ... ELSIF南北优先这样至少不会两方向都绿如果想更严格就在两个条件之外再加一个NOT判断两个同时按下直接全灭。QB1 打包输出比逐点写更稳因为每次赋值都是整字节覆盖不存在“上一步的灯忘了关”的可能。4.3 HMI 画面与变量绑定颜色动画和 IO 域怎么设HMI 这一层要做三件事画六个指示灯、放启动/停止按钮、加两个 IO 域输入通行时间和黄灯时间。灯不用找现成图形指导书里的做法是用矩形组合一个圆或一个矩形在“动画”里配颜色变化关联 PLC 的 Q 点变量值为 1 显示绿/黄/红值为 0 显示灰。变量绑定是最容易出错的地方。KTP700 里可选变量的表格会把 PLC 变量和 HMI 内部变量混在一起列名字相近的还不少选错之后仿真时灯永远不变色。判断方法很简单选中变量后看它的符号名路径是不是 “PLC 变量” 下的绝对地址比如 %Q0.2如果显示的是 “HMI 变量”那就是内部变量PLC 侧根本不认。更稳的做法是在 HMI 变量表里手工建一层映射把 Q0.2 起个别名“南北绿灯”动画只绑别名以后改地址只改一处。IO 域的设置有两个参数必须对模式选“输入/输出”格式选 Decimal关联的变量是 DB 里的 Time 类型时格式要选 Time 而不是 Int否则输入 5 会被当成 5 毫秒。时间值建议在 PLC 侧做限幅比如绿灯最小 5 秒、最大 60 秒防止手滑输入 0 导致状态机疯狂跳步。HMI 上再加一个当前步序号的显示调试时能直接看出程序卡在哪一步。4.4 仿真验证与强制表先看时序再看互锁TIA Portal V13 自带 PLCSIM能仿真 S7-1200HMI 侧用 WinCC Advanced 的仿真运行。下载顺序是先 PLC 后 HMI两个都进入运行态后HMI 上的按钮才能真正驱动变量。下载前把 PG/PC 接口设成 PLCSIM否则会提示找不到设备这一步在实物和仿真之间来回切的时候特别容易忘。验证分两轮。第一轮看时序启动后观察 QB1 的四个状态是否按 0→1→2→3 循环每一步的持续时间是否等于 HMI 上设的值用监控表把 QB1 和时间变量一起拖进去比盯着灯看可靠。第二轮看互锁自动运行到第 0 步时切手动确认六灯是否全灭手动状态下同时给 I0.2 和 I0.3确认不会出现南北绿和东西绿同时亮。验证项操作预期结果自动循环按 I0.0I0.1 保持低QB1 按 0C→0A→21→11 循环时间生效HMI 改绿灯时间为 10s每步绿灯段持续约 10s手自动切换运行中拨 I0.1 为高六灯立即全灭步序号归 0手动互锁手动下同时置 I0.2、I0.3只有南北绿亮或全灭不双绿5. 避坑与排查五个真实翻车现场这一章是整套实验里最值钱的部分。指导书不会写这些但每一个都真实发生过而且现象和原因之间往往隔着一层不知道的人能卡一整晚。5.1 复制粘贴程序段定时器编号撞车现象编译通过下载也正常但八段 LED 的几段显示同时跳变或者交通灯四个步骤的时长完全一样改一个时间参数全变。原因在梯形图里复制程序段时TIA 会把定时器的背景 DB 一起复制如果粘贴后没有重新分配实例多个 TON 引用的是同一个 DB等于所有步骤共用一个计时。指导书里那位同学遇到的正是这个他删掉全部定时器后从右侧指令库重新拖拽、逐个设编号才解决。解决复制含定时器的程序段后右键定时器实例选“更改实例”每个 TON 分配独立的背景 DB或者干脆改用 FB 的多重背景实例自动隔离。我现在的习惯是复制完先编译看“不一致”列表里有没有重复实例的警告。5.2 HMI 动画绑错变量灯永远不变色现象PLC 侧监控 Q0.2 确实在 0/1 翻转HMI 上的指示灯纹丝不动。原因动画里关联的是 HMI 内部变量或者关联了 PLC 变量但地址选成了 %I 而不是 %Q还有一种是选了同名 DB 里另一个路径的变量。解决打开 HMI 变量表逐个确认变量的“符号名”指向 PLC 绝对地址用交叉引用查这个变量在哪些地方被引用动画、IO 域、按钮事件都看一遍。养成习惯HMI 侧只使用自己建的映射变量不直接引用 PLC 变量表里的原始项改地址时只改一处。5.3 IP 不在同一网段下载提示找不到设备现象点下载进度条走到“正在寻址”就报错提示无法建立连接。原因有三种电脑网卡和 PLC 不在同一网段、PLC 实际 IP 还是出厂值没被改过、仿真时 PG/PC 接口选的是物理网卡而不是 PLCSIM。解决先用电脑 ping 一下 192.168.0.200通不了就查网线和网段能 ping 通但搜不到设备检查 TIA 里“可访问的设备”是否能扫出来仿真场景下把接口切到 PLCSIM 再下载。实物调试时把电脑防火墙关掉也能省不少事。5.4 八段显示乱码问题在位序不在程序现象段码表抄得没错程序里 MOVE 的值也对但数码管显示的是奇怪形状。原因物理接线顺序和编码假设不一致比如线接的是 a 到 dp 顺序程序里按 dp 到 a 位序排或者实验箱是共阳接法程序按共阴写的。解决先写一个只点亮单段的测试程序依次给 QB0 赋 0x01、0x02、0x04看哪一段亮把实际位序记下来再重排段码表。共阳的话整表按位取反。这一步花十分钟能省掉后面两小时盯着乱码发呆。5.5 手动切自动灯的状态不干净现象从手动切回自动第一步不是南北绿而是上一步遗留的灯还亮着或者两个方向的红灯同时亮。原因切换时只复位了步序号没有复位输出字节或者复位写在自动分支里手动分支的赋值在下一个周期又把它覆盖了。解决切换沿的判断放在所有分支之前先QB1 : 0再判方向切换后强制等一个扫描周期再允许自动逻辑运行用一个“切换中”标志延时一拍避免同一个周期内手动和自动都写 QB1。6. 进阶把两个实验收成一套可复用模板实验做完程序能跑但下次换个数码管数量、换个路口相位还得从头改一遍这就没意思了。我现在会把这两个实验收成一套模板核心就两点数据用表驱动逻辑用参数化块。段码表放 DB 数组位数变化只改数组长度和 FC 的调用次数逻辑不动。三数码管显示学号时把千位、百位、十位、个位拆成四行调用每个调用只换digit和outByte两个实参代码量从几十行降到四行。如果实验箱只有一个输出字节就加一个 5ms 的循环中断 OB30在中断里轮流点亮三位视觉上就是同时显示。// OB30 循环中断 5ms分时扫描三组数码管 #scanIdx : #scanIdx 1; IF #scanIdx 2 THEN #scanIdx : 0; END_IF; CASE #scanIdx OF 0: QB2 : 16#00; QB1 : 段码_DB.segTable[3]; // 百位 3 1: QB1 : 16#00; QB2 : 段码_DB.segTable[9]; // 十位 9 2: QB2 : 16#00; QB3 : 段码_DB.segTable[4]; // 个位 4 END_CASE;交通灯同理。把相位表做成 DB 里的结构体数组每个元素包含“南北灯状态、东西灯状态、持续时长”三个字段状态机只做一件事按索引取表、等时间、索引加一。改路口相位时改表不改代码六相位、八相位都能塞进去。手自动切换的复位逻辑抽成一个 FC两个实验共用切手动之前先调一次全复位比在每处都写一遍QB:0可靠。还有个小技巧把 HMI 的画面元素和 PLC 变量做成一一对应的命名规范比如“HMI_NS_Green”对应“Q0.2”变量表里按名字排序后一眼能看出哪些没绑上。仿真验证时先跑一轮空载把 QB 的时序用监控表导出来对照相位表逐行核比看灯快得多。从那以后我每次下载前都强制走一遍空载仿真加时序核对宁可多花十分钟也不想在实验箱前面蹲一晚上找那盏不该亮的灯。希望帮到你。本文还有配套的精品资源点击获取