首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PLC Control with ST,V3版本学习笔记09—ST语言基本语句(IF-THEN-END_IF,CASE、FOR)

PLC Control with ST,V3版本学习笔记09—ST语言基本语句(IF-THEN-END_IF,CASE、FOR)

作者头像
Hello工控
发布2025-12-23 14:09:04
发布2025-12-23 14:09:04
1030
举报
文章被收录于专栏:Hello工控Hello工控

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

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

IF语句

IF-THEN-ELSE语句是ST编程中最常用的表达式。

该语句可用于读取传感器输入模块的数字信号并执行相应操作。传感器输入可以是电气启动开关、ON/OFF开关或泵坑中的液位开关。若传感器被激活,则需执行操作(如启动泵或打开指示灯)。

IF语句同样适用于模拟量输入信号和内部变量。

最基本的IF语句:

说明

  • <执行语句>:可包含一行或多行PLC代码
  • <条件表达式>:结果始终为TRUE或FALSE的布尔表达式
  • 当表达式成立时,执行<执行语句>中的代码
  • 语句必须以END_IF;结束(某些PLC类型的分号可省略

带ELSE的扩展语法

运行逻辑

  • 若条件为TRUE,执行<执行语句A>
  • 若条件为FALSE,执行<执行语句B>
  • 注意:语句缩进(推荐2空格)可提升代码可读性

替代ELSE的实现方式

此模式可避免使用ELSE,提升代码清晰度。

嵌套语句的风险

运行逻辑

  1. 条件1为TRUE时:执行<语句1>→检测条件2→TRUE执行<语句2>/FALSE执行<语句3>
  2. 条件1为FALSE时:执行<语句4>

复杂度警告 当存在超过3个IF-THEN-ELSE语句时,代码可读性急剧下降。此时应使用CASE语句替代:

  • 显著提升代码可读性
  • 减少他人修改时的人为错误风险
  • 典型情况下可缩减50%以上代码量

ELSIF语句

运行逻辑

  • 条件1为TRUE → 执行<语句1>
  • 条件1为FALSE且条件2为TRUE → 执行<语句2>
  • 所有条件均为FALSE → 执行<语句3>

最佳实践建议 优先使用CASE语句替代ELSIF——两者流程图逻辑相同,但CASE语句可读性更优。

原书这个章节也介绍了封面的具体语句来源:

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

需要注意的是,ST也可以不用IF来表达逻辑关系:

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

CASE语句

CASE语句适用于需要根据单个变量执行不同事件或动作的场景。当IF语句过于复杂时,应优先采用CASE语句。

CASE尤其适用于顺序控制(又称序列控制器或有限状态机FSM),典型应用场景包括:

  • 设备运行模式切换(如:STOP停止、STARTING启动中、RUN运行、STOPPING停止中)
  • 乳品加工流程控制(如:NONE空闲、CREAM奶油处理、SKIM_MILK脱脂奶处理、WHOLE_MILK全脂奶处理、WATER_FLUSH水冲洗)

实际上,我们在PLC程序标准化中,CASE语言发挥了很重要的作用!例如在Pack ML里面:

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

语法结构

需要注意的是条件控制变量的数据类型必须为整型数据类型(INT/DINT/WORD等)。

理论上说,上述的值n可以无限扩展,但是必须含一条执行语句!另外,ELSE以及默认执行的语句是可以不要,为空即可。

关键实践建议

  1. 代码长度控制:若分支内PLC代码超4-6行,应封装为独立函数/程序模块
  2. ELSE段处理
    • 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-DO 语句内部添加 IF 条件判断(#1 标记处)
  • 当满足 <触发条件> 时,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.扫描周期超时

  • 若循环条件长时间不满足终止条件,会导致整个PLC程序停滞
  • 触发看门狗定时器(Watchdog Timer)复位,造成设备停机

2.破坏确定性 PLC系统要求可预测的执行时间,而:

  • FOR循环:迭代次数固定 → 时间可计算
  • WHILE/REPEAT:迭代次数动态 → 时间不可预测

3.可能死循环

如果条件一直TRUE,可能进入死循环导致系统崩溃。

4.优先级反转 长时间循环会阻塞:

  • 关键安全任务(如急停处理)
  • 通信中断(如OPC UA数据交换)
  • 硬件I/O更新

5.调试复杂度高

  • 循环内部状态难以在线监控(需特殊工具)
  • 故障复现困难(依赖特定时序条件) 故障恢复

6.代码可验证性差

  • 功能安全认证(如IEC 61508 SIL)要求所有路径可预测
  • WHILE/REPEAT使静态分析工具无法确定最坏执行时间

所以,综上所示循环语句就搞定FOR,配合EXIT即可!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hello工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • IF语句
  • 带ELSE的扩展语法
  • 替代ELSE的实现方式
  • 嵌套语句的风险
  • ELSIF语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档