『7x24小时有问必答』
1
  沿指令概述     

沿指令——只抓"变化那一瞬间"

写PLC程序时,你经常需要捕捉的不是"信号有没有",而是**"信号变了没"**——
物料刚到的那一下 → 触发计数
故障刚出现的那一下 → 触发报警
物料刚离开的那一下 → 触发下一步动作
故障刚消失的那一下 → 触发复位

这些场景的共同特点:关心的不是信号的状态,而是信号变化的那一刻。这就需要沿指令。

两种沿,两个方向

表格
类型
信号变化
一句话记忆
典型场景
上升沿
0 → 1
"来了!"
物料到达、故障出现、按钮按下
下降沿
1 → 0
"走了!"
物料离开、故障消失、按钮松开

1.webp

一个关键特性:只通一个扫描周期

沿指令触发后,接通时间只有1个扫描周期——PLC扫一圈就断了,不是持续导通。
2.webp
这意味着什么?
信号从0变1的那一圈扫描,触发一次动作
信号一直保持1,不会重复触发
所以沿指令天然防重复——不管信号持续多久,动作只执行一次

沿指令的两种用法

用法一:捕捉信号变化(最常见的用途)
3.webp
用法二:让程序只执行一个扫描周期

如果你有一段程序只想让它"跑一圈就停",不需要专门做自复位逻辑,直接用沿指令控制执行条件就行:
4.webp

新手最常犯的错:该用沿指令的地方用了普通触点。比如物料传感器用普通触点驱动计数器,物料停在传感器前面3秒,计数器就加了成百上千次——因为每扫描一次都加一次。用上升沿,只加一次,这才是你想要的。
2
博途中沿指令分类
     

博途中的沿指令——四种,各管各的检测对象

S7-1200/1500的沿指令不是只有一种,而是根据检测什么上升/下降两个维度,分成四类:
表格
指令
检测对象
方向
一句话记忆
-(P)-
RLO(逻辑运算结果)
上升沿
前面逻辑结果从0变1 → 触发
-(N)-
RLO(逻辑运算结果)
下降沿
前面逻辑结果从1变0 → 触发
P_TRIG
RLO(逻辑运算结果)
上升沿
和-(P)-功能相同,独立功能块形式
N_TRIG
RLO(逻辑运算结果)
下降沿
和-(N)-功能相同,独立功能块形式
R_TRIG
单个变量
上升沿
指定变量从0变1 → 触发
F_TRIG
单个变量
下降沿
指定变量从1变0 → 触发

快速区分:RLO沿检测的是"前面一串逻辑运算的结果",变量沿检测的是"某个具体变量"。简单信号用变量沿,复合条件用RLO沿。

怎么选?看一个例子

场景:两个条件同时满足时触发一次动作
用RLO沿 → 把两个条件串联,末尾加  -(P)-,简洁
用变量沿 → 要先把两个条件的结果存到中间变量,再对这个变量做R_TRIG,多一步

场景:单个按钮按下触发一次动作
用变量沿 → 直接对按钮变量做  R_TRIG,直白
用RLO沿 → 也能用,但杀鸡用牛刀

选型原则:  简单信号走变量沿,复合逻辑走RLO沿,别为了统一风格硬选一种。
                                         如下图所示
5.webp

四种上升沿指令,到底有什么区别?

前面列了四种沿指令,看起来眼花——其实区别就两个维度:检测对象不同,放置位置不同。
以上升沿为例,逐一拆解:

① P触点——检测某个位地址的跳变

6.webp
检测对象:指定的位地址(如M0.0)
前一状态存在哪:自动分配的下一个位(如M0.1)
放置位置:只能放在触点位置
适用场景:检测单个变量的上升沿,最常用

② P线圈——检测能流的跳变

7.webp
检测对象:进入线圈的能流(即前面逻辑运算的结果)
前一状态存在哪:分配的位地址(如M0.2)
放置位置:可以放在程序段中任何位置
适用场景:检测逻辑运算结果的上升沿,灵活放置

③ P_TRIG——功能块形式的RLO沿检测

8.webp
检测对象:CLK输入的能流
前一状态存在哪:指令内部自动管理
放置位置:不能放在程序段的开头或结尾
适用场景:检测逻辑运算结果的上升沿,比P线圈更规范

④ R_TRIG——带背景数据块的变量沿检测

