1.4.2 功能块

对于PLC编程语言,功能块作为程序组织单元的一种,执行后能够生成一个或多个输出值(相比较功能只有一个输出值)。功能块能够生成多个自身的拷贝,称为实例。每个实例拥有一个相关的标示符(实例名)、一个包含输出和内部变量的数据结构、输入变量的值或者引用(与实现相关)。数据结构中的所有输出变量和某些内部变量的值可能是保持的,这意味着在上一次功能块的执行过程之后的这些变量的值在下一次执行中也是有效的。因此,调用相同输入参数的功能块并不保证输出也是相同的(这一点也和功能不同)。

对于功能块而言,只有它的输入和输出变量是可访问的,换句话说,其内部变量对于用户而言是不透明的。一个已经定义过的功能块可以在另一个功能块或者功能的声明中使用。

一个功能块实例的有效范围应当局限于实现该实例的程序组织单元,除非该实例通过VAR_GLOBAL块被声明为全局的。

假如一个功能块实例通过VAR_INPUT被声明为输入变量,其名字(实例名)可以被用作一个功能或者功能块的输入;或者作为一个功能块的输入/输出变量,如该实例被声明为VAR_IN_OUT。


1.功能块声明

功能块和功能一样可以以文本的方式来声明。

        FUNCTION_BLOCK DEBOUNCE
        (*** External Interface ***)
        VAR_INPUT
            IN : BOOL ;                  (* Default = 0 *)
            DB_TIME : TIME := t#10ms ;  (* Default = t#10ms *)
        END_VAR
        VAR_OUTPUT OUT : BOOL ;          (* Default = 0 *)
                ET_OFF : TIME ;          (* Default = t#0s *)
        END_VAR
        VAR DB_ON : TON ;                (** Internal Variables **)
                DB_OFF : TON ;           (**  and FB Instances  **)
                DB_FF : SR ;
        END_VAR
        (** Function Block Body **)
        DB_ON(IN := IN, PT := DB_TIME) ;
        DB_OFF(IN := NOT IN, PT:=DB_TIME) ;
        DB_FF(S1 :=DB_ON.Q, R := DB_OFF.Q) ;

        OUT := DB_FF.Q ;
        ET_OFF := DB_OFF.ET ;
        END_FUNCTION_BLOCK

或者以图形方式声明,如图1-10所示。

图1-10 功能以图形方式声明

功能块与功能主要的不同在于:

● 功能块的声明关键字为FUNCTION_BLOCK ... END_FUNCTION_BLOCK。

● RETAIN修饰符可以用来修饰功能块的内部和输出变量。

● 通过VAR_EXTERNAL结构传递给功能块的变量,其值可以在功能块内部改变。

● 当一个功能块实例的名字通过VAR_INPUT、VAR_OUTPUT或者VAR_EXTERNAL结构传递给另一个功能块时,该实例的输出值可以在功能块内被访问,但不能被修改。

● 当一个功能块实例的名字通过VAR_IN_OUT或者VAR_EXTERNAL结构传递给另一个功能块时,该实例可以在功能块内被调用。


2.标准功能块

(1)双稳态功能块

IEC61131定义了一个优先复位双稳态功能块(RS)和一个优先置位双稳态功能块(SR),如图1-11所示。

图1-11 双稳态功能块

RS功能块实现了Q1输出端的优先复位。如果输入端SET = TRUE,则输出端Q1被置位。即使SET为FALSE, Q1仍然保持置位状态。如果RESET1 = TRUE,则Q1被复位。如果两个输入均为TRUE,则由RESET1将Q1输出端设置为FALSE。SR则相反,如果输入端SET1 = TRUE,则输出端Q1被置位。即使SET1为FALSE, Q1仍然保持置位状态。如果RESET = TRUE,则Q1被复位。如果两个输入均为TRUE,则由RESET将Q1输出端设置为FALSE。

(2)边沿检测功能块

标准上升沿(R_TRIG)和下降沿检测功能块(F_TRIG)用于检测输入信号CLK的上升沿和下降沿,如图1-12所示。其行为对应下列规则:

图1-12 边沿检测功能块

● R_TRIG功能块的Q输出在CLK输入从0变化到1之后,应当保持BOOL#1到下一次执行,然后在下一次执行时重置为0。

● F_TRIG功能块的Q输出在CLK输入从1变化到0之后,应当保持BOOL#1到下一次执行,然后在下一次执行时重置为0。

(3)计数器功能块

计数器功能块如图1-13所示。

图1-13 计数器功能块

CTU功能块用于递增计数CU输入信号的上升沿次数。假设在CU输入端有一个上升沿,并且RESET = FALSE,则CV递增1。如果达到了计数器的最终值(PV),则在Q输出端发出一个TRUE信号,并且功能块停止计数。如果RESET = TRUE,则用0初始化计数器。为了使能计数过程,RESET输入端必须为FALSE,否则计数器将总被重新初始化。

CTD计数器功能块递减计数。假设在CD输入端有一个上升沿,且LOAD = FALSE,则CV减1。如果达到了计数器的最终值(PV),则在Q输出端发出一个TRUE信号,并且功能块停止计数。如果LOAD = TRUE,则按PV输入的值初始化计数器。为了启用计数过程,LOAD输入端必须为FALSE,否则将重新初始化计数器。

CTUD计数器功能块递增或者递减计数。假设在CU输入端有一个上升沿,则CV递增1。假设在CD输入端有一个上升沿,则CV递减1。如果CV = PV, QU设置为TRUE。如果CV = PV, QU设置为TRUE。如果RESET = TRUE,计数器初始化为0。如果LOAD= TRUE,计数器初始化为PV。为了启用计数过程,RESET和LOAD输入端都必须为FALSE,否则将重新初始化计数器。

(4)定时器功能块

定时器功能块如图1-14所示。

图1-14 定时器功能块

TOF定时器功能块实现延时关定时功能。如果输入IN从TRUE变为FALSE,在延迟输入PT中的时长后关机。经过PT值的时长后,Q值设置为FALSE。在输出端ET上显示过程时间间隔。

TON定时器功能块实现延时开定时功能。如果输入IN从TRUE变为FALSE,在延迟输入PT中的时长后开机。经过PT值的时长后,Q值设置为TRUE。在输出端ET上显示过程时间间隔。

TF定时器功能块产生一个脉冲。如果IN输入端由FALSE变为TRUE,则在Q输出端产生一个时间间隔为PT的脉冲。过程时间显示于ET输出端。如果IN获得另一个时间TRUE值,而PT时间段还没有结束,则它对在Q输出端产生的脉冲时间段没有影响。

(5)通信功能块

PLC的标准通信功能块在IEC 61131-5中定义。这些功能块提供了可编程的通信功能,比如设备验证、获取查询数据、获取已设定数据、参数控制、互锁控制、报告设定的警告、连接管理和保护等。