跳到正文
Learn-LAD
示例库/自动消毒流程

自动消毒流程

9 个网络的消毒流程时序:多步动作、条件互锁与输出控制。

综合 S7-1200 流程控制 多步动作 互锁

导入到我的 TIA 项目

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

TiaLink 设置

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

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

概述

这是一个单按钮步序链:用一个自复位按钮(unlock_button)配合"按下 / 松开"两种状态,一步步把 Tag_1 到 Tag_8 的步序标志依次置位;最后一步 Tag_8 触发一个定时器,输出极短的 sanitization 脉冲。

它更像一个步序骨架而不是完整设备程序:除了最后一步,中间标志都没有驱动实际输出。适合用来学习"自锁链"和"单按钮推进"的基本写法,也正好暴露了这种写法的几个典型坑(见"常见问题")。

信号表

信号 类型 含义 作用
unlock_button I 单按钮(自复位) 用"按下 / 松开"推进步序
Tag_1 M 第 1 步标志 按下按钮置位
Tag_2 M 第 2 步标志 松开后置位
Tag_3 M 第 3 步标志 条件与第 2 步相同
Tag_4 M 第 4 步标志 条件与第 2 步相同
Tag_5 M 第 5 步标志 再按一次置位
Tag_6 M 第 6 步标志 再松开置位
Tag_8 M 第 7 步标志 第三次按下置位(点表里另有未被使用的 Tag_7)
sanitization Q 消毒输出 由 Tag_8 触发,仅 10 ms
IEC_Timer_0_DB TP 脉冲定时器 PT = T#10MS

说明:每个 Tag_N 都是"步序标志",置位后靠自身触点保持(自锁),所以顺序一旦推进就不会自动退回。

工作流程

  1. 按一下 unlock_button → Tag_1 置位;
  2. 松开按钮 → Tag_2、Tag_3、Tag_4 接连置位(因为第 2~4 步的推进条件完全相同);
  3. 再按一下按钮 → Tag_5;
  4. 再松开 → Tag_6;
  5. 第三次按下 → Tag_8;
  6. Tag_8 触发 10 ms 脉冲 → sanitization 输出一个极短脉冲;
  7. 所有标志保持为 1,程序停在"完成"状态;当前程序没有复位逻辑。

MainOB

Network 1 — 第 1 步:按下启动

Network 1:unlock_button、Tag_1、Tag_1

目的:把第 1 步标志置位,作为整条链的起点。

条件 → 动作:按下 unlock_button(或 Tag_1 已经为 1)→ Tag_1 置位;松开按钮后由 Tag_1 自己的触点保持。

为什么:这是最基础的自锁写法——启动条件与自身触点并联。

逻辑:Tag_1 = unlock_button OR Tag_1

Network 2 — 第 2 步:松开按钮置位

Network 2:Tag_1、unlock_button、Tag_2、Tag_2

目的:第 1 步完成且按钮松开后,进入第 2 步。

条件 → 动作:Tag_1=1 且 unlock_button=0(松开)→ Tag_2 置位并自锁。

注意:第 3、4 步的推进条件与这里完全相同,所以只要按钮保持松开,Tag_2、Tag_3、Tag_4 会在一个扫描周期内接连置位,无法"一步一次"。

逻辑:Tag_2 = (Tag_1 AND NOT unlock_button) OR Tag_2

Network 3 — 第 3 步:条件同第 2 步

Network 3:Tag_2、unlock_button、Tag_3、Tag_3

目的:在 Tag_2 的基础上继续推进。

条件 → 动作:Tag_2=1 且按钮松开 → Tag_3 置位并自锁。

注意:由于 Tag_2 已在按钮松开时置位,本步会紧接着第 2 步在同一个按钮状态下完成。若希望它需要一个新的按钮动作,需要把条件改成"按钮松开→再按下"的边沿(见"变体与扩展")。

逻辑:Tag_3 = (Tag_2 AND NOT unlock_button) OR Tag_3

Network 4 — 第 4 步:条件同第 2 步

Network 4:Tag_3、unlock_button、Tag_4、Tag_4

目的:继续推进到第 4 步。

条件 → 动作:Tag_3=1 且按钮松开 → Tag_4 置位并自锁。

