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

对于我们PLC编程而言,需要对内置的标准函数有基本的认识和掌握,也要学会创建一些可以复用、可以跨平台的标准化函数及功能块。
这期我们好好地和大家分享多种内置标准函数。具体何时使用这些函数需根据任务需求而定。需注意的是,不同型号的PLC中这些函数的命名可能有所差异。这意味着若采用标准内置函数,可能会增加将PLC代码移植到其他型号PLC的难度,因为届时可能需要对代码进行调整。

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 提供了三种内置的计数功能块:
以下示例展示了如何在 ST(结构化文本)编程中使用 CTU 功能块:


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

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

只要把计数的方式和计数值的类型改变一下,问题就解决啦。
示例说明:脉冲计数

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

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

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


定时器是PLC内置的功能块,包含以下参数:
输入参数
输出参数
示例1:延时断开定时器
下图展示了一个定时器配置:当开关S1由TRUE变为FALSE后,定时器将保持激活状态100毫秒。

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


MyTimer:TON功能块实例TimerCurrent:TIME类型变量,仅用于实时显示当前计时值MyTimer.Q = FALSE(计时中)MyTimer.Q = TRUE(到达PT值时触发)IN := NOT MyTimer.Q实现自复位逻辑T#10S:10秒T#200ms:200毫秒T#2h:2小时T#前缀指定时间单位。PLC的程序扫描周期构建延时逻辑
前文介绍了使用TON/TOF功能块实现定时的方法,另一种替代方案是利用PLC的程序扫描周期构建延时逻辑。这种方法的原理基于PLC实时运行机制——程序以固定时间间隔循环执行(扫描周期)。
下图流程图描述了两种程序实现方式,核心逻辑如下:
Count,每次程序执行时自增1
当然,还有一种写法也可以:

这种方式在不用多余的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:从冻结值继续计时