|
亲爱的工控小伙伴们,大家好! 很多工程师在学习 ST 一段时间之后,都会进入一个阶段: 开始研究一些“高级写法”。 比如: 数组 结构体 面向对象(OOP) 但有一个很有意思的现象: 有些人用了这些东西之后,程序变得更清晰。 但也有人写完之后,程序更难维护了。 于是很多人会问: ST 到底要不要用高级特性? 我的经验是: 高级 ST 的本质不是语法,而是控制复杂度。 如果你只是为了“写得高级”,那十有八九会翻车。 今天我们就聊聊这三个最常见的东西到底该怎么用。 --- 一、数组不是偷懒,是规模化 很多人第一次用数组,通常是为了省代码。 比如: Motor[1]Motor[2]Motor[3]Motor[4] 这样写确实比: Motor1Motor2Motor3Motor4 更整齐。 但数组真正的价值,其实不是这个。 而是: 规模化。 在很多设备里,你会遇到这样的情况: 多工位设备 多轴系统 多模块设备 比如一台设备有12 个工位。 如果不用数组,你可能会写成这样: Station1Station2Station3...Station12 代码会迅速膨胀。 但如果用数组: Station[1..12] 很多逻辑就可以统一处理。 例如: FOR i := 1 TO 12 DO Station.Run();END_FOR 这时候你会发现: 数组不是偷懒,而是工程规模管理工具。 再配合 FB,就会非常清晰: Station : ARRAY[1..12] OF FB_Station; --- 二、结构体 = 工程语言 在很多 PLC 程序里,经常能看到这种变量: RobotStartRobotBusyRobotErrorRobotPartIDRobotSpeed 变量一多,问题就来了: 这些数据到底属于谁? 很难看出来。 这时候结构体就非常有用。 例如: Robot : ST_Robot 内部结构: STRUCT Command Status ParameterEND_STRUCT 这样所有相关数据都会被组织在一起。 在工程项目里,我通常有一个简单原则: 所有“成组的数据”,一律用 STRUCT。 比如: 设备命令: MachineCmd 设备状态: MachineStatus 设备参数: MachinePara 结构体的好处是: 数据清晰 结构稳定 扩展容易 慢慢你会发现: STRUCT 其实就是工程语言。 --- 三、OOP 只用一半就够了 很多 ST 新手接触 OOP 后,会特别兴奋。 开始研究: 继承 多态 接口 但在自动化项目里,我一直有一个建议: OOP 用一半就够了。 为什么? 因为自动化系统最重要的不是“优雅”。 而是: 稳定。 --- ① 封装:强烈推荐 封装是 OOP 最实用的一部分。 例如: FB_AxisFB_RobotFB_Station 每个模块都是一个独立系统。 内部逻辑全部封装起来。 外部只通过接口调用。 这是非常好的结构。 --- ② 继承:谨慎使用 继承在理论上很优雅。 但在 PLC 项目里,经常会出现: 调试困难 结构复杂 修改影响面太大 所以如果项目规模不大,其实没必要过度使用继承。 --- ③ 多态:慎之又慎 多态在软件工程里很常见。 但在 PLC 项目里,很容易让程序: 可读性下降。 现场调试时,最怕的就是: 看代码看不懂。 所以很多时候: 简单结构反而更稳定。 --- 四、一个很重要的工程原则 很多人学习高级 ST 时,会有一个误区: 觉得代码越高级越好。 但在自动化工程里,我一直遵循一个原则: 稳定 > 优雅 如果一个结构: 所有人都能看懂 调试方便 修改安全 那它就是好结构。 不需要为了“高级”而复杂化。 --- 小总结 高级 ST 的核心,其实不是语法。 而是: 控制系统复杂度。 三个简单原则: 1⃣数组用于规模化系统 2⃣结构体用于组织数据 3⃣OOP主要用封装 记住一句话: 自动化程序最重要的不是“写得漂亮”,而是“跑得稳定”。 --- ST 编程指南 · 系列 本文属于《ST编程指南》系列文章。 这个系列主要分享: ST 程序结构设计 自动化项目工程经验 一线调试总结 如果你正在做: Codesys TwinCAT IEC61131-3 欢迎关注,一起交流学习。 --- ——— END ——— 关注阿凡工控分享 持续分享工控一线经验 --- 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |