Codificación BCD de 2 dígitos en PLC: Display, lectura y contador con programación IEC 61131-3
Bloques funcionales BCD de 2 dígitos en programación de PLC
A continuación se presenta el código en lenguaje Structured Text (ST) de los bloques funcionales Display_BCD_2dig_FB y Lectura_BCD_2dig_FB, junto con los programas de ejemplo que los utilizan.
Bloque funcional Display_BCD_2dig_FB
Este bloque convierte un valor BCD de entrada (0 a 39) en las salidas necesarias para activar un display de dos dígitos, separando unidades y decenas.
FUNCTION_BLOCK Display_BCD_2dig_FB
VAR_INPUT
i_usiEntrada_BCD: USINT;
END_VAR
VAR_OUTPUT
END_VAR
VAR
unitats: USINT;
desenes: USINT;
END_VAR
// IF i_usiEntrada_BCD >= 0 OR i_usiEntrada_BCD <= 39 THEN
unitats:=i_usiEntrada_BCD MOD 10;
desenes:=i_usiEntrada_BCD / 10;
IF unitats=0 THEN
q_xU1:= FALSE;
q_xU2:= FALSE;
q_xU4:= FALSE;
q_xU8:= FALSE;
ELSIF unitats=1 THEN
q_xU1:= TRUE;
q_xU2:= FALSE;
q_xU4:= FALSE;
q_xU8:= FALSE;
ELSIF unitats=2 THEN
q_xU1:= FALSE;
q_xU2:= TRUE;
q_xU4:= FALSE;
q_xU8:= FALSE;
ELSIF unitats=3 THEN
q_xU1:= TRUE;
q_xU2:= TRUE;
q_xU4:= FALSE;
q_xU8:= FALSE;
ELSIF unitats=4 THEN
q_xU1:= FALSE;
q_xU2:= FALSE;
q_xU4:= TRUE;
q_xU8:= FALSE;
ELSIF unitats=5 THEN
q_xU1:= TRUE;
q_xU2:= FALSE;
q_xU4:= TRUE;
q_xU8:= FALSE;
ELSIF unitats=6 THEN
q_xU1:= FALSE;
q_xU2:= TRUE;
q_xU4:= TRUE;
q_xU8:= FALSE;
ELSIF unitats=7 THEN
q_xU1:= TRUE;
q_xU2:= TRUE;
q_xU4:= TRUE;
q_xU8:= FALSE;
ELSIF unitats=8 THEN
q_xU1:= FALSE;
q_xU2:= FALSE;
q_xU4:= FALSE;
q_xU8:= TRUE;
ELSIF unitats=9 THEN
q_xU1:= TRUE;
q_xU2:= FALSE;
q_xU4:= FALSE;
q_xU8:= TRUE;
END_IF
IF desenes=0 THEN
q_xD1:= FALSE;
q_xD2:= FALSE;
ELSIF desenes=1 THEN
q_xD1:= TRUE;
q_xD2:= FALSE;
ELSIF desenes=2 THEN
q_xD1:= FALSE;
q_xD2:= TRUE;
ELSIF desenes=3 THEN
q_xD1:= TRUE;
q_xD2:= TRUE;
END_IF
ELSE
q_xU1:= FALSE;
q_xU2:= FALSE;
q_xU4:= FALSE;
q_xU8:= FALSE;
q_xD1:= FALSE;
q_xD2:= FALSE;
END_IF //
Programa Ex1
// PROGRAM Ex1
VAR
Sortida_decimal: USINT;
END_VAR
Programa ex1_1
// PROGRAM ex1_1
VAR
END_VAR
Programa Ex2
// PROGRAM Ex2
VAR
Lectura: Lectura_BCD_2dig_FB;
Lectura_ex2: USINT;
Display: Display_BCD_2dig_FB;
END_VAR
Programa ex2_1
// PROGRAM ex2_1
VAR
END_VAR
Programa Ex3
// PROGRAM Ex3
VAR
Inicialitzacio: RS;
Init: BOOL;
para_de_contar: BOOL;
posicio: USINT;
Display: Display_BCD_2dig_FB;
contador_posicio: CTUD;
contador_total: CTU;
contador_ctd: CTD;
timer: tof;
RS: RS;
END_VAR
Programa ex3_CFC_1
// PROGRAM ex3_CFC_1
VAR
desti: USINT;
comptador: CTUD;
posicio: WORD;
para_de_contar: BOOL;
RS: RS;
Display: Display_BCD_2dig_FB;
END_VAR
Programa ex3_SFC_1
// PROGRAM ex3_SFC_1
VAR
x: USINT;
END_VAR
// x:=ex3_CFC.desti; //
Función Lectura_BCD_2dig
// FUNCTION Lectura_BCD_2dig : USINT
VAR
U1: USINT;
U2: USINT;
U4: USINT;
U8: USINT;
D1: USINT;
D2: USINT;
END_VAR
IF i_xU1 THEN
U1:=1;
ELSE
U1:=0;
END_IF
IF i_xU2 THEN
U2:=2;
ELSE
U2:=0;
END_IF
IF i_xU4 THEN
U4:=4;
ELSE
U4:=0;
END_IF
IF i_xU8 THEN
U8:=8;
ELSE
U8:=0;
END_IF
IF i_xD1 THEN
D1:=10;
ELSE
D1:=0;
END_IF
IF i_xD2 THEN
D2:=20;
ELSE
D2:=0;
END_IF
Lectura_BCD_2dig:=U1+U2+U4+U8+D1+D2; //
Bloque funcional Lectura_BCD_2dig_FB
// FUNCTION_BLOCK Lectura_BCD_2dig_FB
VAR_INPUT
i_xPU1: BOOL;
i_xPU2: BOOL;
i_xPU4: BOOL;
i_xPU8: BOOL;
i_xPD1: BOOL;
i_xPD2: BOOL;
END_VAR
VAR_OUTPUT
q_usiLectura_BCD: USINT;
END_VAR
VAR
U1: USINT;
U2: USINT;
U4: USINT;
U8: USINT;
D1: USINT;
D2: USINT;
END_VAR
IF i_xPU1 THEN
U1:=1;
ELSE
U1:=0;
END_IF
IF i_xPU2 THEN
U2:=2;
ELSE
U2:=0;
END_IF
IF i_xPU4 THEN
U4:=4;
ELSE
U4:=0;
END_IF
IF i_xPU8 THEN
U8:=8;
ELSE
U8:=0;
END_IF
IF i_xPD1 THEN
D1:=10;
ELSE
D1:=0;
END_IF
IF i_xPD2 THEN
D2:=20;
ELSE
D2:=0;
END_IF
q_usiLectura_BCD:=U1+U2+U4+U8+D1+D2;