位逻辑运算
接点、线圈和边沿检测
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 应用边沿检测。