ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PLC从入门到精通08-同一个变量赋两次值程序就抽风?3 分钟搞懂双线圈陷阱和扫描铁律

PLC从入门到精通08-同一个变量赋两次值程序就抽风?3 分钟搞懂双线圈陷阱和扫描铁律 写 PLC 程序最诡异的 bug 排行第一程序逻辑看着对PLC 跑起来却不按预期。90% 的根因是双线圈——同一个变量在程序里被赋值两次甚至多次CPU 只认最后一次前面的赋值被默默覆盖。这种现象在 PLC 里有个专业术语“双线圈问题” 或 “双输出问题”。F2 调研中提到这是新手调试时最费时间的 bug单次排查平均耗费 2-4 小时——资深工程师一眼看出新人可能要拆整个程序。这篇文章我用 3 张图 2 个真实事故把双线圈陷阱和扫描铁律一次讲透。核心PLC 是扫描执行——同一个扫描周期内多次赋值只认最后一次要在多次赋值实现不同功能必须用 SET/RST 而非普通线圈。目录目录一、双线圈问题的诡异现象1.1 一个典型案例1.2 答案CPU 两次扫描同一变量1.3 双线圈的真实事故二、PLC 循环扫描机制铁律2.1 PLC 扫描的三个阶段2.2 双线圈的本质扫描顺序决定结果2.3 扫描周期的工程意义三、双线圈陷阱的 4 种典型情况情况 1直接双线圈最常见情况 2跨 FB 双线圈情况 3SET 和 OUT 混用情况 4报警复位 启停混用四、解决之道SET/RST 状态分离4.1 标准解决用 SET/RST 替代普通线圈4.2 改进版启停程序专业工程师写法4.3 状态分离设计模式五、强制表 / 在线表调试技巧5.1 TIA Portal 监控表Watch Table5.2 强制功能Force5.3 交叉引用Cross Reference5.4 程序比较Compare六、避坑清单双线圈排查 6 法八、在线表与强制表的正确使用规范TIA Portal 监控表Watch Table高级用法强制表Force Table的 3 条铁律九、双线圈在 SFC 中的合法存在十、OB1 扫描超时的工程影响十一、双线圈检测的自动化方法TIA Portal 的显示重叠赋值检查手动检测脚本F2 推荐程序审查清单十二、过程映像更新机制深入标准 OB1 过程映像即时读/写Peripheral Access十三、过程映像更新机制的深入理解OB1 标准过程映像即时读写Peripheral Access十四、双线圈自动化检测方法F2 推荐审查清单十五、OB1 扫描超时的工程影响十六、程序在线修改的注意事项在线修改Run-Mode Edit在线修改后的验证十七、SET/RST 双稳态的最佳实践SET/RST 的安全优先级SET/RST 的互锁设计不可用 SET/RST 的场景十八、PLC 程序测试的 3 层方法论一、双线圈问题的诡异现象1.1 一个典型案例程序预期按下启动按钮 Q0.0 1按下停止按钮 Q0.0 0。实际程序网络1启动条件 start_btn ──── ( ) Q0.0 网络2停止条件 stop_btn ──── (/) Q0.0 (常闭触点)运行结果只按启动按钮 → Q0.0 1 ✓同时按启动和停止 → Q0.0 0不是预期的启动优先也不是停止优先只按停止按钮 → Q0.0 保持不变停止按钮不起作用新人懵了“我明明写了停止逻辑为啥按了停止按钮没反应”1.2 答案CPU 两次扫描同一变量PLC 扫描执行程序时逐网络Network从上到下、从左到右。Q0.0 这个变量被两个网络赋值网络1启动条件满足时赋值 1网络2停止条件满足时赋值 0CPU 扫描到网络1时Q0.0 1被启动按钮置位。继续扫描到网络2Q0.0 0被停止按钮复位。最后输出到输出映像区的是 0。如果你先按启动按钮再按停止按钮网络1的启动条件仍然满足因为 start_btn 还按着但网络2的停止条件也满足。CPU 扫描结果 Q0.0 0被网络2覆盖。结论双线圈导致前面的逻辑完全失效——程序对但跑不对。1.3 双线圈的真实事故事故 1某包装线电机不规则启动/停止现象按下启动按钮电机转 1 秒就停再按启动按钮又转 1 秒停。怀疑接触器坏了。实际程序里 Q0.0 被赋值 3 次——启动、停止、报警复位都赋了 Q0.0根因双线圈。前两个网络的逻辑被第三个覆盖。事故 2某设备急停按钮失效现象现场急停按钮按了设备不停。怀疑急停按钮坏了。实际急停信号接 I0.7程序里两处用到一处 RST Q0.0急停逻辑一处赋 Q0.0运行逻辑。根因运行逻辑的网络在急停逻辑之后扫描覆盖了急停的 RST。⚠️避坑警告急停按钮必须接在 PLC 输出端的最末层——即不论 PLC 程序怎么写急停信号都能直接切断输出硬件急停。F2 第 24 篇专门讲安全回路。二、PLC 循环扫描机制铁律2.1 PLC 扫描的三个阶段PLC 启动后不停循环做三件事这是 PLC 工作方式的铁律输入采样阶段把所有输入点I0.0、I0.1…的值读入输入映像区。这个阶段外部信号变化不会被立即读到。程序执行阶段CPU 从上到下、从左到右逐条扫描梯形图程序。每个变量包括中间继电器 M、输出 Q的当前值在程序里被读写。输出刷新阶段所有输出点的最终值从输出映像区一次性送到物理输出端子。2.2 双线圈的本质扫描顺序决定结果扫描顺序 程序的时间轴。网络1先扫描网络2后扫描。同一变量的多次赋值中最后一次扫描的值生效。类比两个人先后在同一块白板上写字后写的覆盖先写的——这就是双线圈。2.3 扫描周期的工程意义西门子 S7-1500 典型扫描周期 5-20ms。也就是说按下启动按钮到输出动作的延迟 20ms双线圈的覆盖在 20ms 内完成肉眼完全看不出启动按钮按下时 Q0.0 短暂为 1 又变 0——你只看到 Q0.0 0⚠️避坑警告循环扫描是 PLC 的本质不能改变。想要启动优先或停止优先的逻辑必须改程序结构而不是试图让 PLC 改变扫描顺序。三、双线圈陷阱的 4 种典型情况情况 1直接双线圈最常见网络1start_btn ──── ( ) Q0.0 网络2stop_btn ──── (/) Q0.0 (常闭点停止时赋值 0)结果Q0.0 被两次赋值最后扫描的网络2生效。停止按钮看似失效。情况 2跨 FB 双线圈FB_启动内部 Q0.0 输出 FB_停止内部 Q0.0 输出 OB1 调用两个 FB结果OB1 扫描到 FB_启动时 Q0.0 1扫描到 FB_停止时 Q0.0 0。最后 FB_停止的值生效——FB_启动的逻辑失效。情况 3SET 和 OUT 混用网络1alarm_signal ──── (S) Q0.0 网络2normal_signal ──── ( ) Q0.0结果网络1 用 SET 置位 Q0.0 1网络2 用普通线圈赋值 Q0.0 0。普通线圈覆盖 SET——报警信号看似失效。⚠️避坑警告SET 和 OUT 混用是新手最容易踩的坑。新人以为SET 是强制为 1OUT 是赋值——其实OUT 在 PLC 里就是普通赋值会覆盖 SET。情况 4报警复位 启停混用网络1start ──── ( ) Q0.0 网络2stop ──── (/) Q0.0 网络3alarm_reset ──── (R) Q0.0结果如果报警复位在最后扫描报警复位会覆盖启动逻辑——设备启动不了。F2 报告这种 bug 调试耗时 4 小时。四、解决之道SET/RST 状态分离4.1 标准解决用 SET/RST 替代普通线圈网络1启动条件 ──── (S) Q0.0 网络2停止条件 ──── (R) Q0.0SETSet置位把变量强制设为 1 并保持RSTReset复位把变量强制设为 0 并保持特性同一个变量可以有多个 SET 触发任意一个满足就置位同一个变量可以有多个 RST 触发任意一个满足就复位SET 和 RST 同时满足时PLC 按扫描顺序最后一个生效4.2 改进版启停程序专业工程师写法网络1置位 Q0.0 start_btn AND NOT stop_btn AND NOT fault_signal ──── (S) Q0.0 网络2复位 Q0.0 stop_btn OR fault_signal OR alarm_reset ──── (R) Q0.0逻辑启动条件按下启动按钮 AND 没按停止 AND 没故障 → 置位 Q0.0停止条件按停止 OR 有故障 OR 报警复位 → 复位 Q0.0优点没有双线圈多个启动条件手动启动 自动启动可以同时写多个 (S) Q0.0多个停止条件手动停止 故障停止 报警复位可以同时写多个 ® Q0.04.3 状态分离设计模式更专业的做法——把启动请求和运行状态分离网络1判断启动请求 start_btn AND NOT stop_btn ──── start_req (bool) 网络2SET/RST Q0.0 start_req ──── (S) Q0.0 stop_btn ──── (R) Q0.0 网络3用 Q0.0 控制输出 Q0.0 ──── 电机接触器 KM1优点运行状态Q0.0只在一处被赋值启动条件逻辑独立维护。效率技巧F2 第 11 章特别推荐所有状态保持型变量电机运行、阀门打开都用 SET/RST不要用普通线圈。一次性消除 90% 的双线圈问题。五、强制表 / 在线表调试技巧5.1 TIA Portal 监控表Watch Table监控表用法项目树 → 右键监控与强制表 → “添加新监控表”输入要监控的变量start_btn (I0.0)、motor_run (Q0.0)、M0.0点击全部监控按钮 → 进入在线模式 → 实时显示变量值显示格式BOOL 变量显示FALSE/TRUE或绿色/红色INT 变量显示数字REAL 变量显示浮点数5.2 强制功能Force强制 vs 修改修改Modify临时改变变量值CPU 扫描一次后恢复受程序逻辑影响强制Force直接覆盖变量值程序无法改变直到手动解除强制强制使用场景调试时强制输入点 1看输出响应测试报警功能强制 fault_signal 1紧急停止 PLC 程序逻辑不正常时临时强制关键输入/输出⚠️避坑警告强制是双刃剑。现场调试用强制后忘了解除 → PLC 永久被强制 →程序逻辑失效但找不到原因。F2 特别提醒强制使用后必须记录并解除。5.3 交叉引用Cross ReferenceTIA Portal 交叉引用右键变量 → “交叉引用” → 显示这个变量在程序里被哪些网络/FB 使用双击可跳转到使用位置排查双线圈的神器看到 Q0.0 被多处赋值 → 立即在交叉引用里查看所有使用位置5 分钟定位双线圈源头5.4 程序比较CompareTIA Portal 程序比较“工具” → “比较” → “与在线比较”显示离线程序和在线 PLC 里程序的差异防止本地改了没下载导致的双线圈假象效率技巧F2 4.3 节特别强调调试 PLC 必带 4 件套——监控表 强制 交叉引用 程序比较。这 4 个功能能在 5 分钟内定位 90% 的诡异 bug。六、避坑清单双线圈排查 6 法⚠️避坑警告 1所有状态保持型变量用 SET/RST电机、阀门、报警等状态变量永远用 SET/RST 替代普通线圈——一次解决 90% 双线圈问题。⚠️避坑警告 2禁用 SET 和 OUT 混用同一变量要么全用 SET/RST要么全用普通线圈。混用 调试地狱。⚠️避坑警告 3跨 FB/FC 引用同一变量时慎之又慎FB1 和 FB2 都引用motor_run全局变量 → 必然双线圈。解决FB 之间通过接口IN/OUT 参数通信不用全局变量。⚠️避坑警告 4复杂逻辑用 SFC顺序功能图SFC 把整个流程分解为步和转换条件每一步只赋值当前变量从结构上避免双线圈。F2 第 16 章详述 SFC。⚠️避坑警告 5交叉引用定期检查每周或每次大改程序后用交叉引用检查所有 Q/M 变量被引用的位置。双线圈在改动时容易引入定期检查能早期发现。⚠️避坑警告 6在线监控强制小心强制功能用完立即解除。养成使用强制立刻记录的习惯——记在本子上或注释里。八、在线表与强制表的正确使用规范TIA Portal 监控表Watch Table高级用法触发条件监控监控表里设触发条件——如motor_run TRUE时记录一次捕捉偶发性故障5 个班次才出现 1 次的故障靠人盯根本抓不住修改模式Modify应用每次扫描都修改、仅修改一次、永久修改——3 种模式选对场景永久修改模式下程序无法改变该值调试后必须切换回不修改强制表Force Table的 3 条铁律⚠️铁律 1使用必须登记。在场记录表上写谁、什么时间、强制了哪个变量、原因。不登记 → 接班工程师不知道 → 找 bug 找 4 小时。⚠️铁律 2使用时间不超过 8 小时。超过 8 小时留在强制状态 → 程序逻辑彻底失效。⚠️铁律 3强制输出Q 点必须多人确认。强制 Q 点 让设备不受程序控→ 人员必须确认现场无人。九、双线圈在 SFC 中的合法存在SFC顺序功能图中同一输出可能在不同步中被赋值但因为 CPU 在同一时间只执行一步当前步所以不产生双线圈。这是双线圈的唯一合法场景。但即使 SFC也建议对关键输出用 SET/RST 而非普通线圈——防止 SFC 切换步时输出闪烁。十、OB1 扫描超时的工程影响S7-1500 默认扫描周期监控 150ms。如果 OB1 超过 150ms 还没跑完 → CPU 报错循环时间超出→自动 STOP。典型原因OB1 里循环太多FOR 1000 次 复杂运算大量字符串操作每个占用 1-2ms通信任务占 CPU 周期多个 MODBUS TCP 连接解决把耗时操作字符串/数据库/大量循环移到低优先级的 OB如 OB30 循环中断用循环 OB如 OB35 每 100ms 跑一次分散计算增大循环监控时间最大 6000ms但不推荐超过 500ms⚠️ 生产设备 STOP 停产。扫描超时 设计失误。十一、双线圈检测的自动化方法TIA Portal 的显示重叠赋值检查TIA Portal V17 → 项目树右键 → “编译” → “显示所有警告” → 查看输出地址重叠警告。编译器能发现同地址被多处写但不能发现跨 DB 的同名变量双赋值。手动检测脚本导出程序符号表.xlsx在 Excel 里用 COUNTIF 统计每个 Q 点和 M 点的被写次数。如果 COUNTIF 1 → 双线圈嫌疑需人工确认是否为 SET/RST 合法场景。F2 推荐程序审查清单检查项通过标准每个 Q 点被写次数≤ 1SET/RST 例外每个 M 点被写次数≤ 1SET/RST 例外跨 FB 同全局变量写0必须为 0SET/OUT 混用同变量0必须为 0双线圈出现在不同 OB 中检查中断优先级十二、过程映像更新机制深入标准 OB1 过程映像输入采样 → OB1 执行 → 输出刷新 —— 标准流程。OB1 执行期间读取的 I0.0 始终是本次扫描开始时的值即使物理信号已经变了——因为 I0.0 的值在输入采样阶段被锁存了。即时读/写Peripheral Access绕过过程映像直接读物理 IO%IW0:P西门子。延迟从 20ms 缩短到 1ms。应用场景高速计数、编码器 Z 相信号、光电触发——这些场景不能等 20ms 后再读必须即时读。⚠️即时读写的代价不参与过程映像一致性读到扫描中途变了的值且大幅增加通信负载——每个即时读 一次背板总线通信。十三、过程映像更新机制的深入理解OB1 标准过程映像输入采样 → OB1 执行 → 输出刷新。OB1 执行期间读的 I0.0 始终是本次扫描开始时的值即使物理信号已变——因为在输入采样阶段被锁存了。即时读写Peripheral Access绕过过程映像直接读物理 IO%IW0:P西门子。延迟从 20ms 降到 1ms。适用高速计数、编码器 Z 相、光电触发——不能等 20ms 后。⚠️代价不参与过程映像一致性可能读到扫描中途变了的值且大幅增加背板总线负载。十四、双线圈自动化检测方法TIA Portal V17编译 → “显示所有警告” → “输出地址重叠”。能发现同地址多次写但无法发现跨 DB 的同名变量双赋值。Excel 手动检测导出符号表 .xlsx → COUNTIF 统计每个 Q/M 点被写次数。 1 → 嫌疑需人工确认是否为 SET/RST 合法场景。F2 推荐审查清单检查项标准每个 Q 点被写次数≤ 1SET/RST 例外每个 M 点被写次数≤ 1跨 FB 同全局变量写必须为 0SET/OUT 混用同变量必须为 0十五、OB1 扫描超时的工程影响S7-1500 默认扫描周期监控 150ms。超时 → CPU 报错 →自动 STOP→ 停产。典型原因OB1 里循环太多、大量字符串操作、多 Modbus TCP 连接占 CPU。解决耗时操作移低优先级 OBOB30 循环中断、用 OB35每 100ms分散计算、增大监控最大 6000ms不推荐超过 500ms。十六、程序在线修改的注意事项在线修改Run-Mode Edit三菱 GX Works3 的运行中写入功能——不停机在线改程序段。西门子 TIA Portal 的在线编辑某些 CPU 不支持需查看手册。⚠️在线修改 3 不原则不新增/删除 FB/FC仅修改现有 Network/梯形图不修改 DB 结构会破坏在线数据——生产数据全丢不改安全相关逻辑急停/安全门/光幕——任何涉及安全的逻辑必须停机改、重新验证在线修改后的验证改完要按单步验证修改的 Network——在线修改不经过离线测试风险比离线编程高 10 倍。F2 第 8 章建议在线修改后 30 分钟内工程师不要离开设备。十七、SET/RST 双稳态的最佳实践SET/RST 的安全优先级RST复位优先级必须高于 SET。如果 SET 和 RST 同时有效 → 应为 RST 生效。因为复位 停机/安全置位 启动/允许。安全永远高优先级。梯形图实现RST 线圈放在 SET 线圈之后程序最后一段执行 RST→ RST 覆盖 SET。SET/RST 的互锁设计电机启停启动按钮 → SET motor_run。停止按钮/急停/过载/断相 → RST motor_run。4 个条件里任意 1 个触发 RST → 停机。SET 只有 1 个条件启动按钮→ 启动条件严格、停止条件宽松。设置严格、复位宽松 安全优先。不可用 SET/RST 的场景模拟量输出OUT 指令定时器/计数器不可 SET/RST 定时器 Q 位用 R 输入复位伺服/运动控制MC_Power 等专用块用 Enable 信号控制十八、PLC 程序测试的 3 层方法论第 1 层单元测试对单个 FB 独立测试。“FB_Motor” 给各种输入组合启动故障/启动超时/启动停止/同时按下启动和停止→ 确认输出正确。F2 第 8 章推荐用 TIA Portal Test Suite 自动跑单元测试。第 2 层集成测试连接多个 FB 测试——检查 FB_Motor 和 FB_Valve 的联锁时序“电机启动 3 秒后才能开阀门”。第 3 层系统测试全系统在虚拟调试平台SIMIT跑→ 模拟所有工况→确认无异常。结论如果单元测试做了产线调试能缩短 60% 时间F2 数据。如果跳过单元测试直至产线实测——调试时间翻倍 碰坏设备概率翻倍。十九、扩展阅读 系列预告本篇核心要点回顾双线圈陷阱同一变量被多次赋值CPU 只认最后一次——程序对但跑不对扫描铁律输入采样 → 程序执行 → 输出刷新循环周期 5-20ms4 种典型双线圈直接双线圈 / 跨 FB / SETOUT 混用 / 报警复位启停混用解决之道所有状态保持型变量用 SET/RST 状态分离设计调试 4 件套监控表 强制 交叉引用 程序比较思考题你遇到过程序对但跑不对的诡异 bug是不是和双线圈有关你的项目里状态保持型变量用 SET/RST 还是普通线圈下一篇预告 第 09 篇《电工小白怕上手不敢接第一个灯3 阶段练习法让你 1 个月独立接配电箱**》—从看懂原理图到独立接线的完整路径配电箱接线 5 大规范。标签#PLC调试 #双线圈 #循环扫描 #SET复位 #梯形图编程 #自动化工程师 #PLC入门SEO 关键词PLC双线圈、循环扫描、SET复位、PLC调试技巧、PLC入门
返回列表