跳到正文
Learn-LAD
示例库/自动窗帘控制

自动窗帘控制

用脉冲定时器与逻辑组合实现窗帘的自动开合与限位控制。

进阶 S7-1200 定时器 TP 或逻辑

导入到我的 TIA 项目

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

TiaLink 设置

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

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

概述

用一个按钮(pb open)的"按下 / 松开"节奏来控制窗帘:第一次按下松开后触发一个 30 秒的动作窗口;再次按下则触发第二个 30 秒窗口;两个窗口不会重叠。

它把单按钮顺序(按下/松开产生不同步骤)和脉冲定时器组合成 7 个网络,适合学习"用有限输入表达多个动作"的思路,也能看到这种写法容易变复杂的地方。

信号表

信号 类型 含义 作用
pb open I 控制按钮 按下/松开产生不同步骤
Tag_1 M 第 1 步 按下时置位
Tag_2 M 第 2 步 松开时置位;触发窗口 1
Tag_3 M 第 3 步 再次按下时置位
Tag_4 M 窗口 1 第 2 步触发,30 秒
Tag_5 M 窗口 2 第 3 步触发(窗口 1 已结束时),30 秒
curtain Q 窗帘输出 两个窗口任一有效
IEC_Timer_0_DB / _1 TP 各 30 秒 两个动作窗口

工作流程

  1. 第一次按下 pb open → Tag_1 置位;
  2. 松开 → Tag_2 置位,同时触发 30 秒的窗口 1(Tag_4)→ curtain=1 动作 30 秒;
  3. 第二次按下 → Tag_3 置位;
  4. 如果窗口 1 已经结束(Tag_4=0),窗口 2(Tag_5)触发 → curtain=1 再动作 30 秒;
  5. 两个窗口结束后 curtain 归 0,等待下一次操作。

MainOB

Network 1 — 第一次按下

Network 1:pb open、Tag_1、Tag_1

目的:记录按钮被按下。

条件 → 动作:按下 pb open → Tag_1 置位并自锁。

为什么:Tag_1 是"按下过"的标记,供下一步在松开时使用。

逻辑:Tag_1 = (pb open OR Tag_1)

Network 2 — 松开触发窗口 1

Network 2:Tag_1、Tag_2、pb open、Tag_2

目的:松开按钮后进入第 2 步,并准备触发动作窗口。

条件 → 动作:Tag_1=1(按下过)且 pb open=0(松开)→ Tag_2 置位并自锁。

为什么:用"已按下 + 现在松开"判断松开动作,避免按钮没按过就触发。

注意:Tag_2 一旦置位就保持,后续窗口判断依赖它,读图时要记住它不会自动清零。

逻辑:Tag_2 = (Tag_1 OR Tag_2) AND NOT pb open

Network 3 — 再次按下

Network 3:Tag_2、Tag_3、pb open、Tag_3

目的:识别第二次按下。

条件 → 动作:Tag_2=1(已经松开过)且 pb open=1(再次按下)→ Tag_3 置位并自锁。

为什么:Tag_3 代表"第二次按下",与窗口 2 的触发条件配合使用。

逻辑:Tag_3 = (Tag_2 OR Tag_3) AND pb open

Network 4 — 窗口 1:30 秒

Network 4:Tag_2、Tag_4

目的:松开后输出一个 30 秒的动作窗口。

条件 → 动作:Tag_2=1 触发 TP → Tag_4 输出 30 秒。

为什么:TP 保证窗口完整,不依赖按钮或其他条件维持。

逻辑:Tag_4 = TP(IN = Tag_2, PT = T#30s).Q

Network 5 — 窗口 2:30 秒

Network 5:Tag_3、Tag_4、Tag_5

目的:第二次按下后输出第二个 30 秒窗口,但避免与窗口 1 重叠。

条件 → 动作:Tag_3=1 且 Tag_4=0(窗口 1 已结束)→ 触发 TP → Tag_5 输出 30 秒。

为什么:NOT Tag_4 是互锁条件,防止两个窗口同时动作;如果窗口 1 还没结束,窗口 2 会等到下一轮。

逻辑:Tag_5 = TP(IN = Tag_3 AND NOT Tag_4, PT = T#30s).Q

Network 6 — 窗帘输出

Network 6:Tag_4、Tag_5、curtain

目的:把两个窗口合并成窗帘输出。

条件 → 动作:Tag_4=1 或 Tag_5=1 → curtain=1。

为什么:两个窗口是"或"关系,任意一个有效就动作。用一个输出线圈合并,后续接线只需要一根输出。

逻辑:curtain = Tag_4 OR Tag_5

常见问题

  • 窗帘没动作:确认按钮操作顺序(按下→松开→再按下);Tag_2/Tag_3 都是保持的,顺序错了后面的步骤不会触发。
  • 第二次动作不来:如果窗口 1 还没走完 30 秒,窗口 2 不会触发;等 Tag_4 结束再按。
  • 想只做开/关两档:这种单按钮多步写法对初学者偏复杂,可以改用两个独立按钮直接控制。

变体与扩展

  • 简化成开/关:用两个按钮(开、关)各自触发一个 30 秒窗口,逻辑更直观。
  • 加限位保护:在 curtain 输出前串"上限位/下限位"条件,避免电机堵转。
  • 改为状态机:用 Tag_1/Tag_2/Tag_3 作为状态位,通过 CASE/IF 统一管理,比散落的线圈更清晰。

变量与数据块

变量表:Default tag table

名称数据类型地址注释
pb openBool%I0.0
curtainBool%Q0.0
Tag_1Bool%M0.0
Tag_2Bool%M0.1
Tag_3Bool%M0.2
Tag_4Bool%M0.3
Tag_5Bool%M0.4
系统实例 DB(2 个)

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

IEC_Timer_0_DB 实例 DB(IEC_TIMER)
名称数据类型起始值注释
Static
PTTime
ETTime
INBool
QBool
IEC_Timer_0_DB_1 实例 DB(IEC_TIMER)
名称数据类型起始值注释
Static
PTTime
ETTime
INBool
QBool

下一步