1. 从一个让人抓狂的产线故障说起很多刚接触工业控制的朋友第一次听到“边沿触发”这个词大概率是在调试现场被一个诡异现象折磨之后。我印象很深的一次是帮一个做包装机械的朋友排查问题一台设备上的气缸操作员按一下启动按钮气缸应该动作一次结果实际是——按一下气缸连续动作了七八次才停有时候甚至停不下来。程序逻辑看起来完全没问题按钮信号也正常但设备就是不听话。后来查了半天问题出在按钮信号的“抖动”上。机械按钮在按下和松开的瞬间触点并不是干净利落地接通或断开而是在几毫秒内反复通断好几次。如果程序里用的是普通的“电平判断”——也就是只要信号是接通状态就执行动作——那么这几毫秒的抖动就会被PLC扫描到好几次于是气缸就跟着动作好几次。解决这个问题的核心手段就是边沿触发。它让PLC只在信号“从无到有”或者“从有到无”的那一个瞬间做出反应而不是在整个信号保持期间一直反应。这一下子就把抖动、重复触发的问题给治住了。所以这篇文章我想把PLC里的边沿触发彻底讲清楚。它是什么、为什么需要它、底层是怎么实现的、在梯形图和结构化文本里怎么写、实际项目中怎么用、有哪些坑。不管你是刚入行的电气自动化新手还是已经写了几年程序但一直“知其然不知其所以然”的老手这篇内容应该都能帮你把这块知识补扎实。边沿触发这个知识点说小很小就一个指令的事说大也很大它是理解PLC扫描机制、信号处理、程序稳定性的一个关键入口。2. 边沿触发到底是什么把“状态”和“瞬间”分清楚2.1 用生活类比理解边沿触发要理解边沿触发先得理解它的对立面——电平触发。你可以把电平触发想象成一盏声控灯。只要房间里有持续的声音灯就一直亮着声音停了灯才灭。声音存在期间灯的状态是“持续响应”的。对应到PLC里电平触发就是只要输入信号保持为ON程序里的对应逻辑就一直执行。边沿触发则像是门铃。你按住门铃不放它通常只响一次或者响一声就停它响应的是你“按下去”这个动作本身而不是你“按着”这个状态。你松手再按才会再响一次。对应到PLC里边沿触发就是只在信号从OFF变ON的那一瞬间上升沿或者从ON变OFF的那一瞬间下降沿执行一次逻辑之后即使信号一直保持也不再重复执行。这个区别看起来简单但它直接决定了程序在面对真实物理信号时的行为。真实世界里的按钮、接近开关、光电传感器它们的信号几乎都不是理想方波都带着抖动、干扰、毛刺。电平触发会把这些不完美全部放大成误动作而边沿触发则天然具备“只认变化瞬间”的过滤能力。2.2 上升沿、下降沿与边沿检测的基本定义在PLC的语境里边沿分为两种上升沿Rising Edge / Positive Edge信号从0变为1的那个瞬间。比如按钮从松开到按下。下降沿Falling Edge / Negative Edge信号从1变为0的那个瞬间。比如按钮从按下到松开。边沿检测的本质是比较信号在当前扫描周期和上一个扫描周期的状态。如果上一个周期是0、当前周期是1就检测到了一个上升沿如果上一个周期是1、当前周期是0就检测到了一个下降沿。这里有个关键点必须强调边沿触发检测的是“变化”而变化的判断依赖于PLC的扫描周期。PLC是循环扫描执行的每个扫描周期会读取一次输入、执行一次程序、刷新一次输出。边沿检测就是在这个循环里把“这一次读到的值”和“上一次读到的值”做对比。所以边沿信号的有效宽度实际上只有一个扫描周期。这也是为什么边沿触发能精准捕捉瞬间动作但也因此对扫描周期有一定依赖。2.3 为什么PLC程序离不开边沿触发在实际项目里边沿触发的使用频率极高几乎每个稍微复杂一点的程序都会用到。原因主要有三个第一消除信号抖动和干扰。机械触点的抖动、电气干扰产生的毛刺在电平判断下都会导致误动作而边沿触发只认第一次变化天然抗抖。第二实现“按一次执行一次”的逻辑。比如启动、停止、复位、计数、步进切换这些操作在语义上都是“一次性”的用边沿触发最符合直觉。第三避免重复执行带来的副作用。有些指令如果每个扫描周期都执行会出大问题。比如一个加法指令如果用电平触发信号保持1秒扫描周期10毫秒那这个加法就会执行100次结果完全错误。用边沿触发就只执行1次。我个人的经验是凡是“动作型”的逻辑优先考虑边沿触发凡是“状态型”的逻辑才用电平判断。这个原则能帮你避开大量的现场故障。3. 边沿触发的底层原理PLC扫描机制与边沿检测的实现3.1 PLC循环扫描机制是理解一切的前提要真正搞懂边沿触发绕不开PLC的扫描机制。PLC不是像普通计算机那样“事件驱动”地执行程序而是循环扫描读输入、执行程序、写输出然后不断重复这个过程。一个完整的循环叫一个扫描周期通常在几毫秒到几十毫秒之间。这个机制带来一个非常重要的结论PLC程序里的每一行逻辑在每个扫描周期都会被执行一次。不是“有变化才执行”而是“无论如何都执行”。这一点和很多新手从高级语言编程带来的直觉完全不同。理解了这一点你就能明白为什么电平判断会导致重复执行因为信号保持ON期间程序每个周期都在跑逻辑就每个周期都触发一次。而边沿触发之所以只触发一次是因为它内部记录了“上一次的状态”只有状态发生变化的那一个周期条件才成立。3.2 边沿检测的内部实现一个位存储器就够了边沿检测在底层其实非常简单核心就是一个位存储器辅助继电器/标志位。以上升沿检测为例逻辑是这样的每个扫描周期读取当前信号状态。把当前状态和“上一次状态”做比较。如果上一次是0、当前是1则输出一个周期的上升沿脉冲。然后把当前状态存入“上一次状态”存储器供下个周期比较。用伪代码表示就是上升沿输出 (当前信号 1) AND (上次信号 0) 上次信号 当前信号下降沿则是下降沿输出 (当前信号 0) AND (上次信号 1) 上次信号 当前信号你看逻辑本身一点都不复杂。但正是这个简单的机制解决了工业现场大量的信号处理问题。很多PLC品牌把这个逻辑封装成了专门的指令比如三菱的LDP/LDF西门子的P/N触点欧姆龙的UP/DOWN指令但底层原理都是一样的。3.3 边沿信号为什么只有一个扫描周期这是边沿触发最容易被误解的地方。很多人以为边沿信号会“保持”一段时间其实不是。边沿脉冲的有效宽度严格等于一个扫描周期。这意味着什么呢意味着如果你用边沿信号去驱动一个需要“持续保持”才能完成的动作可能会出问题。比如你用上升沿去启动一个定时器如果这个定时器的使能条件只在这一瞬间成立那定时器可能还没来得及计时就被复位了。所以正确的用法通常是用边沿触发去置位一个标志位然后用这个标志位去驱动后续逻辑。这样边沿负责“捕捉瞬间”标志位负责“保持状态”两者配合才能稳定工作。这个思路在实际项目里非常常用后面我会用具体例子展开。4. 主流PLC平台上的边沿触发写法与实操4.1 梯形图里的边沿触点最直观的写法梯形图是工业现场最常用的编程方式边沿触发在梯形图里通常表现为带箭头的触点。以常见的几个平台为例平台上升沿触点下降沿触点说明三菱LDPLDF直接作为触点使用西门子P触点配合边沿存储位N触点需要指定一个存储位欧姆龙UPDOWN配合内部辅助位台达LDPLDF与三菱类似在梯形图里上升沿触点的画法通常是在普通触点中间加一个向上的箭头下降沿则是向下的箭头。这种视觉表达很直观箭头方向就代表了信号变化的方向。写梯形图时有一个细节要注意边沿触点必须配合一个存储位来记录上一次状态。有些平台把这个存储位隐藏起来了比如三菱的LDP有些平台则需要你显式指定比如西门子的P触点需要跟一个M位。显式指定的好处是你可以控制这个存储位避免多个边沿指令互相干扰。4.2 结构化文本里的边沿检测更灵活也更需要小心在结构化文本ST里边沿检测通常有两种写法。第一种是调用系统提供的边沿检测功能块。比如很多平台提供R_TRIG上升沿和F_TRIG下降沿功能块VAR trig : R_TRIG; startEdge : BOOL; END_VAR trig(CLK : startButton); startEdge : trig.Q;这种写法的好处是封装好了不容易出错。R_TRIG内部自动维护了上一次的状态你只需要把信号接到CLK输入从Q输出取边沿脉冲即可。第二种是手动实现边沿检测VAR lastState : BOOL; currentState : BOOL; risingEdge : BOOL; END_VAR currentState : startButton; risingEdge : currentState AND NOT lastState; lastState : currentState;手动实现的好处是你能完全掌控逻辑坏处是容易忘记更新lastState或者把lastState的更新位置放错。我见过不少新手把lastState : currentState写在risingEdge计算之前结果边沿永远检测不到。这个顺序问题是个经典坑一定要记住先比较后更新。4.3 边沿触发与置位复位指令的配合使用实际项目里边沿触发很少单独使用最常见的搭档是置位SET和复位RST指令。典型模式是这样的// 上升沿检测启动按钮 IF startButton AND NOT lastStart THEN runFlag : TRUE; // 置位运行标志 END_IF; lastStart : startButton; // 上升沿检测停止按钮 IF stopButton AND NOT lastStop THEN runFlag : FALSE; // 复位运行标志 END_IF; lastStop : stopButton;这个模式的好处是边沿负责捕捉按钮动作标志位runFlag负责保持运行状态。这样即使按钮松开了设备依然保持运行直到按下停止按钮。这就是典型的“启保停”逻辑而边沿触发是让它稳定工作的关键。如果用普通的电平判断写启保停按钮抖动会导致runFlag被反复置位虽然结果可能看起来一样但在某些时序敏感的场景下会出问题。用边沿触发逻辑就干净可靠得多。5. 边沿触发的典型应用场景与实战案例5.1 按钮去抖与单次触发这是边沿触发最基础也最广泛的应用。前面提到的气缸连续动作问题解决方案就是在按钮信号后面加一个上升沿检测然后用边沿脉冲去触发动作。具体做法是按钮信号先经过一个上升沿检测得到一个只持续一个扫描周期的脉冲然后用这个脉冲去置位一个“动作请求”标志后续逻辑根据这个标志执行一次动作执行完复位标志。这样无论按钮抖动多少次都只会在第一次按下时触发一次动作。这里有个经验值可以参考机械按钮的抖动时间通常在5到20毫秒之间。如果PLC扫描周期是10毫秒那么抖动可能会被扫描到1到2次。用边沿触发后只有第一次变化会被捕捉后续抖动因为状态没有再次发生“从0到1”的变化所以不会被响应。这就是边沿触发天然去抖的原理。5.2 计数器与流量脉冲的精准计量在流量计量、产量统计、位置计数等场景里边沿触发是保证计数准确的核心。举个例子一个流量计每流过一定体积的液体就输出一个脉冲。如果用电平判断来计数那么脉冲保持期间PLC每个扫描周期都会加一次计数结果会严重偏大。用上升沿检测每个脉冲只计一次结果就准确了。这里有个关键参数需要计算脉冲宽度和扫描周期的关系。如果脉冲宽度小于一个扫描周期PLC可能会漏掉这个脉冲。比如脉冲宽度是5毫秒扫描周期是10毫秒那这个脉冲有可能在两次扫描之间出现又消失PLC根本读不到。这种情况下就需要用高速计数器模块而不是普通输入点加边沿检测。我一般会这样估算普通输入点的信号频率不要超过扫描频率的十分之一。如果扫描周期是10毫秒那信号频率最好在10赫兹以下。超过这个范围就要考虑高速计数或中断处理了。5.3 步进顺序控制中的状态切换在自动化产线上设备往往按照固定的步骤依次动作这就是步进顺序控制。边沿触发在步进控制里扮演着“推进步骤”的角色。典型逻辑是当前步骤完成后产生一个完成信号用这个完成信号的上升沿去触发步骤计数器加一进入下一步。这样每个步骤只会被推进一次不会因为完成信号保持而反复推进。如果用普通电平判断完成信号保持期间步骤会不断加一直接跳到末尾整个顺序就乱了。这是新手写步进程序时最容易犯的错误之一。5.4 报警与事件的单次记录在报警系统中边沿触发用来记录报警的“发生”和“消除”事件。报警信号从0变1时记录一条“报警发生”从1变0时记录一条“报警消除”。这样报警日志里不会因为报警持续而反复记录同一条信息。这个应用场景对边沿触发的要求是必须区分上升沿和下降沿分别对应报警发生和报警消除。很多平台提供独立的上升沿和下降沿指令用起来很方便。6. 边沿触发的常见问题与排查技巧6.1 边沿检测失效的几种典型原因在实际调试中边沿检测失效是很常见的问题。我整理了几种典型原因和排查方法问题现象可能原因排查方法边沿完全检测不到存储位未更新或更新顺序错误检查lastState赋值位置边沿偶尔丢失信号变化太快扫描周期跟不上测量信号宽度考虑高速计数边沿重复触发信号抖动严重或干扰加硬件滤波或软件延时确认多个边沿互相干扰共用存储位每个边沿使用独立存储位首次扫描误触发初始状态未定义初始化时清零存储位其中最常见的是存储位共用问题。有些平台的边沿指令需要指定存储位如果两个边沿指令用了同一个存储位它们就会互相干扰导致边沿检测混乱。这个坑我在早期项目里踩过排查了很久才发现。后来养成的习惯是每个边沿指令都分配独立的存储位并且在变量命名上明确标注用途。6.2 扫描周期对边沿检测的影响扫描周期是边沿检测的“时间分辨率”。扫描周期越长能检测到的最小信号宽度就越大。如果信号宽度小于扫描周期就可能被漏掉。这里有个实际的计算例子假设PLC扫描周期是20毫秒一个传感器输出的脉冲宽度是15毫秒。那么这个脉冲有可能在两次扫描之间完整地出现又消失PLC两次读取都是0边沿就检测不到。解决方法是要么提高扫描速度优化程序要么使用中断输入或高速计数器。我一般会在程序里监控扫描周期如果发现扫描周期异常增大就要警惕边沿检测可能失效。扫描周期增大的常见原因是程序里有大量循环、通信阻塞、或者中断处理时间过长。6.3 边沿触发与中断的取舍有些场景下边沿触发的响应速度不够需要用中断。比如高速计数、精确定位、紧急停止等。中断的特点是不受扫描周期限制信号一来立即响应。但中断也有代价中断程序里不能做太复杂的操作否则会影响主程序扫描中断的调试也更困难。所以我的建议是普通逻辑用边沿触发高速或安全相关逻辑用中断。不要为了追求响应速度而滥用中断否则程序会变得难以维护。6.4 几个我踩过的坑和总结的经验第一个坑边沿信号驱动定时器时使能条件只保持一个周期。定时器需要使能条件持续为真才能计时如果只用边沿脉冲驱动定时器刚启动就被复位了。正确做法是用边沿置位一个标志用标志驱动定时器。第二个坑在中断程序里使用边沿检测。中断程序的执行时机不确定边沿检测依赖的“上一次状态”可能不准确。如果必须在中断里做边沿检测要确保存储位的更新是原子的。第三个坑初始化时忘记清零边沿存储位。PLC上电时如果存储位恰好是1而信号也是1那么第一个扫描周期就会误判为“没有变化”如果存储位是1而信号是0就会误判出一个下降沿。所以初始化时一定要把边沿存储位清零。第四个坑多个边沿指令串联时时序对不上。比如信号A的上升沿触发动作1动作1的结果又触发信号B的上升沿。如果这两个边沿在同一个扫描周期里处理可能会出现时序竞争。解决方法是引入中间标志位分周期处理。7. 边沿触发在不同编程范式下的对比与选型建议7.1 梯形图、结构化文本、功能块的边沿实现对比不同编程范式下边沿触发的实现方式和适用场景不太一样编程方式边沿实现优点缺点适用场景梯形图边沿触点直观、现场调试方便复杂逻辑表达困难简单逻辑、现场维护结构化文本功能块或手动实现灵活、适合复杂算法可读性依赖命名复杂逻辑、批量处理功能块图R_TRIG/F_TRIG封装好、复用性强需要理解功能块机制模块化程序、库开发我的选型建议是现场设备逻辑用梯形图复杂算法和数据处理用结构化文本可复用的功能模块用功能块图。边沿触发在三种范式里都能用关键是保持一致性不要在一个项目里混用太多风格。7.2 边沿触发 vs 电平触发什么时候用哪个这个问题其实可以总结成一个简单的判断标准动作型逻辑用边沿触发。比如启动、停止、复位、计数、步进切换。状态型逻辑用电平触发。比如运行指示、报警显示、联锁条件。安全型逻辑用电平触发加硬件冗余。安全回路不能依赖边沿因为边沿可能丢失。这个标准不是绝对的但能覆盖大部分场景。我个人的习惯是写每一行逻辑时先问自己“这个逻辑是响应一个动作还是响应一个状态”答案自然就出来了。7.3 边沿触发的替代方案与组合使用有些场景下边沿触发不是唯一选择可以和其他机制组合使用延时确认信号变化后延时一段时间再确认过滤抖动。适合慢速信号。硬件滤波在输入端加RC滤波电路从源头消除抖动。适合干扰严重的环境。软件滤波连续采样多次一致才确认。适合对实时性要求不高的场景。中断处理高速信号用中断绕过扫描周期限制。实际项目里我通常会边沿触发加软件滤波组合使用先用边沿捕捉变化再用标志位和定时器做确认这样既保证了响应速度又保证了可靠性。8. 把边沿触发用对程序稳定性就上了一个台阶写了这么多年PLC程序我越来越觉得边沿触发是一个“小指令、大作用”的典型。它本身逻辑简单但用得好不好直接决定了程序在面对真实工业现场时的稳定性。很多看似复杂的现场故障追根溯源往往就是某个该用边沿的地方用了电平或者边沿的存储位处理不当。我个人的体会是边沿触发不只是一个指令更是一种思维方式。它提醒我们工业控制程序面对的不是理想的数字信号而是带着抖动、干扰、时序不确定性的真实世界。用边沿触发本质上是在程序里建立一道“只认变化瞬间”的防线把真实世界的不完美挡在逻辑之外。如果你现在正在调试一个设备发现某个动作会重复执行或者某个计数总是不准不妨先检查一下这里是不是该用边沿触发存储位是不是独立分配的初始化是不是清零了这几个问题排查下来大部分问题都能找到答案。最后分享一个我常用的调试技巧在边沿检测后面串联一个计数器每次边沿触发计数器加一。运行一段时间后看计数器的值如果比预期多说明有重复触发如果比预期少说明有漏触发。这个方法能快速定位边沿检测的问题比盯着程序看效率高得多。
阅读完成 · 觉得有帮助?