我们之前说到文本化编程,最重要的是结构化,跟我们写文章一样,需要分章节分篇分段落,那么对于ST编程而言,也需要我们恰如其分的应用子程序、功能块FB以及函数FC等等来拆分,使得程序更加层次分明,简洁明了!

原书第10章,标题是《Splitting up the PLC program》,翻译过来即程序的拆分!我们这期好好和大家分享下程序的结构化重要的方法!

原书称之为Program modules,我们这里按照常规的理解:子程序。

对于我们刚入门的工程师来说:最基本的结构,那就是整个程序里面只有一个Main主程序。
其他的程序,作为子程序放在Main里面进行调用!对于上图的程序说明如下:
主程序(Main)的执行流程
在每个程序扫描周期(Program-scan)中,主程序(Main)会被执行一次,其执行顺序如下:
HandlingInput 程序模块中的代码(处理输入信号);CalculateData 程序模块中的代码(数据计算与处理);HandlingOutput 程序模块中的代码(控制输出设备)。当一个扫描周期结束时,PLC会重新启动新一轮扫描,再次调用主程序。例如:
如果程序模块包含大型数组或复杂计算,可能会导致执行时间超出扫描周期。此时可采取以下措施:

函数Function
函数是PLC程序中的重要构建模块,包含少量可重复调用(执行)的代码。特别是一些常用的数据计算(数学公式),数据转换,或者经常使用的代码。
函数的调用方式



调用函数时,变量的传递方向通过符号明确区分:

例如:

函数的优势


Fuction函数也可以创建成数组ARRAY类型,对于这类特殊的调用,例如上图就是No.4的数组元素的传参调用方式。


函数(FC)语法:

功能块(FB)语法:

:=):值传递(函数内修改不影响外部变量)=>):地址传递(用于输出结果):=):双向传递(直接修改外部变量,适用于数组/结构体)<函数名>:=值显式返回,且只能返回单一值。

Counter := 0;),避免残留值问题。动词+名词格式(如CalculateAverage、CountMotorStarts)
函数实现设计指南
原则 | 具体要求 | 违反后果 |
|---|---|---|
变量隔离 | 禁止直接访问全局变量或I/O模块,必须通过VAR_IN/OUT/IN_OUT传递参数 | 代码耦合度高,难以移植 |
通用命名 | 避免使用PLC型号、公司名等特定标识,采用功能描述性命名(如CalcMotorEfficiency) | 可读性差,复用困难 |
跨平台兼容 | 确保函数可在不同PLC型号和编程语言中使用 | 硬件依赖性强 |
调用灵活性 | 支持被程序模块和其他函数调用 | 应用场景受限 |
参数精简 | 输入输出参数总数≤8个,超限时改用STRUCT封装(需在VAR_IN_OUT中声明) | 维护困难,易出错 |
鲁棒性校验 | 必须验证输入参数有效性,返回错误标志(如Error: BOOL),避免运行时错误(RTE) | 程序崩溃风险 |

优势:结构清晰,适合复杂功能
数据转换建议:内部处理类型转换(如TIME转WORD以简化接口)
方法B:自底向上设计法

优势:适合新手,降低出错概率
关键提示:当出现重复代码(Copy-Paste)时,应立即抽象为函数!
✅ 结构清晰 ✅ 代码复用率提升 ✅ 便于扩展维护 ✅ 支持模块化测试 ✅ 调试时可快速禁用

原书上有四个函数相关的例子,有兴趣的朋友可以自行翻阅哦!