• 正文
  • 相关推荐
申请入驻 产业图谱

PLC编程最忌讳的写法有哪些?这10个坏习惯正在毁掉你的程序

1小时前
56
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在工业自动化现场,一个不规范的PLC程序轻则导致设备误动作,重则引发安全事故。本文整理了PLC编程中最常见的10个忌讳写法,附错误示例与正确做法,帮你告别"垃圾代码"。

忌讳一:全局变量满天飞,没有封装意识

很多新手喜欢把所有变量都定义成全局变量(Global标签),图省事,结果一个程序里几百个全局变量互相交织,调试时完全理不清数据流向。

好写法

使用FB/FC封装功能块,通过输入输出参数传递数据,内部变量用Static或Temp

坏写法

所有数据都用全局变量传递,FB/FC函数块形参为空,靠M区、DB区直接读写。

好的封装让代码即插即用,一个FB可以重复调用N次控制N个电机,修改一处即可全局生效

忌讳二:梯形图里写"意大利面"逻辑

梯形图最大的优势是直观易懂,但有些人把几十个触点串联在一行,搞得跟意大利面条一样缠绕不清——这种程序别说给别人看,自己三个月后回来也看不懂。

好写法

按功能拆分Network,每个Network只完成一个逻辑,加注释说明意图。

坏写法

一个Network里串联20+个触点,AND/OR混用不加括号,逻辑全凭感觉。

好的梯形图应该让电工也能看懂,这才是PLC编程的初心。

忌讳三:Set/Reset 乱用,搞出一堆"幽灵输出"

Set(S)和Reset(R)指令很方便,但滥用是PLC编程第一大坑。多个地方Set同一个变量、忘了Reset、停电后状态不确定……导致输出莫名自保持,查故障查到怀疑人生

好写法

尽量用自锁电路(启-保-停)替代Set/Reset,如果必须用,集中在一个地方管理

坏写法

到处Set/Reset同一个输出点,没有统一的状态管理

SR触发器的一个Network就能说清楚谁启动谁停止,比散落在各处的Set/Reset靠谱得多

忌讳四:硬编码常量,数字满天飞

定时器预设值、比较阈值、通信参数直接写死在程序里,换一台设备就要重新下载程序——这在现场调试是灾难性的。

好写法

关键参数放到HMI可配置的DB块中,程序里用符号引用。

坏写法

所有参数固化在程序中,修改必须用编程软件连接PLC

把参数交给工艺人员,别把自己困在改程序的死循环里。

忌讳五:不处理故障状态,程序"只走通不走断"

90%的新手只写"设备正常时怎么运行",从不考虑传感器坏了、阀门卡住了、通信断了这些异常情况。结果现场一报警,程序直接卡死或者输出乱跳。

好写法

每个动作都加超时检测+故障报警,用状态机管理异常流程。

坏写法

所有流程按理想情况写,没有超时检测、没有故障状态机。

状态机可以让故障处理逻辑清晰可见,出问题一看Step值就知道卡在哪一步。

忌讳六:程序没有分段结构,OB1里塞满代码

所有逻辑全写在OB1(主循环)里,一个Block几千行,不分功能、不分设备——这在现场维护时简直是噩梦。查一个传感器故障要翻几百个Network

好写法

按功能拆分FC/FB,OB1只负责调用,一目了然。

坏写法

OB1几千行,搜索功能全靠Ctrl+F

程序结构清晰了,调试效率能提升10倍。

忌讳七:无注释/乱注释——比没注释更可怕

注释有两种极端:一是完全不写注释,变量名全是M0.0、DB1.DBW2这种;二是注释过时了,程序改了注释没改,写着"电机正转"实际在控制水泵——后者比前者更坑人。

好写法

每个Network写清楚"为什么这么做",而不是"做了什么";变量命名见名知义

 

坏写法

零注释 + 神秘变量名 / 过时注释误导人。

好的注释可以让你半年后回来改程序时,10分钟就进入状态。

忌讳八:搞不清上升沿/下降沿的扫描机制

PLC是循环扫描执行的,不了解这个机制就会写出各种奇葩Bug。最典型的就是在一个扫描周期内多次使用同一个上升沿检测——结果第二个永远检测不到。

好写法

理解扫描周期,一个信号只在一个地方做一次边沿检测,结果用变量传递。

坏写法

同一个上升沿变量在一周期内多处使用,或者用上升沿触发Set后又在本周期读取。

边沿检测像"一次性筷子",用一次就没了,记得把结果存起来

忌讳九:数据类型乱匹配,隐式转换埋雷

INT和DINT混用、字节和字不做转换直接传参——编译器不报错,运行起来数据就乱了。尤其西门子PLC的字节顺序(Big-Endian)和PC端的(Little-Endian)不一样,不注意就是坑。

好写法

严格使用正确的数据类型,做显式转换,用结构体代替M区。

坏写法

类型不匹配强行赋值,或者不处理字节序。

结构化编程 + 强类型转换,让编译器帮你发现错误而不是运行时才爆炸。

忌讳十:循环调用大量FB,不管理内存

FB(功能块)每次调用都会在背景数据块中占用内存。在一个循环里无节制地调用FB,内存很快就爆了。尤其S7-1200这类内存紧张的PLC,这个问题尤为致命。

好写法

功能块优先用FC(无背景DB),必须用FB时用MULTI-INSTANCE(多重实例),一个背景DB管理所有实例。

坏写法

FOR循环里反复New一个FB实例,或同一个FB有几百个背景DB

内存管理做得好,S7-1200也能跑出1500的感觉。

十大忌讳速查表

写在最后

PLC编程不同于PC软件开发,代码质量直接影响产线安全和生产效率。一个好的PLC程序应该做到三点:

① 结构清晰——任何一个懂行的工程师都能在5分钟内找到他想改的地方

② 容错健壮——即使传感器坏了、通信断了,程序也能安全停机而不是乱跑

③ 可维护——参数可在线修改,不用每次都下载程序

避开上面这10个坑,你的PLC代码水平就能超越90%的同行。共勉!

—  —

相关推荐