跳到正文
Learn-LAD
示例库/交通灯控制

交通灯控制

三相位(东/西/北)红绿灯循环:每相 20 秒(15 秒绿 + 5 秒黄),用计数器切换相位。

综合 S7-1200 交通灯 定时器 计数器 顺序控制

导入到我的 TIA 项目

通过 TiaLink 把本示例的 7 个对象导入你当前打开的 TIA Portal 项目。导入前会先预检,默认不覆盖同名对象,导入后不会自动保存。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

概述

这是一个三相位交通灯:东向 → 西向 → 北向循环放行,每相 20 秒(前 15 秒绿灯,后 5 秒黄灯),其余方向红灯。

程序用 SR 启停 + 计数器换相 + 三个 20 秒 TP + 比较指令做绿/黄切换,共 8 个可见网络,是"状态机 + 定时 + 比较"的综合作业。点表里的 START/STOP 是 %M 内部位,通常由 HMI 或面板按钮驱动。

信号表

信号 类型 含义 作用
START / STOP M 启动/停止 控制 STARTED 启停保持
STARTED M 运行标志 SR 输出;所有相位的总使能
COUNTER_STEP CTU 相位计数器(PV=3) 每相结束 +1,计到 3 回 0
STEP1 TP 东向相位 20 秒 CV=0 时运行
STEP2 TP 西向相位 20 秒 CV=1 时运行
STEP3 TP 北向相位 20 秒 CV=2 时运行
STEP*_FINISHED M 下降沿存储位 三个 NContact 的边沿检测位
EAST_* / WEST_* / NORTH_* M 各方向灯中间位 绿/黄/红
EAST_GREEN/RED/YELLOW 等 M 方向灯汇总 由相位信号映射
说明 点表中的实际输出是这些灯位;如果接实体灯,需要映射到 %Q

工作流程

  1. START 置位 STARTED,程序开始运行;STOP 复位 STARTED,全部灯熄灭;
  2. COUNTER_STEP.CV=0 → 东向相位 STEP1 运行 20 秒(15 秒绿 + 5 秒黄);
  3. STEP1 结束时产生下降沿 → 计数器 +1 → CV=1 → 西向相位 STEP2;
  4. STEP2 结束 → CV=2 → 北向相位 STEP3;
  5. STEP3 结束 → 计数器计到 3 后回到 0 → 重新从东向开始,循环往复。

MainOB

Network 1 — 启停保持(SR)

Network 1:START、STOP、STARTED

目的:用 START/STOP 控制整个信号灯的运行状态。

条件 → 动作:START 接到 SR 的置位端,STOP 接到复位端;STARTED 为 SR 的输出。

为什么:交通灯需要"按一下启动、按一下停止"的保持状态;SR 模块正好表达置位/复位优先关系。

注意:START/STOP 在点表里是 %M 位,不是物理输入;仿真时用 M 位强制即可。

逻辑:STARTED = SR(SET = START, RESET = STOP)

Network 2 — 相位计数器

Network 2:STEP1.Q、STEP2.Q、STEP3.Q

目的:每相结束时把计数器加 1,用 CV 选择下一相。

条件 → 动作:STEP1.Q、STEP2.Q、STEP3.Q 的下降沿(NContact)并联送入 CTU 的 CU;PV=3,计到 3 后 CV 回 0。

为什么:用一个计数器代替三个互锁的状态位,相位切换逻辑更简洁;STEP*_FINISHED 是三个 NContact 的边沿存储位。

注意:NContact 检测的是"下降沿"——也就是定时器脉冲结束的瞬间;不是定时器一启动就加。

逻辑:COUNTER_STEP = CTU(CU = FALLING(STEP1.Q) OR FALLING(STEP2.Q) OR FALLING(STEP3.Q), PV = 3)

Network 3 — 西向相位(CV=1)

Network 3 — STEP 1:STARTED、STEP2_WEST_GREEN、STEP2_EAST_RED、STEP2_NORTH_RED、STEP2_WEST_YELLOW

目的:CV=1 时运行西向 20 秒相位。

条件 → 动作:STARTED=1 且 COUNTER_STEP.CV=1 → TP STEP2 输出 20 秒;其中 ET<15s 时 STEP2_WEST_GREEN=1,15s<ET<20s 时 STEP2_WEST_YELLOW=1;对向东向/北向保持红灯。

为什么:用比较指令把 20 秒拆成"绿 15 秒 + 黄 5 秒",不用额外的定时器。

注意:原工程的网络注释写的是 "STEP 1",但逻辑用的是 STEP2(CV=1)——注释和编号错位,以逻辑为准。