9.webp
检测对象:CLK输入的变量或能流
前一状态存在哪:背景数据块(需要分配DB块)
放置位置:不能放在程序段的开头或结尾
适用场景:检测变量的上升沿,状态存在独立DB块中,更清晰可追踪

四种指令核心对比

表格
指令
检测对象
前状态存储
放置限制
常用程度
P触点
指定位地址
自动分配相邻位
只能做触点
最常用
P线圈
能流(RLO)
指定位地址
任意位置
偶尔用
P_TRIG
能流(RLO)
指令内部管理
不在段首尾
最常用
R_TRIG
变量/能流
背景数据块
不在段首尾
常用

实际使用:记住两组就够了

下降沿同理,把P换成N、R_TRIG换成F_TRIG,逻辑完全一样。
日常编程真正高频使用的就四个:
表格
用途
检测单个信号
检测逻辑运算结果
上升沿
P触点
P_TRIG
下降沿
N触点
N_TRIG

记忆口诀:单信号用触点,复合逻辑用TRIG。P线圈和R_TRIG是"备选方案",需要时再查,不必一开始就全学。

3
沿指令正确使用

(1)先看下面这段程序,为什么启动按钮启动后,后面的输出一个有输出,一个没有输出。
10.webp
     

️ 沿指令最容易踩的坑:暂存位重复

同一个变量,在两个程序段里都要判断上升沿——你以为两次都能抓到跳变,实际第二次抓不到。

为什么?

沿指令判断"有没有跳变"的原理是:拿当前状态和上一扫描周期的状态做对比。上一周期的状态存在哪?暂存位。

问题出在这里:
11.webp
根本原因:  程序段1执行完后,把当前状态写入了暂存位M0.0。等程序段2再执行时,暂存位已经是1了,和当前值一样,沿指令认为"没有变化",上升沿消失。

正确做法:每个沿指令用不同的暂存位

程序段1:UserDB.Start ──┤P├── 暂存位 M0.0    ← 各用各的
程序段2:UserDB.Start ──┤P├── 暂存位 M0.1    ← 各用各的
这样两个程序段各自记录各自的"上一周期状态",互不干扰,两次上升沿都能正确触发。

更省心的做法:用R_TRIG代替P触点

R_TRIG自动分配背景数据块来存储上一周期状态,不用你手动指定暂存位,从根本上杜绝重复问题:
程序段1:UserDB.Start ──→ R_TRIG(DB1)──→ 输出1
程序段2:UserDB.Start ──→ R_TRIG(DB2)──→ 输出2
每个实例自动管理各自的暂存状态,不会冲突
规则很简单:一个沿指令,一个独立的暂存位。嫌手动分配麻烦,就用R_TRIG让系统帮你管,省心不出错。
  
(2)RLO上升沿——几个条件组合后的"一瞬间"

前面讲的P触点检测的是单个变量的跳变,但很多时候你需要判断的是几个条件组合之后的结果——
比如:手动模式 AND 物料到达 AND 设备未故障 → 这三个条件同时满足的那一下,触发一次动作。
如果用P触点,你得先把三个条件的运算结果存到一个中间变量,再对这个变量做上升沿——多一步,多一个变量,多一个暂存位。
用RLO上升沿指令(-(P)-  线圈或  P_TRIG),直接在逻辑运算后面加一个沿检测,一步搞定:
12.webp
三个条件串联的逻辑运算结果,从0变1的那一瞬间 → 导通1个扫描周期
对比两种写法:
表格
写法
步骤
需要中间变量
暂存位管理
P触点
逻辑运算→存中间变量→对中间变量做上升沿
需要
手动分配
RLO沿
逻辑运算后直接加-(P)-
不需要
手动分配或自动管理

选型判断:单个信号跳变 → P触点,简单直接;多个条件组合后的跳变 → RLO沿,少绕一步。
13.webp
(3)SCL中怎么用沿指令?
梯形图里沿指令是触点/线圈,拖上去就能用。但SCL是文本编程,没有触点和线圈——怎么检测沿?
答案是:用  R_TRIG / F_TRIG 功能块

SCL上升沿写法

14.webp
三行代码,拆开看:
表格
干的事
说明
声明FB实例
创建一个R_TRIG实例
系统自动生成背景数据块,帮你管理上一周期状态
调用FB
CLK接入要检测的变量
变量从0变1时触发
取Q输出
Q就是上升沿信号
只通1个扫描周期,和梯形图中的P触点效果一样

SCL下降沿写法

15.webp

和梯形图的对应关系

表格
梯形图
SCL
效果
┤P├
  触点
