アップダウンカウンタ
ファンクションブロックCTUD (count up/down)で、カウンタ命令をプログラムできます。
カウントアップ(CUをTRUEにセット)
0から最大値32767に達するまでカウントアップされます。カウントアップCUで立ち上がりエッジが検出されるたびに、現在値CVに1が加算されます。
カウントダウン(CDをTRUEにセット)
0から最小値-32768に達するまでカウントダウンされます。カウントダウンCDで立ち上がりエッジが検出されるたびに、現在値CVから値1が減算されます。
入力
カウントアップ入力
入力CUで立ち上がりエッジが検出されるたびに、現在値CVに値"1"が加算されます。ただし、RまたはLD、あるいはその両方がONの場合を除きます。
カウントダウン入力
入力CDで立ち上がりエッジが検出されるたびに、現在値CVから値"1"が減算されます。ただし、RまたはLD、あるいはその両方がONの場合を除きます。
CUとCDが同時にTRUEにセットされた場合、カウントは行われません。
リセット入力
R信号の立ち上がりエッジで、現在値CVは"0"にリセットされ、カウントが停止します。 QU/QDの出力がFALSEにセットされます。
次のR信号の立ち下がりエッジでカウントが再開します。
ロード
LDがONになると、現在値CVには設定値PVがロードされ、QUはTRUEにセットされます。ただし、Rが同時にONになっている場合を除きます。この場合、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がONになると、iCurrentValue (CV)は0にリセットされます。bCountUpがONになると、iCurrentValueに値"1"が加算されます。立ち上がりエッジは、bCountUpで検出され、iCurrentValueがiPresetValue以上になるまでこの処理を繰り返します。設定値に達すると、bUpCounting_PV_reachedがONになります。bResetまたはbLoadの一方あるいはその両方がON状態の場合、この処理は実行されません。
カウントダウン:
bResetがON (TRUE)になると、iPresetValue (PV = 設定値)がiCurrentValueに読み込まれます。bCountDownがONになると、iPresetValueから値"1"が減算されます。この処理は、iCurrentValueが"0"以下になるまで立ち上がりエッジが検出されるたびに繰り返されます。"0"に達すると、bDownCounting_zero_reachedがTRUEにセットされます。bResetまたはbLoadの一方あるいはその両方がON状態の場合、この処理は実行されません。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);