注意:同样与第 2、3 步几乎同时完成;这一组"连跳三步"是本程序最需要留意的行为。

逻辑:Tag_4 = (Tag_3 AND NOT unlock_button) OR Tag_4

Network 5 — 第 5 步:再次按下

Network 5:Tag_4、unlock_button、Tag_5、Tag_5

目的:第 5 步改为"按下按钮"推进,与前面拉开区别。

条件 → 动作:Tag_4=1 且按钮按下 → Tag_5 置位并自锁。

为什么:这一步利用了按钮的另一种状态,配合前面几步就形成了"按下 → 松开 → 再按下"的推进节奏。

逻辑:Tag_5 = (Tag_4 AND unlock_button) OR Tag_5

Network 6 — 第 6 步:再次松开

Network 6:Tag_5、unlock_button、Tag_6、Tag_6

目的:松开按钮后进入第 6 步。

条件 → 动作:Tag_5=1 且按钮松开 → Tag_6 置位并自锁。

逻辑:Tag_6 = (Tag_5 AND NOT unlock_button) OR Tag_6

Network 7 — 第 7 步:第三次按下

Network 7:Tag_6、unlock_button、Tag_8、Tag_8

目的:第三次按下按钮,进入最后一步。

条件 → 动作:Tag_6=1 且按钮按下 → Tag_8 置位并自锁。

注意:程序的标志编号从 Tag_6 跳到 Tag_8;点表里其实定义了 Tag_7(%M0.7),只是本程序没有使用,读的时候容易误会"漏了一步"。

逻辑:Tag_8 = (Tag_6 AND unlock_button) OR Tag_8

Network 8 — 消毒输出:10 ms 脉冲

Network 8:Tag_8、sanitization

目的:最后一步触发消毒输出。

条件 → 动作:Tag_8=1 触发 TP(脉冲定时器),sanitization 输出保持 PT 指定的时长,然后自动关。

为什么:TP 的特点是"触发一次、输出固定保持一段时间",适合做点动或脉冲输出。

注意:PT 的导出值是 T#10MS,也就是 10 毫秒——对"消毒"来说通常太短。如果原意是 10 分钟,应改为 T#10M。这很可能是原工程的笔误,也是本示例最值得记住的坑。

逻辑:sanitization = IEC_Timer_0_DB.Q(IN = Tag_8, PT = T#10MS)

常见问题

  • 为什么一松手就跳过了好几步? 第 2、3、4 步的推进条件相同(都是"按钮松开"),条件一满足就连续置位。要严格一步一步来,需要让每步有各自独立的触发条件。
  • 消毒输出几乎看不见:PT = T#10MS 是 10 毫秒;改成 T#10M 才是 10 分钟(若原意如此)。
  • 流程跑完后无法重新开始:所有步序标志都是自锁的,程序里没有复位网络。加一段"复位"逻辑即可重新开始。
  • Tag_7 去哪了? 点表里有 Tag_7(%M0.7),但程序没有引用它;属于命名/使用上的不一致,不影响逻辑。

变体与扩展

  • 严格的单按钮步进:用上升沿指令(PBox/R_TRIG)检测按钮的每一次按下,并把"上一步标志 + 新一次按下沿"作为下一步的置位条件,这样每次按钮动作只前进一步。
  • 加复位网络:增加一个网络,用复位按钮或流程结束条件把 Tag_1…Tag_8 统一清零(可以逐个复位线圈,或用一个 MOVE 批量写 0)。
  • 变成真正的流程:把每一步的 Tag_N 接到对应执行机构的线圈上,就得到一个完整的多步顺序控制程序;步与步之间可按需要加互锁和超时监控。

变量与数据块

变量表:Default tag table

名称数据类型地址注释
unlock_buttonBool%I0.0
sanitizationBool%Q0.0
Tag_1Bool%M0.0
Tag_2Bool%M0.1
Tag_3Bool%M0.2
Tag_4Bool%M0.3
Tag_5Bool%M0.4
Tag_6Bool%M0.5
Tag_7Bool%M0.7
Tag_8Bool%M0.6
系统实例 DB(1 个)

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

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

下一步