简介:这份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 地址 | 连接方式 |
|---|---|---|---|
| PLC | CPU1214 DC/DC/DC,6ES7 214-1AG40-0XB0 | 192.168.0.200 | PROFINET |
| HMI | KTP700 Basic PN | 192.168.0.201 | PROFINET |
| 编程电脑 | 任意装 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_Btn | I0.0 | Bool | 启动,常开 |
| Stop_Btn | I0.1 | Bool | 停止/手自动切换,实验二里复用 |
| NS_Green | Q0.2 | Bool | 南北绿灯 |
| EW_Red | Q0.3 | Bool | 东西红灯 |
| Seg_Out | QB0 | Byte | 八段数码管段码输出 |
| GreenTime | 交通灯_DB.GreenTime | Time | HMI 可写的绿灯时长 |
2.3 OB1 与 FC 的分工:主循环只做调用
程序结构上,Main(OB1)不要塞逻辑,只做块调用和必要的初始化。八段 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) | 十六进制 |
|---|---|---|---|
| 0 | a b c d e f | 0011 1111 | 0x3F |
| 1 | b c | 0000 0110 | 0x06 |
| 2 | a b d e g | 0101 1011 | 0x5B |
| 3 | a b c d g | 0100 1111 | 0x4F |
| 4 | b c f g | 0110 0110 | 0x66 |
| 5 | a c d f g | 0110 1101 | 0x6D |
| 6 | a c d e f g | 0111 1101 | 0x7D |
| 7 | a b c | 0000 0111 | 0x07 |
| 8 | a b c d e f g | 0111 1111 | 0x7F |
| 9 | a b c d f g | 0110 1111 | 0x6F |
注意:如果实验箱是共阳接法,把上表每个值按位取反再送输出,例如 0 变成 0xC0。不要试图在程序里临时算,直接建两张表切换更省事。
3.2 定时器 + 计数器 + MOVE:1s 自增循环的骨架
指导书里的做法是“接通延时定时器 PT 设 1s,1s 后自动接通”,再配合计数器加一,把结果 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 覆盖计数值
指导书最后一条要求是“在触摸屏上输入 6,LED 会输出 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.3 | GreenTime | 南北通行 |
| 1 | 黄灯 Q0.1 | 红灯 Q0.3 | YellowTime | 南北过渡 |
| 2 | 红灯 Q0.0 | 绿灯 Q0.5 | GreenTime | 东西通行 |
| 3 | 红灯 Q0.0 | 黄灯 Q0.4 | YellowTime | 东西过渡 |
// 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-1200,HMI 侧用 WinCC Advanced 的仿真运行。下载顺序是先 PLC 后 HMI,两个都进入运行态后,HMI 上的按钮才能真正驱动变量。下载前把 PG/PC 接口设成 PLCSIM,否则会提示找不到设备,这一步在实物和仿真之间来回切的时候特别容易忘。
验证分两轮。第一轮看时序:启动后观察 QB1 的四个状态是否按 0→1→2→3 循环,每一步的持续时间是否等于 HMI 上设的值,用监控表把 QB1 和时间变量一起拖进去,比盯着灯看可靠。第二轮看互锁:自动运行到第 0 步时切手动,确认六灯是否全灭;手动状态下同时给 I0.2 和 I0.3,确认不会出现南北绿和东西绿同时亮。
| 验证项 | 操作 | 预期结果 |
|---|---|---|
| 自动循环 | 按 I0.0,I0.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 的时序用监控表导出来,对照相位表逐行核,比看灯快得多。从那以后我每次下载前都强制走一遍空载仿真加时序核对,宁可多花十分钟,也不想在实验箱前面蹲一晚上找那盏不该亮的灯。希望帮到你。
本文还有配套的精品资源,点击获取