ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PLC编程核心:OIS1、OIS1N、OSSR、OSSI指令原理与实战应用详解

2026/8/13 3:49:27 拓冰建站 浏览量
PLC编程核心:OIS1、OIS1N、OSSR、OSSI指令原理与实战应用详解 1. 项目概述深入理解工业自动化中的关键继电器指令在工业自动化特别是PLC可编程逻辑控制器编程领域有几个指令代码看似简单却常常让新手工程师感到困惑甚至在老手的程序里也偶尔会看到它们被误用或滥用。OIS1、OIS1N、OSSR、OSSI——这四个指令就是典型的代表。它们不是控制电机正反转的线圈也不是处理复杂运算的函数块而是专门用于处理“单稳态”或“单脉冲”逻辑的专用继电器指令。简单来说它们解决的核心问题是如何将一个可能持续多个扫描周期的输入信号精准地转换成一个只持续一个扫描周期的脉冲信号。这个需求在自动化场景中无处不在。想象一下一个操作员按下“启动”按钮这个按钮信号在物理上会保持接通状态直到手指松开。如果我们直接用这个信号去触发一个“计数加一”的操作那么在一个扫描周期内计数器可能会被疯狂地累加数百次这显然不是我们想要的。我们真正需要的是无论按钮按了多久只识别“按下”这个动作事件本身一次。这就是OIS1等指令的用武之地。它们就像是信号世界里的“事件检测器”或“边缘捕捉器”只关心信号从无到有上升沿或从有到无下降沿的那个瞬间并将这个瞬间转换成一个标准化的、宽度为一个PLC扫描周期的脉冲。理解并正确使用这些指令是编写出稳定、可靠、无副作用的PLC程序的基本功。它们直接关系到程序的响应准确性、逻辑严密性以及是否会出现难以排查的“幽灵”故障。本文将从一个资深自动化工程师的视角彻底拆解这四条指令的原理、差异、应用场景和那些手册上不会写的实战避坑指南。2. 核心指令原理与功能拆解要掌握这四条指令必须从两个维度去理解触发沿和输出特性。触发沿决定了指令在信号的什么变化时刻被激活输出特性决定了指令输出的脉冲形态。2.1 触发沿上升沿与下降沿的本质PLC程序是循环扫描执行的。在每个扫描周期它会读取所有输入点的状态输入采样执行用户程序然后更新所有输出点的状态输出刷新。所谓“沿”就是指信号状态在两个连续扫描周期之间发生变化的那个“时刻”。上升沿 (Positive Edge/Rising Edge)指信号从0OFF假变为1ON真的瞬间。它检测的是“接通”动作的开始。例如按钮被按下的那一刻、传感器检测到物体到位的那一刻。下降沿 (Negative Edge/Falling Edge)指信号从1ON真变为0OFF假的瞬间。它检测的是“断开”动作的开始。例如按钮被释放的那一刻、物体离开传感器感应区的那一刻。在程序里我们无法真正捕捉到物理上的“瞬间”我们捕捉到的是“在本次扫描周期信号为1而上一个扫描周期信号为0”这个事实。这个“事实”会持续一个完整的扫描周期。因此所有沿检测指令产生的有效输出其持续时间都是一个扫描周期。2.2 四条指令的功能定义与对比基于不同的触发沿和输出特性这四条指令的功能被严格定义。我们以西门子S7-1200/1500系列PLC的SCL结构化控制语言或梯形图中的对应概念为例进行说明其核心思想适用于绝大多数品牌的PLC。指令助记符全称触发沿输出特性通俗理解OIS1One-shot Impulse Set 1上升沿输出一个扫描周期的TRUE1脉冲“按下即触发”。只在信号从无到有的那一刻给一个短脉冲。OIS1NOne-shot Impulse Set 1 Negative下降沿输出一个扫描周期的TRUE1脉冲“松开即触发”。只在信号从有到无的那一刻给一个短脉冲。OSSROne-shot Set/Reset (Rising)上升沿输出置位 (Set)需要手动复位“按下即锁定”。信号从无到有时输出被锁定为1直到你用其他逻辑将其复位为0。OSSIOne-shot Set/Reset (Impulse)上升沿输出一个扫描周期的TRUE脉冲且自复位功能与OIS1几乎完全相同。关键在于“自复位”它内部自动处理了脉冲结束。注意指令名称如OIS1, OSSR可能因PLC品牌西门子、三菱、欧姆龙、罗克韦尔等而异但功能分类上升沿单脉冲、下降沿单脉冲、上升沿置位是通用的。例如在梯形图中常被称为“P”触点上升沿、“N”触点下降沿和“S”置位线圈。核心差异深度解析OIS1 vs OIS1N这是最基础的沿检测对。它们的区别纯粹在于“关心”信号的哪个边沿。OIS1用于动作启动OIS1N用于动作结束或异常检测。OIS1 vs OSSI在绝大多数现代PLC编程中你可以认为OIS1和OSSI是等价的都是上升沿单脉冲。细微的差别可能存在于一些老式系统或特定品牌的实现中OSSI更强调其“单次触发、内部复位”的特性。在工程实践中我们通常只选用其中一种如OIS1并保持团队代码风格统一。OIS1/OSSI vs OSSR这是最容易混淆、也最关键的区别OIS1/OSSI输出是瞬态脉冲。它像一个点动按钮按一下输出闪一下一个周期然后自动熄灭。它不记忆状态。OSSR输出是稳态锁存。它像一个自锁按钮按一下输出接通并保持置位直到有专门的“复位”信号来把它关掉。它记忆状态。一个生活化类比OIS1像是门铃。客人按一下上升沿门铃“叮咚”响一声一个脉冲然后停止。无论客人按着不放多久门铃也只响一声。OSSR像是电灯的开关。你按一下开关上升沿灯亮置位并保持亮着。你需要再按一下开关或另一个复位开关才能让灯熄灭。3. 典型应用场景与实战编程解析理解了原理我们来看它们在实际项目中如何大显身手。以下场景均来源于真实的自动化项目。3.1 OIS1上升沿单脉冲的核心应用场景一计数器与累加器触发这是OIS1最经典、最高频的应用。防止因信号长通导致的多次计数。// 错误的做法直接使用按钮信号计数 IF “启动按钮” THEN “产品数量” : “产品数量” 1; END_IF; // 如果“启动按钮”接通了10个扫描周期计数器会增加10次 // 正确的做法使用OIS1检测按钮按下动作 IF OIS1(“启动按钮”) THEN // 或者使用 P_TRIG 功能块 “产品数量” : “产品数量” 1; END_IF; // 无论按钮按下多久只会在按下瞬间增加1次。场景二模式切换或状态步进在设备的手动、自动、维修等模式间切换通常要求每按一次切换按钮模式改变一次。IF OIS1(“模式切换按钮”) THEN CASE “当前模式” OF 0: “当前模式” : 1; // 从手动切换到自动 1: “当前模式” : 2; // 从自动切换到维修 2: “当前模式” : 0; // 从维修切回手动 END_CASE; END_IF;场景三初始化或单次功能执行设备上电后或故障复位后需要执行一次初始化序列如回零、气缸复位等。IF “首次扫描” OR OIS1(“复位按钮”) THEN // 执行初始化程序段 “轴使能” : FALSE; “执行回零” : TRUE; “当前步骤” : 0; END_IF;3.2 OIS1N下降沿单脉冲的特殊用途场景一停机或结束信号检测检测一个“运行”信号的消失用于触发停机后的清理、统计或报警确认。IF OIS1N(“电机运行反馈”) THEN “本次运行时间” : “运行计时器”.ET; // 记录运行时长 “总耗电量” : “总耗电量” “本次运行时间” * 功率; “停机时间戳” : CURRENT_TIME; // 记录停机时刻 END_IF;场景二按钮“释放”动作触发某些安全或确认操作需要检测按钮被松开的那一刻。// 双手启动安全逻辑必须同时按下两个按钮并同时松开才能启动 “按钮A按下” : “安全按钮A”; “按钮B按下” : “安全按钮B”; IF “按钮A按下” AND “按钮B按下” THEN “双手按下标志” : TRUE; END_IF; // 只有当双手都按下后再同时松开才触发启动 IF OIS1N(“按钮A按下”) AND OIS1N(“按钮B按下”) AND “双手按下标志” THEN “设备启动” : TRUE; “双手按下标志” : FALSE; // 复位标志 END_IF;场景三故障信号消失后的复位确认当故障排除后故障信号会消失下降沿利用这个沿可以自动清除故障报警记录或提示操作员进行确认。IF OIS1N(“电机过载报警”) THEN “过载报警历史已确认” : FALSE; // 提示操作员去查看历史 // 可以在这里触发一个提示音或闪烁指示灯 END_IF;3.3 OSSR上升沿置位的锁定型应用场景一设备启停的经典自锁电路这是继电器控制逻辑在PLC中的直接体现也是最基础的启保停电路。// 启动条件按下启动按钮且无停止信号和故障 “启动沿” : OIS1(“启动按钮”); // 先用OIS1取启动按钮的沿 IF “启动沿” AND NOT “停止按钮” AND NOT “急停” AND NOT “综合故障” THEN “设备运行标志” : TRUE; // 相当于 Set (置位) END_IF; // 停止条件停止按钮、急停或故障任一条件满足则停止 IF “停止按钮” OR “急停” OR “综合故障” THEN “设备运行标志” : FALSE; // 相当于 Reset (复位) END_IF; // 输出 “主接触器” : “设备运行标志”;在这个逻辑中“设备运行标志”的行为就是一个OSSR由启动沿置位由停止条件复位。场景二报警/事件锁定当某个故障发生时需要锁定这个报警状态即使故障信号瞬间消失报警指示仍需保持直到维护人员手动复位。// 故障检测与锁定 IF “温度传感器超限” OR “压力传感器超限” THEN “综合故障锁定” : TRUE; // 置位锁定 END_IF; // 手动复位 IF “故障复位按钮” THEN “综合故障锁定” : FALSE; // 复位 END_IF; // 报警输出 “红色报警灯” : “综合故障锁定”; “蜂鸣器” : “综合故障锁定” AND OIS1(“综合故障锁定”); // 蜂鸣器只在故障刚发生时响一声用OIS1实现场景三单按钮启停控制乒乓控制用一个按钮实现交替启停第一次按启动第二次按停止。IF OIS1(“单按钮”) THEN “设备运行标志” : NOT “设备运行标志”; // 每次按下都翻转状态 END_IF;这个逻辑非常简洁但它本质上不是纯粹的OSSR因为它没有独立的复位通路。更严谨的OSSR实现可能需要一个单独的复位按钮但在这种特定需求下这种“翻转”逻辑更常用。4. 高级技巧、常见陷阱与深度避坑指南掌握了基本应用下面分享一些从无数个项目调试和故障排查中总结出的“血泪经验”。这些内容在标准手册里很少提及但却能决定程序的稳定性和可维护性。4.1 指令的“扫描周期”本质与潜在风险核心认知OIS1/OIS1N输出的脉冲宽度严格等于一个PLC扫描周期。扫描周期不是固定值它随程序大小、CPU负载动态变化通常在几毫秒到几十毫秒之间。陷阱1高速信号丢失如果你的输入信号变化速度接近甚至快于PLC扫描周期沿检测指令可能会漏掉信号。实战心得处理高速脉冲如编码器Z相信号、高速计数输入时绝对不要使用程序中的OIS1指令。必须使用PLC硬件自带的高速计数器HSC功能或专用的高速输入中断例如西门子的“硬件中断”OB。程序扫描级的沿检测只适用于按钮、传感器等变化相对缓慢的信号。陷阱2逻辑竞争与时序混乱考虑以下有问题的代码// 程序段A “脉冲标志” : OIS1(“按钮”); IF “脉冲标志” THEN “数据A” : “数据A” 1; END_IF; // 程序段B (在程序段A之后执行) IF “脉冲标志” THEN “数据B” : “数据B” 1; END_IF;理论上数据A和数据B应该同时加1。但由于“脉冲标志”只在一个扫描周期内为真如果程序段A和B之间还有其他复杂运算导致时间差有可能出现数据A加了1而数据B没加上或反之的极端情况。虽然概率低但在对时序要求极其严格的场合如同步动作这是风险点。解决方案对于需要驱动多个后续动作的单脉冲最好先将脉冲存储到一个“事件寄存器”中在该扫描周期内所有后续逻辑都查询这个寄存器然后在扫描周期末尾统一清除它。或者更简单可靠的方法是用这个脉冲去置位一个“任务请求标志”相当于OSSR然后由统一的调度逻辑来处理这个请求处理完毕后再复位该标志。4.2 OSSR的复位管理与程序结构核心原则对同一个变量位进行置位Set和复位Reset的逻辑必须放在程序中的同一个位置或者有非常清晰、唯一的复位通路。陷阱分散的复位逻辑导致的“幽灵”故障这是大型程序中最常见的bug之一。程序员A在“自动流程”中置位了“阀门打开标志”并在流程结束时复位它。程序员B在“手动干预”模块中也编写了在手动模式下复位“阀门打开标志”的逻辑。这看起来没问题。但程序员C后来增加了一个“安全监控”功能当检测到压力超高时也直接复位“阀门打开标志”。 问题来了在某种复杂的工况下“自动流程”尚未结束“手动干预”未被触发但“安全监控”复位了标志。这可能导致自动流程逻辑错乱因为它在等待一个永远不会被它自己复位的标志从而造成设备死锁或动作异常。排查起来极其困难因为每个复位逻辑单独看都是合理的。黄金法则对于关键的状态标志采用“集中置位集中复位”的原则。或者使用“状态机”编程范式每个状态有明确的进入、执行和退出条件状态的转移是唯一的从根本上避免了多路复位的问题。4.3 沿检测的“抖动”与信号滤波机械按钮、行程开关在接通或断开的瞬间由于触点弹跳会产生多次快速的通断称为“抖动”。这会导致一个物理动作产生多个沿信号从而使OIS1误触发多次。标准处理方案硬件滤波在输入回路中加入RC滤波电路这是最有效的方式。软件滤波延时消抖这是PLC中最常用的方法。原理不是直接对输入信号用OIS1而是先经过一个计时器进行延时判断。// 软件消抖示例检测稳定的“启动”信号 IF “启动按钮” THEN IF NOT “消抖计时器”.Q THEN // 如果计时器未运行 “消抖计时器”.IN(PT : T#50ms); // 启动50ms计时 END_IF; ELSE “消抖计时器”.RESET; // 按钮松开则复位计时器 END_IF; // 计时器到时认为按钮已稳定按下产生一个有效的“滤波后上升沿” “启动按钮_滤波后” : “消抖计时器”.Q; IF OIS1(“启动按钮_滤波后”) THEN // 这里执行真正的启动逻辑 END_IF;这段代码的意思是只有当“启动按钮”持续按下超过50ms才认为这是一个有效的按下动作然后取其上升沿。短于50ms的抖动会被过滤掉。时间常数如50ms需要根据具体元器件的特性调整。4.4 在功能块FB与函数FC中使用沿指令的注意事项当你在可重复调用的功能块FB有背景数据块或函数FC无存储中使用OIS1等指令时需要格外小心静态数据的存储。在FB中使用这是最安全的方式。因为FB有自己的背景数据块Instance DB可以存储上一个扫描周期的信号状态。FB的输入参数如#InputSignal在每次调用时传入FB内部使用静态变量如#LastSignal来记忆上次的状态从而实现沿检测。不同调用实例之间的数据是隔离的不会互相干扰。在FC中使用非常危险因为FC没有自己的存储区。如果你在FC内部用一个局部变量如#LastSignal来存储上次状态那么这个局部变量的生命周期仅限于本次FC调用。当FC执行完毕该变量就被释放了下次调用时它的值是未定义的通常是0。这会导致沿检测完全失效或混乱。绝对禁忌除非你将“上一次状态”作为INOUT参数从外部传入FC并由调用它的父程序管理其生命周期否则不要在FC内部实现需要记忆功能的沿检测逻辑。最佳实践是将沿检测逻辑放在调用FC的上一层程序如OB1或某个FB中将检测到的脉冲作为输入参数传给FC。5. 程序调试与问题排查实战手册当程序行为异常怀疑是沿指令问题时可以按照以下流程进行系统性排查。5.1 问题现象与可能原因速查表问题现象可能原因排查方向计数器增加过快一次动作多次计数1. 未使用沿指令直接用了长信号。2. 使用了沿指令但输入信号有抖动。3. OIS1指令被意外放在了会被多次执行的条件分支中。1. 在线监控确认触发计数器的信号是否为单脉冲。2. 监控原始输入信号看是否有毛刺。3. 检查程序逻辑确保OIS1所在网络只在预期条件下执行。该触发的动作没触发1. 扫描周期过长信号脉冲被错过。2. 沿指令的“上一次状态”存储变量被意外复位或覆盖。3. 在FC中错误地使用了沿检测。4. 信号脉冲宽度小于PLC扫描周期。1. 查看CPU负载和扫描周期时间。2. 监控沿指令内部的状态存储位。3. 检查沿指令的实现位置OB/FC/FB。4. 考虑使用硬件中断或高速计数器。状态标志无法复位或意外复位1. OSSR逻辑存在多路复位发生竞争。2. 复位条件过于宽泛或存在逻辑错误。3. 程序扫描顺序导致置位发生在复位之后。1. 审查所有对目标标志进行复位的逻辑。2. 在线监控复位条件的各个组成部分。3. 调整程序块调用顺序或使用“先读后写”的中间变量。单按钮启停逻辑混乱1. 按钮抖动导致一次物理按下产生多个沿。2. 逻辑中使用了NOT运算但状态翻转时机不对。1. 为按钮信号增加软件消抖。2. 确保翻转逻辑: NOT严格且仅由OIS1(按钮)触发。5.2 在线监控与诊断技巧监控“沿”本身不要只监控输出结果。将沿指令内部用于比较的“上一个扫描周期状态”的变量也添加到监控表。观察它是否随着输入信号正确变化。例如对于OIS1(#Input)监控#Input和存储其上次状态的静态变量#LastInput。使用“触发器”功能大多数PLC编程软件如TIA Portal的在线监控都有触发功能。可以设置为当“疑似有问题的脉冲信号”从0变1时触发一段时间的波形记录。这能帮你捕捉到那些一闪而过、肉眼难以观察的脉冲。强制与修改值在停机安全状态下可以强制给某个输入点赋值然后在线修改其值如从0改为1再快速改回0模拟一个脉冲观察程序逻辑的响应是否符合预期。这是验证沿逻辑最直接的方法。关注扫描周期在诊断疑似漏脉冲的问题时务必查看CPU的诊断缓冲区了解当前的平均扫描周期和最坏情况扫描周期。如果扫描周期波动很大如从10ms突然跳到100ms很可能就是问题根源。5.3 编程规范建议为了团队协作和后期维护建立统一的沿指令使用规范至关重要命名规范对经过沿检测的信号在变量名中体现出来。例如原始按钮叫btnStart其上升沿脉冲可以命名为btnStart_PosEdge或cmdStart表示启动命令。集中管理考虑在程序架构中建立一个专门的“输入信号处理”功能块或区域。所有物理输入信号的滤波、取反、沿检测都在这里完成生成干净的、可供逻辑层使用的“过程映像”。逻辑层只使用这些处理后的信号不与原始IO直接耦合。注释清晰在复杂的沿检测或状态锁存逻辑旁用注释写明意图。例如// 上升沿置位仅当急停复位后由停止按钮复位。优先使用系统功能块大多数现代PLC都提供了经过优化的、带背景数据块的沿检测功能块如西门子的R_TRIG,F_TRIG。优先使用它们而不是自己用变量去比较实现通常更可靠且易于调试。OIS1、OIS1N、OSSR、OSSI这些指令是构建PLC程序确定性和可靠性的基石。它们将连续的、模拟的物理世界信号转换为我们逻辑程序中离散的、确定的事件。理解它们的本质差异——瞬态脉冲与稳态锁存——是避免逻辑错误的第一步。而在实战中对扫描周期的敬畏、对信号抖动的处理、对复位逻辑的谨慎以及对程序结构的良好规划则是将这些简单指令用出“高级感”的关键。下次在编程时当你的手指即将输入一个普通的常开触点去驱动一个计数器时不妨停顿一秒问自己一句“这里真的不需要一个上升沿吗”