업/다운 카운터
펑션블록 CTUD(카운트 업/다운)은 카운팅 절차의 프로그래밍을 지원합니다(업/다운).
카운트 업(CU가 TRUE로 설정됨)
최대 값 32767에 도달할 때까지 카운트 업은 0에서 시작합니다. 카운트 업 CU에서 각 상승 엣지는 현재 값 CV에서 값을 1만큼 증가시킵니다.
카운트 다운(CD가 TRUE로 설정됨)
최소 값 -32768에 도달할 때까지 카운트 다운은 0에서 시작합니다. 카운트 다운 CD에서 각 상승 엣지는 현재 값 CV에서 값을 1만큼 감소시킵니다.
입력
카운트 업
CU에서 감지된 각 상승 엣지에 대해 값 1이 CV에 추가됩니다. 단, R 및/또는 LD가 설정된 경우는 제외합니다.
카운트 다운
CD에서 감지된 각 상승 엣지에 대해 값 1이 CV에서 빼기됩니다. 단, R 및/또는 LD가 설정된 경우는 제외합니다.
CU 및 CD가 TRUE로 동시에 설정된 경우 카운팅 작업이 실행되지 않습니다.
리셋(R)
CV가 R 및 카운팅 스탑에서 각 상승 엣지에 대해 0으로 리셋됩니다. 출력 QU/QD가 FALSE로 설정됩니다.
R의 다음 하강 엣지가 카운팅을 다시 시작합니다.
로드
LD가 설정된 경우, PV가 CV로 로드되고 QU가 TRUE로 설정됩니다. 하지만, 이것은 R가 동시에 설정된 경우에는 적용되지 않습니다. 이 경우, LD는 무시됩니다.
프리셋값
더하기 또는 빼기로 구할 프리셋 값을 정의합니다.
프리셋 값이 없거나 프리셋 값이 0인 경우, 카운팅이 시작한 직후 출력 QU가 TRUE로 설정됩니다.
출력
신호 출력 - 카운트 업
CV가 PV와 같거나 이보다 큰 경우 TRUE로 설정됩니다.
상승 엣지가 R에서 감지된 경우 FALSE로 설정됩니다.
신호 출력 - 카운트 다운
CV = 0인 경우 TRUE로 설정됩니다.
상승 엣지가 R에서 감지된 경우 FALSE로 설정됩니다.
현재 값
더하기/빼기 결과입니다.
카운팅 업:
CV가 프리셋 값 PV에 도달하면, 출력 QU가 TRUE로 설정되지만, 최대 한도 32767에 도달할 때까지 카운팅이 계속됩니다.
카운팅 다운:
CV가 0에 도달하면 출력 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)가 0으로 리셋됩니다. bCountUp이 설정되면 값 1이 iCurrentValue로 추가됩니다. iCurrentValue가 iPresetValue과 같거나 이보다 커질 때까지 이 절차가 bCountUp에서 감지된 각 상승 엣지에 대해 반복됩니다. 그 다음 bUpCounting_PV_reached가 설정됩니다. bReset 및/또는 bLoad가 설정된 경우 절차가 실시되지 않습니다.
카운트 다운:
bReset이 설정된 경우(상태 = TRUE), iPresetValue(PV = 프리셋 값)가 iCurrentValue로 로드됩니다. bCountDown이 설정되면 값 1이 iPresetValue에서 빼기됩니다. iCurrentValue가 0보다 작거나 0인 경우 이 절차가 각 상승 엣지에서 반복됩니다. 그 다음, 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);