跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL R_TRIG — 上升沿检测

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 里调用。

TiaLink 设置

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

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

一句话

答案:用 #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输入BOOLI, Q, M, D, L, P被检测的信号。R_TRIG 比较本周期的 CLK 与实例里保存的上一周期值。
Q输出BOOLI, 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 的块接口
区块名称类型说明
输入SignalBool
输出RisingBool
静态TrigR_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;        // 上升沿:只在一个扫描周期为 1
10   END_VAR
11 
12   VAR
13      Trig : R_TRIG;        // 边沿实例,保存上一周期的 CLK
14   END_VAR
15 
16BEGIN
17   REGION 检测上升沿
18      // 先调用实例,再读 Q;实例内部保存上一周期的 CLK。
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 时序图:信号从 0 变 1 时 Q 只在一个扫描周期为 1
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 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真PASS(5 scans)2026-11-02scl_run_scenario / scl_validate
TIA 导入编译待实测—TiaLink + TIA Portal(待实测)

“待实测”表示还没有在 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 实例会怎样?

实例里的上一周期状态会被后一次调用覆盖,边沿可能丢失或误判。每个信号用独立实例,或者把边沿检测集中到一个地方。

← 返回 SCL 指令手册