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