scieee AI-readable full text Open interactive document viewer

Desarrollo de un soporte informático en Python para modelos de optimización del mantenimiento en un horizonte temporal finito

Díaz Gandul, Beatriz María

Abstract

En el presente trabajo se avanza en el conocimiento de la resolución de un problema de optimización del mantenimiento, así como en su implantación y gestión en problemas reales. Se trata de un problema de mantenimiento para un horizonte de tiempo finito de m pasos, donde se buscan los intervalos de mantenimiento preventivo óptimos. Se parte de un método de referencia en el que se modela el problema como un proceso Semi-Markoviano y se utiliza la técnica de la transformada z para resolver la ecuación recurrente del retorno (ingresos menos costes) promedio acumulado para un sistema que se inicia desde un estado Operativo. La aportación al método creada en este trabajo, siguiendo dicha metodología, permite calcular el tiempo hasta el mantenimiento preventivo óptimo, inicializando el sistema adicionalmente desde los estados Correctivo y Preventivo. En este proyecto se crea una herramienta de escritorio que permite hallar el momento óptimo en el que un sistema debe pasar a un estado donde se apliquen medidas de mantenimiento preventivo, de manera que se maximice el retorno medio acumulado en un horizonte de tiempo finito. La herramienta se ha desarrollado a través del lenguaje de programación Python con el cual se ha creado una interfaz gráfica de fácil comprensión para el usuario final, gracias a la importación de la librería Tkinter. La aplicación permite comparar visualmente, a través de representaciones gráficas, los diferentes escenarios que puede presentar el sistema simplemente cambiando cualquiera de sus parámetros. Tras demostrar el correcto funcionamiento del programa, la rapidez y facilidad en la obtención de resultados se revela como una ventaja adicional de la herramienta desarrollada, que puede favorecer la implantación de políticas de mantenimiento, en particular la planificación y gestión del mantenimiento preventivo.

Full text

i Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de Organización Industrial Desarrollo de un soporte informático en Python para modelos de optimización del mantenimiento en un horizonte temporal finito. Autor: Beatriz M.ª Díaz Gandul Tutor: Dr. Antonio Sánchez Herguedas Dpto. de Organización Industrial y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020 iii Trabajo Fin de Grado Grado en Ingeniería de Organización Industrial Desarrollo de un soporte informático en Python para modelos de optimización del mantenimiento en un horizonte temporal finito. Autor: Beatriz M.ª Díaz Gandul Tutor: Dr. Antonio Sánchez Herguedas Profesor titular Dpto. de Organización Industrial y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020 v Trabajo Fin de Grado: Desarrollo de un soporte informático en Python para modelos de optimización del mantenimiento en un horizonte temporal finito. Autor: Beatriz Mª Díaz Gandul Tutor: Dr. Antonio Sánchez Herguedas El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocal/es: Secretario: Acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha: vii A mi familia A mis profesores ix Agradecimientos Me gustaría agradecer este proyecto a mi familia por confiar en mí y darme esta oportunidad. A mis amigos por estar cerca o lejos, pero siempre a mi lado. A mis compañeros y profesores por haberme acompañado en este camino. Al Dr. D. Antonio Sánchez Herguedas por su ayuda y atención en la elaboración de este proyecto. Y a todas las personas con las que me he cruzado estos cinco años que me han enseñado algo nuevo. Beatriz M.ª Díaz Gandul Alumna de la Escuela Técnica Superior de Ingeniería Sevilla, 2020 4 Manual de Usuario del Programa PM-3E 25 4.1 Interfaz de Usuario: Pantalla Principal 26 4.2 Datos Iniciales 28 4.3 Calculadora 29 4.3.1 Cálculo de tau óptimo 29 4.3.2 Cálculo del vector de retorno promedio acumulado, V 30 4.3.2.1 Opciones de cálculo para V 31 4.3.3 Cálculo del tiempo de operación, OT. 32 4.3.3.1 Opciones de cálculo para OT 33 4.3.4 Funciones de los botones 34 4.3.4.1 Botón Calcular 34 4.3.4.2 Botón Eliminar 34 4.3.4.3 Botón Guardar 35 4.4 Gráfico 37 4.4.1 Elecciones de representación 38 4.4.2 Funciones de los botones 40 4.4.2.1 Botón Representar 40 4.4.2.2 Botón Eliminar 40 4.4.2.3 Botón Guardar 40 4.5 Calculadora para Tau propio 42 4.6 Botones Ayuda 42 5 Resultados Experimentales 49 5.1 Datos Iniciales 49 5.2 Comprobación del Valor Óptimo de 𝝉 50 5.2.1 Caso 1 (R1=45) 51 5.2.2 Caso 2 (R1=12) 51 5.2.3 Caso 3 (R1= 6) 52 5.2.4 Representación gráfica del valor óptimo de tau versus el número de transiciones 52 5.3 Comprobación del Primer Componente del Vector de Retorno Promedio Acumulado para pasos de transición pares, V1(m par) 53 5.3.1 Caso 1 (m=10) 54 5.3.2 Caso 2 (m=8) 55 5.3.3 Caso 3 (m=6) 55 5.4 Comprobación del Primer Componente del Vector de Retorno Promedio Acumulado para pasos de transición impares, V1(m impar) 56 5.4.1 Caso 1 (m=9) 56 5.4.2 Caso 2 (m=7) 57 5.4.3 Caso 3 (m=5) 58 5.5 Comprobación del Tiempo de Operación Promedio, AOT 59 5.6 Comprobación del Primer Vector de Retorno Acumulado para 10 pasos de transición 60 5.7 Comprobación del Valor del Tiempo de Funcionamiento Promedio Acumulado, AAOT 61 5.8 Comprobación del Valor del Retorno Promedio, V1/AAOT 62 6 Conclusiones 63 7 Trabajo Futuro 65 Anexo A: Codificación en Python del programa PM-3E 67 A.1 Importación de Librerías 67 A.2 Creación de la Ventana Principal 67 A.3 Declaración de las Variables Principales 68 A.4 Declaración de Widgets 68 A.4.1 Datos iniciales: títulos 68 A.4.2 Datos iniciales: etiquetas y casillas de escritura 69 A.4.3 Botón V1, V2 o V3 70 A.4.4 Cálculo de tau óptimo 71 A.4.5 Cálculo de V 71 A.4.6 Cálculo de OT 72 A.4.7 Sección plantilla gráfico 72 Sumario sobre la estructura del proyecto xvii xvii A.4.8 Sección gráfico 72 A.4.9 Cálculo para tau propio 73 A.4.10 Creación botones ayuda 74 A.5 Posicionamiento de Widgets 74 A.5.1 Datos iniciales 74 A.5.2 Botones V1, V2 y V3 75 A.5.3 Cálculo de tau óptimo 75 A.5.4 Cálculo de V 76 A.5.5 Cálculo de OT 76 A.5.6 Representación gráfica 76 A.5.7 Cálculo para tau propio 77 A.5.8 Botones ayuda 77 A.6 Definición Botones Ayuda 77 A.6.1 Retornos 77 A.6.2 Datos iniciales 78 A.6.3 Cálculo de tau óptimo 79 A.6.4 Cálculo de V 79 A.6.5 Cálculo de OT 80 A.6.6 Guardar 81 A.6.7 Opciones representación gráfica 81 A.6.8 Representación gráfica 82 A.6.9 Cálculo para tau propio 82 A.7 Definición Botón Eliminar 83 A.7.1 Resultado de tau óptimo 83 A.7.2 Resultado de V 83 A.7.3 Resultado de OT 84 A.7.4 Gráfico 84 A.7.5 Resultado para tau propio 84 A.8 Función: Cálculo de Tau Óptimo 84 A.9 Función: Cálculo de V 86 A.10 Función: Cálculo de OT 90 A.11 Función: Guardar Resultados 91 A.12 Función: Guardar Gráfico 94 A.13 Función: Representación de Resultados 94 A.14 Función: Cálculo para Tau Propio 98 A.15 Cierre de la Aplicación 100 8 Referencias 101 xix Índice de Tablas Tabla 2–1.Métodos aplicados a la planificación del mantenimiento preventivo. [28] 8 Tabla 3–1. Valores iniciales para las funciones de distribución (FD) [1]. 24 Tabla 3–2. Datos iniciales para los retornos [1]. 24 Tabla 5–1. Valores de los parámetros utilizados para el caso de estudio [1] 49 Tabla 5–2. Valores de los retornos utilizados para el caso de estudio [1]. 50 Tabla 5–3. τ0 para diferentes pasos y retornos de operación [1]. 50 Tabla 5–4. τ0 para R1=45 [1] 51 Tabla 5–5. τ0 para R1=12 [1] 51 Tabla 5–6. τ0 para R1=6 [1] 52 Tabla 5–7: Resultado del retorno promedio acumulado para 10 pasos de transición. 60 Tabla 5–8: Resultado para AAOT correspondiente a 10 pasos de transición [1] 61 Tabla 5–9: Resultados para V1/AAOT correspondientes a 10 pasos de transición [1] 62 xxi Índice de Figuras Figura 2-1:Formato general del modelo de optimización. 4 Figura 2-2: Requisitos ecológicos del mantenimiento [19]. [Traducción propia] 6 Figura 3-1: Esquema cambio de fases del sistema. [Fuente: Elaboración propia]. 12 Figura 3-2: Transición de un estado a otro. [Fuente: Elaboración propia]. 12 Figura 3-3: Volquete. [38] 23 Figura 4-1: Pantalla principal de PM-3E. 26 Figura 4-2: Opciones para minimizar, maximizar y cerrar la aplicación. 26 Figura 4-3: Diferentes secciones de la herramienta PM-3E 27 Figura 4-4: Señalización botón “Ayuda” 27 Figura 4-5: Sección de la herramienta donde se deben introducir los datos iniciales. 28 Figura 4-6: Sección de la herramienta donde se muestran los resultados 29 Figura 4-7: Sección de la herramienta para el cálculo de tau óptimo. 29 Figura 4-8: Representación de cómo calcular tau óptimo. 30 Figura 4-9: Señalización del resultado de tau óptimo para un número de pasos determinado. 30 Figura 4-10: Sección de la herramienta para el cálculo de V. 30 Figura 4-11: Representación de cómo calcular V. 31 Figura 4-12: Señalización del resultado de V1 para un número de pasos determinado. 31 Figura 4-13: Señalización del resultado de V1 para un número de pasos determinado. 31 Figura 4-14: Señalización del resultado de V1 para un número de pasos determinado. 32 Figura 4-15: Sección de la herramienta para el cálculo del tiempo de operación y opciones disponibles de cálculo. 32 Figura 4-16: Representación de cómo calcular los tiempos de operación. 32 Figura 4-17: Señalización del resultado de AOT para un número de pasos determinado. 33 Figura 4-18: Señalización del resultado de AAOT para un número de pasos determinado. 33 Figura 4-19: Señalización del resultado de AR para un número de pasos determinado. 33 Figura 4-20: Señalización de los botones existentes en la herramienta para calcular resultados. 34 Figura 4-21: Representación de cómo eliminar un resultado. 34 Figura 4-22: Explicación de cómo guardar los resultados obtenidos. 35 Figura 4-23: Explicación de cómo guardar los resultados obtenidos. 35 Figura 4-24: Archivo creado al guardar los resultados a través de la herramienta. 36 Figura 4-25: Ejemplo de cómo se guardan los datos obtenidos a través del programa. 36 Figura 4-26: Sección de la herramienta para la representación gráfica de los resultados 37 Figura 4-27: Representación de cómo realizar una representación gráfica usando la herramienta. 37 Figura 4-28: Representación gráfica de tau frente a V1 creada a través de la herramienta. 38 Figura 4-29: Representación gráfica de los pasos de transición frente al tau óptimo creada a través de la herramienta. 38 Figura 4-30: Representación gráfica del número de pasos frente a V1, creada a través de la herramienta. 39 Figura 4-31: Representación gráfica del número de pasos frente a AAOT creada a través de la herramienta. 39 Figura 4-32: Representación gráfica del número de pasos frente a AR creada a través de la herramienta. 40 Figura 4-33: Explicación de cómo guardar la representación gráfica creada con la herramienta. 40 Figura 4-34: Pestaña para guardar el archivo creado. 41 Figura 4-35: Imagen creada a partir de la herramienta. 41 Figura 4-36: Sección de PM-3E, calculadora para tau propio 42 Figura 4-37: Opciones de cálculo para un tau propio dado por el usuario. 42 Figura 4-38: Ejemplo de uso de la Calculadora para Tau propio de la herramienta. 42 Figura 4-39: Señalización del botón ayuda de la herramienta 42 Figura 4-40: Nota explicativa emergente al clicar en un botón Ayuda asociado a “Datos Iniciales”. 43 Figura 4-41: Nota explicativa emergente al clicar en un botón Ayuda asociado a “Retornos”. 43 Figura 4-42: Nota explicativa emergente al clicar en un botón Ayuda, asociado al botón para guardar el archivo. 44 Figura 4-43: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo de tau óptimo. 44 Figura 4-44: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo del vector de retorno promedio acumulado. 45 Figura 4-45: Nota explicativa emergente al clicar en un botón Ayuda, asociado al cálculo de los tiempos de operación. 45 Figura 4-46: Nota explicativa emergente al clicar en un botón Ayuda, asociado a las opciones de representación gráfica que dispone el programa. 46 Figura 4-47: Nota explicativa emergente al clicar en un botón Ayuda asociado a la representación gráfica de los datos. 46 Figura 4-48: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo de parámetros con el uso de un tau dado. 47 Figura 5-1: Datos iniciales. [Imagen tomada de la herramienta PM-3E]. 50 Figura 5-2: τ0 para 9 pasos de transición y R1=45. Resultado de 1-6 pasos. [Imagen tomada de la herramienta PM-3E]. 51 Figura 5-3: τ0 para 9 pasos de transición y R1=45.Resultado de 4-9 pasos. [Imagen tomada de la herramienta PM-3E]. 51 Figura 5-4: τ0 para 9 pasos de transición y R1=12. Resultado de 1-6 pasos. [Imagen tomada de la herramienta PM-3E]. 51 Figura 5-5: τ0 para 9 pasos de transición y R1=12. Resultado de 4-9 pasos. [Imagen tomada de la herramienta PM-3E]. 51 Figura 5-6: τ0 para 9 pasos de transición y R1=6. 52 Figura 5-7: τ0 para 9 pasos de transición y R1=6. 52 Figura 5-8: Tiempo hasta la acción preventiva versus el número de transiciones [1]. 52 Figura 5-9: Representación gráfica del valor óptimo de tau, para 9 pasos en tres casos distintos. [Imagen tomada de la herramienta PM-3E]. 53 Figura 5-10: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para tres valores de transiciones pares diferentes [1]. 53 Sumario sobre la estructura del proyecto xxiii xxiii Figura 5-11: Introducción de valor de m=10. [Imagen tomada de la herramienta PM-3E]. 54 Figura 5-12: Selección para la representación gráfica del tiempo preventivo frente al vector de retorno promedio acumulado. [Imagen tomada de la herramienta PM-3E]. 54 Figura 5-13 Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para un valor de transición par (m=10). [Imagen tomada de la herramienta PM-3E]. 54 Figura 5-14: Introducción de valor de m=8. [Imagen tomada de PM-3E]. 55 Figura 5-15: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para dos valores de transiciones pares diferentes (m=10, línea naranja y m=8, línea roja). [Imagen tomada de PM-3E]. 55 Figura 5-16: Introducción de valor de m=6. [Imagen tomada de PM-3E] 55 Figura 5-17: Representación gráfica del primer componente del vector retorno promedio acumulado para τ preventivo, para tres valores de transiciones pares diferentes (m=10, línea naranja; m=8, línea roja y m=6, línea marrón). [Imagen tomada de PM-3E]. 55 Figura 5-18: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para tres valores de transiciones impares diferentes [1]. 56 Figura 5-19: Introducción de valor de m=9. [Imagen tomada de PM-3E]. 56 Figura 5-20: Selección para la representación gráfica del tiempo preventivo frente al vector de retorno. promedio acumulado. [Imagen tomada de PM-3E]. 56 Figura 5-21: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para un valor de transición impar (m=9). [Imagen tomada de PM-3E]. 57 Figura 5-22: Introducción de valor de m=7. [Imagen tomada de PM-3E]. 57 Figura 5-23: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para dos valores de transiciones impares diferentes (m=9, línea naranja y m=7, línea roja). [Imagen tomada de PM-3E]. 57 Figura 5-24: Introducción de valor de m=5. [Imagen tomada de PM-3E]. 58 Figura 5-25: Representación gráfica del primer componente del vector retorno promedio acumulado para τ preventivo, para tres valores de transiciones impares diferentes (m=9, línea naranja; m=7, línea roja y m=5, línea marrón). [Imagen tomada de PM-3E]. 58 Figura 5-26: Cálculo de τ0 para m=10. [Imagen tomada de PM-3E]. 59 Figura 5-27: Cálculo de V1 pasos de transición impares. [Imagen tomada de PM-3E]. 59 Figura 5-28: Cálculo de AOT para 10 pasos de transición. [Imagen tomada de PM-3E]. 59 Figura 5-29: Resultado de V1 de m=1 hasta m=6 para 10 pasos de transición. [Imagen tomada de PM- 3E]. 60 Figura 5-30: Resultado de V1 de m=5 hasta m=10 para 10 pasos de transición. [Imagen tomada de PM- 3E]. 60 Figura 5-31: Resultado de AAOT de m=1 hasta m=6 para 10 pasos de transición. [Imagen tomada de PM-3E]. 61 Figura 5-32: Resultado de AAOT de m=5 hasta m=10 para 10 pasos de transición. [Imagen tomada de PM-3E]. 61 Figura 5-33: Resultado de V1/AAOT de m=1 hasta m=5 para 10 pasos de transición. [Imagen de PM- 3E]. 62 Figura 5-34: Resultado de V1/AAOT de m=5 hasta m=10, para 10 pasos de transición. [Imagen de PM- 3E]. 62 xxv Notación SMP Proceso Semi-Markoviano PM-3E Nombre del programa creado: Mantenimiento preventivo, sistema con 3 estados E1 Estado Operativo E2 Estado Correctivo E3 Estado Preventivo m Paso de transición de un estado a otro pij Probabilidad de transición del estado i al estado j P Matriz de probabilidades de transición F Matriz de tiempos de permanencia A Tiempo promedio de permanencia en el estado Operativo 𝜏 Tau, tiempo de permanencia en el estado Operativo antes de pasar al Preventivo 𝜏0 Tau óptimo, tiempo óptimo de permanencia en el estado Operativo antes de pasar al Preventivo B Tiempo promedio de permanencia en el estado Correctivo C Tiempo promedio de permanencia en el estado Preventivo 𝐹(𝑡) Función de distribución acumulativa de fallos del equipo 𝑓(𝑡) Función de densidad de la probabilidad de fallos del equipo 𝐺(𝑡𝑐) Función de distribución del tiempo de permanencia bajo mantenimiento correctivo 𝑔(𝑡𝑐) Función de densidad de la probabilidad del tiempo bajo mantenimiento correctivo 𝐻(𝑡𝑝) Función de distribución del tiempo de permanencia bajo mantenimiento preventivo ℎ(𝑡𝑝) Función de densidad de la probabilidad del tiempo bajo mantenimiento preventivo 𝑟𝑖𝑗 Retorno al pasar del estado i al estado j R1 Ingreso por unidad de tiempo que el sistema permanece en el estado Operativo R2 Coste por unidad de tiempo que el sistema permanece en el estado Correctivo R3 Coste por unidad de tiempo que el sistema permanece en el estado Preventivo R12 Coste de transición del estado Operativo al Correctivo R21 Coste de transición del estado Correctivo al Operativo R13 Coste de transición del estado Operativo al Preventivo R31 Coste de transición del estado Preventivo al Operativo 𝑣𝑖(𝑚) Retorno acumulado medio 𝑉(𝑚) Vector de retorno promedio acumulado 𝒵[𝑥] Función de la transformada z AOT Tiempo de operación promedio del sistema AAOT Tiempo de operación promedio acumulado AR Retorno acumulado OT Tiempo de operación Antecedentes 6 2.2.2.2 Impacto medioambiental del mantenimiento Pese a que los impactos medioambientales relacionados con el mantenimiento no son de menor importancia, no se han realizado demasiados estudios sobre el tema. Se ha destacado la necesidad de considerar estos impactos en las estrategias de mantenimiento [17], debido a que si se activan prácticas de mantenimiento mal definidas, se podrían generar muchos problemas medioambientales, como emisiones peligrosas, desperdicio de producción debido al mal funcionamiento del sistema, uso ineficiente de energía, consumo ineficaz de recursos y/o desperdicio de materiales almacenados [18]. En la Figura 2-2 se muestra una clasificación de los requisitos ecológicos del mantenimiento donde se incluye la compatibilidad ambiental, la eficiencia energética y los riesgos para la salud y la seguridad humana. De todos los requisitos, los que se exhiben en rectángulos sombreados en la figura se pueden cumplir si se tienen en cuenta en la etapa de diseño. El resto de los requisitos son los que se pueden atender durante la fase de operación de mantenimiento [19]. Figura 2-2: Requisitos ecológicos del mantenimiento [19]. [Traducción propia] Los tribomateriales hacen referencia al desarrollo de nuevos materiales antifricción y de elevada resistencia al desgaste, más baratos y de menor peso [20] En conclusión, si se quieren poner en marcha estrategias de mantenimiento medioambientalmente proactivas se recomienda considerar estos requisitos ecológicos [21]. 2.2.2.3 Impacto del mantenimiento en las personas El principal impacto social relacionado con el mantenimiento se refiere a la salud y a la seguridad humana. No sólo la de los trabajadores directamente involucrados en las tareas de mantenimiento, sino también la de todos los empleados e incluso la de los clientes. Una mala gestión del mismo causaría condiciones de trabajo inseguras, accidentes, situaciones peligrosas y productos manufacturados de baja calidad [22]. Conjuntamente, si se mira a largo plazo, los efectos peligrosos acumulativos de los contaminantes debido a la ausencia de actividades de mantenimiento pueden influir en el cambio climático y causar posteriores impactos en la salud humana [23]. Introducción al Mantenimiento 7 7 2.2.3 Implantación del mantenimiento La implantación del mantenimiento consiste en el seguimiento de unas políticas específicas que definan los planes de acción a realizar, para proporcionar directrices y pautas que gestionen las acciones de mantenimiento adicionales requeridas por un sistema [24]. Tras describir los impactos del mantenimiento, se puede apreciar lo que supone una mala gestión de éste y lo importante que es implantar políticas de mantenimiento. El estudio de este proyecto se centra en el impacto económico. Por ello, la gestión del mantenimiento debe ser una actividad que se relacione con: asegurar el buen funcionamiento de las instalaciones, sistemas y equipos, lograr buenas condiciones de operación con la máxima disponibilidad, y todo ello con el menor coste posible. Por lo tanto, no solo se deben optimizar los costes en actividades comerciales o productivas, sino también en actividades relacionadas con el mantenimiento para obtener un nivel satisfactorio de productividad que mantenga a la empresa competitiva en los mercados. Para que los gerentes puedan implantar políticas de mantenimiento, su planificación y control de las actividades derivadas, necesitan información sobre el desempeño del propio sistema. En este sentido, la Norma Europea EN15341: 2007, define el rendimiento del mantenimiento como un resultado de actividades complejas, que pueden evaluarse mediante indicadores apropiados para medir tanto los resultados reales como los esperados [25]. En resumen, para poder crear e implantar políticas de mantenimiento es necesario un estudio previo del sistema, al igual que la creación de herramientas que permitan estudiar la evolución de los resultados, tanto reales como esperados. 2.2.4 Planificación del mantenimiento preventivo El objetivo de la aplicación que se desarrolla en este proyecto es la planificación del mantenimiento preventivo de un sistema en un periodo de tiempo finito, teniendo en cuenta sus impactos económicos. No todas las planificaciones del mantenimiento preventivo se realizan de la misma manera. Por ello, es necesario realizar una investigación previa que se puede resumir en cuatro facetas: • Objetivos por los que se realiza la planificación del mantenimiento preventivo. • Descripción del estado del sistema, su importancia y sus funciones. • Horizonte de tiempo para el cual se realiza la planificación. • Métodos que ayudan a determinar las mejores soluciones para los problemas destacados. 2.2.4.1 Objetivos Los objetivos por los que se realiza la planificación de mantenimiento preventivo pueden ser [26] [27]: • Fijación de los intervalos de mantenimiento preventivo óptimos: Cálculo del momento óptimo para llevar a cabo acciones de mantenimiento preventivas como el remplazo de un sistema o un componente antes de que falle. • Programación adecuada del trabajo: se busca secuenciar las acciones de mantenimiento preventivas dentro de un intervalo de tiempo. • Asignación de tareas de mantenimiento preventivo: qué acciones se deben realizar para poner en práctica un correcto mantenimiento preventivo y cómo hacerlas. • Determinación de la frecuencia de las inspecciones y el mantenimiento óptimo basado en la condición actual o futura de la maquinaria (CBM). • Determinación de los recursos óptimos para cumplir con los requisitos de mantenimiento. • Establecimiento del ciclo de vida económico de un equipo ante la disyuntiva de la reparación frente al remplazo. Antecedentes 8 2.2.4.2 Estado del sistema Un sistema está compuesto por un conjunto de componentes interconectados dispuestos para ejecutar un proceso. Es necesario hacer un estudio del sistema cuando éste está funcionando con normalidad, cuando está funcionando con un fallo y cuando deja de funcionar completamente, de esta manera se pueden planificar medidas de prevención de acuerdo al estado del sistema. La planificación de las acciones a emprender será distinta si se trata de un sistema formado por una sola unidad o un sistema complejo. • Sistema único: Aquel que consta de uno o varios componentes, pero donde la única acción de mantenimiento posible es renovar todo el sistema, mediante un reemplazo completo o mediante una reparación. • Sistema múltiple/complejo: Está compuesto por sistemas que disponen de varios componentes y que forman una unidad. En este caso se pueden producir muchos modos de fallo, donde un solo componente de un sistema puede haber fallado sin afectar a los componentes de otro sistema. Éste puede ser remplazado o reparado sin necesidad de sustituir el sistema múltiple al completo. 2.2.4.3 Horizonte de tiempo Otro punto a tener en cuenta dentro de la planificación del mantenimiento preventivo es el horizonte de tiempo para el cual se realiza el estudio, que puede ser finito o infinito. • Se habla de horizonte de tiempo finito, cuando la planificación se llevará a cabo para en un periodo de tiempo marcado por un instante de inicio y un punto final. • Mientras que el horizonte de tiempo infinito, tiene en cuenta el instante de inicio, pero se desarrolla el problema con una situación de tiempo estacionaria. 2.2.4.4 Métodos La planificación del mantenimiento preventivo puede realizarse con la ayuda de métodos que permitan resolver los problemas que han causado el colapso de un sistema. A medida que un sistema se vuelve más complicado, se necesita una planificación de mantenimiento preventivo más sofisticada para resolver los problemas de mantenimiento relacionados con el rendimiento del sistema. Por lo tanto, los métodos adecuados que pueden lidiar con los problemas de mantenimiento dinámicamente, deben considerarse como parte del proceso de desarrollo para una planificación óptima del mantenimiento preventivo. El método es la descripción de cualquier procedimiento a seguir para determinar un plan de mantenimiento preventivo óptimo bajo ciertos requisitos o restricciones de mantenimiento. El propósito de establecer un método y resolverlo es facilitar la toma de decisiones respecto a la planificación del mantenimiento preventivo. Decisiones basadas en análisis y resultados precisos y eficientes. Varios métodos han sido aplicados por investigadores con respecto a la planificación del mantenimiento preventivo. Éstos se pueden clasificar en estas seis categorías: Tabla 2–1.Métodos aplicados a la planificación del mantenimiento preventivo. [28] Métodos Clasificación Descripción Lógica difusa, Algoritmo Genético (GA), Red Neuronal, Cadena de Márkov, Red Bayesiana, Algoritmo Heurístico. Inteligencia Artificial (AI) La teoría y el desarrollo de sistemas informáticos que puedan realizar tareas y permitan que los sistemas realicen funciones que normalmente requerirían inteligencia humana [29] SIMAN, Monte Carlo, Witness Simulación Una técnica computable que tiene la capacidad de analizar, diseñar y operar sistemas complejos para una mejor comprensión sin afectar al sistema real [30] . Introducción a Python y sus Características 9 9 Métodos Clasificación Descripción Programación lineal, Programación no lineal, Programación lineal entera (ILP), Programación dinámica, Programación lineal entera mixta (MILP), Distribución Weibull, Modelo de riesgo proporcional (PHM) Formulación matemática Representación matemática para tomar decisiones sobre la mejor asignación posible de recursos escasos [31]. Matriz de coeficientes de similitud Matriz de formación Una matriz rectangular que abarca números, símbolos u otros objetos matemáticos para los que se definen operaciones como la suma y la multiplicación [32]. Análisis de modo y efecto de fallo (FMEA), Efecto de modo de fallo y análisis crítico (FMECA) Análisis crítico Estudios detallados para identificar el mecanismo de fallo, la criticidad y cómo afectarían a la condición y a la vida útil de un sistema [33]. PROMETHEE, Proceso de red analítica (ANP), Proceso jerárquico analítico (AHP) Multicriterio Método de decisión que analiza varias alternativas al considerar todos los criterios en conflicto y los juicios de un decisor [34]. 2.3 Introducción a Python y sus Características Python es un lenguaje de programación. Un lenguaje de programación consiste en un lenguaje informático diseñado para expresar órdenes e instrucciones precisas, que deben ser puestas en marcha por un ordenador. Este lenguaje está compuesto por una serie de símbolos, reglas sintácticas y semánticas que definen la estructura de la lengua. Se trata de un lenguaje de programación multiparadigma, en otras palabras, soporta programación funcional, programación imperativa y programación orientada a objetos. Igualmente, Python es multiplataforma. Puede usarse para crear programas en diferentes sistemas operativos como Linux, Mac OS y Windows [35]. A diferencia de la mayoría de los lenguajes de programación, Python dispone de reglas de estilos a fin de poder escribir un código fuente más legible y de manera estandarizada. En definitiva, presenta un lenguaje sencillo a la vez que elegante y flexible. El código fuente hace referencia al conjunto de instrucciones y órdenes lógicas compuestas de algoritmos. Se encuentra escrito en un determinado lenguaje de programación y debe ser interpretado o compilado para permitir la ejecución del programa informático [36]. Otra característica, de igual importancia, es que Python se ejecuta sin necesidad de ser procesado por el compilador, se detectan los errores y se comprueban las variables en el tiempo de ejecución. Por último, cabe destacar que Python contiene una gran cantidad de librerías, tipos de datos y funciones incorporadas en el propio lenguaje, que ayudan a la realización de muchas tareas comunes sin necesidad de tener que programarlas desde cero [37]. Antecedentes 10 11 3 FORMALIZACIÓN DEL PROBLEMA n el presente capítulo se expondrá el problema que se aborda en el proyecto, el objetivo y la metodología para su resolución. Además de una aportación propia al método y la descripción del caso práctico que se ha utilizado de referencia para la realización del programa. 3.1 Descripción Inicial del Problema Se dispone de un sistema que se encuentra en un estado de funcionamiento correcto generando ingresos. Sin embargo, cada cierto tiempo el sistema presenta un fallo y éste debe ser reparado con unos costes. Una vez que el sistema es reparado vuelve a funcionar de manera correcta. No obstante, se quiere implantar un periodo donde el equipo pase por un mantenimiento preventivo de tal forma que se reduzca la probabilidad de que falle. Se busca una planificación del mantenimiento preventivo para un horizonte de tiempo finito, basada en los costes e ingresos que supone la implantación de este nuevo periodo, es decir, teniendo en cuenta los costes de reparación, sustitución, repuestos, herramientas, mano de obra, tiempo de inactividad, etc. 3.2 Objetivo El objetivo del problema consiste en determinar el momento óptimo en el que un sistema, que se encuentra funcionando correctamente, debe pasar a un estado donde se apliquen medidas de mantenimiento preventivo, de manera que se maximice el retorno (ingresos menos costes) promedio acumulado en un horizonte de tiempo finito 3.3 Resolución Para llevar a cabo la resolución de este problema de mantenimiento, se ha elegido un proceso Semi-Markoviano (SMP) como el formato estocástico para modelar el mismo. También existen unos costes e ingresos asociados a cada estado del sistema que se acumulan en cada transición del proceso, hecho que permite calcular el retorno acumulado promedio en m transiciones. El modelo da origen a un sistema de ecuaciones, que pueden expresarse como un sistema de ecuaciones en diferencias. Para resolver el sistema de ecuaciones en diferencias para el retorno acumulado promedio en m transiciones, se utiliza la técnica de la z transformada. Una vez calculado el retorno acumulado promedio, a partir de su derivada, respecto del tiempo hasta el preventivo igualada a cero, se ha podido obtener el momento óptimo para realizar el mantenimiento preventivo. Toda la resolución del método fue tomada de acuerdo a Sánchez-Herguedas [1]. E Una persona inteligente resuelve un problema. Una persona sabia lo evita. - Albert Einstein - Formalización del Problema 12 3.3.1 Modelo Semi-Markoviano Para este caso concreto, se define un modelo Semi-Markoviano de 3 estados, es decir, el sistema en cuestión se puede encontrar en: E1: Estado Operativo. Momento en el que el sistema se encuentra funcionando correctamente. E2: Estado Correctivo. Hace referencia a cuando el sistema está siendo reparado debido a un fallo. E3: Estado Preventivo. Momento en el que el sistema se encuentra en un estado donde se están realizando acciones de mantenimiento preventivas. Figura 3-1: Esquema cambio de fases del sistema. [Fuente: Elaboración propia]. Hasta ahora las transiciones entre los estados tienen lugar en tiempos aleatorios. Cada cambio de estado corresponde a un paso de transición m, con m = 1,2,3…Cada transición entre estados tiene asociada una probabilidad p, siendo pij la probabilidad de que el equipo pase del estado i al estado j. En el instante inicial, el equipo se encuentra en el estado Operativo. Si tras un tiempo 𝝉, el equipo no falla, el sistema hace una transición hacia el estado Preventivo, en el que se realiza la tarea de mantenimiento. Una vez terminada la tarea preventiva el sistema volvería al estado Operativo con probabilidad 1. Si antes de haber alcanzado el tiempo 𝝉 se produce el fallo, el sistema pasaría directamente del estado Operativo al Correctivo. El sistema compuesto por los tres estados evoluciona durante el tiempo que se estime oportuno (tiempo finito) mediante el mecanismo de ir saltando de un estado a otro de acuerdo con ciertas probabilidades de transición, formando un proceso de Márkov homogéneo. Figura 3-2: Transición de un estado a otro. [Fuente: Elaboración propia]. Se define P como la matriz de probabilidades de transición de un estado a otro. De igual importancia, F es la matriz de tiempos de permanencia en un estado. Donde Fij es el tiempo medio del sistema en el estado i antes de pasar al estado j. 𝑃=(0 𝐹(𝜏)1−𝐹(𝜏) 1 0 0 1 0 0 ) ; 𝐹=(0 𝐴 𝜏 𝐵 0 0 𝐶 0 0) (3–1) Resolución 13 13 Siendo A el tiempo promedio que el sistema permanece en el estado Operativo antes de que ocurra la falla en el intervalo (0, τ). El tiempo de falla en ese intervalo es una variable aleatoria truncada. Por otra parte, 𝝉 es el tiempo que el sistema permanece en el estado Operativo antes de pasar al Preventivo. Finalmente, B es el tiempo promedio que el sistema permanece en el estado Correctivo y C el tiempo promedio que el sistema se encuentra en el estado Preventivo antes de pasar al Correctivo. Ninguno de estos dos últimos está sujeto a truncamiento. Los componentes de cada uno de ellos se expresan mediante estas ecuaciones: 𝐴= 1 𝐹(𝜏)∫𝑡·𝑓(𝑡) 𝜏 0 𝑑𝑡 ; 𝐵= ∫ 𝑡𝑐 𝑔(𝑡𝑐)𝑑𝑡𝑐 ∞ 0; 𝐶= ∫ 𝑡𝑝 ℎ(𝑡𝑝)𝑑𝑡𝑝 ∞ 0 (3–2) Siendo los parámetros utilizados: • 𝑭(𝒕) es la función de distribución acumulativa de fallos del equipo, 𝒇(𝒕) su función de densidad de probabilidad. • 𝑮(𝒕𝒄) es la función de distribución del tiempo que el equipo permanece bajo mantenimiento correctivo y 𝒈(𝒕𝒄) su función de densidad de probabilidad. • 𝑯(𝒕𝒑) es la función de distribución del tiempo que el equipo permanece bajo mantenimiento preventivo y 𝒉(𝒕𝒑) su función de densidad de probabilidad. 3.3.2 Costes e ingresos Cuando el equipo se encuentra en el estado Operativo funcionará produciendo unos ingresos. En el momento que pasa al estado Correctivo, tras un fallo, acumula unos costes de mano de obra de reparación, de repuesto y de indisponibilidad. Y si el sistema no falla y pasa al estado Preventivo en el tiempo 𝝉, se generan de igual modo, unos costes asociados a los repuestos, a la mano de obra y a la inactividad del sistema. Ya sea un ingreso o un coste, este valor económico se ha denominado retorno. Siendo los ingresos, retornos positivos y, por el contrario, los costes, retornos negativos. Los retornos se denotan con una 𝒓𝒊, siendo i el estado en el que se encuentra el equipo. Los cambios de estado también conllevan unos retornos, y se expresan de esta manera: 𝒓𝒊𝒋; siendo i el estado en el que se encuentra el equipo y j el estado al que pasaría. Los retornos que se presentan son (costes e ingresos): • 𝑹𝟏, ingreso por unidad de tiempo que el sistema permanece en el estado 1 (E1: Operativo). • 𝑹𝟐, coste por unidad de tiempo que el sistema permanece en el estado 2 (E2: Correctivo). • 𝑹𝟑, coste por unidad de tiempo que el sistema permanece en el estado 3 (E3: Preventivo). • 𝑹𝟏𝟐, coste de transición desde el estado 1 al estado 2. • 𝑹𝟐𝟏, coste de transición desde el estado 2 al 1. • 𝑹𝟏𝟑, coste de transición desde el estado 1 al 3. • 𝑹𝟑𝟏, coste de transición desde el estado 3 al 1. Partiendo de F, Eq.(3–1), se obtiene que la matriz de retornos R, donde 𝒓𝒊𝒋=𝑹𝒊+𝑹𝒊𝒋, es: 𝑅=(0 𝑟12 𝑟13 𝑟21 0 0 𝑟31 0 0)= ( 0 𝑅1𝐴+𝑅12 𝑅1 𝜏 + 𝑅13 𝑅2𝐵+𝑅21 0 0 𝑅3𝐶+𝑅31 0 0 ) . (3–3) Formalización del Problema 14 A medida que el sistema va cambiando de estado, éste acumulará retornos, constituyendo el retorno acumulado en m transiciones o cambios de estado. El valor del retorno acumulado es un valor aleatorio ya que es posible determinar el estado inicial del equipo, pero es impredecible determinar el siguiente y los que siguen. De esta forma, el sistema puede evolucionar de muchas maneras en m transiciones. Ésta es la razón por la que interesa maximizar el retorno acumulado medio, y no el retorno acumulado en sí [1]. El retorno esperado en un solo paso se puede formular como: 𝑣𝑖(1)= ∑𝑟𝑖𝑗(1) 𝑝𝑖𝑗 𝑛 𝑗=1 (3–4) Y el valor esperado del retorno de los 𝑚−1 pasos restantes se puede formular como: 𝐸(𝑣𝑗(𝑚−1))= ∑ 𝑣𝑗𝑘(𝑚− 1) 𝑝𝑗𝑘 𝑛 𝑘=1 (3–5) Luego, el retorno esperado total del sistema en 𝒎 pasos consiste en: 𝑣𝑖(𝑚)=𝑣𝑖(1)+ 𝐸(𝑣𝑗(𝑚−1))=𝑣𝑖(1)+∑𝑣𝑗𝑘(𝑚 − 1) 𝑝𝑗𝑘 𝑛 𝑘=1 (3–6) Si se define el vector 𝑉(𝑚)=(𝑣1(𝑚),𝑣2(𝑚),··· ,𝑣𝑛(𝑚))𝑡, donde el superíndice t indica transposición en el sentido matricial, la ecuación anterior podría escribirse como una ecuación matricial en diferencias: 𝑉(𝑚)=𝑉(1)+ 𝑃 𝑉(𝑚− 1) (3–7) Donde 𝑷 es la matriz de probabilidades de transición. Siendo esta ecuación la que proporciona el retorno esperado en m pasos desde cualquier posible estado de partida 𝒊 . 3.3.3 Explicación de la resolución del sistema de ecuaciones en diferencias aplicando la transformada z Este es el momento en el que, para poder resolver el sistema de ecuaciones en diferencias descrito anteriormente, Eq.(3–7), como se anunció al principio, es necesario aplicar la técnica de la transformada z. La transformada z es una función de variable compleja que se define como la siguiente serie de Laurent: 𝒵[𝑥(𝑚)]=∑𝑥(𝑛)𝑧−𝑛 ∞ 𝑛=0 , 𝑧∈ℂ∖ {0}. (3–8) La transformada 𝑧 del vector es otro vector cuyas componentes son las transformadas 𝑧 de los componentes. Es conveniente reescribir la ecuación en diferencias con el índice aumentado en una unidad, es decir: 𝑉(𝑚+1)= 𝑉(1)+ 𝑃 𝑉(𝑚), y aplicarle la transformada 𝑧 a ambos miembros de la igualdad. Para ello se tiene en cuenta la linealidad de la transformada y el hecho de que la matriz 𝑷 es constante (es decir, no depende de 𝒎) [1]: 𝒵[𝑉(𝑚+1)]=𝒵[𝑉(1)]+ 𝑃 𝒵[𝑉(𝑚)] (3–9) Resolución 15 15 Usando las propiedades de la transformada 𝑧 se alcanza: 𝑧(𝒵[𝑉(𝑚)]−𝑉(0))=𝑉(1)𝑧 𝑧−1+ 𝑃 𝒵[𝑉(𝑚)] (3–10) Multiplicando por la inversa de la matriz 𝐼−𝑧−1𝑃 (que es regular), dividiendo por 𝒛 y reordenando los términos, se obtiene: 𝒵[𝑉(𝑚)]=1 𝑧−1(𝐼−𝑧−1𝑃)−1𝑉(1)+(𝐼−𝑧−1𝑃)−1𝑉(0) (3–11) El vector de retornos esperados inicial 𝑽(𝟎) es el vector nulo, ya que no hay ningún retorno anterior al instante inicial en que comienza la evolución de la cadena. Por lo tanto: [𝑉(𝑚)]=1 𝑧−1(𝐼−𝑧−1𝑃)−1𝑉(1) (3–12) Ahora, solamente queda invertir esta transformada para obtener los retornos medios en 𝒎 pasos 𝑽(𝒎). 3.3.4 Aplicación de la transformada z al sistema de ecuaciones en diferencias del modelo Semi-Markoviano de 3 estados. Una vez explicado el desarrollo de las ecuaciones para la transformada z, se aplica al modelo de tres estados presentado anteriormente para obtener el valor de los retornos medios en 𝒎 pasos, 𝑽(𝒎). En primer lugar, teniendo en cuenta que 𝑉(0)=0, porque no hay retorno antes del primer paso, y simplificando 𝐹(𝜏)=𝑝, el vector V (1), según la ecuación, Eq.(3–4), sería: (𝑣1(1) 𝑣2(1) 𝑣3(1))=(𝑟12𝑝+𝑟13(1−𝑝) 𝑟21 𝑟31 ) (3–13) Si se desarrolla la matriz (𝐼−𝑧−1𝑃)−1: (𝐼−𝑧−1𝑃)−1=1 𝑧2−1(𝑧2𝑧𝑝 𝑧(1−𝑝) 𝑧 𝑧2+𝑝−1 1−𝑝 𝑧 𝑝 𝑧2−𝑝) (3–14) El resultando es: 𝒵[𝑉(𝑚)]=1 (𝑧−1)2(𝑧+1)((𝑟12𝑝+𝑟13(1−𝑝))𝑧2+(𝑟21𝑝+𝑟31(1−𝑝))𝑧 (𝑟12𝑝+𝑟13(1−𝑝))𝑧+𝑟21𝑧2+(𝑟31−𝑟21)(1−𝑝) (𝑟12𝑝+𝑟13(1−𝑝))𝑧+𝑟31𝑧2+(𝑟21−𝑟31)𝑝) (3–15) Formalización del Problema 22 3.4.2 Inicialización del sistema en el estado Preventivo En el caso de querer calcular 𝝉 a partir del tercer componente de V(m), 𝒗𝟑(𝒎), se realizarían exactamente los mismos pasos. Si se aprecian las ecuaciones para 𝓩[𝒗𝟐(𝒎)] 𝑦 𝓩[𝒗𝟑(𝒎)], ambas son iguales, con la única diferencia que 𝒃𝟐 y 𝒃𝟑 son sustituidos por 𝒃𝟒 𝑦 𝒃𝟓. Se realiza la inversa de 𝓩[𝒗𝟑(𝒎)]: 𝑣3(𝑚)=14[(−1+2𝑚−(−1)𝑚−1)𝑎+(1+2𝑚+(−1)𝑚−1)𝑏4+(2𝑚−3+(−1)𝑚−1)𝑏5] (3–43) Se sustituye m = n+2: 𝑣3(0)=0 𝑣3(1)=𝑏4 𝑣3(𝑚)=14[(−1+2𝑚−(−1)𝑚−1)𝑎+(1+2𝑚+(−1)𝑚−1)𝑏4+(2𝑚−3+(−1)𝑚−1)𝑏5] 𝑚=2,3,4,⋯ (3–44) Sustituyendo los valores a, 𝒃𝟒,𝒃𝟓 por las ecuaciones, Eq.(3–18), los valores de 𝒓𝟏𝟐,𝒓𝟏𝟑,𝒓𝟐𝟏,𝒓𝟑𝟏, usando la Eq.(3–3), y posteriormente sustituyendo A, Eq. (3–2): 𝑣3(𝑚)=14[(−1+2𝑚−(−1)𝑚−1)∗(𝑅1∫𝑡𝑓(𝑡)𝑑𝑡 𝜏 0+𝑅12𝐹(𝜏)+(𝑅1𝜏+𝑅13)(1−𝐹(𝜏))) +(1+2𝑚+(−1)𝑚−1)∗(𝑅3𝐶+𝑅31)+(2𝑚−3+(−1)𝑚−1)∗((𝑅2𝐵 +𝑅21)−(𝑅3𝐶+𝑅31)) ∗ 𝐹(𝜏))] (3–45) Se realiza la derivada respecto de 𝝉 : 𝑑𝑣3(𝑚) 𝑑𝜏 =14[(−1+2𝑚−(−1)𝑚−1 )(𝑅1𝜏𝑓(𝜏)+𝑅12𝑓(𝜏)+𝑅1−𝑅1𝐹(𝜏)−𝑅1𝜏𝑓(𝜏) −𝑅13𝑓(𝜏)) +(1+2𝑚−(−1)𝑚−1)((𝑅3𝐶+𝑅31))∗0 +(2𝑚−3+(−1)𝑚−1)(𝑅2𝐵+𝑅21−𝑅3𝐶−𝑅31)(𝑓(𝜏)))] =14[𝑓(𝜏)((−1+2𝑚−(−1)𝑚−1 )(𝑅12−𝑅13) +(2𝑚−3+(−1)𝑚−1)(𝑅2𝐵+𝑅21−𝑅3𝐶−𝑅31))] +(−1+2𝑚−(−1)𝑚−1 )𝑅1 4(1−𝐹(𝜏)). (3–46) Si se aprecia el resultado de la derivada para 𝒗𝟑(𝒎), es exactamente igual que para 𝒗𝟐(𝒎), luego el valor de 𝝉 va a ser el mismo: 𝜏𝛼−1=𝛽𝛼 𝛼∙−𝑅1 𝑅12−𝑅13+2𝑚−3+(−1)𝑚−1 −1+2𝑚−(−1)𝑚−1(𝑅2𝐵+𝑅21−𝑅3𝐶−𝑅31) (3–47) Con esta ecuación se obtiene el instante óptimo en el que el sistema debe pasar al estado Preventivo después de m transiciones, habiendo comenzado desde el estado Preventivo. Descripción del Caso Práctico 23 23 3.5 Descripción del Caso Práctico Una vez descrito el problema general, el objetivo, su modelaje, y su resolución, se detallará el caso práctico que se ha utilizado para la comprobación de la herramienta creada, objetivo de este trabajo. El caso práctico se ha tomado del artículo de referencia [1]. En la descripción del problema, se habla de un sistema. En este caso, el equipo protagonista para al cual se realiza el estudio es un motor Diesel de 2 tiempos, 16 cilindros en V y de 1800KW, instalado en los camiones de una empresa minera en el sur de España. Figura 3-3: Volquete. [38] El motor del camión se encuentra funcionando correctamente hasta que ocurre un fallo. El modo de fallo se encuentra en el ventilador de admisión de aire posicionado dentro del motor. El fallo se debe a una fuga a través del retenedor de aceite del soplador [1]. Cuando el soplador falla, el motor registra una condición crítica repentina (alta presión del cárter). Al detectarse el fallo en el motor, la unidad de control electrónico (ECU) lo registra, luego los técnicos de mantenimiento diagnostican el problema y lo reparan. Este procedimiento puede tomar alrededor de 15 turnos de inactividad del sistema promedio: 120 horas de indisponibilidad. La compañía tiene la opción de realizar un reemplazo preventivo de los sopladores viejos con elementos remanufacturados, después de τ horas de operación. El procedimiento de mantenimiento preventivo reduce el tiempo de inactividad a un período promedio de 6 turnos, 48 horas, con dos técnicos trabajando. El problema es que los estados del sistema pueden variar dentro de un número finito de períodos de tiempo, lo que afecta a los ingresos por unidad de tiempo cuando el sistema se encuentra en estado Operativo. La administración de la mina no está segura de los beneficios de implementar la tarea preventiva y quiere saber cómo esta medida afectará a su economía y a la planificación de los trabajadores. Este dilema se puede resolver con el modelo presentado, de tal forma que se calcule el tiempo que debe permanecer el equipo en el estado Operativo antes de pasar al estado de mantenimiento Preventivo, maximizando el retorno promedio acumulado. De igual importancia, tras el estudio realizado de los datos recogidos y la construcción de la función de distribución a partir de los tiempos de fallo, se concretó que ésta se ajusta a una función Weibull de tres parámetros [1]. α=3,50, β=2.500, γ=0 Formalización del Problema 24 3.5.1 Datos del problema Antes de comenzar el cálculo del tiempo óptimo de permanencia en el estado Operativo, es necesario conocer los valores iniciales de ciertos parámetros especificados en la Tabla 3–1: Tabla 3–1. Valores iniciales para las funciones de distribución (FD) [1]. A demás, es necesario saber los ingresos y los costes asociados a cada estado en el que se encuentra el sistema. Los valores de los retornos de este caso práctico son éstos: • R1, ingreso por unidad de tiempo que el sistema permanece en el estado 1. (E1: Operativo): 6 €/hora. • R2, coste por unidad de tiempo que el sistema permanece en el estado 2. (E2: Correctivo): 20€/hora. • R3, coste por unidad de tiempo que el sistema permanece en el estado 3. (E3: Preventivo): 20€/hora. • R12, coste de transición del estado Operativo al Correctivo: 500€. • R21, coste de transición del estado Correctivo al Operativo: 4100€. • R13, coste de transición del estado Operativo al Preventivo: 1€. • R31, coste de transición del estado Preventivo al Operativo: 290€. La tabla resumen de los retornos mencionados es: Tabla 3–2. Datos iniciales para los retornos [1]. Retornos Operación Retorno Correctivo Retorno Preventivo R1 (€/hora) R12 (€) R13 (€) R2 (€/hora) R21 (€) R3 (€/hora) R31 (€) 6.0 -500 -1.0 -20 -4100 -20 -290 Una vez que se tienen todos los datos iniciales, se puede resolver el problema utilizando el modelo descrito. En el capítulo 5 se muestran los resultados obtenidos para el tiempo óptimo en el que el sistema debe pasar al mantenimiento Preventivo, utilizando la herramienta creada para este proyecto. Además, se incluye la verificación de los resultados, mediante la comparativa de éstos con los que se revelan en el artículo de referencia [1]. FD de Fallos FD Tiempos E. Correctivo FD Tiempos E. Preventivo Weibull (α, β) Normal (μ1, σ1) Normal (μ2, σ2) α β μ1 σ1 μ2 σ2 3.50 2,500 120 2 48 1 25 4 MANUAL DE USUARIO DEL PROGRAMA PM-3E n el presente capítulo se explica el funcionamiento de la herramienta PM-3E y los pasos que debe seguir el usuario para poder obtener los resultados deseados rápidamente con el fin de facilitar la toma de decisiones futuras. El programa PM-3E es una herramienta con la cual se puede hallar el tiempo de permanencia de un sistema en el estado Operativo antes de pasar al Preventivo, maximizando el retorno (ingreso menos coste) promedio acumulado en un horizonte finito de 𝒎 pasos. Del mismo modo, a partir del tiempo óptimo obtenido el programa permite el cálculo del retorno promedio. Por otro lado, la herramienta está diseñada para un sistema que se puede encontrar en 3 estados diferentes, donde los estados posibles del sistema son: • E1: Estado Operativo. • E2: Estado Correctivo. • E3: Estado Preventivo. Por otro lado, la función de distribución de fallos que representa el tiempo de permanencia del sistema en el estado Correctivo, en este caso [1] se corresponde con la función Weibull de tres parámetros. Esta herramienta se ha creado con Python 3.7 y, gracias a la importación de la librería Tkinter, se ha desarrollado una pestaña gráfica que facilita la interacción con el usuario. La creación de este programa facilita, agiliza y compara visualmente, a través de representaciones gráficas, los diferentes escenarios que puede presentar el sistema simplemente cambiando cualquier parámetro en la distribución de Weibull o los valores de los retornos en cada estado [1]. Las principales funciones de la herramienta son: • Cálculo del tiempo óptimo hasta la intervención de mantenimiento preventivo (Tau óptimo, τ). • Cálculo del vector de retorno promedio acumulado (V). • Cálculo del tiempo de operación promedio (Average Operating Time, AOT). • Cálculo del tiempo de operación promedio acumulado (Average Accumulated Operating Time, AAOT). • Cálculo del retorno promedio (Average Return, AR). • Creación de un archivo de texto con los resultados obtenidos. • Representación gráfica: o Número de pasos de transición frente el Tau óptimo. o Número de pasos de transición frente al vector de retorno promedio acumulado. o Tau frente al vector de retorno promedio acumulado. o Número de pasos de transición frente al tiempo de operación promedio acumulado. o Número de pasos de transición frente al retorno promedio. • Cálculo de V, AOT, AAOT o AR para un tiempo dado. E Lo dibujé en sólo unos segundos, pero me ha costado 34 años aprender a dibujarlo en sólo unos segundos. - Paula Scher - Manual de Usuario del Programa PM-3E 26 Seguidamente, se explicará y se mostrará la interfaz de usuario, cada una de las partes que la componen y su respectivo funcionamiento. Todo el código desarrollado para la creación de este programa se recoge en el Anexo A: Codificación en Python del programa PM-3E. 4.1 Interfaz de Usuario: Pantalla Principal Al ejecutar el programa se abre la pantalla principal, con la cual el usuario podrá interactuar para calcular los diferentes valores mencionados. Figura 4-1: Pantalla principal de PM-3E. En primer lugar, la pantalla principal se puede minimizar, maximizar y mover según las necesidades del usuario. Igualmente se puede cerrar cuando el usuario haya terminado de usarla. Figura 4-2: Opciones para minimizar, maximizar y cerrar la aplicación. Interfaz de Usuario: Pantalla Principal 27 27 Puesto que todas las funcionalidades de la herramienta se muestran en una única pantalla, ésta se ha estructurado de tal forma que se puedan distinguir cuatro secciones principales. 1. Datos Iniciales 2. Calculadora 3. Gráfico 4. Calculadora para Tau propio Figura 4-3: Diferentes secciones de la herramienta PM-3E Adicionalmente, cada una de las secciones viene acompañada de uno o varios botones “Ayuda”. Figura 4-4: Señalización botón “Ayuda” Manual de Usuario del Programa PM-3E 28 4.2 Datos Iniciales En esta sección se encuentran 14 casillas con las que el usuario puede interactuar, cada una de ellas viene acompaña de una etiqueta que indica el parámetro al que corresponde. El usuario puede modificar cualquiera de estas casillas introduciendo los valores adecuados a su caso. Si se desea introducir un valor decimal, se deberá usar “.” no “,” para marcar la parte decimal, en caso contrario el programa no realizará ningún cálculo. Figura 4-5: Sección de la herramienta donde se deben introducir los datos iniciales. El abrir el programa aparecen los datos que se reflejan en la Figura 4-5, para que el usuario pueda usarlos como ejemplo y verificar el funcionamiento de la herramienta. Igualmente, el usuario puede clicar en cualquiera de las casillas, borrar su contenido e incluir el valor que desee. Es una herramienta diseñada para un sistema que pasa por tres estados diferentes: • E1: Estado Operativo. Aquel en el que el sistema se encuentra funcionando correctamente. • E2: Estado Correctivo. Momento en el que el sistema está siendo reparado debido a un fallo en el mismo. • E3: Estado Preventivo. Cuando el sistema se encuentra en un estado donde se están realizando acciones de mantenimiento preventivas. El tiempo de permanencia del sistema en cada estado para este caso, sigue las siguientes distribuciones: • Función de distribución de Fallos: Función Weibull de tres parámetros (α, β, γ) para E1. • Función de distribución Tiempos de Reparación: Normal (μ1, σ1) para E2. • Función de distribución Tiempos Preventivo: Normal (μ2, σ2) para E3. Por otro lado, cuando el sistema se encuentra en un estado o cambia a otro, genera ingresos y gastos. Éstos se representan a través de los retornos, que se escribirán con signo negativo si es un gasto. • R1, ingreso por unidad de tiempo que el sistema permanece en el estado 1 (E1: Operativo) • R2, costo por unidad de tiempo que el sistema permanece en el estado 2 (E2: Correctivo) • R3, costo por unidad de tiempo que el sistema permanece en el estado 3 (E3: Preventivo). • R12, costo de transición del estado Operativo al Correctivo. • R21, costo de transición del estado Correctivo al Operativo. • R13, costo de transición del estado Operativo al Preventivo. • R31, costo de transición del estado Preventivo al Operativo. Calculadora 29 29 4.3 Calculadora En esta sección se calculan cada uno de los resultados. Cada vez que el sistema cambia de estado corresponde a un paso de transición m. A medida que el sistema cambia de estado, acumula ingresos y costes. Se encuentra una primera casilla donde el usuario debe introducir el número de pasos de transición que desee para su estudio. Conjuntamente, existen tres botones, “V1”, “V2” y “V3”. Se deberá seleccionar “V1” si el sistema se inicia en el estado Operativo, “V2” si el sistema se inicia en el estado Correctivo y “V3” si se inicia en el estado Preventivo. Figura 4-6: Sección de la herramienta donde se muestran los resultados A continuación, se encuentran 3 apartados dentro de esta misma sección. Cada uno revela el cálculo de un elemento. 4.3.1 Cálculo de tau óptimo El tau óptimo indica el instante en horas en el que el sistema debe pasar al estado de mantenimiento preventivo, de modo que se maximice el retorno promedio acumulado (Ingresos-Gastos). Para ello el usuario únicamente, tras introducir el número de pasos y señalar el estado inicial del sistema, debe pulsar el botón que dice “Calcular”. Figura 4-7: Sección de la herramienta para el cálculo de tau óptimo. Manual de Usuario del Programa PM-3E 30 De esta manera se ejecutará la función adecuada y el resultado de tau óptimo para el paso introducido aparecerá en la casilla negra conjunta a la etiqueta “Tau. (h)”. Figura 4-8: Representación de cómo calcular tau óptimo. Al mismo tiempo, aparecerá en el recuadro que se encuentra justo debajo, el valor de tau óptimo de cada uno de los pasos hasta llegar al paso introducido. Figura 4-9: Señalización del resultado de tau óptimo para un número de pasos determinado. 4.3.2 Cálculo del vector de retorno promedio acumulado, V En esta sección se incluye una pestaña donde se exponen varias opciones (PAR, IMPAR, TODO). Todas corresponden al cálculo del vector de retorno promedio acumulado en euros para el número de pasos introducido. De igual forma, si se ha seleccionado “V1” al inicio, se calculará el primer vector de retorno promedio, en el caso de “V2” el segundo vector y para “V3” el tercer vector. Figura 4-10: Sección de la herramienta para el cálculo de V. Calculadora 31 31 Para poner en funcionamiento el cálculo de V, una vez seleccionada alguna de las opciones, el usuario debe pulsar el botón “Calcular” que se encuentra justo al lado del desplegable. Tras realizar esta acción el resultado aparecerá en el recuadro conjunto a esta sección. Figura 4-11: Representación de cómo calcular V. 4.3.2.1 Opciones de cálculo para V PAR: Al seleccionar esta opción se calculará el valor de V tomando el valor de tau óptimo para el número de pasos introducido. Se mostrará el resultado únicamente para los pasos de transición pares desde 1 hasta el paso introducido al inicio (10 en este ejemplo). Figura 4-12: Señalización del resultado de V1 para un número de pasos determinado. El resultado se revela de esta manera: V (paso de transición) = Valor de V obtenido en ese paso para tau óptimo. IMPAR: De igual modo, al seleccionar esta opción se calculará el valor de V tomando el valor de tau óptimo para el número de pasos introducido, y se mostrará el resultado únicamente para los pasos de transición impares desde 1 hasta el paso introducido. Figura 4-13: Señalización del resultado de V1 para un número de pasos determinado. Manual de Usuario del Programa PM-3E 38 4.4.1 Elecciones de representación Eje X: Tau; Eje Y: V. Esta opción es la única que podrá ser representada sin necesidad de que haya calculado su valor en el apartado calculadora, ya que no existe opción para ello. Esta opción representa gráficamente una serie de valores de tau para un mismo paso y su respectivo valor de V. Y señala en la propia gráfica el valor de tau óptimo para ese paso de transición indicado. Figura 4-28: Representación gráfica de tau frente a V1 creada a través de la herramienta. Eje X: N.º de pasos (m); Eje Y: Tau óptimo. En caso de que se haya calculado el tau óptimo en la sección de cálculos, se podrá representar su valor frente a los pasos de transición. Figura 4-29: Representación gráfica de los pasos de transición frente al tau óptimo creada a través de la herramienta. Gráfico 39 39 Eje X: N.º de pasos (m); Eje Y: V. Esta selección se representará siempre y cuando en la sección de cálculo de V se haya calculado alguna de las opciones que dispone: “Par, Impar, Todo” Figura 4-30: Representación gráfica del número de pasos frente a V1, creada a través de la herramienta. Eje X: N.º de pasos (m); Eje Y: AAOT. Para poder representar esta opción es necesario haber calculado previamente el valor de AAOT. En el recuadro de resultados de OT se debe mostrar el valor de AAOT para cada uno de los valores de m desde m = 1 hasta el paso de transición introducido. Figura 4-31: Representación gráfica del número de pasos frente a AAOT creada a través de la herramienta. Manual de Usuario del Programa PM-3E 40 Eje X: N.º de pasos (m); Eje Y: V/AAOT. Asimismo, para poder representar esta opción es necesario haber calculado previamente en la sección de OT la opción “V/AAOT”. Figura 4-32: Representación gráfica del número de pasos frente a AR creada a través de la herramienta. 4.4.2 Funciones de los botones 4.4.2.1 Botón Representar Tras haber marcado la combinación deseada, el usuario debe pulsar este botón. Acto seguido se mostrará en la cuadricula el gráfico elegido. 4.4.2.2 Botón Eliminar Este botón se pulsará siempre que se haya hecho una representación y seguidamente se quiera representar una función diferente, es decir, una nueva combinación. Pese a que, tras pulsar el botón visualmente para el usuario no cambiará nada, tras volver a pulsar “Representar” desaparecerá la función anterior quedando en la cuadricula únicamente la nueva. Si no se pulsa “Eliminar", se representará una combinación de ambos gráficos. 4.4.2.3 Botón Guardar El usuario deberá pulsar este botón si desea guardar la representación creada. Figura 4-33: Explicación de cómo guardar la representación gráfica creada con la herramienta. Gráfico 41 41 El programa abrirá esta pantalla: Figura 4-34: Pestaña para guardar el archivo creado. En ella el usuario seleccionará el nombre y el lugar dónde desea guardar el archivo. Éste se guardará en formato png, es decir, como una imagen. Al abrir el archivo creado, se mostrará una imagen de la representación guardada. Figura 4-35: Imagen creada a partir de la herramienta. Manual de Usuario del Programa PM-3E 42 4.5 Calculadora para Tau propio En esta sección el usuario podrá introducir un valor de tau que desee, es decir, un momento dado (instante en horas) para realizar la intervención del mantenimiento preventivo y el paso de transición al que pertenece. Al igual que el estado inicial en el que se encontraba el sistema: • V1: Estado inicial Operativo. • V2: Estado inicial Correctivo. • V3: Estado inicial Preventivo. Figura 4-36: Sección de PM-3E, calculadora para tau propio Acto seguido, el usuario deberá elegir la opción que desea calcular para dicho tau: • V: Vector de retorno promedio acumulado. • AOT: Tiempo de operación promedio. • AAOT: Tiempo de operación promedio acumulado. • V/AAOT: Retorno promedio. Figura 4-37: Opciones de cálculo para un tau propio dado por el usuario. Una vez elegida la opción deberá pulsar “Calcular”. Ejemplo de funcionamiento: Figura 4-38: Ejemplo de uso de la Calculadora para Tau propio de la herramienta. Antes de realizar un nuevo cálculo deberá pulsar “Eliminar”. 4.6 Botones Ayuda Estos botones se presentan de este modo: Figura 4-39: Señalización del botón ayuda de la herramienta Botones Ayuda 43 43 Se encuentran distribuidos a lo largo de toda la herramienta, y su función es aclarar las dudas que le pueden surgir al usuario al interactuar con la herramienta. El clicarlos aparece una ventana nueva. Figura 4-40: Nota explicativa emergente al clicar en un botón Ayuda asociado a “Datos Iniciales”. Cada uno de los botones ayuda contiene información explicativa para el usuario. Las notas explicativas que podemos encontrar son éstas: Figura 4-41: Nota explicativa emergente al clicar en un botón Ayuda asociado a “Retornos”. Manual de Usuario del Programa PM-3E 44 Figura 4-42: Nota explicativa emergente al clicar en un botón Ayuda, asociado al botón para guardar el archivo. Figura 4-43: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo de tau óptimo. Botones Ayuda 45 45 Figura 4-44: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo del vector de retorno promedio acumulado. Figura 4-45: Nota explicativa emergente al clicar en un botón Ayuda, asociado al cálculo de los tiempos de operación. Manual de Usuario del Programa PM-3E 46 Figura 4-46: Nota explicativa emergente al clicar en un botón Ayuda, asociado a las opciones de representación gráfica que dispone el programa. Figura 4-47: Nota explicativa emergente al clicar en un botón Ayuda asociado a la representación gráfica de los datos. Botones Ayuda 47 47 Figura 4-48: Nota explicativa emergente al clicar en un botón Ayuda asociado al cálculo de parámetros con el uso de un tau dado. Las notas explicativas se pueden abrir siempre que el usuario las necesite y cerrar cuando ya las haya leído. Resultados Experimentales 54 Como se indica en el pie de la figura Figura 5-10, ésta se corresponde con la representación de V1 versus tau para tres valores de transiciones (m) diferentes, en este caso 10, 8 y 6. Igualmente, en el gráfico se nos señala el punto más alto de cada uno de los casos, siendo éste el valor de tau óptimo, 𝜏0. Para que la herramienta pueda generar un gráfico como el mostrado en la Figura 5-10, no es necesario calcular ningún valor previo, directamente se introduce el paso de transición deseado y se pasa a la sección “Gráfico” del programa. 5.3.1 Caso 1 (m=10) Como se explica en el Manual de Usuario del Programa PM-3E, primero se debe introducir el valor de m que se desee para obtener los valores de V, y seleccionar “V1” en caso de buscar el primer vector, es decir, inicializando el sistema en el estado Operativo. Figura 5-11: Introducción de valor de m=10. [Imagen tomada de la herramienta PM-3E]. Seguidamente en la sección de gráfico se marcan estas opciones y se pulsa “Representar”: Figura 5-12: Selección para la representación gráfica del tiempo preventivo frente al vector de retorno promedio acumulado. [Imagen tomada de la herramienta PM-3E]. Resultado al seleccionar “Representar”: Figura 5-13 Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para un valor de transición par (m=10). [Imagen tomada de la herramienta PM-3E]. Comprobación del Primer Componente del Vector de Retorno Promedio Acumulado para pasos de transición pares, V1(m par) 55 55 5.3.2 Caso 2 (m=8) Para poder mostrar varias representaciones en una misma gráfica se introducen sucesivamente los valores de m para los distintos casos y, sin pulsar “Eliminar”, se clica en “Representar” como en el caso anterior: Figura 5-14: Introducción de valor de m=8. [Imagen tomada de PM-3E]. Figura 5-15: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para dos valores de transiciones pares diferentes (m=10, línea naranja y m=8, línea roja). [Imagen tomada de PM-3E]. 5.3.3 Caso 3 (m=6) Se introduce el último caso: Figura 5-16: Introducción de valor de m=6. [Imagen tomada de PM-3E] El resultado para los tres casos conjuntamente es: Figura 5-17: Representación gráfica del primer componente del vector retorno promedio acumulado para τ preventivo, para tres valores de transiciones pares diferentes (m=10, línea naranja; m=8, línea roja y m=6, línea marrón). [Imagen tomada de PM-3E]. Resultados Experimentales 56 Si se comparan ambas gráficas (Figura 5-10 vs. Figura 5-15Figura 5-17) se puede ver que el resultado que se obtiene es igual para cada uno de los tres casos, siendo el valor de V1 más alto el que se corresponde con x igual a tau óptimo. Como se ha explicado previamente, el valor de tau óptimo para las transiciones pares, es el mismo. Éste se representa en ambos gráficos con una línea vertical y para este caso, tau es igual a 2223 horas. 5.4 Comprobación del Primer Componente del Vector de Retorno Promedio Acumulado para pasos de transición impares, V1(m impar) Para esta comprobación se va a seguir exactamente el procedimiento del apartado anterior, únicamente que se van a estudiar casos con pasos de transición de valor impar: 9, 7 y 5. En primer lugar, se muestra el gráfico de resultados que se presenta en el artículo de referencia: Figura 5-18: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para tres valores de transiciones impares diferentes [1]. En el artículo, adicionalmente se nos indica el valor de tau para el resultado más alto que se obtuvo de V1: • Para 𝑚=5, el tiempo 𝜏0(5)=2,570.21 horas da el valor más alto para 𝑣1(5). • Para 𝑚=7, el tiempo 𝜏0(7)= 2,465.66 horas da el valor más alto para 𝑣1(7). • Para 𝑚=9, el tiempo 𝜏0(9)=2,409.61 da el mayor valor de 𝑣1(9). Como en el apartado anterior, los resultados se obtienen dentro del programa directamente en la sección “Gráfico”. 5.4.1 Caso 1 (m=9) Primero se debe introducir el valor de m para el cual queremos obtener los valores de V1 y se selecciona “V1”. Figura 5-19: Introducción de valor de m=9. [Imagen tomada de PM-3E]. Seguidamente en la sección de gráfico se seleccionan estas opciones y se pulsa “Representar”: Figura 5-20: Selección para la representación gráfica del tiempo preventivo frente al vector de retorno. promedio acumulado. [Imagen tomada de PM-3E]. Comprobación del Primer Componente del Vector de Retorno Promedio Acumulado para pasos de transición impares, V1(m impar) 57 57 Resultado al seleccionar “Representar”: Figura 5-21: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para un valor de transición impar (m=9). [Imagen tomada de PM-3E]. 5.4.2 Caso 2 (m=7) El resultado que se obtiene para este caso es: Figura 5-22: Introducción de valor de m=7. [Imagen tomada de PM-3E]. Figura 5-23: Primer componente del vector de retorno acumulado promedio versus tiempo para τ preventivo, para dos valores de transiciones impares diferentes (m=9, línea naranja y m=7, línea roja). [Imagen tomada de PM-3E]. Resultados Experimentales 58 5.4.3 Caso 3 (m=5) El resultado que se obtiene para este caso es: Figura 5-24: Introducción de valor de m=5. [Imagen tomada de PM-3E]. La representación gráfica de los resultados obtenidos se refleja de esta manera: Figura 5-25: Representación gráfica del primer componente del vector retorno promedio acumulado para τ preventivo, para tres valores de transiciones impares diferentes (m=9, línea naranja; m=7, línea roja y m=5, línea marrón). [Imagen tomada de PM-3E]. En la Figura 5-25, como se indica en la esquina inferior derecha, los valores representados en naranja reflejan el caso 1 (m=9), siendo éste el que obtiene valores más altos para V1. Los valores representados en rojo y marrón corresponden al caso 2 (m=7) y al caso 3 (m=5), respectivamente. Se puede apreciar que los resultados de la herramienta coinciden con el gráfico del artículo de referencia, Figura 5-18, siendo los valores de tau para el resultado más alto que se obtuvo de V1 los siguientes: • Para 𝑚=5, el tiempo 𝜏0(5)=2,570.21 horas da el valor más alto para 𝑣1(5). • Para 𝑚=7, el tiempo 𝜏0(7)= 2,465.66 horas da el valor más alto para 𝑣1(7). • Para 𝑚=9, el tiempo 𝜏0(9)=2,409.61 horas da el mayor valor de 𝑣1(9). Comprobación del Tiempo de Operación Promedio, AOT 59 59 5.5 Comprobación del Tiempo de Operación Promedio, AOT El resultado que se expresa en el artículo para el valor de AOT es: 𝐴𝑂𝑇= 𝜏0 (1−𝑝)+𝐴· 𝑝= 1,948 hours (5–1) Siendo los valores de cada una de las variables: 𝜏0= 2,222.86 , 𝑝=0.4846 y 𝐴=802.53 Para el cálculo de AOT, la herramienta debe contener los valores de 𝜏0, 𝑝 y 𝐴. Estos valores se deben calcular a través de la misma previamente, de este modo se guardarán y podrán utilizarse más tarde en el cálculo de AOT. El valor de 𝜏0 que se utiliza en el artículo de referencia para este apartado corresponde con el Caso 3 (R1= 6) para un paso de transición par. En este caso se ha escogido 10 pasos de transición. En primer lugar, se obtendrá el resultado de 𝜏0: Figura 5-26: Cálculo de 𝜏0 para m=10. [Imagen tomada de PM-3E]. En segundo lugar, para obtener el valor de 𝑝 y 𝐴 es necesario realizar en la herramienta el cálculo de V1: Figura 5-27: Cálculo de V1 pasos de transición impares. [Imagen tomada de PM-3E]. En este caso, se ha seleccionado la opción del cálculo de V1 únicamente para los pasos de transición impares. Es una demostración de que no tiene importancia que valores de V se haya elegido calcular, ya que para todas las opciones (Par, Impar y Todo) queda registrado el valor de p y de A. Finalmente, se realiza la operación de AOT: Figura 5-28: Cálculo de AOT para 10 pasos de transición. [Imagen tomada de PM-3E]. Con la Figura 5-28 tomada de la herramienta, se puede comprobar que el resultado calculado para AOT, 10 pasos de transición, es correcto: 𝐴𝑂𝑇 (10)= 1,948 horas Resultados Experimentales 60 5.6 Comprobación del Primer Vector de Retorno Acumulado para 10 pasos de transición En el artículo se enseña la siguiente tabla con el resultado del primer vector de retorno acumulado, V1, para 10 pasos de transición: Tabla 5–7: Resultado del retorno promedio acumulado para 10 pasos de transición. m Average Accumulated Return (€) v1(m) 1 11446,223 2 7652,0197 3 19098,243 4 15304,039 5 26750,262 6 22956,059 7 34402,282 8 30608,079 9 42054,302 10 38260,098 El resultado que se obtuvo con el uso de la herramienta para este caso es: Figura 5-29: Resultado de V1 de m=1 hasta m=6 para 10 pasos de transición. [Imagen tomada de PM-3E]. Figura 5-30: Resultado de V1 de m=5 hasta m=10 para 10 pasos de transición. [Imagen tomada de PM-3E]. Si se comparan ambos resultados se puede apreciar que los valores son iguales para cada uno de los pasos, siendo: 𝑉1(𝑚=10)= 38260,099€ Quedando verificado el correcto funcionamiento de la herramienta para el cálculo de V1. Comprobación del Valor del Tiempo de Funcionamiento Promedio Acumulado, AAOT 61 61 5.7 Comprobación del Valor del Tiempo de Funcionamiento Promedio Acumulado, AAOT Los resultados que se obtienen en el artículo de referencia para el valor de AAOT se expresan en esta tabla: Tabla 5–8: Resultado para AAOT correspondiente a 10 pasos de transición [1] m Average Accumulated Operating Time (hours) AAOT 1 1948,17 2 1948,17 3 3896,35 4 3896,35 5 5844,52 6 5844,52 7 7792,70 8 7792,70 9 9740,87 10 9740,87 Con los resultados guardados en la herramienta para el cálculo de V1, como se indica en el apartado anterior, se puede realizar directamente el cálculo de AAOT. Los resultados que se obtienen son los mostrados: Figura 5-31: Resultado de AAOT de m=1 hasta m=6 para 10 pasos de transición. [Imagen tomada de PM-3E]. Figura 5-32: Resultado de AAOT de m=5 hasta m=10 para 10 pasos de transición. [Imagen tomada de PM- 3E]. Los valores obtenidos coinciden con los que se exponen en el artículo de referencia, teniendo como resultado para m = 10: 𝐴𝐴𝑂𝑇(𝑚=10)= 9740,87 horas Quedando verificado el correcto funcionamiento de la herramienta para el cálculo del tiempo de operación promedio acumulado. Resultados Experimentales 62 5.8 Comprobación del Valor del Retorno Promedio, V1/AAOT Por último, una vez que se obtienen V1 y AAOT se puede calcular el retorno promedio. Los valores que se obtienen en el artículo de referencia para este parámetro considerando 10 pasos de transición son: Tabla 5–9: Resultados para V1/AAOT correspondientes a 10 pasos de transición [1] m Average Return (€/h) v1(m)/AAOT 1 5,875 2 3,928 3 4,902 4 3,928 5 4,577 6 3,928 7 4,415 8 3,928 9 4,317 10 3,928 Los resultados que se obtuvieron para el retorno promedio a partir de la herramienta son: Figura 5-33: Resultado de V1/AAOT de m=1 hasta m=5 para 10 pasos de transición. [Imagen de PM-3E]. Figura 5-34: Resultado de V1/AAOT de m=5 hasta m=10, para 10 pasos de transición. [Imagen de PM-3E]. Los valores obtenidos coinciden con los que se exponen en el artículo de referencia, teniendo como resultado para m = 10: 𝑅𝑒𝑡𝑜𝑟𝑛𝑜 𝑝𝑟𝑜𝑚𝑒𝑑𝑖𝑜 (𝑚=10)= 3,928€/h Con esta última comprobación, se verifica el correcto funcionamiento del programa creado al completo. 63 6 CONCLUSIONES n el presente trabajo se avanza en el conocimiento de la resolución de un problema de optimización del mantenimiento, así como en su implantación y gestión en problemas reales. Se trata de un problema de mantenimiento para un horizonte de tiempo finito de m pasos, donde se buscan los intervalos de mantenimiento preventivo óptimos. Se parte de una resolución del problema desde un enfoque de procesos Semi-Markoviano (SMP) formado por sistema de tres estados, que demuestra que el retorno esperado puede expresarse como la solución de un sistema de ecuaciones en diferencias resuelto a través de la técnica de la transformada z. Para maximizar este retorno promedio acumulado esperado en m pasos, 𝑉(𝑚), se ha utilizado el procedimiento directo de derivación con respecto al tiempo hasta el mantenimiento preventivo 𝜏, igualando esta derivada a cero y estudiando las condiciones de existencia de la solución. Este método tomado de referencia [1], inicializaba el sistema desde un estado Operativo. Los resultados indican que: 1. La aportación al método creada en este trabajo, siguiendo la misma metodología antes descrita, permite calcular el tiempo hasta el mantenimiento preventivo óptimo, inicializando el sistema desde los estados Correctivo y Preventivo. Tras el desarrollo de las ecuaciones matemáticas, se obtiene el resultado del tiempo óptimo en el que el sistema debe pasar a un estado de mantenimiento preventivo, iniciando el sistema desde el estado Correctivo o desde el estado Preventivo, con idéntico valor para ambos estados y superior al que se obtiene desde el estado Operativo. 2. Respecto al desarrollo de la herramienta para la implantación y gestión del mantenimiento preventivo, se concluye que gracias al lenguaje de programación Python y la implantación de librerías como Tkinter, se ha podido crear una interfaz gráfica eficiente y amigable para el usuario. 3. El programa desarrollado permite el cálculo de los siguientes parámetros: tiempo óptimo hasta la intervención de mantenimiento preventivo (Tau óptimo, τ), vector de retorno promedio acumulado (V), tiempo de operación promedio (Average Operating Time, AOT), tiempo de operación promedio acumulado (Average Accumulated Operating Time, AAOT). Alternativamente, permite el cálculo de valores concretos de dichos parámetros para un valor de tau dado. 4. La herramienta proporciona una selección de representaciones gráficas de dichos parámetros: Número de pasos de transición frente el tau óptimo, número de pasos de transición frente al vector de retorno promedio acumulado, tau frente al vector de retorno promedio acumulado, número de pasos de transición frente al tiempo de operación promedio acumulado y número de pasos de transición frente al retorno promedio. De forma individualizada para un único caso o de forma combinada para estudios comparativos. 5. Esta interfaz permite de manera sencilla el cálculo y la comparativa de los diferentes escenarios que puede presentar el sistema, simplemente cambiando cualquier parámetro en la distribución de Weibull o los valores de los retornos en cada estado. 6. Se ha demostrado el correcto funcionamiento del programa mediante la comparativa de los resultados obtenidos con el mismo y los desarrollados en el método de referencia. 7. El ahorro de tiempo que supone la rapidez en la obtención de resultados es una ventaja adicional de la herramienta desarrollada. De esta forma, se puede favorecer la implantación de políticas de mantenimiento, en particular la planificación y gestión del mantenimiento preventivo, partiendo de cualquiera de los tres estados posibles del sistema, Operativo, Correctivo o Preventivo. 8. Gracias al programa se facilita la implantación del mantenimiento preventivo, y a través de un método que maximiza el retorno, se reduce el impacto económico que implicaría la implantación de dicho mantenimiento. Estas acciones de mantenimiento aumentan la vida útil de un sistema, además de reducir los fallos graves del mismo, lo que implica la reducción de posibles impactos tanto ambientales como a las personas. E Si eres valiente para decir adiós, la vida te recompensará con un nuevo hola. - Paulo Coelho- Anexo A: Codificación en Python del programa PM-3E 70 self.etq8= tk.Label(self.raiz, text="R1:",font=fuente, bg=color) self.retorno1= ttk.Entry(self.raiz, textvariable=self.R1, width=10) self.etq9= tk.Label(self.raiz, text="R12:",font=fuente, bg=color) self.retorno12= ttk.Entry(self.raiz, textvariable=self.R12, width=10) self.etq10= tk.Label(self.raiz, text="R13:",font=fuente, bg=color) self.retorno13= ttk.Entry(self.raiz, textvariable=self.R13, width=10) self.etq11= tk.Label(self.raiz, text="R2:",font=fuente, bg=color) self.retorno2= ttk.Entry(self.raiz, textvariable=self.R2, width=10) self.etq12= tk.Label(self.raiz, text="R21:",font=fuente, bg=color) self.retorno21= ttk.Entry(self.raiz, textvariable=self.R21, width=10) self.etq13= tk.Label(self.raiz, text="R3:",font=fuente, bg=color) self.retorno3= ttk.Entry(self.raiz, textvariable=self.R3, width=10) self.etq14= tk.Label(self.raiz, text="R31:",font=fuente, bg=color) self.retorno31= ttk.Entry(self.raiz, textvariable=self.R31, width=10) self.etq15= tk.Label(self.raiz, text="Introduzca el número de pasos:",font=fuente, bg=color) self.numeropasos= ttk.Entry(self.raiz, textvariable=self.paso, width=10) A.4.3 Botón V1, V2 o V3 Un Radiobutton permite juntar varios botones para que solo se pueda hacer clic en uno de ellos. Si una de las opciones está activada y el usuario hace clic en otra, el primero se desactiva. De esta manera, por ejemplo, se permite después tener un único botón para calcular, pero dependiendo de la opción que esté seleccionada en el Radiobutton se calcularán diferentes elementos [42]. self.sel_v = StringVar() self.sel_v.set('V1') self.radiobutton_V1 = tk.Radiobutton(self.raiz, text="V1", variable=self.sel_v, value='V1', indicatoron=False) self.radiobutton_V2 = tk.Radiobutton(self.raiz, text="V2", variable=self.sel_v, value='V2', Declaración de Widgets 71 71 indicatoron=False) self.radiobutton_V3 = tk.Radiobutton(self.raiz, text="V3", variable=self.sel_v, value='V3', indicatoron=False) A.4.4 Cálculo de tau óptimo Un Button es un widget que puede estar encendido o apagado. Cuando un usuario hace clic en él, el botón emite un evento/función. El Listbox es un cuadro de texto, que presenta el contenido en forma de lista, y permite al usuario elegir entre un conjunto de opciones [42]. self.etq16= tk.Label(self.raiz, text='Tau (h)' ,font="Arial 10", bg='lemon chiffon') self.resultado= ttk.Label(self.raiz, textvariable=self.valor_optimo,foreground="yellow", background="black",borderwidth=5, anchor="e", width=30) self.calcular = tk.Button(self.raiz, text="Calcular", command=self.calcular) self.limpiar =tk.Button(self.raiz, text="Eliminar", command=self.limpiar) self.listbox = tk.Listbox(self.raiz, width=30, height=6) self.listbox2= tk.Listbox() self.salir = tk.Button(self.raiz, text="Salir",command=quit) self.guardar = tk.Button(self.raiz, text="Guardar",command=self.guardar) A.4.5 Cálculo de V El widget Combobox crea una lista desplegable. Cuando se hace clic en la flecha de la izquierda, aparece un menú desplegable que expone todas las opciones disponibles. El usuario puede seleccionar cualquiera de ellas. self.v= tk.Label(self.raiz, text="V(€):",font="Arial 10", bg='lemon chiffon') self.desplegable= ttk.Combobox(self.raiz, state="readonly") self.desplegable["values"] = ["PAR", "IMPAR", "TODO"] self.calcular_v=tk.Button(self.raiz, text="Calcular", command=self.calcular_v) self.resultado_v= tk.Listbox(self.raiz, width=30, height=6) self.eliminar_v=tk.Button(self.raiz, text="Eliminar", command=self.limpiar_v) self.τ_par=tk.Listbox() self.τ_impar=tk.Listbox() self.datos_v=tk.Listbox() Anexo A: Codificación en Python del programa PM-3E 72 A.4.6 Cálculo de OT self.OT=tk.Label(self.raiz, text="OT (h):",font="Arial 10", bg='lemon chiffon') self.desplegable_ot= ttk.Combobox(self.raiz, state="readonly") self.desplegable_ot["values"] = ["AOT", "AAOT", "V/AAOT"] self.resultado_ot=tk.Listbox(self.raiz, width=30, height=6) self.calcular_ot=tk.Button(self.raiz, text="Calcular", command=self.calcular_ot) self.eliminar_ot=tk.Button(self.raiz, text="Eliminar", command=self.limpiar_ot) self.datos_A=tk.Listbox() self.datos_AAOT=tk.Listbox() self.datos_AR=tk.Listbox() A.4.7 Sección plantilla gráfico right_frame = tk.Frame(self.raiz, bg='#C0C0C0', bd=1.5) right_frame.place(x=500, y=20, width=550, height=350 ) self.figure = plt.Figure(figsize=(5,6), dpi=50) self.plot = self.figure.add_subplot(111) self.plot.grid(True),self.plot.set_xlabel('$x$'),self.plot.set_yla bel('$y(x)$') self.line = FigureCanvasTkAgg(self.figure, right_frame) self.line.get_tk_widget().pack(side=tk.LEFT,fill=tk.BOTH,expand=1) A.4.8 Sección gráfico self.crear_grafico = tk.Button(self.raiz, text="Representar",command=self.crear_grafico) self.titulografico=tk.Label(self.raiz, text="Gráfico",bg='lemon chiffon', font=fuente) self.varx = StringVar(value='m') self.var_x=tk.Label(self.raiz, text="Eje X:",bg=color, font=fuente) self.tau_x= tk.Radiobutton(self.raiz, text='Tau (τ)', variable=self.varx, value='tx',bg=color,font=fuente) self.m= tk.Radiobutton(self.raiz, text='Nº de pasos (m)',variable=self.varx, value='m',bg=color,font=fuente) self.vary=StringVar(value='ty') self.var_y=tk.Label(self.raiz, text="Eje Y:",bg=color, font=fuente) self.tau_y= tk.Radiobutton(self.raiz, text='Tau óptimo (τ0)', variable=self.vary, value='ty',bg=color,font=fuente) self.v_y= tk.Radiobutton(self.raiz, text='V', variable=self.vary, value='v',bg=color,font=fuente) self.aaot_y=tk.Radiobutton(self.raiz, text='AAOT', Declaración de Widgets 73 73 variable=self.vary, value='AAOT',bg=color,font=fuente) self.v1_aaot_y=tk.Radiobutton(self.raiz, text='V/AAOT', variable=self.vary, value='V/AAOT',bg=color,font=fuente) self.eliminar_grafico=tk.Button(self.raiz, text="Eliminar",command=self.eliminar_graf) self.guardar_grafico=tk.Button(self.raiz, text="Guardar",command=self.guardar_graf) self.datos_v_comp=tk.Listbox() A.4.9 Cálculo para tau propio self.titu_tau_pro=tk.Label(self.raiz, text="Calculadora para Tau propio",bg='lemon chiffon', font=fuente) self.etq_tau= tk.Label(self.raiz, text="Tau:",font=fuente, bg=color) self.pro_tau=DoubleVar() self.propio_tau=ttk.Entry(self.raiz, textvariable=self.pro_tau, width=10) self.etq_paso= tk.Label(self.raiz, text="Paso:",font=fuente, bg=color) self.pro_paso=IntVar(value=1) self.propio_paso=ttk.Entry(self.raiz, textvariable=self.pro_paso, width=5) self.desplegable_tau_pro= ttk.Combobox(self.raiz, state="readonly",width=10) self.desplegable_tau_pro["values"] = ["V","AOT", "AAOT", "V/AAOT"] self.resultado_tau_prop=DoubleVar(0.0) self.resultado_tau_pro=tk.Label(self.raiz, textvariable=self.resultado_tau_prop,width=15,foreground="yel low", background="black", borderwidth=5, anchor="e") self.calcular_tau_pro=tk.Button(self.raiz, text="Calcular", command=self.calcular_prop_tau) self.sel_v_tau = StringVar() self.sel_v_tau.set('V1') self.radiobutton_V1_tau = tk.Radiobutton(self.raiz, text="V1", variable=self.sel_v_tau, value='V1', indicatoron=False) self.radiobutton_V2_tau = tk.Radiobutton(self.raiz, text="V2", variable=self.sel_v_tau, value='V2', indicatoron=False) self.radiobutton_V3_tau = tk.Radiobutton(self.raiz, text="V3", Anexo A: Codificación en Python del programa PM-3E 74 variable=self.sel_v_tau, value='V3', indicatoron=False) self.eliminar_tau_pro=tk.Button(self.raiz, text="Eliminar", command=self.eliminar_prop_tau) A.4.10 Creación botones ayuda color_2='dark turquoise' self.ayuda_datos=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_datos) self.ayuda_OP=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_OP) self.ayuda_V1=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_V1) self.ayuda_OT=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_OT) self.ayuda_guard=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_guard) self.ayuda_graf_ejes=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_graf_ejes) self.ayuda_graf=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_graf) self.ayuda_retornos=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_retornos) self.ayuda_tau_propio=tk.Button(self.raiz, text="*",height=1,background=color_2,width=2, command=self.ayuda_tau_propio) A.5 Posicionamiento de Widgets La librería Tkinter provee tres métodos para establecer la posición de los widgets dentro de una ventana. Éstas se corresponden con las funciones pack(), place() y grid(). Para este caso se ha utilizado la función place(). [43] La función place() permite ubicar elementos indicando su posición (X e Y) respecto de un elemento padre, siendo la coordenada (0,0) la esquina superior izquierda de la ventana principal. Dentro de esta función también se puede indicar el tamaño que ocupa el widget en píxeles con los parámetros width y height. A.5.1 Datos iniciales self.titulo.place(x=10, y=10) self.fallos.place(x=10, y=40) self.etq1.place(x=10, y=60) self.landa.place(x=30, y=60) Posicionamiento de Widgets 75 75 self.etq2.place(x=10, y=85) self.beta.place(x=30, y=85) self.etq3.place(x=10, y=110) self.gamma.place(x=30, y=110) self.etq4.place(x=150, y=60) self.mi1.place(x=180, y=60) self.reparacion.place(x=150, y=40) self.etq5.place(x=150, y=85) self.sigma1.place(x=180, y=85) self.preventivo.place(x=320, y=40) self.etq6.place(x=320, y=60) self.mi2.place(x=350, y=60) self.etq7.place(x=320, y=85) self.sigma2.place(x=350, y=85) self.ret_ope.place(x=10, y=140) self.etq8.place(x=10, y=160) self.retorno1.place(x=45, y=160) self.etq9.place(x=10, y=185) self.retorno12.place(x=45, y=185) self.etq10.place(x=10, y=210) self.retorno13.place(x=45, y=210) self.ret_cor.place(x=150, y=140) self.etq11.place(x=150, y=160) self.retorno2.place(x=185, y=160) self.etq12.place(x=150, y=185) self.retorno21.place(x=185, y=185) self.ret_pre.place(x=320, y=140) self.etq13.place(x=320, y=160) self.retorno3.place(x=350, y=160) self.etq14.place(x=320, y=185) self.retorno31.place(x=350, y=185) A.5.2 Botones V1, V2 y V3 self.radiobutton_V1.place(x=290,y=248) self.radiobutton_V2.place(x=320,y=248) self.radiobutton_V3.place(x=350,y=248) A.5.3 Cálculo de tau óptimo self.guardar.place (x=380, y=248) self.etq15.place(x=10, y=250) self.numeropasos.place(x=220, y=250) Anexo A: Codificación en Python del programa PM-3E 76 self.calcular.place(x=320, y=280) self.etq16.place(x=10, y=280) self.resultado.place(x=130, y=280) self.limpiar.place(x=320, y=320) self.listbox.place(x=130, y=300) A.5.4 Cálculo de V self.v.place(x=10, y=410) self.desplegable.place(x=130, y=410) self.calcular_v.place(x=280, y=407) self.resultado_v.place(x=130, y=438) self.eliminar_v.place(x=320, y=485) self.propio_tau.place(x=290, y=410) A.5.5 Cálculo de OT self.OT.place(x=10, y=550) self.desplegable_ot.place(x=130, y=550) self.resultado_ot.place(x=130, y=578) self.calcular_ot.place(x=280, y=547) self.eliminar_ot.place(x=320, y=628) A.5.6 Representación gráfica self.titulografico.place(x=500, y=400) self.var_x.place(x=500, y=430) self.tau_x.place(x=500, y=460) self.m.place(x=500, y=480) self.var_y.place(x=700, y=430) self.tau_y.place(x=700, y=460) self.v_y.place(x=700, y=480) self.aaot_y.place(x=700, y=500) self.v1_aaot_y.place(x=700, y=520) self.crear_grafico.place(x=800, y=520) self.eliminar_grafico.place(x=880, y=520) self.guardar_grafico.place(x=940, y=520) Definición Botones Ayuda 77 77 A.5.7 Cálculo para tau propio self.titu_tau_pro.place(x=500, y=570) self.radiobutton_V1_tau.place(x=695, y=570) self.radiobutton_V2_tau.place(x=725, y=570) self.radiobutton_V3_tau.place(x=755, y=570) self.etq_tau.place(x=500, y=600) self.propio_tau.place(x=540, y=603) self.etq_paso.place(x=610, y=600) self.propio_paso.place(x=655, y=603) self.desplegable_tau_pro.place(x=700, y=603) self.resultado_tau_pro.place(x=790, y=600) self.calcular_tau_pro.place(x=910, y=600) self.eliminar_tau_pro.place(x=970, y=600) A.5.8 Botones ayuda self.ayuda_datos.place(x=120, y=10) self.ayuda_retornos.place(x=430, y=173) self.ayuda_OP.place(x=60, y=280) self.ayuda_V1.place(x=60, y=410) self.ayuda_OT.place(x=60, y=550) self.ayuda_guard.place(x=440,y=248) self.ayuda_graf_ejes.place(x=560, y=400) self.ayuda_graf.place(x=1000, y=520) self.ayuda_tau_propio.place(x=790, y=570) #final widgets self.raiz.mainloop() A.6 Definición Botones Ayuda A.6.1 Retornos def ayuda_retornos(self): color='lemon chiffon' letra=('times', 14, 'italic') master = tk.Tk() master.geometry("550x400") master.configure(background=color) whatever_you_do = "RETORNOS"\ "\t\n-R1, ingreso por unidad de tiempo que el sistema permanece en el estado 1 (E1: Operativo)"\ Anexo A: Codificación en Python del programa PM-3E 78 "\t\n -R2, costo por unidad de tiempo que el sistema permanece en el estado 2 (E2: Correctivo)"\ "\t\n -R3, costo por unidad de tiempo que el sistema permanece en el estado 3 (E3: Preventivo)."\ "\t\n -R12, costo de transición del estado operativo al correctivo."\ "\t\n -R21, costo de transición del estado correctivo al operativo."\ "\t\n -R13, costo de transición del estado operativo al preventivo."\ "\t\n -R31, costo de transición del estado preventivo al operativo.\t\n"\ "\t\n Los costos se escriben con signo negativo" msg = tk.Message(master, text = whatever_you_do) msg.config(bg=color, font=letra, width="450", padx="1") msg.pack() tk.mainloop() A.6.2 Datos iniciales def ayuda_datos(self): color='lemon chiffon' letra=('times', 14, 'italic') master = tk.Tk() master.configure(background=color) whatever_you_do ="Introduzca los datos de su problema"\ "\t\n Programa diseñado para un sistema que pasa por tres estados diferentes."\ "\n •E1: Estado Operativo. Hace referencia al momento en el que el sistema se encuentra funcionando correctamente."\ "\n •E2: Estado Correctivo. Hace referencia a cuando el sistema está siendo reparado debido a un fallo en el mismo."\ "\n •E3: Estado Preventivo. Se refiere al momento, el cual el sistema se encuentra en un estado en el que se están llevando a cabo acciones de mantenimiento preventivas.\t\n"\ "\t\n El tiempo que el sistema permanece en cada estado se expresa con funciones de distribución."\ "\n •E1: Función de distribución de Fallos: Función Weibull de tres parámetros (α, β, γ)"\ "\n •E2: Función de distribución Tiempos de Reparación: Normal (μ1, σ1)"\ "\n •E3: Función de distribución Tiempos Preventivo: Normal (μ2, σ2)\t\n"\ "\t\n La permanencia del sistema en cada estado, lleva asociado unos ingresos y costos, llamados retornos."\ Definición Botones Ayuda 79 79 "\t\n El objetivo de este programa es el cálculo del tiempo óptimo (Tau óptimo) en el que el sistema debe pasar al mantenimiento preventivo de manera que se maximicen los retornos acumulados."\ "\t\n Para introducir los datos solo debe clicar en la casilla que desee, borrar su contenido y escribir el valor deseado."\ "\t\n Utilizar punto no coma para marca la parte decimal." msg = tk.Message(master, text = whatever_you_do) msg.config(bg=color, font=letra,width="500") msg.pack() tk.mainloop() A.6.3 Cálculo de tau óptimo def ayuda_OP(self): color='lemon chiffon' letra=('times', 14, 'italic') master = tk.Tk() whatever_you_do = "Cálculo de Tau Óptimo"\ "\t\n 1.Introducir el número de pasos para el cual desea calcular el tau óptimo."\ "\t\n 2.Pulsar V1 si el sistema parte del estado operativo. V2 si el sistema parte del estado correctivo. V3 Si es sistema comenzó en estado preventivo."\ "\t\n 3. Pulsar el botón de Calcular que se encuentra a continuación."\ "\t\n 4. El resultado aparecerá en el recuadro correspondiente a esta sección."\ "\t\n τ(paso de transición)= valor de tau óptimo para ese paso en horas."\ "\t\n 5. Si se desea eliminar el resultado para calcular uno nuevo, pulse Eliminar." msg = tk.Message(master, text = whatever_you_do) msg.config(bg=color, font=letra) msg.pack() tk.mainloop() A.6.4 Cálculo de V def ayuda_V1(self): color='lemon chiffon' letra=('times', 16, 'italic') Anexo A: Codificación en Python del programa PM-3E 86 while m <= pasos: valor_optimo=((β**α)/α*(-R1)*(-1+2*m-(-1)**(m-1))/((- 1+2*m-(-1)**(m-1))*(R12-R13)+(-3+2*m+(-1)**(m- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ self.valor_optimo.set(round(valor_optimo,3)) self.listbox.insert(tk.END, f"τ({m})={round(valor_optimo,3)}") self.listbox2.insert(tk.END,round(valor_optimo,3)) m += 1 if self.sel_v.get()=="V3": τ=((β**α)/α*(-R1)*(-1+2*pasos-(-1)**(pasos-1))/((- 1+2*pasos-(-1)**(pasos-1))*(R12-R13)+(- 3+2*pasos+(-1)**(pasos-1))*(R2*μ1+R21-R3*μ2- R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y= α/(β*F)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((x-γ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) self.τ_0=τ self.A=A self.F=F m += 2 while m <= pasos: valor_optimo=((β**α)/α*(-R1)*(-1+2*m-(-1)**(m-1))/((- 1+2*m-(-1)**(m-1))*(R12-R13)+(-3+2*m+(-1)**(m- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ self.valor_optimo.set(round(valor_optimo,3)) self.listbox.insert(tk.END, f"τ({m})={round(valor_optimo,3)}") self.listbox2.insert(tk.END,round(valor_optimo,3)) m += 1 A.9 Función: Cálculo de V A diferencia de las estructuras de control condicionales, las iterativas, también llamadas cíclicas o bucles, permiten ejecutar un mismo código, repetidamente, mientras se cumpla una condición [44]. El bucle while, se encarga de ejecutar una misma acción "mientras que" una determinada condición se cumpla. def calcular_v(self): import sympy as sp error_dato = False valor_optimo = 0 Función: Cálculo de V 87 87 m=1 try: α = float(self.α.get()) β = float(self.β.get()) γ = float(self.γ.get()) μ1 = float(self.μ1.get()) σ1 = float(self.σ1.get()) μ2 = float(self.μ2.get()) σ2 = float(self.σ2.get()) R1 = float(self.R1.get()) R12 = float(self.R12.get()) R13 = float(self.R13.get()) R2 = float(self.R2.get()) R21 = float(self.R21.get()) R3 = float(self.R3.get()) R31 = float(self.R31.get()) pasos = float(self.paso.get()) except: error_dato = True if not error_dato: while m <= pasos: if self.desplegable.get()=="IMPAR": if self.sel_v.get()=="V1": τ=((β**α)/α*(-R1)*(1+2*pasos+(-1)**(pasos- 1))/((1+2*pasos+(-1)**(pasos-1))*(R12- R13)+(-1+2*pasos-(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((1+2*m+(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(- 1+2*m-(-1)**(m-1))*((R2* μ1 +R21)*F+(R3* μ2+R31)*(1-F))) if self.sel_v.get()=="V2": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) Anexo A: Codificación en Python del programa PM-3E 88 A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R2* μ1 +R21)+(- 3+2*m+(-1)**(m-1))*(( R3* μ2+R31)-( R2* μ1 +R21)*(1-F))) if self.sel_v.get()=="V3": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R3* μ2 +R31)+(- 3+2*m+(-1)**(m-1))*(( R2* μ1+R21)-( R3* μ2 +R31)*(F))) self.τ_impar.insert(tk.END,τ) self.A=(1/F)*A self.resultado_v.insert(tk.END, f"{self.sel_v.get()}({m})={round (v,3)}") self.datos_v.insert(tk.END,round (v,3)) m += 2 if self.desplegable.get()=="PAR": m +=1 if self.sel_v.get()=="V1": τ=((β**α)/α*(-R1)*(1+2*pasos+(-1)**(pasos- 1))/((1+2*pasos+(-1)**(pasos-1))*(R12- R13)+(-1+2*pasos-(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((1+2*m+(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(- 1+2*m-(-1)**(m-1))*((R2* μ1 +R21)*F+(R3* μ2+R31)*(1-F))) if self.sel_v.get()=="V2": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) Función: Cálculo de V 89 89 x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R2* μ1 +R21)+(- 3+2*m+(-1)**(m-1))*(( R3* μ2+R31)-( R2* μ1 +R21)*(1-F))) if self.sel_v.get()=="V3": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R3* μ2 +R31)+(- 3+2*m+(-1)**(m-1))*(( R2* μ1+R21)-( R3* μ2 +R31)*(F))) self.τ_par.insert(tk.END,τ) self.A=(1/F)*A self.resultado_v.insert(tk.END, f"{self.sel_v.get()}({m})={round (v,3)}") self.datos_v.insert(tk.END,round (v,3)) m +=1 if self.desplegable.get()=="TODO": if self.sel_v.get()=="V1": τ=((β**α)/α*(-R1)*(1+2*pasos+(-1)**(pasos- 1))/((1+2*pasos+(-1)**(pasos-1))*(R12- R13)+(-1+2*pasos-(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((1+2*m+(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(- 1+2*m-(-1)**(m-1))*((R2* μ1 +R21)*F+(R3* μ2+R31)*(1-F))) if self.sel_v.get()=="V2": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- Anexo A: Codificación en Python del programa PM-3E 90 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R2* μ1 +R21)+(- 3+2*m+(-1)**(m-1))*(( R3* μ2+R31)-( R2* μ1 +R21)*(1-F))) if self.sel_v.get()=="V3": τ=((β**α)/α*(-R1)*(-1+2*pasos-(- 1)**(pasos-1))/((-1+2*pasos-(-1)**(pasos- 1))*(R12-R13)+(-3+2*pasos+(-1)**(pasos- 1))*(R2*μ1+R21-R3*μ2-R31)))**(1/(α-1))-γ F=1-sp.exp(-(((τ-γ)/β)**α)) x = sp.Symbol('x') y=α/(β)*x*(((x-γ)/β)**(α-1))*sp.exp(-(((xγ)/β)**α)) A=sp.integrate(y,(x,γ+0.001,τ)) v=1/4*((-1+2*m-(-1)**(m- 1))*(R1*A+R12*F+(R1* τ +R13)*(1- F))+(1+2*m+(-1)**(m-1))*(R3* μ2 +R31)+(- 3+2*m+(-1)**(m-1))*(( R2* μ1+R21)-( R3* μ2 +R31)*(F))) self.A=(1/F)*A self.resultado_v.insert(tk.END, f"{self.sel_v.get()}({m})={round (v,3)}") self.datos_v.insert(tk.END,round (v,3)) m +=1 A.10 Función: Cálculo de OT def calcular_ot(self): m=(self.paso.get()) paso=1 V1=list(self.datos_v.get(0, END)) i=0 τ=self.τ_0 A=self.A F=self.F Función: Guardar Resultados 91 91 if self.desplegable_ot.get()=="AOT": AOT=τ*(1-F)+A*F self.resultado_ot.insert(tk.END, f"AOT({round(m)})={round (AOT,3)}") if self.desplegable_ot.get()=="AAOT": AOT=τ*(1-F)+A*F while paso<=m: if paso % 2 == 0: AAOT=((paso)/2)*AOT else: AAOT=((paso+1)/2)*AOT self.resultado_ot.insert(tk.END, f"AAOT({paso})={round (AAOT,3)}") self.datos_AAOT.insert(tk.END,round(AAOT,2)) paso+=1 if self.desplegable_ot.get()=="V/AAOT": if self.desplegable.get()=="TODO"or self.desplegable.get()=="PROPIO TAU": AOT=τ*(1-F)+A*F while paso<=m: if paso % 2 == 0: AAOT=((paso)/2)*AOT else: AAOT=((paso+1)/2)*AOT paso+=1 self.datos_AAOT.insert(tk.END,AAOT) AAOT_L=list(self.datos_AAOT.get(0, END)) while i<=m-1: AR=V1[i]/float(AAOT_L[i]) self.resultado_ot.insert(tk.END, f"AR({i+1})={round (AR,3)}") self.datos_AR.insert(tk.END,round(AR,2)) i+=1 A.11 Función: Guardar Resultados El objeto file()permite la creación de un archivo de texto. Para ello es necesario la función open(), ya que no es posible escribir ni leer en un archivo cerrado. def guardar(self): Anexo A: Codificación en Python del programa PM-3E 92 #obtener valores α = float(self.α.get()) β = float(self.β.get()) γ = float(self.γ.get()) μ1 = float(self.μ1.get()) σ1 = float(self.σ1.get()) μ2 = float(self.μ2.get()) σ2 = float(self.σ2.get()) R1 = float(self.R1.get()) R12 = float(self.R12.get()) R13 = float(self.R13.get()) R2 = float(self.R2.get()) R21 = float(self.R21.get()) R3 = float(self.R3.get()) R31 = float(self.R31.get()) pasos = float(self.paso.get()) valor_optimo_info = self.valor_optimo.get() desplegable=self.desplegable.get() desplegable_ot=self.desplegable_ot.get() #crear archivo txt nombrearch=fd.asksaveasfilename(initialdir = "/",title = "Guardar como",filetypes = (("txt files","*.txt"),("todos los archivos","*.*")),defaultextension='*.txt') if nombrearch!='': file=open(nombrearch, "w", encoding="utf-8") file.write("F.Distribución Fallos") file.write("\t") file.write("α:{}; β:{}; γ:{}".format(α, β, γ)) file.write("\t\n") file.write("F.D.Tiempos Reparación") file.write("\t") file.write(" μ1:{}; σ1:{}".format(μ1, σ1)) file.write("\t\n") file.write("F.D.Tiempos Preventivo") file.write("\t") file.write(" μ2:{}; σ2:{}".format(μ2, σ2)) file.write("\t\n") file.write("Retornos Operación") file.write("\t") Función: Guardar Resultados 93 93 file.write("R1:{}; R12:{}; R13:{}".format(R1, R12, R13)) file.write("\t\n") file.write("Retorno Correctivo") file.write("\t") file.write(" R2:{}; R21:{}".format(R2, R21)) file.write("\t\n") file.write("Retorno Preventivo") file.write("\t") file.write(" R3:{}; R31:{}".format(R3, R31)) file.write("\t\n") file.write("\t\n") file.write("NºPasos:{}".format(pasos)) file.write("\t\n") file.write("\t\n") file.write("VALOR ÓPTIMO (h):") file.write(str(valor_optimo_info)) file.write("\t\n") file.write('\n'.join(self.listbox.get(0, END))) file.write("\t\n") file.write("\t\n") file.write("V(€):{}".format(desplegable)) file.write("\t\n") file.write('\n'.join(self.resultado_v.get(0, END))) file.write("\t\n") file.write("\t\n") file.write("Tiempo de Operación:{}".format(desplegable_ot)) file.write("\t\n") file.write('\n'.join(self.resultado_ot.get(0, END))) file.close() Anexo A: Codificación en Python del programa PM-3E 94 A.12 Función: Guardar Gráfico La función savefig() permite guardar figuras creadas como los gráficos. def guardar_graf(self): nombrearch=fd.asksaveasfilename(initialdir = "/",title = "Guardar como",filetypes = (("PNG Image", "*.png"),("todos los archivos","*.*")),defaultextension='.png') self.figure.savefig(nombrearch) A.13 Función: Representación de Resultados def crear_grafico(self): m=int(self.paso.get()) if self.varx.get()=="m": if self.vary.get()=="ty": if self.sel_v.get()=="V1": x=np.arange(1,m+1) if self.sel_v.get()=="V2": x=np.arange(2,m+1) if self.sel_v.get()=="V3": x=np.arange(3,m+1) y=self.listbox2.get(0, END) self.plot.set_title('τ optimum (h)',fontsize=18) self.plot.set_xlabel('Pasos de transición',fontsize=18) self.plot.set_ylabel('τ0 (Horas)',fontsize=18) self.plot.plot(x,y,'o-', label=f'τ0_{self.sel_v.get()}({m})'), self.plot.grid(True) self.plot.legend(loc=4,fontsize=12) if self.varx.get()=="m": if self.vary.get()=="v": if self.desplegable.get()=="PAR": x =np.arange(start=2, stop=m+2, step=2) y=np.array(self.datos_v.get(0, END)) #self.plot.set_title('τ0 (optimum)') self.plot.set_title('{self.sel_v.get()}(€), para transiciones pares',fontsize=18) self.plot.set_xlabel('Pasos de transición par',fontsize=18) self.plot.set_ylabel('{self.sel_v.get()}(€)',fontsize=18) self.plot.plot(x,y,'o-',label=f'{self.sel_v.get()}({m}) par'), self.plot.grid(True) Función: Representación de Resultados 95 95 self.plot.legend(loc=4,fontsize=12) if self.varx.get()=="m": if self.vary.get()=="v": if self.desplegable.get()=="IMPAR" : x =np.arange(start=1, stop=m+1, step=2) y=np.array(self.datos_v.get(0, END)) self.plot.set_title('V(€), para transiciones impares',fontsize=18) self.plot.set_xlabel('Pasos de transición impar',fontsize=18) self.plot.set_ylabel('V(€)',fontsize=18) self.plot.plot(x,y,'o- ',label=f'{self.sel_v.get()}({m})impar'), self.plot.grid(True) self.plot.legend(loc=4,fontsize=12) if self.varx.get()=="m": if self.vary.get()=="v": if self.desplegable.get()=="TODO" : x =np.arange(start=1, stop=m+1) y=np.array(self.datos_v.get(0, END)) #self.plot.set_title('τ0 (optimum)') self.plot.set_title('V(€)',fontsize=18) self.plot.set_xlabel('Pasos de transición',fontsize=18) self.plot.set_ylabel('V(€)',fontsize=18) self.plot.plot(x,y,'o-',label=f'{self.sel_v.get()}({m})'), self.plot.grid(True) self.plot.legend(loc=4,fontsize=12) if self.varx.get()=="m": if self.vary.get()=="AAOT": if self.desplegable_ot.get()=="AAOT": x =np.arange(start=1, stop=m+1) y=list(self.datos_AAOT.get(0, END)) self.plot.set_title('Tiempo de funcionamiento promedio acumulado (h)',fontsize=18) self.plot.set_xlabel('Pasos de transición',fontsize=18) self.plot.set_ylabel('AAOT(h)',fontsize=18) self.plot.plot(x,y,'o-',label=f'AAOT({m})'), self.plot.grid(True) self.plot.legend(loc=4,fontsize=12) Referencias 102 [15] C. Franciosi, B. Iung, S. Miranda y S. Riemma, «Maintenance for sustainability in the industry 4.0 context: a scoping literature review,» IFAC-PapersOnLine, vol. 51, nº 11, pp. 903-908., 2018. [16] A. Sutrisno, I. Gunawan, H. Khorshidi y S. Tangkuman, «A new modified FMEA model for ranking the risk of maintenance waste considering hierarchy of root causes and effects,» Int. J. Qual. Eng. Technol, vol. 5, nº 3-4, pp. 217-237, 2015. [17] J. Liyanage, F. Badurdeen y R. Ratnayake, «Industrial asset maintenance and sustainability performance: economical, environmental, and societal implications.,» Handb. Mainten Manag.Eng, pp. 665-693, 2009. [18] J. Liyanage y F. Badurdeen, «Strategies for integrating maintenance for sustainable manufacturing. In: Engineering Asset Lifecycle Management.,» Springer London, pp. 308-315., 2010. [19] V. Ajukumar y O. Gandhi, « Evaluation of green maintenance initiatives in design and development of mechanical systems using an integrated approach,» J. Clean. Prod, vol. 51, pp. 34-46, 2013. [20] Google Books , «books.google.es,» Principios De Tribología Aplicados En La Ingeniería Mecánica, 2020. [En línea]. Available: https://books.google.es/books?id=XMTEDwAAQBAJ&pg=PA25&lpg=PA25&dq=tribomateriales&source=bl&ots=DNXUOMUUHN&sig=ACfU3U2F2MR0Tg4Xc0tcXBx1dggx1_4yaQ&h l=es&sa=X&ved=2ahUKEwjhkZuRm5_qAhXaD2MBHQf6BmYQ6AEwB3oECAkQAQ#v=onepage &q=tribo-materiales&f=false. [21] J. Souza, J. Sacomano, S. Kyrillos, F. Milreu y F. Paparlado, « The maintenance function in the context of corporate sustainability: a theoreticalanalytical reflexion.,» In: IFIP International Conference on Advances in Production Managemen, 2014. [22] M. Jasiulewicz-Kaczmarek y Dro_zyner, «Social dimension of sustainable developmentesafety and ergonomics in maintenance activities,» de P. In: International Conference on Universal Access in Human- Computer Interaction, Berlin, Heidelberg,, Springer, 2013b, pp. 175-184. [23] V. Ajukumar y O. Gandhi, « Evaluation of green maintenance initiatives in design and development of mechanical systems using an integrated approach,» J. Clean. Prod, vol. 51, pp. 34-46, 2013. [24] G. Waeyenbergh y L. Pintelon, «A framework for maintenance concept development,» International Journal of Production Economics, vol. 77, nº 3, pp. 299-313, 2002. [25] C. Franciosi, A. Voisin, S. Miranda y S. Riemma, «Measuring maintenance impacts on sustainability of manufacturing industries: from a systematic literature review to a framework proposal,» Journal of Cleaner Production, vol. 260, nº 121065, 2020. [26] C. Cassady y E. Kutanoglu, «Integrating preventive maintenance planning and production scheduling for a single machine,» IEEE Transactions on Reliability, vol. 54, nº 2, pp. 304-309, 2005. [27] Crespo Marquez A y S. H. A., «Models for maintenance optimization: a study for repairable systems and finite time periods.,» Reliability Engineering and System Safety, vol. 75, nº 3, p. 367–377, 2002. [28] E. I. Basri, I. H. A. Razak, H. Ab-Samat y S. Kamaruddin, «Preventive maintenance (PM) planning: a review,» Journal of Quality in Maintenance Engineering, vol. 23, nº 2, pp. 114-143, 2017. [29] K. Kobbacy y D. Murthy, Complex system maintenance handbook, London: Springer, 2008. [30] A. Alabdulkarim, P. Ball y A. Tiwari, «Applications of simulation in maintenance research,» World Journal of Modelling and Simulation, vol. 9, nº 1, pp. 14-37, 2013. Cierre de la Aplicación 103 103 [31] H. Rommelfanger, «Fuzzy linear programming and applications,» European Journal of Operational Research, vol. 92, nº 3, pp. 512-527, 1996. [32] C. Romesburg, Cluster Analysis for Researchers, North Carolina: Lulu.com, 2004. [33] Y. Zhao, «On preventive maintenance policy of a critical reliability level for system subject to degradation,» Reliability Engineering and System Safety, vol. 79, nº 3, pp. 301-308, 2003. [34] A. Labib, R. O’Connor y G. Williams, «An effective maintenance system using the analytic hierarchy process,» Integrated Manufacturing Systems, vol. 9, nº 2, pp. 87-98, 1998. [35] Pythonizame.s3.amazonaws, «Pythonizame.s3.amazonaws.com,» 2020. [En línea]. Available: https://pythonizame.s3.amazonaws.com/media/Book/iniciacion-python-3/file/8ba1f99c-7c60-11e5- 964d-04015fb6ba01.pdf. [36] Iaa.csic, «Iaa.csic.es.,» 2020. [En línea]. Available: https://www.iaa.csic.es/python/curso-python-para- principiantes.pdf. [Último acceso: 6 Junio 2020]. [37] Programoergosum., «www.programoergosum.com,» Pi., ¿Qué Es Python? - Curso De Iniciación A La Programación Con Python En Raspberry, 2020. [En línea]. Available: https://www.programoergosum.com/cursos-online/raspberry-pi/244-iniciacion-a-python-en-raspberry- pi/que-es-py,. [Último acceso: 15 junio 2020]. [38] The Best Manuals Online , «the-best-manuals-online.com,» Esquema del sistema hidráulico de camiones fuera de carretera OEM de Caterpillar 777F y 777F, [En línea]. Available: https://the-best-manuals- online.com/es/products/caterpillar-777f-and-777f-oem-off-highway-truck-hydraulic-system-schematic- diagrams. [39] Think Big., «empresas.blogthinkbig.com,» Python Para Todos (3): Scypy, Numpy, Pandas ...¿Qué Librerías Necesitamos? - Think Big Empresas., 2020. [En línea]. Available: https://empresas.blogthinkbig.com/python-todos-3-librerias/. [40] Es.qwe.wiki, «Es.qwe.wiki.com,» Tkinter - Qwe.Wiki., 2020. [En línea]. Available: https://es.qwe.wiki/wiki/Tkinter#Widget. [41] Tkdocs, «tkdocs.com,» TkDocs - Tk Tutorial - Basic Widgets, [En línea]. Available: https://tkdocs.com/tutorial/widgets.html. [42] Dummies, «Dummies.com,» Tkinter Widgets In Python - Dummies, 2020. [En línea]. Available: https://www.dummies.com/programming/python/using-tkinter-widgets-in-python/. [43] Recursospython, «Recursospython.com,» Posicionar elementos en Tkinter, 2020. [En línea]. Available: https://recursospython.com/guias-y-manuales/posicionar-elementos-en-tkinter/. [44] «uniwebsidad.com,» 2.2. Estructuras de Control de Flujo (Python para principiantes), 2020. [En línea]. Available: https://uniwebsidad.com/libros/python/capitulo-2/estructuras-de-control-de-flujo. Referencias 104 11