PLC中的功能块对初学者来说是一个很难理解的概念,本文通过实例来讲解功能块的应用。本质上,功能块和功能的区别在于功能块中的变量可以定义成运行时保持类型(西门子的PLC中的功能块需要每一个都分配一个背景数据块)。
我们要实现一个故障报警功能,当报警点导通后持续时间大于等于5秒,并开始计数,计数大于等于3次后,输出报警,并带有故障清除功能。
我们可以这样写
PROGRAM Main1
VAR
E1:BOOL;(*报警信号*)
E2:BOOL;
E3:BOOL;
R1: BOOL;(*报警复位信号*)
R2: BOOL;
R3: BOOL;
EC1: BOOL;(*故障输出*)
EC2: BOOL;
EC3: BOOL;
TON1: TON;
CTU1: CTU;
TON2: TON;
CTU2: CTU;
TON3: TON;
CTU3: CTU;
END_VAR
//故障1检测
TON1(IN:= E1 , PT:=T#5S , Q=> , ET=> );
CTU1(CU:=TON1.Q , RESET:=R1 , PV:=3 , Q=>EC1 , CV=> );
//故障2检测
TON2(IN:= E2 , PT:=T#5S , Q=> , ET=> );
CTU2(CU:=TON2.Q , RESET:=R2 , PV:=3 , Q=>EC2 , CV=> );
//故障3检测
TON3(IN:= E3 , PT:=T#5S , Q=> , ET=> );
CTU3(CU:=TON2.Q , RESET:=R2 , PV:=3 , Q=>EC3 , CV=> );
通过程序我们可以看出,代码重复的地方比较多,我们把计时器和计数器封装到功能块中,这时候计时器和计数器要定义在具有记忆性的区域内。
我们先实现功能块
FUNCTION_BLOCK TC
VAR_INPUT
Ei: BOOL;
Ri: BOOL;
END_VAR
VAR_OUTPUT
EC1: BOOL;
END_VAR
VAR
TON1: TON;
CTU1: CTU;
END_VAR
TON1(IN:= Ei , PT:=T#5S , Q=> , ET=> );
CTU1(CU:=TON1.Q , RESET:=Ri , PV:=3 , Q=>EC1 , CV=> );
我们再实现主程序
PROGRAM Main2
VAR
E1:BOOL;(*报警信号*)
E2:BOOL;
E3:BOOL;
R1: BOOL;(*报警复位信号*)
R2: BOOL;
R3: BOOL;
EC1: BOOL;(*故障输出*)
EC2: BOOL;
EC3: BOOL;
TC1: TC;
TC2: TC;
TC3: TC;
END_VAR
TC1(Ei:=E1, Ri:=R1 , EC1=>EC1 );
TC2(Ei:=E2, Ri:=R2 , EC1=>EC2 );
TC3(Ei:=E3, Ri:=R3 , EC1=>EC3 );
程序调试的时候,我们查看功能块时,会提示我们要查看哪一个程序块。