CTUD

升值/降值计数器

功能块CTUD(递增计数/递减计数)可用于编写计数程序(递增和递减)。

  • 递增计数(CU设置为TRUE

    递增计数从零开始,直到达到最大值32767为止。递增计数CU端每检测到一个上升沿,在当前值CV的基础上加1。

  • 递减计数(CD设置为TRUE

    递减计数从零开始,直到达到最小值-32768为止。递减计数CD端每检测到一个上升沿,在当前值CV的基础上减1。

参数

输入

CU (BOOL)

正计数

对于在CU检测到的每个上升沿,当前CV会增加数值1,除非设置了R和/或LD

CD (BOOL)

倒计数

CD端每检测到一个上升沿,在当前值CV的基础上减1,设置了R和/或LD的情况除外。

如果CUCD同时设置为TRUE,则不执行任何计数运算。

R (BOOL)

复位(R)

R端每检测到一个上升沿,CV复位至零,且计数停止。 输出QU/QD设置为FALSE

R端检测到下一个下降沿时,重新开始计数。

LD (BOOL)

载入

如果设置了LD,则PV加载到CVQU设置为TRUE。但是如果这时同时设置了R,则不会载入。在这种情况下,将忽略LD

PV (INT)

预置值

定义预置值,通过加减运算可获得预置值

如果未设置预置值或预置值为零,则输出QU在计数开始后将立即被设置为TRUE

输出

QU (BOOL)

比较输出信号-正计数

设置为TRUE,如果CV大于/等于PV

设置为FALSE,如果R端检测到上升沿

QD (BOOL)

比较输出信号-倒计数

设置为TRUE,如果CV等于零

设置为FALSE,如果R端检测到上升沿

CV (INT)

当前值

  • 是加法/减法结果

  • 递增计数:

    如果CV达到预设值PV,则输出QU设置为TRUE,但计数将继续,直到达到最大限值32767为止。

  • 递减计数:

    如果CV达到零,则输出QD设置为TRUE,但计数将继续,直到达到最小限值-32768为止。

  • 通过从编程编辑器写入变量,可以在计数操作过程中改变数值。

时间图

示例

POU头

所有用于编程此函数的输入和输出变量已在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

POU本体

正计数:

如果设置了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,则不执行此步骤。如果同时设置了CUCD,则不执行任何计数操作。

LD本体

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

ST本体

CTUD1(CU := bCountUp, CD := bCountDown, R := bReset, LD := bLoad, 
	  PV := iPresetValue, QU => bUpCounting_PV_reached,
	  QD => bDownCounting_zero_reached, CV => iCurrentValue);

IL本体

最后更新日期: 此页面上的反馈松下热线