SCL R_TRIG — 上升沿检测
检测 0→1 的上升沿,Q 只在一个扫描周期为 1;需要实例。
边沿
S7-1200/1500
TIA V19
别名:Detect positive signal edge / 上升沿 / R_TRIG / Positive edge
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_RTrig_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:用 #Trig(CLK := #Signal) 调用 R_TRIG,读 #Trig.Q;Q 只在 CLK 从 0 变 1 的那个扫描周期为 1。
R_TRIG 检测信号的 0→1 上升沿:CLK 从 0 变 1 的那个扫描周期,Q 为 1;下一周期自动回 0。SCL 里用 #Trig(CLK := #Signal) 调用,再用 #Trig.Q 读结果。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
CLK | 输入 | BOOL | I, Q, M, D, L, P | 被检测的信号。R_TRIG 比较本周期的 CLK 与实例里保存的上一周期值。 |
Q | 输出 | BOOL | I, Q, M, D, L, P | 上升沿输出。CLK 从 0 变 1 的那个扫描周期为 1,下一周期自动回 0。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_RTrig_Demo FB
最小示例 · 23 行 · 源文件 blocks/FB_RTrig_Demo.scl
查看 FB_RTrig_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Signal | Bool | |
| 输出 | Rising | Bool | |
| 静态 | Trig | R_TRIG | |
blocks/FB_RTrig_Demo.scl
1FUNCTION_BLOCK "FB_RTrig_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Signal : Bool;
6 END_VAR
7
8 VAR_OUTPUT
9 Rising : Bool;
10 END_VAR
11
12 VAR
13 Trig : R_TRIG;
14 END_VAR
15
16BEGIN
17 REGION 检测上升沿
18
19 #Trig(CLK := #Signal);
20 #Rising := #Trig.Q;
21 END_REGION
22END_FUNCTION_BLOCK
23
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
在 FB 的 Static 里声明一个 R_TRIG 实例:
SCL
1VAR
2 Trig : R_TRIG;
3END_VAR
4
5#Trig(CLK := #Signal);
6#Rising := #Trig.Q;
也可以直接声明全局实例 DB,或用 Q => 把输出接到变量:
SCL
1"R_TRIG_DB"(CLK := "TagIn", Q => "TagOut");
注意:R_TRIG 是 FB,必须有实例;不能像普通函数那样只写 R_TRIG(CLK := ...) 而没有实例。
怎么工作
本周期 CLK |
上一周期 CLK |
Q |
| 0 |
0 |
0 |
| 1 |
0 |
1(仅本周期) |
| 1 |
1 |
0 |
| 0 |
1 |
0 |
- R_TRIG 的实例里存着上一周期的
CLK;每次调用先比较,再更新。
Q 是单周期脉冲,不能直接当持续使能;要持续动作就置位一个 Bool 或进状态机。
- 如果调用被跳过,上一周期状态不会更新,下一次调用可能把跨周期的变化误判成边沿。
R_TRIG 比较当前 CLK 和实例保存的上一周期值;Q 只在 0→1 的扫描周期为 1。
常用场景
1. 按钮点动转自锁
按钮 Start 是点动信号;用 R_TRIG 抓到上升沿后,置位 Run,再用 Stop 复位。这样按住按钮不会反复触发。
2. 产量计数
零件到位传感器每来一个零件产生一个上升沿;用 R_TRIG 的 Q 去做 CTU 的 CU,避免传感器保持为 1 时每个扫描都计数。
3. 状态机启动
CASE 状态机里,用 R_TRIG 把“启动按钮按下”变成一个单周期事件,避免在 Start 保持期间反复进入启动分支。
常见坑
- 用
Signal AND NOT Signal 做上升沿:同一个变量不可能同时为 1 和 0;必须和上一周期比较,R_TRIG 就是干这个的。
- Q 只亮一个周期:不要拿 Q 直接驱动需要保持的输出;用置位、自锁或状态机保持。
- 实例复用:多个信号共用一个 R_TRIG 实例,上一周期状态会互相覆盖;每个信号一个实例。
- 跳过调用:把 R_TRIG 放在
IF 分支里,分支不执行时实例不更新,下一次调用可能把长时间的变化当成边沿。
- 首次扫描:实例初始的上一周期值是 0;如果信号初始就是 1,第一次调用会被当成上升沿,需要按工艺决定是否屏蔽首次扫描。
和 LAD 的区别
LAD 里 R_TRIG 是一个带 CLK 和 Q 的盒,边沿结果通常直接串到后面的线圈;SCL 里必须显式调用实例并读 Q,更适合把边沿结果当布尔变量参与 IF/CASE 或计数。梯形图版本见 Learn-LAD 的 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/R_TRIG__Detect_positive_signal_edge.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
边沿语义和实例要求以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
SCL 里上升沿为什么要用 R_TRIG,不能直接写 Signal AND NOT Signal?
同一个变量在本周期既为 1 又为 0 不可能成立。上升沿必须和上一周期的值比较,R_TRIG 的实例就是替你保存这个上一周期状态。
R_TRIG 的 Q 为什么只亮一下就没了?
这是设计行为:Q 只在一个扫描周期为 1。要驱动持续动作,用 Q 去置位一个 Bool,或者用自锁/状态机保持。
多个地方用同一个 R_TRIG 实例会怎样?
实例里的上一周期状态会被后一次调用覆盖,边沿可能丢失或误判。每个信号用独立实例,或者把边沿检测集中到一个地方。