首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PLC Control with ST,V3版本学习笔记12—ST语言中常见的标准函数!

PLC Control with ST,V3版本学习笔记12—ST语言中常见的标准函数!

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

我们在PLC编程时,并不是所有的代码都需要一行一行进行编辑,很多都是从标准的内置函数出发的,好比人家已经建好一座房子,你只需要装修一下,搞搞内饰设计,基本就可以住下来了。而不是,需要你从泥巴变砖头,再砌个房子。

对于我们PLC编程而言,需要对内置的标准函数有基本的认识和掌握,也要学会创建一些可以复用、可以跨平台的标准化函数及功能块。

这期我们好好地和大家分享多种内置标准函数。具体何时使用这些函数需根据任务需求而定。需注意的是,不同型号的PLC中这些函数的命名可能有所差异。这意味着若采用标准内置函数,可能会增加将PLC代码移植到其他型号PLC的难度,因为届时可能需要对代码进行调整。

首次执行位:FirstScanBit

PLC代码的某些部分可能需要在设备上电(PLC启动)后仅执行一次。例如:需要将数字输出初始化为特定值,以确保信号灯以正确的颜色点亮,或将阀门设置为关闭状态;也可能需要在启动时将内部变量、计数器和数组重置为零。

部分PLC型号为此提供了首次扫描位(xFirstScanBit)或首循环位(xFirstCycleBit)功能。若PLC不支持此类特性,可采用以下代码实现:

默认xFirstScanBit的值为False;在程序运行的第一个周期,IF条件满足,xFirstScanBit就会置TRUE,IF就再也不执行了。仅仅只是执行了一个周期,值永远为TRUE直到下一次断电重启!

这种方式特别在初始化阶段使用频繁。

边沿检测:R_TRIG,F_TRIG

边沿检测函数应该是非常常用的标准功能块之一。常常用在需要确保某些代码仅在特定动作触发时执行一次的 场合。例如,当传感器开关被激活时(比如用于统计传送带上物品数量的传感器),由于PLC循环扫描执行程序的工作机制,会导致相关代码被多次执行。因此,必须采取相应措施来避免这种重复执行的情况。

以下是两种确保代码只执行一次的标准功能块:

上升沿检测直接用R_TRIG当然是最直接和常用的方式,但是在ST语言中,还可以用另一种方式实现:

这种方式的写法非常简单,就不再需要什么函数,只需要多一个BOOL的变量来记录上一次的值。

那么,可以把代码直接写在#1空白的区域。运行的时间也就是图中的#1位置。只运行了一个周期。

基于这个用法,可以直接去封装一个R_TRIG的函数,具体代码可以自行查阅原书。

图片
图片

计数函数:CTU、CTD、CTUD

PLC 提供了三种内置的计数功能块:

  • CTU(Count Up)—— 递增计数器
  • CTD(Count Down)—— 递减计数器
  • CTUD(Count Up/Down)—— 双向计数器

以下示例展示了如何在 ST(结构化文本)编程中使用 CTU 功能块:

其中,S1为计数的输入,每一次输入的上升沿都会执行计数值+1的操作,PV为设定值,一旦计数值到达12,那么Q:=TRUE。RESET的信号接收到后就会复位计数器值,实现自动复位。CV即为当前的计数值显示。

但是CTU这种计数值的类型是WORD,所以最大值为65535.

那如果超出这个范围呢,有没有很好的办法呢?实际上,在ST语言里面非常好处理这类数学和算法类的问题。

只要把计数的方式和计数值的类型改变一下,问题就解决啦。

示例说明:脉冲计数

当然,在ST语言中CTD这类由于有WORD的输出限制,更加合适的方式是用下方R_TRIG+自定义的方式:

这种可以封装成标准的函数功能块,供我们后面类似的应用的直接调用。

定时器:TON、TOF