R_TRIG
上升沿,通1个扫描周期
┤N├
  触点
F_TRIG
下降沿,通1个扫描周期

SCL中只能用R_TRIG/F_TRIG,没有P触点、P线圈、P_TRIG这些写法。好消息是——R_TRIG/F_TRIG自动管理背景数据块,不存在暂存位重复的问题,反而比梯形图更省心。
16.webp

手写沿检测——理解原理的最好方式

如果不想用R_TRIG/F_TRIG功能块,也可以根据沿指令的原理自己写——本质上就是本次状态和上次状态做对比

上升沿手写逻辑

核心思路:本次=1 AND 上次=0 → 有上升沿
17.webp
拆解执行过程:
表格
扫描周期
本次Start
上次Start_Last
本次=1 AND 上次=0
上升沿
N
0
0
0 AND 1 = 否
N+1
1
0
1 AND 1 = 是
抓到了
N+2
1
1
1 AND 0 = 否
无(不会重复触发)
N+3
0
1
0 AND 0 = 否

最后一行千万别忘了——把本次状态写入上次状态,否则下次对比用的还是旧数据,沿检测就废了。

下降沿手写逻辑

核心思路反过来:本次=0 AND 上次=1 → 有下降沿
18.webp

两种写法对比

表格
对比项
R_TRIG/F_TRIG
手写沿检测
代码量
少,3行搞定
多,IF-ELSE+赋值
暂存位管理
自动(背景数据块)
手动(自己定义_Last变量)
暂存位冲突风险
有——同一变量多处检测时,_Last变量必须各用各的
可读性
一看就知道是沿检测
需要看逻辑才能理解
适合场景
日常编程,省心
学习理解原理,或功能块不可用的场合

实际项目中推荐用R_TRIG/F_TRIG,少出错、好维护。手写沿检测的价值在于理解原理——你把这段代码搞懂了,沿指令的"暂存位重复坑"也就彻底明白了,因为本质就是同一回事。
  
19.webp

变量说明——数组方式管理多个沿检测

上面手写沿检测用的是单个变量,如果项目里有多个信号要检测,可以用数组统一管理,变量命名更有规律,不容易乱:

上升沿(数组索引[1])

表格
变量
类型
说明
UserDB".Start_P[1]
Bool
上升沿输出信号——检测到跳变时为TRUE,只通1个扫描周期
UserDB".Start[1]
Bool
本次状态——当前扫描周期信号的实际值
UserDB".LastStatusBit[1]
Bool
上次状态暂存——上一个扫描周期的信号值

下降沿(数组索引[2])

表格
变量
类型
说明
UserDB".Start_N[2]
Bool
下降沿输出信号——检测到跳变时为TRUE
UserDB".Start[2]
Bool
本次状态——当前扫描周期信号的实际值
UserDB".LastStatusBit[2]
Bool
上次状态暂存——上一个扫描周期的信号值

三个变量的关系

20.webp
数组索引[1]和[2]只是编号,不是固定的——你可以用[1]检测信号A,[2]检测信号B,[3]检测信号C……每组三个变量用同一个索引,管理起来不会乱。但注意:同一个索引的三组变量必须一一对应,别把[1]的本次状态和[2]的暂存位混搭,沿检测直接失效。

4
总结   

  沿指令三句总结

① 选对指令:单信号用触点,复合逻辑用TRIG
表格
场景
梯形图
SCL
检测单个变量的沿
P触点 / N触点
R_TRIG / F_TRIG
检测逻辑运算结果的沿
-(P)- 线圈 / P_TRIG
R_TRIG(CLK接逻辑运算)

不管是单个触点还是逻辑组合,R_TRIG/F_TRIG都能搞定——区别只是CLK端接的是单个变量还是逻辑表达式。但能选对更合适的那种,程序更简洁。
② 暂存位绝不重复——这是沿指令第一铁律
同一个变量,两个程序段都要检测沿?暂存位必须各用各的。重复了,后面的沿信号直接失效,查bug查到怀疑人生。
用R_TRIG/F_TRIG可以自动管理,从根本上避免这个问题。
③ SCL手写沿检测:理解原理的练手,日常用FB省心
手写IF-ELSE + _Last赋值,帮你真正搞懂沿指令的底层逻辑。但实际项目用R_TRIG/F_TRIG——代码少、不出错、好维护。
一句话记住沿指令:抓变化、只一瞬、暂存位不重复
      

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码