位逻辑运算
接点、线圈和边沿检测
PLC 编程的核心。位逻辑指令处理每一个布尔运算 —— 从简单的接点和线圈到触发器和边沿检测。掌握这些,您就可以构建任何自动化逻辑。
什么是位逻辑运算?
位逻辑运算是 PLC 编程中最基本的指令。它们处理布尔信号(TRUE/FALSE,1/0) —— 读取输入状态,使用 AND/OR 逻辑组合条件并控制输出。在 LAD 中,它们表现为梯级上的接点和线圈。在 FBD 中,它们表现为 AND/OR/NOT 逻辑门方框。
每个 PLC 程序都广泛使用位逻辑指令。电机启动/停止电路、报警条件、阀门联锁 —— 它们都始于读取传感器状态的接点,终于驱动执行器的线圈。
接点 —— 读取输入状态
接点读取变量的布尔状态并将其传递给逻辑链
常开接点 (Normally Open)
—| |—功能描述
读取布尔变量 (BOOL)。如果变量为 TRUE (1),接点闭合并将能流 (RLO = TRUE) 传递到下一个元素。如果变量为 FALSE (0),接点断开并阻断能流。这是 LAD 编程中最常用的指令。
何时使用
每当您需要检查条件是否为 TRUE 时:按钮是否按下?传感器是否激活?标志位是否设置?放置一个常开接点并为其分配您的变量。
专业提示
“常开”一词源自继电器逻辑 —— 接点在其正常/静止状态下是断开的(不通电)。通电时闭合。
多个常开接点串联创建 AND (与) 逻辑。并行分支中的多个常开接点创建 OR (或) 逻辑。
在 FBD 中,等效操作只需将 BOOL 变量连接到 AND/OR 方框输入端即可 —— 无需显式的接点符号。
常闭接点 (Normally Closed)
—|/|—功能描述
常开接点的反操作。如果变量为 FALSE (0),接点闭合并通过能流。如果变量为 TRUE (1),接点断开并阻断能流。它对接点值执行 NOT (非) 运算。
何时使用
当您需要检查条件是否不成立时:急停未按下、无激活故障、未达到限位开关。常用于安全联锁和报警条件。
专业提示
对于急停按钮和安全电路,请使用常闭接点 —— 它们具有故障安全特性。如果导线断开,常闭接点将打开并停止机器。
在 FBD 中,等效操作是取反输入(AND/OR 方框输入引脚上的小圆圈)。
不要将常闭接点指令与物理常闭按钮混淆。它们是独立的概念。
RLO 取反 (NOT)
—|NOT|—功能描述
取反(否定)当前的逻辑运算结果 (RLO)。如果到此点为止的逻辑链评估为 TRUE,NOT 将其变为 FALSE,反之亦然。它作用于累积的逻辑结果,而不是特定的变量。
何时使用
当您需要取反复杂的逻辑表达式而不是单个变量时。无需使用取反接点重写整个条件,只需在末尾放置 NOT 即可翻转结果。
专业提示
NOT 取反链中该点的整个 RLO —— 它与仅取反一个变量的常闭接点不同。
在 FBD 中,使用 NOT 方框或取反逻辑门的输出。
谨慎使用 —— 过多使用 NOT 会使逻辑难以阅读。通常,重新组织逻辑会更清晰。
线圈 —— 控制输出
线圈将逻辑链的结果写入输出变量
赋值 (Assignment)
—( )—功能描述
将当前的 RLO(逻辑运算结果)写入布尔变量。如果逻辑链为 TRUE,则变量变为 TRUE。如果为 FALSE,则变量变为 FALSE。这是标准的输出线圈 —— 它在每个扫描周期直接反映输入逻辑。
何时使用
适用于任何应直接遵循其输入条件的输出。当电机运行时开启指示灯,或者当满足条件时开启阀门。输出跟踪输入 —— 当条件变为 FALSE 时,输出也变为 FALSE。
专业提示
赋值线圈是“非保持性”的 —— 它在每次扫描时写入。如果逻辑变为 FALSE,输出立即变为 FALSE。
一个变量应仅在一个网络中赋值。对同一变量进行多次赋值会导致最后一个胜出,从而引发不可预测的行为。
在 FBD 中,赋值只是将逻辑门的输出连接到 BOOL 变量。
取反赋值 (Negate Assignment)
—(/)—功能描述
将取反后的 RLO 写入布尔变量。如果逻辑链为 TRUE,变量变为 FALSE。如果逻辑链为 FALSE,变量变为 TRUE。它在一个指令中结合了赋值 + NOT 运算。
何时使用
当输出应在相反条件下激活时。例如,当检测到故障时关闭“系统正常”指示灯。无需取反整个逻辑链,使用取反线圈即可。
专业提示
相当于在普通赋值线圈前放置一个 NOT,但更紧凑。
谨慎使用 —— 取反线圈可能读起来很困惑。有时重新组织逻辑更清晰。
在 FBD 中,这是一个取反的输出连接。
复位输出 (Reset)
—(R)—功能描述
当 RLO 为 TRUE 时,变量被设置为 FALSE (0)。当 RLO 为 FALSE 时,变量保持不变(保留当前值)。这是一个单向操作 —— 只能关闭,不能开启。
何时使用
在置位/复位电路中:一个网络置位输出(开启),另一个复位它(关闭)。将复位用于停止条件、故障清除和报警确认。在安全逻辑中,复位通常具有优先级。
专业提示
复位仅在其 RLO 为 TRUE 时起作用。当 RLO 为 FALSE 时,输出保持不变 —— 它不会将其设置为 TRUE。
在 S/R 对中,如果两个条件同时为 TRUE,则程序中最后出现的指令具有优先级。
复位是保持性的 —— 复位后,输出保持 FALSE,直到再次被显式置位。
置位输出 (Set)
—(S)—功能描述
当 RLO 为 TRUE 时,变量被设置为 TRUE (1)。当 RLO 为 FALSE 时,变量保持不变(保留当前值)。这是一个单向操作 —— 只能开启,不能关闭。
何时使用
在置位/复位电路中:将置位用于启动条件、锁存信号和首次运行标志。一旦置位,输出将保持 TRUE,直到被显式复位 —— 这使其具有“自锁”功能,无需密封接点。
专业提示
置位仅在其 RLO 为 TRUE 时起作用。当 RLO 为 FALSE 时,输出保持不变 —— 它不会复位它。
经典电机控制:网络 1 = 启动按钮 → 置位电机。网络 2 = 停止按钮或故障 → 复位电机。
在安全电路中注意保持性变量 —— 电力循环后,置位输出可能会保留其最后状态,具体取决于数据块 (DB) 的设置。
位字段操作
在单个操作中置位或复位一系列位
SET_BF — 置位位字段
功能描述
从指定地址开始,将一组连续的位设置为 TRUE。您可以定义起始位和要置位的位数。当 RLO 为 TRUE 时,所有指定的位都设置为 1。
何时使用
当您需要同时激活多个相关输出时 —— 例如,设置状态字的所有位、初始化一组标志或一次激活一组输出。
专业提示
适用于批量操作,而不是为每个位编写单独的置位指令。
位数参数决定了受影响的连续位数。
与置位一样,这仅在 RLO 为 TRUE 时起作用 —— 当 RLO 为 FALSE 时,位保持不变。
RESET_BF — 复位位字段
功能描述
从指定地址开始,将一组连续的位重置为 FALSE。您可以定义起始位和要复位的位数。当 RLO 为 TRUE 时,所有指定的位都清除为 0。
何时使用
当您需要一次清除多个标志或输出时 —— 例如,清除状态字中的所有报警位、在停机期间复位一组输出或初始化数据区域。
专业提示
SET_BF 的对应指令 —— 将它们一起用于组级置位/复位操作。
特别适用于在单个操作中清除报警字或状态寄存器。
与复位一样,这仅在 RLO 为 TRUE 时起作用 —— 当 RLO 为 FALSE 时,位保持不变。
触发器 —— 锁存电路
记忆其状态直到显式更改的双稳态元件
SR — 置位/复位触发器
功能描述
具有置位优先级的双稳态触发器。它有两个输入:S (置位) 和 R (复位),以及一个输出 Q。当 S=TRUE 时,Q 变为 TRUE。当 R=TRUE 时,Q 变为 FALSE。当 S 和 R 同时为 TRUE 时,Q 为 TRUE(置位优先)。
何时使用
适用于应具有置位优先级的锁存电路。在 SR 触发器中,如果同时按下启动和停止,输出将保持开启。当“启动优先”可接受时使用此项。
专业提示
SR = 置位优先。如果 S=1 且 R=1 → Q=1。当启动比停止更重要时使用。
在安全要求较高的应用中,优先选择 RS(复位优先) —— 如果两个条件同时触发,它更安全。
触发器在 LAD 和 FBD 中都是具有 S、R 输入和 Q 输出的单个方框。
RS — 复位/置位触发器
功能描述
具有复位优先级的双稳态触发器。它有两个输入:R (复位) 和 S (置位),以及一个输出 Q。当 S=TRUE 时,Q 变为 TRUE。当 R=TRUE 时,Q 变为 FALSE。当 R 和 S 同时为 TRUE 时,Q 为 FALSE(复位优先)。
何时使用
适用于安全至上的锁存电路。复位(停止)条件具有优先级 —— 如果启动和停止同时激活,输出为 OFF。这是电机控制和安全联锁的标准选择。
专业提示
RS = 复位优先。如果 S=1 且 R=1 → Q=0。对于大多数工业应用来说是更安全的选择。
经典电机控制模式:S = 启动按钮 AND 无故障,R = 停止按钮 OR 急停 OR 故障。
输出 Q 在扫描周期内是保持性的 —— 它保留其值直到触发器被再次评估。
边沿检测 —— 检测信号变化
检测信号何时从 FALSE→TRUE 或 TRUE→FALSE 转换
扫描操作数的上升沿
—|P|—功能描述
检测特定操作数上的上升沿(FALSE→TRUE 转换)。指令将当前值与上一次扫描的值进行比较。如果值从 0 变为 1,RLO 在正好一个扫描周期内为 TRUE。需要一个边沿存储位 (M 位) 来存储上一个状态。
何时使用
当您需要从持续信号中获得单次脉冲时:计算按钮按下次数、在电平变化时触发单个动作、每次激活时递增计数器。如果没有边沿检测,按住的按钮将在每个扫描周期触发动作。
专业提示
您必须分配一个唯一的边沿存储位 (M 位) —— 不要为多个边沿检测重用同一个 M 位,否则它们会相互干扰。
输出在正好一个 PLC 扫描周期内为 TRUE(通常为 1-50ms)。如果您需要更长的脉冲,请使用定时器。
在 LAD 中,这表现为带有 'P' 标记的接点。M 位变量显示在接点的上方/下方。
扫描操作数的下降沿
—|N|—功能描述
检测特定操作数上的下降沿(TRUE→FALSE 转换)。指令将当前值与上一次扫描的值进行比较。如果值从 1 变为 0,RLO 在正好一个扫描周期内为 TRUE。需要一个边沿存储位。
何时使用
当您需要对信号关闭做出反应时:检测按钮何时松开、在传感器断开时触发、或捕获工艺步骤完成的时刻。
专业提示
与上升沿相同的规则 —— 每个下降沿检测都需要自己唯一的 M 位。
适用于“按钮松开”动作:在按钮松开而非按下时启动定时器。
在停机序列中,使用下降沿检测每个步骤何时完成(输出从 ON 变为 OFF)。
在上升沿置位操作数
—(P)—功能描述
当在 RLO 上检测到上升沿(FALSE→TRUE)时,将指定操作数置位(写入 TRUE)一个扫描周期。在单个指令中结合了边沿检测和输出赋值。
何时使用
当您想在上升沿将标志位或输出设置为正好一个扫描周期,而无需单独的边沿检测接点和线圈时。
专业提示
这是一种线圈型指令 —— 它位于梯级的末尾,而不是中间。
与接点版本一样需要边沿存储位。
操作数仅在一个扫描周期内为 TRUE,然后自动返回 FALSE。
在下降沿置位操作数
—(N)—功能描述
当在 RLO 上检测到下降沿(TRUE→FALSE)时,将指定操作数置位(写入 TRUE)一个扫描周期。在单个指令中结合了下降沿检测和输出赋值。
何时使用
当您想在下降沿将标志位或输出设置为正好一个扫描周期。适用于触发停用后的动作。
专业提示
线圈型指令 —— 放置在梯级的末尾。
需要自己唯一的边沿存储位。
常用于工艺停止时应发生一次的“清理”动作。
P_TRIG — 扫描 RLO 的上升沿
功能描述
检测 RLO(逻辑运算结果)而非特定操作数上的上升沿。当组合逻辑结果从 FALSE 转换为 TRUE 时,输出在一个扫描周期内为 TRUE。边沿存储在指令实例内。
何时使用
当您想检测复杂逻辑组合而非单个变量的上升沿时。例如:检测 (传感器1 AND 传感器2 AND 无故障) 何时首次变为 TRUE。
专业提示
P_TRIG 作用于累积的 RLO —— 它检测其之前整个逻辑链的边沿。
边沿存储内置于指令中 —— 无需单独的 M 位。
在 FBD 中,P_TRIG 是一个具有 CLK 输入和 Q 输出的方框。
N_TRIG — 扫描 RLO 的下降沿
功能描述
检测 RLO 上的下降沿。当组合逻辑结果从 TRUE 转换为 FALSE 时,输出在一个扫描周期内为 TRUE。边沿存储在指令实例内。
何时使用
当您想检测复杂条件何时不再为真时。例如:检测 (自动模式 AND 全部就绪) 何时从 TRUE 变为 FALSE。
专业提示
N_TRIG 是 P_TRIG 的下降沿对应指令。
无需单独的 M 位 —— 边沿存储是内部的。
适用于检测组合条件而非单个信号的结束。
R_TRIG — 检测信号上升沿
功能描述
符合 IEC 61131-3 标准的上升沿检测功能块。它具有一个 CLK 输入和一个 Q 输出。当 CLK 从 FALSE 转换为 TRUE 时,Q 在一个扫描周期内为 TRUE。边沿存储在 FB 的实例数据中。
何时使用
当您想要具有自己实例数据的 IEC 标准边沿检测时。R_TRIG 是一个功能块 —— 每个实例自动维护自己的边沿存储。在结构化、可重用的代码中优先使用。
专业提示
R_TRIG 是一个 FB —— 它需要实例数据(可以是自己的 DB,也可以作为父 FB 中的多重实例)。这使其具有自包含和可重用性。
自 V1.0 起在 S7-1200/1500 上可用。这是边沿检测的 IEC 61131-3 标准方式。
在 SCL 中:myRTRIG(CLK := mySignal); IF myRTRIG.Q THEN ... END_IF;
F_TRIG — 检测信号下降沿
功能描述
符合 IEC 61131-3 标准的下降沿检测功能块。它具有一个 CLK 输入和一个 Q 输出。当 CLK 从 TRUE 转换为 FALSE 时,Q 在一个扫描周期内为 TRUE。边沿存储在 FB 的实例数据中。
何时使用
当您想要具有自己实例数据的 IEC 标准下降沿检测时。F_TRIG 是 R_TRIG 的下降沿对应指令。
专业提示
F_TRIG 是具有自己实例的 FB —— 与 R_TRIG 一样,它自包含且符合 IEC 61131-3 标准。
在 SCL 中:myFTRIG(CLK := mySignal); IF myFTRIG.Q THEN ... END_IF;
在编写可重用的库代码时,优先选择 R_TRIG/F_TRIG 而非 |P|/|N| 接点,因为它们不需要外部 M 位。
快速参考 —— 全部 20 个位逻辑指令
| # | 指令 | LAD 符号 | 快捷键 | 描述 |
|---|---|---|---|---|
| 1 | 常开接点 (Normally Open) | —| |— | F9 | 当变量为 TRUE 时通过能流 |
| 2 | 常闭接点 (Normally Closed) | —|/|— | F10 | 当变量为 FALSE 时通过能流 |
| 3 | RLO 取反 (NOT) | —|NOT|— | — | 取反逻辑运算结果 |
| 4 | 赋值 (Assignment) | —( )— | Shift + F7 | 将 RLO 写入输出变量 |
| 5 | 取反赋值 (Negate Assignment) | —(/)— | — | 将取反的 RLO 写入输出变量 |
| 6 | 复位输出 (Reset) | —(R)— | — | 当 RLO 为 TRUE 时将变量设置为 FALSE |
| 7 | 置位输出 (Set) | —(S)— | — | 当 RLO 为 TRUE 时将变量设置为 TRUE |
| 8 | SET_BF — 置位位字段 | — | — | 将一系列位设置为 TRUE |
| 9 | RESET_BF — 复位位字段 | — | — | 将一系列位重置为 FALSE |
| 10 | SR — 置位/复位触发器 | — | — | 置位优先触发器 (S=1,R=1 → Q=1) |
| 11 | RS — 复位/置位触发器 | — | — | 复位优先触发器 (S=1,R=1 → Q=0) |
| 12 | 扫描操作数的上升沿 | —|P|— | — | 检测操作数上的上升沿 |
| 13 | 扫描操作数的下降沿 | —|N|— | — | 检测操作数上的下降沿 |
| 14 | 在上升沿置位操作数 | —(P)— | — | 在上升沿置位操作数 1 个扫描周期 |
| 15 | 在下降沿置位操作数 | —(N)— | — | 在下降沿置位操作数 1 个扫描周期 |
| 16 | P_TRIG — 扫描 RLO 的上升沿 | — | — | 检测 RLO 上的上升沿 |
| 17 | N_TRIG — 扫描 RLO 的下降沿 | — | — | 检测 RLO 上的下降沿 |
| 18 | R_TRIG — 检测信号上升沿 | — | — | IEC 上升沿检测器 (FB) |
| 19 | F_TRIG — 检测信号下降沿 | — | — | IEC 下降沿检测器 (FB) |
常见问题解答
置位/复位线圈与 SR/RS 触发器有什么区别?
置位 (S) 和复位 (R) 线圈是放置在不同网络中的单个指令 —— 您通过哪个网络排在最后来控制优先级。SR/RS 触发器是具有两个输入的单个方框 —— 优先级是内置的(SR = 置位优先,RS = 复位优先)。触发器更紧凑且优先级明确。
我应该使用哪种边沿检测:|P|/|N|、(P)/(N)、P_TRIG/N_TRIG 还是 R_TRIG/F_TRIG?
|P|/|N| 接点检测特定变量的边沿并需要外部 M 位。(P)/(N) 线圈结合了边沿检测与输出赋值。P_TRIG/N_TRIG 检测 RLO(组合逻辑)的边沿。R_TRIG/F_TRIG 是具有内置存储的 IEC 标准 FB。对于可重用的库代码,优先选择 R_TRIG/F_TRIG。对于简单的内联逻辑,|P|/|N| 接点即可。
为什么我的置位/复位电路表现异常?
最常见的原因是置位和复位条件同时为 TRUE。在这种情况下,程序中最后一条指令胜出。如果您的复位网络在置位网络之前,输出将被置位。解决方案:对于安全关键电路使用 RS 触发器(复位优先),或确保您的条件是互斥的。
边沿检测可以作用于模拟值还是仅限 BOOL?
边沿检测指令(|P|、|N|、R_TRIG、F_TRIG)仅作用于布尔信号。对于模拟值,您需要先创建一个比较(例如:值 > 阈值)以产生 BOOL 结果,然后对该 BOOL 应用边沿检测。