作为一名刚入行不久的自动化工程师,我接触西门子 PLC 的时间并不算长,最初仅能完成一些简单的线性逻辑编程。而第一次使用 FOR 循环指令的经历,不仅让我突破了编程思路的局限,更让我深刻体会到西门子 PLC 指令的灵活性与高效性,至今回想起来仍历历在目。
那是我参与的第一个完整项目 —— 某电子元件组装生产线的 PLC 程序编写。项目中需要实现一个核心功能:对生产线的 10 个工位进行物料检测,每个工位都装有一个光电传感器(对应 PLC 的输入点 I0.0-I0.9),当某个工位检测到物料缺失时,需立即点亮对应的报警指示灯(对应输出点 Q0.0-Q0.9),同时将缺失工位的编号上传至上位机。
接到任务时,我首先想到的是 “笨办法”:针对每个工位单独编写检测逻辑。比如工位 1 的逻辑是 “如果 I0.0 未检测到信号(物料缺失),则置位 Q0.0,并将工位编号 1 写入数据寄存器 DB1.DBW0”;工位 2 则是 “如果 I0.1 未检测到信号,置位 Q0.1,写入编号 2”…… 以此类推,10 个工位就需要重复编写 10 段几乎相同的代码。
当我写完前 3 个工位的逻辑时,就明显感觉到了问题:代码冗余度极高,不仅编写过程枯燥繁琐,后续维护也十分不便 —— 如果后续需要增加工位,或者修改报警逻辑,就得逐一修改每一段代码,很容易出现遗漏或错误。更重要的是,当时项目工期紧张,这样的编写方式会严重拖慢进度。
就在我一筹莫展时,带我的师傅看到了我的代码,提醒道:“10 个工位的逻辑完全一致,为什么不用 FOR 循环指令简化一下?西门子 PLC 的循环指令专门解决这种重复执行的场景。” 这是我第一次听到 “FOR 循环” 在 PLC 编程中的应用,虽然在大学课本里学过循环的基本概念,但从未在实际 PLC 项目中使用过,一时不知从何下手。
师傅打开博途软件(TIA Portal),一边操作一边讲解:西门子 PLC 的 FOR 循环指令位于 “指令”→“程序控制” 目录下,核心是通过设定 “起始值”“终止值” 和 “步长”,让程序自动重复执行循环体内的逻辑,还能通过循环变量(如 #i)动态关联 I/O 点和数据地址。以我的项目为例,循环变量 #i 的起始值设为 0、终止值设为 9、步长设为 1,这样循环会从 #i=0 执行到 #i=9,正好对应 10 个工位。
接下来,师傅教我用 “地址偏移” 的方式关联 I/O 点:输入点不再写死为 I0.0 或 I0.1,而是写成 “P#I0.0 BYTE 1” 偏移 #i 个字节(实际项目中需根据信号类型调整,此处为简化逻辑),输出点同理写成 “P#Q0.0 BYTE 1” 偏移 #i 个字节;数据寄存器也通过 “DB1.DBW0 + #i*2”(Word 类型占 2 个字节)动态存储工位编号。这样一来,原本 10 段重复的代码,只用一段循环程序就能实现。
刚开始编写时,我频频出错:要么循环变量的起始值和终止值搞反,导致循环不执行;要么地址偏移的计算错误,让报警灯对应到了错误的工位。比如有一次,我误将循环变量的步长设为 2,结果只检测了工位 1、3、5 等奇数工位,偶数工位完全没反应。这时,师傅让我用博途的 “在线监控” 功能,实时观察循环变量 #i 的变化过程 —— 看着 #i 从 0 逐步增加到 9,再结合 I/O 点的状态变化,我很快找到了偏移计算和步长设置的问题。
经过反复调试,当我第一次运行程序,看到 10 个工位的物料缺失报警能准确对应,且上位机能正确显示缺失工位编号时,那种成就感难以言喻。更让我惊喜的是,后续项目需要新增 2 个工位时,我只需要将 FOR 循环的终止值从 9 改成 11,再相应增加 I/O 点的硬件配置,无需修改任何程序逻辑,极大地提升了效率。
这次使用 FOR 循环的经历,让我明白西门子 PLC 编程不仅是 “写代码”,更是 “找方法”—— 合理运用指令能让复杂问题变得简单。如今,无论是批量设备控制、数据批量处理,还是参数批量设置,FOR 循环都成了我编程时的 “常用工具”。而这段从手足无措到熟练应用的经历,也让我更加坚信:只有在实战中不断探索和试错,才能真正掌握技术的精髓,这或许就是工程师成长的必经之路