导入到我的 TIA 项目
通过 TiaLink 把本示例的 7 个对象导入你当前打开的 TIA Portal 项目。导入前会先预检,默认不覆盖同名对象,导入后不会自动保存。
概述
这是一个三相位交通灯:东向 → 西向 → 北向循环放行,每相 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 |
工作流程
START 置位 STARTED,程序开始运行;STOP 复位 STARTED,全部灯熄灭;
COUNTER_STEP.CV=0 → 东向相位 STEP1 运行 20 秒(15 秒绿 + 5 秒黄);
STEP1 结束时产生下降沿 → 计数器 +1 → CV=1 → 西向相位 STEP2;
STEP2 结束 → CV=2 → 北向相位 STEP3;
STEP3 结束 → 计数器计到 3 后回到 0 → 重新从东向开始,循环往复。
MainOB
Network 1 — 启停保持(SR)
目的:用 START/STOP 控制整个信号灯的运行状态。
条件 → 动作:START 接到 SR 的置位端,STOP 接到复位端;STARTED 为 SR 的输出。
为什么:交通灯需要"按一下启动、按一下停止"的保持状态;SR 模块正好表达置位/复位优先关系。
注意:START/STOP 在点表里是 %M 位,不是物理输入;仿真时用 M 位强制即可。
逻辑:STARTED = SR(SET = START, RESET = STOP)
Network 2 — 相位计数器
目的:每相结束时把计数器加 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)
目的: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)
目的: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)
目的: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 — 东向灯输出
目的:把相位中间位汇总成东向的绿/黄/红。
条件 → 动作: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 — 西向灯输出
条件 → 动作: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 — 北向灯输出
条件 → 动作: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 和比较值),并补充对应的灯位映射。
- 夜间黄闪:加一个模式位,在夜间只让黄灯闪烁。
- 行人灯:按相位增加人行横道灯输出,逻辑结构与主灯一致。
变量与数据块
系统实例 DB(4 个)
TIA 自动生成的定时器/计数器实例 DB,导入示例时会一并导入。
COUNTER_STEP 实例 DB(IEC_COUNTER)
| 名称 | 数据类型 | 起始值 | 注释 |
| Static |
| CU | Bool | | |
| CD | Bool | | |
| R | Bool | | |
| LD | Bool | | |
| QU | Bool | | |
| QD | Bool | | |
| PV | Int | | |
| CV | Int | | |
STEP1 实例 DB(IEC_TIMER)
| 名称 | 数据类型 | 起始值 | 注释 |
| Static |
| PT | Time | | |
| ET | Time | | |
| IN | Bool | | |
| Q | Bool | | |
STEP2 实例 DB(IEC_TIMER)
| 名称 | 数据类型 | 起始值 | 注释 |
| Static |
| PT | Time | | |
| ET | Time | | |
| IN | Bool | | |
| Q | Bool | | |
STEP3 实例 DB(IEC_TIMER)
| 名称 | 数据类型 | 起始值 | 注释 |
| Static |
| PT | Time | | |
| ET | Time | | |
| IN | Bool | | |
| Q | Bool | | |