有朋友一谈到ST语言,就说我就会个IF-ELSE。没错,ST语言最基本的语句就是IF语句。

那我们这期好好介绍下ST语言的核心的内容之一的基本语句。

IF-THEN-ELSE语句是ST编程中最常用的表达式。
该语句可用于读取传感器输入模块的数字信号并执行相应操作。传感器输入可以是电气启动开关、ON/OFF开关或泵坑中的液位开关。若传感器被激活,则需执行操作(如启动泵或打开指示灯)。
IF语句同样适用于模拟量输入信号和内部变量。
最基本的IF语句:


说明:
<执行语句>:可包含一行或多行PLC代码<条件表达式>:结果始终为TRUE或FALSE的布尔表达式<执行语句>中的代码END_IF;结束(某些PLC类型的分号可省略)
运行逻辑:
<执行语句A><执行语句B>
此模式可避免使用ELSE,提升代码清晰度。


运行逻辑:
<语句1>→检测条件2→TRUE执行<语句2>/FALSE执行<语句3><语句4>复杂度警告 当存在超过3个IF-THEN-ELSE语句时,代码可读性急剧下降。此时应使用CASE语句替代:

运行逻辑:
<语句1><语句2><语句3>最佳实践建议 优先使用CASE语句替代ELSIF——两者流程图逻辑相同,但CASE语句可读性更优。
原书这个章节也介绍了封面的具体语句来源:

所以,这个最简单的示例基本能了解到ST的语言的基础和核心内容。按照这种说法,ST的IF语句也是不简单的。我们需要掌握前面章节的所有内容才能很好的运用IF语句!
需要注意的是,ST也可以不用IF来表达逻辑关系:

这种方式,也是非常灵活的一种,前期如果对这种方式不那么熟练,建议用IF语句的表达!

CASE语句
CASE语句适用于需要根据单个变量执行不同事件或动作的场景。当IF语句过于复杂时,应优先采用CASE语句。
CASE尤其适用于顺序控制(又称序列控制器或有限状态机FSM),典型应用场景包括:
实际上,我们在PLC程序标准化中,CASE语言发挥了很重要的作用!例如在Pack ML里面:

不同的模式是不同的状态转换逻辑,用CASE语句将复杂的问题就能细分到很细节的逻辑,这样结构化清晰,所以才能让更多的企业和工程师共同推近,使其发挥更大价值!
语法结构


需要注意的是条件控制变量的数据类型必须为整型数据类型(INT/DINT/WORD等)。
理论上说,上述的值n可以无限扩展,但是必须含一条执行语句!另外,ELSE以及默认执行的语句是可以不要,为空即可。
关键实践建议
示例1:电风扇

可以根据人工选中的挡位设定风扇的速度和开关!这种方式就非常直观,当然如果两种变量对应的表达式是一样的,可以用“,”隔开,非常简洁!
示例2:CASE实现不同子程序的切换

左右两边的代码的作用一样,但是这两种哪种更好非常直观的展示出来呢?右边这种通过建立常数,当然也可以用枚举ENUM类型的方式来表达,会比数字的更加直观些。
示例3:CASE语句做密码验证

当然,上述的也可以用IF语句来表达:

虽然这两种逻辑表达方式的结果是一样,但是IF语句的长度明显也要更长,简洁度CASE最佳!

FOR_DO语句
FOR_DO语句是典型的循环逻辑语句之一,也是常用的循环类型!
基本语法:

参数说明:

实际上,默认是正向的循环,BY 1通常是省略的,正常的格式:

当然,也有反向循环,此时就需要BY这个关键字,ValueStep设置成负数,例如-1即可。
在使用FOR循环中,需要注意的是计数器超过限制,特别是配合ARRAY数组的时候,需要正确的处理数组的起始和结束的位置,切勿超出数组的大小限制。
EXIT的使用
若需在循环完成前退出 FOR-DO 语句,可使用 EXIT 命令。典型场景是在数组中搜索特定值时,一旦找到目标值即可立即终止循环。
EXIT 命令语法示例:

如上所示:
关键说明:
此机制通过条件判断实现循环的精准控制,避免不必要的后续迭代,提升代码执行效率。在数组遍历等场景中,能有效防止因冗余操作导致的系统资源浪费。
FOR示例1:一维数组数据初始化

例如上图,定义一个四个元素的一维数组:

实际上和下方的代码的功能是一样的:

但是这不过是4个元素,看不出FOR的优势,当数组元素成千上万的时候,就能明显看出他的优势!
当然,如果对应的数组元素要更改,可以在FOR循环的下方直接赋值即可。
FOR示例2:三维数组数据初始化

实际上上述是FOR循环的嵌套,总共是三层嵌套;需要注意的是如果PLC的性能差,有可能报错,那可以用多个2维数组代替!
元素总共是:10*20*30 = 6000个INT变量;那么,对这6000个元素赋值只需要3个FOR循环共7行代码即可搞定!
FOR示例3:数据的排序
下面是一个典型的FOR循环应用的例子,代码可以用来将数据进行排序,那在数据处理方面的应用非常便利,具体如下图所示:

将上述的FOR循环逐步拆解步骤如下所示:

当然,这种排序的方法有很多,也可以不用全部初始化为999,常见的有以下几种:

例如,用插入排序法:

代码运行后,看下结果:

结果符合预期!我们循环基本介绍就完成了。可能有朋友问还用另外两种循环呢:WHILE和REPEAT呢?
PLC编程的核心原则不是追求代码简洁,而是保证100%的执行确定性和安全性。
而WHILE和REPEAT语句的循环次数是无法确定的,可能造成:
1.扫描周期超时
2.破坏确定性 PLC系统要求可预测的执行时间,而:
FOR循环:迭代次数固定 → 时间可计算WHILE/REPEAT:迭代次数动态 → 时间不可预测3.可能死循环

如果条件一直TRUE,可能进入死循环导致系统崩溃。
4.优先级反转 长时间循环会阻塞:
5.调试复杂度高
6.代码可验证性差
WHILE/REPEAT使静态分析工具无法确定最坏执行时间所以,综上所示循环语句就搞定FOR,配合EXIT即可!