逻辑(节选): STEP2_WEST_GREEN = TP(IN = STARTED AND COUNTER_STEP.CV = 1, PT = T#20S).Q AND STEP2.ET < T#15S

STEP2_WEST_YELLOW = TP(...).Q AND STEP2.ET > T#15S AND STEP2.ET < T#20S

Network 4 — 东向相位(CV=0)

Network 4 — STEP 2:STARTED、STEP1_EAST_GREEN、STEP1_NORTH_RED、STEP1_WEST_RED、STEP1_EAST_YELLOW

目的:CV=0 时运行东向 20 秒相位。

条件 → 动作:STARTED=1 且 CV=0 → TP STEP1;ET<15s 绿、15s<ET<20s 黄;西向/北向红。

为什么:与西向相位结构完全对称,只是选择条件变成 CV=0。

注意:原工程注释写 "STEP 2",实际是东向(STEP1,CV=0);同样以逻辑为准。

逻辑(节选):STEP1_EAST_GREEN = TP(IN = STARTED AND COUNTER_STEP.CV = 0, PT = T#20S).Q AND STEP1.ET < T#15S

Network 5 — 北向相位(CV=2)

Network 5 — STEP3:STARTED、STEP3_NORTH_GREEN、STEP3_WEST_RED、STEP3_EAST_RED、STEP3_NORTH_YELLOW

目的:CV=2 时运行北向 20 秒相位。

条件 → 动作:STARTED=1 且 CV=2 → TP STEP3;绿/黄拆分同上;东向/西向红。

逻辑(节选):STEP3_NORTH_GREEN = TP(IN = STARTED AND COUNTER_STEP.CV = 2, PT = T#20S).Q AND STEP3.ET < T#15S

Network 6 — 东向灯输出

Network 6 — EAST:STEP1_EAST_GREEN、EAST_GREEN、STEP2_EAST_RED、STEP3_EAST_RED、EAST_RED、STEP1_EAST_YELLOW、EAST_YELLOW

目的:把相位中间位汇总成东向的绿/黄/红。

条件 → 动作:EAST_GREEN=STEP1_EAST_GREEN;EAST_YELLOW=STEP1_EAST_YELLOW;EAST_RED=STEP2_EAST_RED OR STEP3_EAST_RED。

为什么:红灯在另外两相都亮,用"或"把两个红灯条件合并。

逻辑:EAST_RED = STEP2_EAST_RED OR STEP3_EAST_RED

Network 7 — 西向灯输出

Network 7 — WEST:STEP2_WEST_GREEN、WEST_GREEN、STEP1_WEST_RED、STEP3_WEST_RED、WEST_RED、STEP2_WEST_YELLOW、WEST_YELLOW

条件 → 动作:WEST_GREEN=STEP2_WEST_GREEN;WEST_YELLOW=STEP2_WEST_YELLOW;WEST_RED=STEP1_WEST_RED OR STEP3_WEST_RED。

逻辑:WEST_RED = STEP1_WEST_RED OR STEP3_WEST_RED

Network 8 — 北向灯输出

Network 8 — NORTH:STEP3_NORTH_GREEN、NORTH_GREEN、STEP2_NORTH_RED、STEP1_NORTH_RED、NORTH_RED、STEP3_NORTH_YELLOW、NORTH_YELLOW

条件 → 动作:NORTH_GREEN=STEP3_NORTH_GREEN;NORTH_YELLOW=STEP3_NORTH_YELLOW;NORTH_RED=STEP1_NORTH_RED OR STEP2_NORTH_RED。

逻辑:NORTH_RED = STEP1_NORTH_RED OR STEP2_NORTH_RED

常见问题

  • 相位不切换:检查计数器是否在步进(STEP*_FINISHED 是 NContact 的边沿存储位,不是"未使用");三个定时器的下降沿都应能触发 CU。
  • 注释和相位对不上:原工程 Network 3/4 的注释编号错位,按 CV 和实际网络逻辑理解。
  • 灯没有输出到物理点:本程序的灯位都在 %M,如果接实体灯,需要把这些中间位映射到 %Q 输出。
  • 想改相位时长:三个 TP 的 PT(20 秒)和比较阈值(15 秒)要一起改。

变体与扩展

  • 四相位/带左转:增加相位(计数器 PV 和比较值),并补充对应的灯位映射。
  • 夜间黄闪:加一个模式位,在夜间只让黄灯闪烁。
  • 行人灯:按相位增加人行横道灯输出,逻辑结构与主灯一致。

变量与数据块

变量表:Default tag table

名称数据类型地址注释
(空变量表)

变量表:Tag table_1

名称数据类型地址注释
STARTBool%M0.0
STOPBool%M0.1
STARTEDBool%M0.2
STEP1_EAST_GREENBool%M0.3
STEP1_WEST_REDBool%M0.4
STEP1_NORTH_REDBool%M0.5
STEP1_EAST_YELLOWBool%M0.6
STEP1_FINISHEDBool%M0.7
STEP2_WEST_GREENBool%M1.0
STEP2_EAST_REDBool%M1.1
STEP2_NORTH_REDBool%M1.2
STEP2_WEST_YELLOWBool%M1.3
STEP2_FINISHEDBool%M1.4
STEP3_NORTH_GREENBool%M1.5
STEP3_WEST_REDBool%M1.6
STEP3_EAST_REDBool%M1.7
STEP3_NORTH_YELLOWBool%M2.0
STEP3_FINISHEDBool%M2.1
EAST_GREENBool%M2.2
EAST_YELLOWBool%M2.3
EAST_REDBool%M2.4
NORTH_REDBool%M2.5
NORTH_GREENBool%M2.6
NORTH_YELLOWBool%M2.7
WEST_REDBool%M3.0
WEST_GREENBool%M3.1
WEST_YELLOWBool%M3.2
系统实例 DB(4 个)

TIA 自动生成的定时器/计数器实例 DB,导入示例时会一并导入。

COUNTER_STEP 实例 DB(IEC_COUNTER)
名称数据类型起始值注释
Static
CUBool
CDBool
RBool
LDBool
QUBool
QDBool
PVInt
CVInt
STEP1 实例 DB(IEC_TIMER)
名称数据类型起始值注释
Static
PTTime
ETTime
INBool
QBool
STEP2 实例 DB(IEC_TIMER)
名称数据类型起始值注释
Static
PTTime
ETTime
INBool
QBool
STEP3 实例 DB(IEC_TIMER)
名称数据类型起始值注释
Static
PTTime
ETTime
INBool
QBool

下一步