Subido por sergio.aguete.r

apuntes tia portal

APUNTES DE TIA PORTAL
FIFO Y LIFO EN SCL
OB1
TRAKING FIFO-LIFO
EN
ENO
DB2(DB2_PIEZAS_IN_OUT) ->Informacion PIEZA_IN y PIEZA_OUT
Nombre_variables
Tipo
Descripcion
PIEZA_IN
"PIEZA"
PIEZA_OUT
"PIEZA"
Tipo de datos UDT =>Se define en el menu TIPO DE DATOS =>
Crear Tipo de Dato "PIEZA" y el tipo de dato que necesito
Ejm. FECHA
DTL
PESO
Real
CODIGO Int
COLOR
Int
FC1
Necesito dos entradas que seran las correspondientes a la pieza que entra
y la pieza que sale.Para nuestro caso utilizaremos dos marcas.
M100.0 => Fotocelula de entrada = Entrada pieza
M101.0 => Señal salida de pieza
M100.0
RD_LOC_T
DTL
EN
ENO
P_TRIG
CLK
Q
Fotocelula
RET_VAL
Pulso Carga Datos
OUT
#HORARIO_VERANO
"PIEZAS_IN_OUT".PIEZAS_IN.FECHA
ADD (INT)
"PIEZAS_IN_OUT".PIEZAS
_IN.CODIGO
1
EN
ENO
IN1
OUT
"PIEZAS_IN_OUT".PIEZAS_IN.CODIGO
IN2
ADD (REAL)
"PIEZAS_IN_OUT".PIEZAS
_IN.PESO
1.0
EN
ENO
IN1
OUT
"PIEZAS_IN_OUT".PIEZAS_IN.PESO
IN2
ADD (INT)
"PIEZAS_IN_OUT".PIEZAS
_IN.PCOLOR
1
EN
ENO
IN1
OUT
IN2
"PIEZAS_IN_OUT".PIEZAS_IN.COLOR
DB1 "FIFO_LIFO_PIEZAS_DB"
FB1 FIFO_LIFO_PIEZAS
EN
FOTOCELULA
M100.0
INGRESAR PIEZA
"PIEZAS_IN_OUT".PIEZAS_IN
DATOS_PIEZA_IN
ENO
DATOS_PIEZA_OUT
SEÑAL SALIDA
M101.0
0
M102.0
"PIEZAS_IN_OUT".PIEZAS_OUT
SACAR PIEZA
LIFO/FIFO
BORRAR_BUFFER
0 => FIFO (First IN - First OUT
1 => LIFO (Last IN - First OUT)
// Secuencia de entrada de una nueva pieza
IF #Ingresar_Pieza THEN
// Si se activa la fotocelula
IF NOT #Flanco_Pieza_IN THEN
// Chequeamos el flanco de ingreso
#Flanco_Pieza_IN := True // Ponemos a TRUE para generar el flanco
#Piezas_a_Mover:= INT TO DINT(#Numero_max_piezas_linea - 1); // Calculamos cuantas piezas hemos de mover
#Resultado:= MOVE_BLK_VARIANT (SRC:=#Piezas,COUNT:=#Piezas_a_Mover,SRC_INDEX:=0,DEST_INDEX:=1,DEST=>#Piezas);
#Piezas[1]:=#Datos_piezas_IN
IF "#LIFO/FIFO" THEN
#Indice_FIFO:=#Indice_FIFO + 1;
END_IF;
END_IF;
ELSE
#Flanco_Pieza_IN:= FALSE
END_IF;
// Movemos el array desde 1 -> Final -1 a 2 -> Final
// Copiamos los datos de la pieza de entrada en la posicion 1
// Si la señal cae regeneramos el auxiliar del flanco
// Secuencia de salida de una nueva pieza
IF #Sacar_Pieza THEN
// Si se activa la señal sacamos la pieza del FIFO
IF NOT #Flanco_Pieza_OUT THEN
// Chequeamos el flanco de ingreso
#Flanco_Pieza_OUT := True
// Ponemos a TRUE para generar el flanco
IF "#LIFO/FIFO" THEN
// Secuencia de recuperacion del LIFO
#Datos_piezas_OUT:= #Piezas[1] ;
#Piezas_a_Mover:= INT TO DINT(#Numero_max_piezas_linea - 1); // Calculamos cuantas piezas hemos de mover
#Resultado:= MOVE_BLK_VARIANT (SRC:=#Piezas,COUNT:=#Piezas_a_Mover,SRC_INDEX:=1,DEST_INDEX:=0,DEST=>#Piezas);
// Movemos el array desde 2 -> Final a 1 -> Final - 1
#Piezas[#Numero_max_piezas_linea]:=#Pieza_vacia;
// Borramos la ultima posicion copiando datos de pieza vacia
ELSE
// Secuencia de recuperacion del FIFO
IF #Indice_FIFO>=1 THEN
#Datos_Pieza_OUT:= #Piezas[#Indice_FIFO]; // Pasamos el valor del array mas viejo a la salida
#Piezas[#Indice_FIFO]:= #Pieza_vacia;
// Borramos la ultima posicion copiando datos de pieza vacia
#Indice_FIFO:=#Indice_FIFO - 1;
END_IF;
END_IF;
END_IF;
ELSE
#Flanco_Pieza_OUT:= FALSE
// Si la señal cae regeneramos el auxiliar del flanco
END_IF;
// Secuencia de borrado del buffer
IF #Borrar_Buffer THEN
FOR(#Contador:=0 TO Numero_max_piezas_linea - 1
DO
// Recorremos el array para borrarlo
#Resultado:= MOVE_BLK_VARIANT (SRC:=#Piezas,COUNT:=#Pieza_vacia,SRC_INDEX:=0,DEST_INDEX:=1,DEST=>#Piezas);
END_FOR;
#Datos_piezas_OUT:= #Pieza_vacia;
#Indice_FIFO:=0;
END_IF;
// Borramos la pieza de salida
// Reinicializamos el indice
#Resultado:= MOVE_BLK_VARIANT (SRC:=#Piezas,COUNT:=Piezas_a_Mover,SRC_INDEX:=0,DEST_INDEX:=1,DEST=>#Piezas);
||
||
||
||
||
Fuente:el array de
Nº piezas a entrar Primer indice
Ultimo indice Destino:el array de piezas
piezas
del array aunque
se ponga 1...100 el
primero es el 0