SCL F_TRIG — 下降沿检测
检测 1→0 的下降沿,Q 只在一个扫描周期为 1;需要实例。
边沿
S7-1200/1500
TIA V19
别名:Detect negative signal edge / 下降沿 / F_TRIG / Negative edge
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_FTrig_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:用 #Trig(CLK := #Signal) 调用 F_TRIG,读 #Trig.Q;Q 只在 CLK 从 1 变 0 的那个扫描周期为 1。
F_TRIG 检测信号的 1→0 下降沿:CLK 从 1 变 0 的那个扫描周期,Q 为 1;下一周期自动回 0。SCL 里用 #Trig(CLK := #Signal) 调用,再用 #Trig.Q 读结果。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
CLK | 输入 | BOOL | I, Q, M, D, L, P | 被检测的信号。F_TRIG 比较本周期的 CLK 与实例里保存的上一周期值。 |
Q | 输出 | BOOL | I, Q, M, D, L, P | 下降沿输出。CLK 从 1 变 0 的那个扫描周期为 1,下一周期自动回 0。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_FTrig_Demo FB
最小示例 · 22 行 · 源文件 blocks/FB_FTrig_Demo.scl
查看 FB_FTrig_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Signal | Bool | |
| 输出 | Falling | Bool | |
| 静态 | Trig | F_TRIG | |
blocks/FB_FTrig_Demo.scl
1FUNCTION_BLOCK "FB_FTrig_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Signal : Bool;
6 END_VAR
7
8 VAR_OUTPUT
9 Falling : Bool;
10 END_VAR
11
12 VAR
13 Trig : F_TRIG;
14 END_VAR
15
16BEGIN
17 REGION 检测下降沿
18 #Trig(CLK := #Signal);
19 #Falling := #Trig.Q;
20 END_REGION
21END_FUNCTION_BLOCK
22
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1VAR
2 Trig : F_TRIG;
3END_VAR
4
5#Trig(CLK := #Signal);
6#Falling := #Trig.Q;
也可以直接声明全局实例 DB,或用 Q => 把输出接到变量:
SCL
1"F_TRIG_DB"(CLK := "TagIn", Q => "TagOut");
怎么工作
本周期 CLK |
上一周期 CLK |
Q |
| 1 |
1 |
0 |
| 0 |
1 |
1(仅本周期) |
| 0 |
0 |
0 |
| 1 |
0 |
0 |
- 实例里保存上一周期的
CLK;每次调用先比较,再更新。
Q 是单周期脉冲,不能直接当持续使能。
- 调用被跳过时上一周期状态不更新,下次调用可能把跨周期变化误判成边沿。
F_TRIG 比较当前 CLK 和实例保存的上一周期值;Q 只在 1→0 的扫描周期为 1。
常用场景
1. 停止/复位事件
按钮松开、设备停止、传感器离开时产生一个单周期事件;用 F_TRIG 抓下降沿,避免在信号保持为 0 期间反复触发。
2. 计数下降沿
某些流量计或编码器用下降沿计数;把 F_TRIG 的 Q 接到 CTD 的 CD 或 CTU 的 CU。
3. 状态机离开条件
状态机里“离开某状态”只需要一次动作时,用 F_TRIG 把条件消失变成单周期事件。
常见坑
- 用
NOT Signal AND Signal 做下降沿:同一个变量不可能同时为 1 和 0;必须和上一周期比较。
- Q 只亮一个周期:不要拿 Q 直接驱动需要保持的输出;用置位/自锁/状态机。
- 实例复用:多个信号共用一个 F_TRIG 实例会互相覆盖。
- 跳过调用:把 F_TRIG 放在不执行的分支里,边沿可能丢失。
- 首次扫描:实例初始上一周期值为 0;如果信号初始就是 0,第一次调用不会被当成下降沿(上一周期也是 0);如果初始为 1,则下一次变 0 才触发。
- 和 R_TRIG 混用:需要同时检测两个沿时用两个独立实例,不要试图用一个实例兼顾。
云仿真验证
PLC 云仿真:PASS(5 次扫描)。场景:下降沿只出现一个扫描周期。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。
查看云仿真回归输出
云仿真回归输出
PASS 下降沿只出现一个扫描周期 (5 step(s), 5 scan(s))
RESULT: ALL PASS (5 scan(s))
云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Bit_logic_operations/F_TRIG__Detect_negative_signal_edge.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
边沿语义和实例要求以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
F_TRIG 和 R_TRIG 有什么区别?
R_TRIG 检测 0→1 上升沿,F_TRIG 检测 1→0 下降沿;Q 都只在一个扫描周期为 1,都需要实例保存上一周期状态。
F_TRIG 的 Q 为什么只亮一下就没了?
这是设计行为:Q 只在一个扫描周期为 1。要驱动持续动作,用 Q 去置位一个 Bool 或进状态机保持。
多个信号能共用一个 F_TRIG 实例吗?
不能。实例里只保存一个上一周期值,多个信号共用会互相覆盖,边沿可能丢失或误判。