定时器也是PLC编程里面常见的标准功能函数。例如,在PLC编程中,某些设备需要限定运行时长。典型应用场景包括:

  • 电机每小时仅运行30分钟的程序控制
  • 楼梯照明延时自动关闭功能
  • 秒表计时功能
  • 储罐液位传感器的报警延时触发(避免液面波动导致误报警)

PLC系统提供两种标准定时器功能块:

定时器是PLC内置的功能块,包含以下参数:

输入参数

  • IN:触发信号(上升沿启动定时器)
  • PT(Preset Time):预设时间值

输出参数

  • Q:定时器输出信号(达到PT时置位)
  • ET(Elapsed Time):当前已计时时间

示例1:延时断开定时器

下图展示了一个定时器配置:当开关S1由TRUE变为FALSE后,定时器将保持激活状态100毫秒

示例2:带自动重启功能的定时器

以下程序演示了如何实现一个10秒周期自动重启的定时器:

工作原理说明
  1. 定时器配置
    • MyTimer:TON功能块实例
    • TimerCurrent:TIME类型变量,仅用于实时显示当前计时值
  2. 运行逻辑
    • 激活状态MyTimer.Q = FALSE(计时中)
    • 完成状态MyTimer.Q = TRUE(到达PT值时触发)
    • 自动重启:通过IN := NOT MyTimer.Q实现自复位逻辑
  3. 时间参数格式
    • T#10S:10秒
    • T#200ms:200毫秒
    • T#2h:2小时
    • 使用T#前缀指定时间单位。

PLC的程序扫描周期构建延时逻辑

前文介绍了使用TON/TOF功能块实现定时的方法,另一种替代方案是利用PLC的程序扫描周期构建延时逻辑。这种方法的原理基于PLC实时运行机制——程序以固定时间间隔循环执行(扫描周期)

实现示例

下图流程图描述了两种程序实现方式,核心逻辑如下:

  1. 定义计数变量Count,每次程序执行时自增1
  2. 当扫描周期为10ms时:
    • 计数达到200次时点亮灯光(10ms × 200 = 2秒延时)
    • 计数达到400次时关闭灯光(4秒延时)
  3. 此方法可实现简单的灯光闪烁控制

当然,还有一种写法也可以:

这种方式在不用多余的TON、TOF功能块即可实现同样的逻辑,在ST语言中非常便利,那么我们在实际应用和工作中可以灵活应用。

应用示例:闪烁的逻辑实现

可以用两个TON来实现,当然Value的值变化后,可以控制闪烁的频率。

应用示例:信号的滤波及模拟量的处理

我们在处理传感器的信号时,常常用到这种TON和TOF来处理信号滤波,使得程序运行更加稳定。例如,上图如果不做任何处理,信号就会断断续续,跟此信号相关的动作就会受到影响。

同理,模拟量的输入值,有可能持续波动,并不是刚已超过限位就出现报警,更多的是对当前值的判断,加上延时判断才会更加可靠。

上面处理的示例代码这里不做展示,可以参考原文的具体章节。

应用示例:带暂停功能的定时器

当需要临时中断定时器运行时,可使用TONP功能块(Pausable On-Delay Timer)。该功能块在标准TON定时器基础上扩展了暂停控制功能:

当需要临时中断定时器运行时,可使用TONP功能块(Pausable On-Delay Timer)。该功能块在标准TON定时器基础上扩展了暂停控制功能:

  • 核心特性:通过PAUSE输入参数实现定时过程的暂停/继续
  • 工作逻辑
    • PAUSE = TRUE:冻结当前计时值(ET停止更新)
    • PAUSE = FALSE:从冻结值继续计时
典型应用场景
  1. 设备维护暂停:急停触发时暂停生产线的定时工序
  2. 间歇式流程:处理原料时需要暂停计时等待检测结果
  3. 调试模式:手动暂停计时以检查设备状态
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首次执行位:FirstScanBit
  • 示例2:带自动重启功能的定时器
    • 工作原理说明
    • 实现示例
    • 典型应用场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档