升值/降值计数器
功能块CTUD(递增计数/递减计数)可用于编写计数程序(递增和递减)。
递增计数(CU设置为TRUE)
递增计数从零开始,直到达到最大值32767为止。递增计数CU端每检测到一个上升沿,在当前值CV的基础上加1。
递减计数(CD设置为TRUE)
递减计数从零开始,直到达到最小值-32768为止。递减计数CD端每检测到一个上升沿,在当前值CV的基础上减1。
输入
正计数
对于在CU检测到的每个上升沿,当前CV会增加数值1,除非设置了R和/或LD。
倒计数
CD端每检测到一个上升沿,在当前值CV的基础上减1,设置了R和/或LD的情况除外。
如果CU和CD同时设置为TRUE,则不执行任何计数运算。
复位(R)
R端每检测到一个上升沿,CV复位至零,且计数停止。 输出QU/QD设置为FALSE。
R端检测到下一个下降沿时,重新开始计数。
载入
如果设置了LD,则PV加载到CV且QU设置为TRUE。但是如果这时同时设置了R,则不会载入。在这种情况下,将忽略LD。
预置值
定义预置值,通过加减运算可获得预置值
如果未设置预置值或预置值为零,则输出QU在计数开始后将立即被设置为TRUE。
输出
比较输出信号-正计数
设置为TRUE,如果CV大于/等于PV
设置为FALSE,如果R端检测到上升沿
比较输出信号-倒计数
设置为TRUE,如果CV等于零
设置为FALSE,如果R端检测到上升沿
当前值
是加法/减法结果
递增计数:
如果CV达到预设值PV,则输出QU设置为TRUE,但计数将继续,直到达到最大限值32767为止。
递减计数:
如果CV达到零,则输出QD设置为TRUE,但计数将继续,直到达到最小限值-32768为止。
通过从编程编辑器写入变量,可以在计数操作过程中改变数值。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
CTUD1: CTUD;
bCountUp: BOOL:=FALSE;
(*increments CV if TRUE*)
bCountDown: BOOL:=FALSE;
(*decrements CV if TRUE*)
bReset: BOOL:=FALSE;
(*sets CV to zero if TRUE*)
bLoad: BOOL:=FALSE;
(*sets CV to PV if TRUE*)
iPresetValue: INT:=3;
(*if CV reaches this value,
output QU is set*)
bUpCounting_PV_reached: BOOL:=FALSE;
(*is set, if CV reaches PV*)
bDownCounting_zero_reached: BOOL:=FALSE;
(*is set, if CV reaches zero*)
iCurrentValue: INT:=0;
(*contains the current value*)
END_VAR
正计数:
如果设置了bReset,则iCurrentValue (CV)将复位至零。如果设置了bCountUp,则在iCurrentValue的基础上加1。如果bCountUp端每检测到一个上升沿,就会重复此步骤,直到iCurrentValue大于/等于iPresetValue。然后设置bUpCounting_PV_reached。如果设置了bReset和/或bLoad,则不执行此程序。
倒计数:
如果设置了bReset(状态 = TRUE),iPresetValue(PV = 预置值)将被加载到iCurrentValue。如果设置了bCountDown,则在iPresetValue的基础上减1。在每个上升沿重复此过程,直到iCurrentValue小于/等于零为止。然后,bDownCounting_zero_reached将设置为TRUE。如果设置了bReset或/和bLoad,则不执行此步骤。如果同时设置了CU和CD,则不执行任何计数操作。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 14 ;
NETWORK_BODY
B(B_CONTACT,,bCountUp,5,3,7,5,);
B(B_CONTACT,,bCountDown,5,5,7,7,);
B(B_FB,CTUD!,CTUD1,12,4,18,11,,?BCU?BCD?BR?BLD?BPV?AQU?AQD?ACV);
B(B_COIL,,bUpCounting_PV_reached,25,5,27,7,);
B(B_CONTACT,,bReset,5,7,7,9,);
B(B_COIL,,bDownCounting_zero_reached,25,8,27,10,);
B(B_CONTACT,,bLoad,5,9,7,11,);
B(B_VAROUT,,iCurrentValue,20,10,22,12,);
B(B_VARIN,,iPresetValue,7,11,9,13,);
L(1,0,1,14);
L(1,4,5,4);
L(7,4,10,4);
L(10,4,10,6);
L(1,6,5,6);
L(7,6,9,6);
L(10,6,12,6);
L(18,6,25,6);
L(9,6,9,7);
L(9,7,12,7);
L(18,7,20,7);
L(20,7,20,9);
L(1,8,5,8);
L(7,8,12,8);
L(18,8,19,8);
L(19,8,19,11);
L(9,9,12,9);
L(20,9,25,9);
L(9,9,9,10);
L(1,10,5,10);
L(7,10,9,10);
L(10,10,12,10);
L(10,10,10,12);
L(19,11,20,11);
L(9,12,10,12);
END_NETWORK_BODY
END_NET_WORK
END_BODY
CTUD1(CU := bCountUp, CD := bCountDown, R := bReset, LD := bLoad,
PV := iPresetValue, QU => bUpCounting_PV_reached,
QD => bDownCounting_zero_reached, CV => iCurrentValue);