Inheritance: System.Windows.Forms.Form
Esempio n. 1
0
        private void button4_Click(object sender, EventArgs e)
        {
            Random r = new Random(DateTime.Now.Millisecond);
            textBox5.Enabled = true;
            textBox5.Text = "";

            double TiempoFuncionandoAcumulado = 0;
            double TiempoParadoAcumulado = 0;
            double t = 0;
            double Disponibilidad;

            double X1 = 0;
            double Y1 = 0;
            double X2 = 0;
            double Y2 = 0;

            //Crear e inicializar la lista que contendrá los puntos de la gráfica
            List<PointF> Datos_a_representar = new List<PointF>();

            try
            {
                //Captura de indicaciones del usuario
                double Tiempo_A_Simular = Convert.ToDouble(textBox10.Text);

                //Captura de datos sobre Ley de Funcionamiento ------------------------------------------------------
                string ley_func = comboBox1.Text;
                double ley_func_param1 = 0;
                double ley_func_param2 = 0;
                double MinimoFuncionando = 0;
                double MaximoFuncionando = 0;

                if (comboBox1.Text == "Exponencial" || comboBox1.Text == "Weibull2P")
                {
                    ley_func_param1 = Convert.ToDouble(textBox1.Text);
                    ley_func_param2 = Convert.ToDouble(textBox2.Text);
                    MinimoFuncionando = Convert.ToDouble(textBox3.Text);
                    MaximoFuncionando = Convert.ToDouble(textBox4.Text);
                }

                if (comboBox1.Text == "Uniforme")
                {
                    MinimoFuncionando = Convert.ToDouble(textBox3.Text);
                    MaximoFuncionando = Convert.ToDouble(textBox4.Text);
                }

                //pregunta que debo poner aqui para que no ejecute
                if (comboBox1.Text == "Ninguna Ley") return;

                //Fin de la captura de datos sobre ley de funcionamiento

                //Captura de datos sobre Ley de Parada ------------------------------------------------------------
                string ley_paro = comboBox2.Text;
                double ley_paro_param1 = 0;
                double ley_paro_param2 = 0;
                double MinimoParado = 0;
                double MaximoParado = 0;

                if (comboBox2.Text == "Exponencial" || comboBox2.Text == "Normal")
                {
                    ley_paro_param1 = Convert.ToDouble(textBox6.Text);
                    ley_paro_param2 = Convert.ToDouble(textBox7.Text);
                    MinimoParado = Convert.ToDouble(textBox8.Text);
                    MaximoParado = Convert.ToDouble(textBox9.Text);
                }

                if (comboBox2.Text == "Weibull2P")
                {
                    ley_paro_param1 = Convert.ToDouble(textBox6.Text);
                    ley_paro_param2 = Convert.ToDouble(textBox7.Text);
                    MinimoParado = Convert.ToDouble(textBox8.Text);
                    MaximoParado = Convert.ToDouble(textBox9.Text);
                }

                if (comboBox2.Text == "Uniforme")
                {
                    MinimoParado = Convert.ToDouble(textBox8.Text);
                    MaximoParado = Convert.ToDouble(textBox9.Text);
                }

                //pregunta que debo poner aqui para que no ejecute
                if (comboBox2.Text == "Ninguna Ley") return;

                //Fin de la captura de datos sobre ley de parada

                //Captura de indicaciones sobre recuperacion ------------------------------------------------------
                string ley_recu = comboBox3.Text;
                double ley_recu_param1 = 0;
                double ley_recu_param2 = 0;
                double MinimoRecup = 0;
                double MaximoRecup = 0;

                if (comboBox3.Text == "Exponencial" || comboBox3.Text == "Weibull2P")
                {
                    ley_recu_param1 = Convert.ToDouble(textBox12.Text);
                    ley_recu_param2 = Convert.ToDouble(textBox13.Text);
                    MinimoRecup = Convert.ToDouble(textBox14.Text);
                    MaximoRecup = Convert.ToDouble(textBox15.Text);
                }

                if (comboBox3.Text == "Línea recta")
                {
                    X1 = Convert.ToDouble(textBox12.Text);
                    Y1 = Convert.ToDouble(textBox13.Text);
                    X2 = Convert.ToDouble(textBox14.Text);
                    Y2 = Convert.ToDouble(textBox15.Text);
                }

                //pregunta que debo poner aqui para que no ejecute
                //if (comboBox3.Text == "Ninguna Ley") return;

                //Fin de la captura de datos sobre recuperacion

                //Captura de indicaciones sobre costes ------------------------------------------------------------
                double CosteMantenimientoHr = 0;
                double CostePerdidaProduccionHr = 0;
                double CosteMantenimietoCadaIntervencion = 0;
                double XX1 = 0;
                double YY1 = 0;
                double XX2 = 0;
                double YY2 = 0;
                string ley_coste = "";
                double CosteEsteMantenimiento = 0;
                double CosteEstaPerdidaDeProduccion = 0;

                if (comboBox4.Text == "Fijo por tiempo")
                {
                    ley_coste = "Fijo por tiempo";
                    CosteMantenimientoHr = Convert.ToDouble(textBox16.Text);
                    CostePerdidaProduccionHr = Convert.ToDouble(textBox17.Text);
                }

                if (comboBox4.Text == "Fijo por intervención")
                {
                    ley_coste = "Fijo por intervención";
                    CosteMantenimietoCadaIntervencion = Convert.ToDouble(textBox16.Text);
                    CostePerdidaProduccionHr = Convert.ToDouble(textBox17.Text);
                }

                if (comboBox4.Text == "Lineal creciente")
                {
                    ley_coste = "Lineal creciente";
                    XX1 = Convert.ToDouble(textBox16.Text);
                    YY1 = Convert.ToDouble(textBox17.Text);
                    XX2 = Convert.ToDouble(textBox18.Text);
                    YY2 = Convert.ToDouble(textBox19.Text);
                    CostePerdidaProduccionHr = Convert.ToDouble(textBox20.Text);
                }

                //Fin de la captura de datos sobre costes

                //Captura de indicaciones sobre estrategia de mantenimiento ---------------------------------------
                //Fin de la captura de datos sobre estrategia de mantenimiento

                //Estimar el tamaño máximo de la barra de seguimiento
                progressBar1.Maximum = Convert.ToInt32((MaximoFuncionando - MinimoFuncionando) / 2 + (MaximoParado - MinimoParado) / 2);
                progressBar1.Value = 0;

                //Borrar el contenido del textbox de salida de resultados
                textBox5.Text = ""; ;

                TiempoFuncionandoAcumulado = 0;
                TiempoParadoAcumulado = 0;
                double TiempoTranscurrido = 0;
                double minimoY = 0;
                double maximoY = 1;
                double TiempoParcialFuncionando;
                double TiempoParcialFallado;
                double PuntoFinalBajadaDisponibilidad = 0;
                double DisponibilidadMinimaAdmisible = 0.0;

                double CosteTotalMantenimiento = 0;
                double CosteTotalPerdidaProduccion = 0;
                double CosteAcumuladoRecuperacion = 0;
                double CosteMedioRecuperacion = 0;

                int ContadorCiclosFuncionaPara = 0;
                double AcumuladorTiemposEntreFallos = 0;
                double ContadorTiempoDisponibilidadPositiva;
                double MTBF = 0;
                double MTTR = 0;
                double IntensidadFallos = 0;
                double TiempoDelCiclo = 0;

                //Aseguramos que los datos introducidos son correctos
                if(ChequeoTextboxCicloFuncionamieontoParada(comboBox1,comboBox2,comboBox3,comboBox4,textBox1,textBox2,textBox3,textBox4
                ,textBox6,textBox7,textBox8,textBox9,textBox12,textBox13,textBox14,textBox15,textBox16,textBox17,textBox18
                ,textBox19,textBox20,textBox10)==0)
                {//Lanzamos la simulación

                //BUCLE QUE REALIZA la SIMULACIÓN
                do
                {
                    //Incrementar el contador de ciclos funciona-para
                    ContadorCiclosFuncionaPara += 1;

                    //Incrementar la barra indicadora
                    progressBar1.Increment(1);

                    //Puntos inicial y final de la subida a funcionamiento
                    Datos_a_representar.Add(new PointF((float)TiempoTranscurrido, (float)minimoY));
                    Datos_a_representar.Add(new PointF((float)TiempoTranscurrido, (float)maximoY));

                    //Generar tiempo funcionando, controlar su validez y acumularlo
                    if (ley_func == "Uniforme") t = GeneradoresDeAleatorios.Generador_Aleatorio_Uniforme(MinimoFuncionando, MaximoFuncionando, r);
                    if (ley_func == "Exponencial") t = GeneradoresDeAleatorios.Generador_Aleatorio_Exponencial(ley_func_param1, 1 / ley_func_param2, MinimoFuncionando, MaximoFuncionando, r);
                    if (ley_func == "Weibull2P") t = GeneradoresDeAleatorios.Generador_Aleatorio_Weibull_2P(ley_func_param1, ley_func_param2, MinimoFuncionando, MaximoFuncionando, r);
                    if (ley_func == "Normal") t = GeneradoresDeAleatorios.Generador_Aleatorio_Normal(ley_func_param1, ley_func_param2, MinimoFuncionando, MaximoFuncionando, r);

                    //bajada de disponibilidad durante el periodo de funcionamiento, solo Exponencial y Weubull tienen sentido
                    //Para las otras leyes se opta por no bajar la disponibilidad
                    if (ley_func == "Exponencial") PuntoFinalBajadaDisponibilidad = Math.Exp(-ley_func_param2 * t) - 1 + maximoY;
                    if (ley_func == "Weibull2P") PuntoFinalBajadaDisponibilidad = Math.Exp(-Math.Pow(t / ley_func_param2, ley_func_param1)) - 1 + maximoY;
                    if (ley_func == "Uniforme" || ley_func == "Normal") PuntoFinalBajadaDisponibilidad = maximoY;

                    //Controlar la validez de t ==> encontrar el t que hace cero la disponibilidad (si procede)
                    ContadorTiempoDisponibilidadPositiva = 0;
                    if (PuntoFinalBajadaDisponibilidad <= DisponibilidadMinimaAdmisible)
                    {
                        double DisponibilidadInstantanea = -1000;
                        for (int j = 1; j <= t; j++)
                        {
                            if (ley_func == "Exponencial") DisponibilidadInstantanea = Math.Exp(-ley_func_param2 * j) - 1 + maximoY;
                            if (ley_func == "Weibull2P") DisponibilidadInstantanea = Math.Exp(-Math.Pow(j / ley_func_param2, ley_func_param1)) - 1 + maximoY;
                            if (DisponibilidadInstantanea <= DisponibilidadMinimaAdmisible) break;
                            ContadorTiempoDisponibilidadPositiva += 1;
                        }
                        PuntoFinalBajadaDisponibilidad = DisponibilidadMinimaAdmisible;
                        t = ContadorTiempoDisponibilidadPositiva;
                    }

                    //Acumular tiempos funcionando
                    TiempoFuncionandoAcumulado += t;
                    TiempoParcialFuncionando = t;

                    //Acumular el tiempo de funcionamiento al tiempo total simulado o "tiempo transcurrido"
                    TiempoTranscurrido += t;

                    //Dibujar puntos intermedios para mejorar el aspecto de la gráfica
                    if (PuntoFinalBajadaDisponibilidad >= 0)
                    {
                        double TiempoIntermedio = 0;
                        double maxY_new = 0;
                        if (ley_func == "Exponencial" || ley_func == "Weibull2P")
                        {
                            for (int j = 1; j <= 9; j++)
                            {
                                //TiempoIntermedio = (TiempoTranscurrido - t) + j * (t / 10);
                                TiempoIntermedio = j * (t / 10);

                                if (ley_func == "Exponencial") maxY_new = Math.Exp(-ley_func_param2 * TiempoIntermedio) - 1 + maximoY;
                                if (ley_func == "Weibull2P") maxY_new = Math.Exp(-Math.Pow(TiempoIntermedio / ley_func_param2, ley_func_param1)) - 1 + maximoY;
                                Datos_a_representar.Add(new PointF((float)(TiempoTranscurrido - t + TiempoIntermedio), (float)maxY_new));
                            }
                        }
                    }
                    //Dibujar Punto final de la bajada de Disponibilidad (inicial de la bajada al fallo) (depende de la lay de Confiabilidad y no del maximoY)
                    Datos_a_representar.Add(new PointF((float)TiempoTranscurrido, (float)PuntoFinalBajadaDisponibilidad));

                    //Punto final de la bajada a fallo
                    Datos_a_representar.Add(new PointF((float)TiempoTranscurrido, (float)minimoY));

                    //Generar tiempo parado y acumularlo
                    if (ley_paro == "Uniforme") t = GeneradoresDeAleatorios.Generador_Aleatorio_Uniforme(MinimoParado, MaximoParado, r);
                    if (ley_paro == "Exponencial") t = GeneradoresDeAleatorios.Generador_Aleatorio_Exponencial(ley_paro_param1, 1 / ley_paro_param2, MinimoParado, MaximoParado, r);
                    if (ley_paro == "Weibull2P") t = GeneradoresDeAleatorios.Generador_Aleatorio_Weibull_2P(ley_paro_param1, ley_paro_param2, MinimoParado, MaximoParado, r);
                    if (ley_paro == "Normal") t = GeneradoresDeAleatorios.Generador_Aleatorio_Normal(ley_paro_param1, ley_paro_param2, MinimoParado, MaximoParado, r);
                    TiempoParadoAcumulado += t;
                    TiempoParcialFallado = t;

                    //Actualizacion del tiempo
                    TiempoTranscurrido += t;

                    //Calcular el tiempo del ciclo (tiempo que dura el ciclo)
                    TiempoDelCiclo = TiempoParcialFallado + TiempoParcialFuncionando;

                    //Establecer el valor de la máxima recuperacion posible dado por la Ley de Recuperación
                    if (ley_recu == "Siempre a Nuevo (GAN)" || ley_recu == "Ninguna Ley") maximoY = 1;
                    if (ley_recu == "Según tiempo (BAO)" && ley_func == "Exponencial") maximoY = Math.Exp(-ley_func_param2 * (TiempoTranscurrido - ley_func_param1));
                    if (ley_recu == "Según tiempo (BAO)" && ley_func == "Weibull2P") maximoY = Math.Exp(-Math.Pow(TiempoTranscurrido / ley_func_param2, ley_func_param1));
                    if (ley_recu == "Exponencial") maximoY = Math.Exp(-ley_recu_param2 * (TiempoTranscurrido - ley_recu_param1));
                    if (ley_recu == "Weibull2P") maximoY = Math.Exp(-Math.Pow(TiempoTranscurrido / ley_recu_param2, ley_recu_param1));
                    if (ley_recu == "Línea recta") maximoY = Y1 + (Y2 - Y1) * (TiempoTranscurrido - X1) / (X2 - X1);
                    if(maximoY > 1 )maximoY = 1;

                    //Romper si la recuperacion maxima es menor o igual que la DisponibilidadMinimaAdmisible
                    //if (maximoY <= DisponibilidadMinimaAdmisible) break;

                    //Generar los costes de la recuperacion y de pérdida de producción
                    if (ley_coste == "Fijo por tiempo")
                    {
                        CosteEsteMantenimiento = CosteMantenimientoHr * t;
                        CosteEstaPerdidaDeProduccion = CostePerdidaProduccionHr * t;
                    }

                    if (ley_coste == "Fijo por intervención")
                    {
                        CosteEsteMantenimiento = CosteMantenimietoCadaIntervencion;
                        CosteEstaPerdidaDeProduccion = CostePerdidaProduccionHr * t;
                    }

                    if (ley_coste == "Lineal creciente")
                    {
                        CosteEsteMantenimiento = (YY1 + (YY2 - YY1) * (TiempoTranscurrido - XX1) / (XX2 - XX1)) * t;
                        CosteEstaPerdidaDeProduccion = CostePerdidaProduccionHr * t;
                    }

                    //Acumular costes derivados del paro/fallo
                    CosteTotalMantenimiento += CosteEsteMantenimiento;
                    CosteTotalPerdidaProduccion += CosteEstaPerdidaDeProduccion;

                    //CALCULO DE INDICADORES (SACAR A GRAFICAS TODOS LOS INDICADORES)
                    //---------------------------------------------------------------

                    //Calcular Disponibilidad
                    Disponibilidad = TiempoFuncionandoAcumulado / (TiempoFuncionandoAcumulado + TiempoParadoAcumulado);

                    //Indicador Tiempo Medio Entre Fallos (MTBF)
                    AcumuladorTiemposEntreFallos += TiempoParcialFallado + TiempoParcialFuncionando;
                    MTBF = AcumuladorTiemposEntreFallos / ContadorCiclosFuncionaPara;

                    //Indicador Tiempo Medio de Reparacion (MTTR)
                    MTTR = TiempoParadoAcumulado / ContadorCiclosFuncionaPara;

                    //Indicador Intensidad de Fallos (IntensidadFallos)
                    IntensidadFallos = ContadorCiclosFuncionaPara / TiempoTranscurrido;

                    //Indicador Coste Acumulado de Recuperacion (Mto+Perdida de produccion)
                    CosteAcumuladoRecuperacion = CosteTotalMantenimiento + CosteTotalPerdidaProduccion;

                    //Indicador Coste Medio de Recuperacion (CosteMedioRecuperacion)
                    CosteMedioRecuperacion = (CosteEsteMantenimiento + CosteEstaPerdidaDeProduccion) / ContadorCiclosFuncionaPara;

                    //FIN DEL CALCULO DE INDICADORES
                    //-------------------------------

                    //Presentar los resultados numéricos en el TextBox de pantalla
                    textBox5.Text += " Ciclo número: " + ContadorCiclosFuncionaPara.ToString("0.") + "\r\n";
                    textBox5.Text += " ---------------------------------------------------------------------------------------------------------------------------------------------------" + "\r\n";
                    textBox5.Text += " t funcionando este ciclo = " + TiempoParcialFuncionando.ToString("0.##") + "      t parado este ciclo = " + TiempoParcialFallado.ToString("0.##") + "      t del ciclo = " + TiempoDelCiclo.ToString("0.##") + "\r\n";
                    textBox5.Text += " Tiempo Medio Entre Fallos (MTBF)= " + MTBF.ToString("0.##") + "\r\n";
                    textBox5.Text += " Tiempo total simulado = " + TiempoTranscurrido.ToString("0.##") + "       Tiempo total funcionando =  " + TiempoFuncionandoAcumulado.ToString("0.##") + "\r\n";
                    textBox5.Text += " Disponibilidad Maxima Alcanzada en el Ciclo = " + maximoY.ToString("0.######") + "\r\n";
                    textBox5.Text += " Disponibilidad Operacional= " + Disponibilidad.ToString("0.######") + "\r\n";
                    textBox5.Text += " Intensidad de Fallos = " + IntensidadFallos.ToString("0.##########") + "\r\n";
                    textBox5.Text += " Coste Mto este ciclo = " + CosteEsteMantenimiento.ToString("0.##") + "     Coste Perdida de producción este ciclo = " + CosteEstaPerdidaDeProduccion.ToString("0.##") + "\r\n";
                    textBox5.Text += " Coste acumulado Recuperación (Mto+PérdidaProd) = " + CosteAcumuladoRecuperacion.ToString("0.##") + "\r\n";
                    textBox5.Text += " Coste Medio de Recuperacion = " + CosteMedioRecuperacion.ToString("0.##") + "\r\n";
                    textBox5.Text += " Tiempo Medio de Reparacion (MTTR) = " + MTTR.ToString("0.##") + "\r\n";
                    textBox5.Text += "  " + "\r\n";
                    textBox5.Text += "  " + "\r\n";

                } while (TiempoFuncionandoAcumulado + TiempoParadoAcumulado <= Tiempo_A_Simular);

                //Terminar de rellanar la barra de progreso de los calculos
                progressBar1.Value = progressBar1.Maximum;

                //linea = Formato(t,4,12) +" ";
                //linea = string.Format("{0,15}", t.ToString("F4")) + " ";
                //linea += string.Format("{0,15}", t.ToString("F4")) + " ";
                //linea += TiempoFuncionandoAcumulado.ToString("F4") + " ";
                //linea += string.Format("{0,15}", TiempoFuncionandoAcumulado.ToString("F4")) + " ";
                //linea += Convert.ToString(TiempoParadoAcumulado) + " ";
                //linea += string.Format("{0,15}", TiempoParadoAcumulado.ToString("F4")) + " ";
                //linea += Convert.ToString(TiempoFuncionandoAcumulado + TiempoParadoAcumulado)+ " ";
                //linea += string.Format("{0,15}", (TiempoFuncionandoAcumulado + TiempoParadoAcumulado).ToString("F4")) + " ";

                //Lanzar formulario flotante con la gráfica
                Form4 frm = new Form4();
                frm.Datos_a_dibujar = Datos_a_representar;
                frm.rotulo_eje_x = "tiempo de simulacion";
                frm.rotulo_eje_y = "Disponibilidad Operacional";
                frm.rotulo_primer_dato = "Disponibilidad";
                frm.primer_dato = Disponibilidad;
                frm.rotulo_segundo_dato = "Coste";
                frm.segundo_dato = CosteTotalMantenimiento + CosteTotalPerdidaProduccion;
                frm.Show();

            }//del if
            }
            catch
            {
                MessageBox.Show("Se ha producido un error en los datos de entrada", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Esempio n. 2
0
        private void comboBox7_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox7.Text == "Disponibilidad")
            {
                //Gráfica de Disponibilidad
                if (Lista_Disponibilidad.Count()>1)
                {
                Form4 frm1 = new Form4();
                frm1.Datos_a_dibujar = Lista_Disponibilidad;
                frm1.Text = "SIM: Evolución de la Disponibilidad Operacional";
                frm1.rotulo_eje_x = "tiempo de simulacion";
                frm1.rotulo_eje_y = "Disponibilidad Operacional";
                frm1.rotulo_primer_dato = "Disponibilidad Operacional";
                frm1.primer_dato = resultados["Disponibilidad"];
                frm1.rotulo_segundo_dato = "";
                frm1.segundo_dato = 0;
                frm1.Show();
                }
            }

            if (comboBox7.Text == "MTBF")
            {
                //Gráfica del MTBF
                if (Lista_MTBF.Count() > 1)
                {
                    Form4 frm2 = new Form4();
                    frm2.Datos_a_dibujar = Lista_MTBF;
                    frm2.Text = "SIM: Evolución del Tiempo Medio Entre Fallos (MTBF)";
                    frm2.rotulo_eje_x = "tiempo de simulacion";
                    frm2.rotulo_eje_y = "MTBF";
                    frm2.rotulo_primer_dato = "Tiempo Medio Entre Fallos";
                    frm2.primer_dato = resultados["MTBF"];
                    frm2.rotulo_segundo_dato = "";
                    frm2.segundo_dato = 0;
                    frm2.Show();
                }
            }

            if (comboBox7.Text == "Número de Fallos")
            {
                //Gráfica del Número de Fallos
                if (Lista_Numero_de_Fallos.Count() > 1)
                {
                    Form4 frm2 = new Form4();
                    frm2.Datos_a_dibujar = Lista_Numero_de_Fallos;
                    frm2.Text = "SIM: Evolución del Número de Fallos";
                    frm2.rotulo_eje_x = "tiempo de simulacion";
                    frm2.rotulo_eje_y = "Nº de Fallos";
                    frm2.rotulo_primer_dato = "Número de Fallos";
                    frm2.primer_dato = resultados["Numero_de_Fallos"];
                    frm2.rotulo_segundo_dato = "";
                    frm2.segundo_dato = 0;
                    frm2.Show();
                }
            }

            if (comboBox7.Text == "Número de Preventivos")
            {
                //Gráfica del Número de Preventivos
                if (Lista_Numero_de_Preventivos.Count() > 1)
                {
                    Form4 frm2 = new Form4();
                    frm2.Datos_a_dibujar = Lista_Numero_de_Preventivos;
                    frm2.Text = "SIM: Evolución del Número de Mantenimientos Preventivos";
                    frm2.rotulo_eje_x = "tiempo de simulacion";
                    frm2.rotulo_eje_y = "Nº de Preventivos";
                    frm2.rotulo_primer_dato = "Número de Preventivos";
                    frm2.primer_dato = resultados["Numero_de_Preventivos"];
                    frm2.rotulo_segundo_dato = "";
                    frm2.segundo_dato = 0;
                    frm2.Show();
                }
            }

            if (comboBox7.Text == "MTTR")
            {
                //Gráfica del MTTR
                if (Lista_MTTR.Count() > 1)
                {
                    Form4 frm3 = new Form4();
                    frm3.Datos_a_dibujar = Lista_MTTR;
                    frm3.Text = "SIM: Evolución del Tiempo Medio de Recuperación/Reparación (MTTR)";
                    frm3.rotulo_eje_x = "tiempo de simulacion";
                    frm3.rotulo_eje_y = "MTTR";
                    frm3.rotulo_primer_dato = "Tiempo Medio Recuperación";
                    frm3.primer_dato = resultados["MTTR"];
                    frm3.rotulo_segundo_dato = "";
                    frm3.segundo_dato = 0;
                    frm3.Show();
                }
            }

            if (comboBox7.Text == "MTTR sin logística")
            {
                //Gráfica de Disponibilidad
                if (Lista_MTTR_SinLog.Count() > 1)
                {
                    Form4 frm1 = new Form4();
                    frm1.Datos_a_dibujar = Lista_MTTR_SinLog;
                    frm1.Text = "SIM: Evolución del MTTR sin tiempos de Logística";
                    frm1.rotulo_eje_x = "tiempo de simulacion";
                    frm1.rotulo_eje_y = "MTTR sin logística";
                    frm1.rotulo_primer_dato = "MTTR sin logística";
                    frm1.primer_dato = resultados["MTTR_SinLog"];
                    frm1.rotulo_segundo_dato = "";
                    frm1.segundo_dato = 0;
                    frm1.Show();
                }
            }

            if (comboBox7.Text == "Ratio MTTR/MTTR_sinlog")
            {
                //Gráfica de Disponibilidad
                if (Lista_RatioMTTR_vs_MTTR_SinLog.Count() > 1)
                {
                    Form4 frm1 = new Form4();
                    frm1.Datos_a_dibujar = Lista_RatioMTTR_vs_MTTR_SinLog;
                    frm1.Text = "SIM: Evolución del ratio MTTR/MTTR_sinlog";
                    frm1.rotulo_eje_x = "tiempo de simulacion";
                    frm1.rotulo_eje_y = "MTTR/MTTR_sinlog";
                    frm1.rotulo_primer_dato = "ratio MTTR/MTTR_sinlog";
                    frm1.primer_dato = resultados["ratio MTTR/MTTR_sinlog"];
                    frm1.rotulo_segundo_dato = "";
                    frm1.segundo_dato = 0;
                    frm1.Show();
                }
            }

            if (comboBox7.Text == "Intensidad de Fallos")
            {
                //Grafica de la Intensidad de Fallos
                if (Lista_IntensidadFallos.Count() > 1)
                {
                    Form4 frm4 = new Form4();
                    frm4.Datos_a_dibujar = Lista_IntensidadFallos;
                    frm4.Text = "SIM: Evolución de la Intensidad de Fallos";
                    frm4.rotulo_eje_x = "tiempo de simulacion";
                    frm4.rotulo_eje_y = "Intensidad de Fallos";
                    frm4.rotulo_primer_dato = "Intensidad de Fallos";
                    frm4.primer_dato = resultados["IntensidadFallos"];
                    frm4.rotulo_segundo_dato = "";
                    frm4.segundo_dato = 0;
                    frm4.Show();
                }

            }

            if (comboBox7.Text == "Ratio t_Correctivo/t_total_Mto")
            {
                if (Lista_RatioCorrectivo_vs_total.Count() > 1)
                {
                    Form4 frm5 = new Form4();
                    frm5.Datos_a_dibujar = Lista_RatioCorrectivo_vs_total;
                    frm5.Text = "SIM: Ratio Tiempo_en_Correctivo/Tiempo_Total_Mto";
                    frm5.rotulo_eje_x = "tiempo de simulacion";
                    frm5.rotulo_eje_y = "t_Corr/t_total";
                    frm5.rotulo_primer_dato = "Ratio t_Correctivo/t_Total_Mto";
                    frm5.primer_dato = resultados["Ratio t_Correctivo/t_Total_Mto"];
                    frm5.rotulo_segundo_dato = "";
                    frm5.segundo_dato = 0;
                    frm5.Show();
                }
            }

            if (comboBox7.Text == "Ratio t_Preventivo/t_total_Mto")
            {
                //Modificar variables para Coste Acumulado de Recuperacion
                if (Lista_RatioPreventivo_vs_total.Count() > 1)
                {
                    Form4 frm5 = new Form4();
                    frm5.Datos_a_dibujar = Lista_RatioPreventivo_vs_total;
                    frm5.Text = "SIM: Ratio Tiempo_en_Preventivo/Tiempo_Total_Mto";
                    frm5.rotulo_eje_x = "tiempo de simulacion";
                    frm5.rotulo_eje_y = "t_Prev/t_total";
                    frm5.rotulo_primer_dato = "Ratio t_Preventivo/t_Total_Mto";
                    frm5.primer_dato = resultados["Ratio t_Preventivo/t_Total_Mto"];
                    frm5.rotulo_segundo_dato = "";
                    frm5.segundo_dato = 0;
                    frm5.Show();
                }
            }

            if (comboBox7.Text == "Coste Acumulado Rec/Rep")
            {
                //Modificar variables para Coste Acumulado de Recuperacion
                if (Lista_CosteAcumuladoRecuperacion.Count() > 1)
                {
                    Form4 frm5 = new Form4();
                    frm5.Datos_a_dibujar = Lista_CosteAcumuladoRecuperacion;
                    frm5.Text = "SIM: Evolución del Coste Acumulado de Recuparación/Reparación (Mto+Perdida de produccion)";
                    frm5.rotulo_eje_x = "tiempo de simulacion";
                    frm5.rotulo_eje_y = "Coste Acumulado de Recuperacion (Mto+Perdida de produccion)";
                    frm5.rotulo_primer_dato = "Coste Total de Recuperación";
                    frm5.primer_dato = resultados["CosteTotalMantenimiento"] + resultados["CosteTotalPerdidaProduccion"];
                    frm5.rotulo_segundo_dato = "";
                    frm5.segundo_dato = 0;
                    frm5.Show();
                }
            }

            if (comboBox7.Text == "Coste Medio de Recuperacion")
            {
                //Modificar variables para Coste Medio de Recuperacion
                if (Lista_CosteMedioRecuperacion.Count() > 1)
                {
                    Form4 frm6 = new Form4();
                    frm6.Datos_a_dibujar = Lista_CosteMedioRecuperacion;
                    frm6.rotulo_eje_x = "tiempo de simulacion";
                    frm6.rotulo_eje_y = "Coste Medio de Recuperacion";
                    frm6.rotulo_primer_dato = "Coste Medio de Recuperacion";
                    frm6.primer_dato = resultados["Coste Medio de Recuperacion"];
                    frm6.rotulo_segundo_dato = "";
                    frm6.segundo_dato = 0;
                    frm6.Show();
                }
            }

            if (comboBox7.Text == "     ")
            {

            }
        }
Esempio n. 3
0
        private void button1_Click(object sender, EventArgs e)
        {
            double X, Y;
            Random r = new Random(DateTime.Now.Millisecond);

            double TiempoFuncionandoAcumulado = 0;
            double TiempoParadoAcumulado = 0;
            double t;
            double Disponibilidad;
            double Disponibilidad_Media = 0;
            double Disponibilidad_Acumulada = 0;
            textBox3.Text = "";

            List<PointF> Datos_a_representar = new List<PointF>();

            try
            {
            //Captura de indicaciones del usuario
            double Tiempo_A_Simular = Convert.ToDouble(textBox1.Text);
            int numero_repeticiones = Convert.ToInt16(textBox2.Text);
            double MinimoFuncionando = Convert.ToDouble(textBox7.Text);
            double MaximoFuncionando = Convert.ToDouble(textBox6.Text);
            double MinimoParado = Convert.ToDouble(textBox5.Text);
            double MaximoParado = Convert.ToDouble(textBox4.Text);
            double Disponibilidad_Minima_Encontrada = 1;
            double Disponibilidad_Maxima_Encontrada = 0;

               // Comprobamos que el usuario introduce correctamente los valores maximos y minimos
              if (((MaximoFuncionando - MinimoFuncionando) < 0) || ((MaximoParado - MinimoParado) < 0))
               {
                   MessageBox.Show("Valores maximos y minimos erroneos", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
               }
              else if (((MaximoFuncionando > Tiempo_A_Simular) || (MinimoFuncionando > Tiempo_A_Simular)))
              {
                  MessageBox.Show("Valor del tiempo de funcionamiento mayor al tiempo a simular", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
              }
              else if (((MaximoParado > Tiempo_A_Simular) || (MinimoParado > Tiempo_A_Simular)))
              {
                  MessageBox.Show("Valor del tiempo de parada mayor al tiempo a simular", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
              }
              else if (Tiempo_A_Simular > 31536000)
              {
                  MessageBox.Show("Valor del tiempo a simular elevado", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
              }
               else//lanzamos la simulacion
               {

            //Indicar el tamaño máximo de la barra de seguimiento
            progressBar1.Maximum = numero_repeticiones;
            progressBar1.Value = 0;

            //Limpiar la gráfica
            chart1.Series.Clear();

            // Enable range selection and zooming end user interface
            chart1.ChartAreas["ChartArea1"].CursorX.IsUserEnabled = true;
            chart1.ChartAreas["ChartArea1"].CursorX.IsUserSelectionEnabled = true;
            chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true;
            chart1.ChartAreas["ChartArea1"].AxisX.ScrollBar.IsPositionedInside = true;
            chart1.ChartAreas["ChartArea1"].CursorY.IsUserEnabled = true;
            chart1.ChartAreas["ChartArea1"].CursorY.IsUserSelectionEnabled = true;
            chart1.ChartAreas["ChartArea1"].AxisY.ScaleView.Zoomable = true;
            chart1.ChartAreas["ChartArea1"].AxisY.ScrollBar.IsPositionedInside = true;

            //Poner rótulos apropiados en los ejes de la gráfica
            chart1.ChartAreas["ChartArea1"].AxisX.Title = "Tiempo";
            chart1.ChartAreas["ChartArea1"].AxisY.Title = "Disponibilidad";

            //Poner los valores máximo, mínimo y redondeo a los valores del eje X
            chart1.ChartAreas["ChartArea1"].AxisX.Minimum = 0;
            chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Tiempo_A_Simular;
            chart1.ChartAreas["ChartArea1"].AxisX.RoundAxisValues();
            chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Format="F3";

            //Poner redondeo a los valores del eje Y
            chart1.ChartAreas["ChartArea1"].AxisY.RoundAxisValues();
            chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Format = "F3";

            //Crear fichero de resultados
            System.IO.StreamWriter archivo = new System.IO.StreamWriter("leccion2.txt");
            string linea;

            //BUCLE QUE REALIZA LAS REPETICIONES DE LAS SIMULACIONES
            for (int i = 1; i <= numero_repeticiones; i++)
            {

                TiempoFuncionandoAcumulado = 0;
                TiempoParadoAcumulado = 0;

                linea = "SIMULACION NUMERO : " + Convert.ToString(i);
                archivo.WriteLine(linea);
                linea = "-------------------------------- ";
                archivo.WriteLine(linea);
                linea = "t_funcionando      t_parado        t_total_func       t_total_parado       t_total       Disponibilidad ";
                archivo.WriteLine(linea);

                chart1.Series.Add("Series" + Convert.ToString(i));
                chart1.Series["Series" + Convert.ToString(i)].ChartType = SeriesChartType.Line;

                //BUCLE QUE REALIZA CADA SIMULACIÓN
                do
                {
                    //Generar tiempo funcionando y acumularlo
                    t = GeneradoresDeAleatorios.Generador_Aleatorio_Uniforme(MinimoFuncionando, MaximoFuncionando, r);
                    //linea = Formato(t,4,12) +" ";
                    linea = string.Format("{0,15}", t.ToString("F4")) + " ";
                    TiempoFuncionandoAcumulado += t;

                    //Generar tiempo parado y acumularlo
                    t = GeneradoresDeAleatorios.Generador_Aleatorio_Uniforme(MinimoParado, MaximoParado, r);
                    linea += string.Format("{0,15}", t.ToString("F4")) + " ";
                    TiempoParadoAcumulado += t;

                    //guardar tiempos acumulados tambien
                    //linea += TiempoFuncionandoAcumulado.ToString("F4") + " ";
                    linea += string.Format("{0,15}", TiempoFuncionandoAcumulado.ToString("F4")) + " ";
                    //linea += Convert.ToString(TiempoParadoAcumulado) + " ";
                    linea += string.Format("{0,15}", TiempoParadoAcumulado.ToString("F4")) + " ";

                    //Calcular Disponibilidad
                    Disponibilidad = TiempoFuncionandoAcumulado / (TiempoFuncionandoAcumulado + TiempoParadoAcumulado);
                    //linea += Convert.ToString(TiempoFuncionandoAcumulado + TiempoParadoAcumulado)+ " ";
                    linea += string.Format("{0,15}", (TiempoFuncionandoAcumulado + TiempoParadoAcumulado).ToString("F4")) + " ";

                    //Escribir los cálculos en archivo
                    //linea += Convert.ToString(Disponibilidad);
                    linea += string.Format("{0,15}", Disponibilidad.ToString("F4")) + " ";
                    archivo.WriteLine(linea);

                    //Incluir en gráfica de la simulacion
                    X = TiempoFuncionandoAcumulado + TiempoParadoAcumulado;
                    Y = Disponibilidad;
                    chart1.Series["Series" + Convert.ToString(i)].Points.AddXY(X, Y);

                    if (i == 1)
                    {
                        //Añadir a la lista de datos la nueva pareja de valores
                        Datos_a_representar.Add(new PointF((float)X, (float)Y));
                    }

                    //Almacenar las Disponibilidades mínima y máxima encontradas para construir la gráfica correctamente
                    if (Disponibilidad < Disponibilidad_Minima_Encontrada) Disponibilidad_Minima_Encontrada = Disponibilidad;
                    if (Disponibilidad > Disponibilidad_Maxima_Encontrada) Disponibilidad_Maxima_Encontrada = Disponibilidad;

                } while (TiempoFuncionandoAcumulado + TiempoParadoAcumulado <= Tiempo_A_Simular);

                //Actualizar valores máximo y mínimo de la Disponibilidad en el eje Y de la gráfica
                chart1.ChartAreas["ChartArea1"].AxisY.Minimum = Disponibilidad_Minima_Encontrada;
                chart1.ChartAreas["ChartArea1"].AxisY.Maximum = Disponibilidad_Maxima_Encontrada;

                //Calcular la disponibilidad media según avanzan las repeticiones
                Disponibilidad_Acumulada += Disponibilidad;
                Disponibilidad_Media = Disponibilidad_Acumulada / i;

                //Presentar los resultados numéricos en el TextBox de pantalla
                textBox3.Text += Convert.ToString(i) + ", Disponibilidad Operacional media= " + Convert.ToString(Disponibilidad_Media)+"\r\n";

                //Incrementar la barra indicadora
                progressBar1.Increment(1);

                //Escribir los cálculos en archivo
                //linea = "Disponibilidad Operacional media= " + Convert.ToString(Disponibilidad_Media);
                linea = "Disponibilidad Operacional media= " + string.Format("{0,15}", Disponibilidad_Media.ToString("F4")) + " "; ;
                archivo.WriteLine(linea);
                linea = "                                ";
                archivo.WriteLine(linea);

            }

            //Cerrar archivo de resultados
            archivo.Close();

            Form4 frm = new Form4();
            frm.Datos_a_dibujar = Datos_a_representar;
            frm.rotulo_eje_x = "tiempo de simulacion";
            frm.rotulo_eje_y = "Disponibilidad operacional media";
            frm.rotulo_primer_dato = "Disponibilidad Operacional";
            frm.primer_dato = Disponibilidad_Media;
            frm.Show();

               }
            }
            catch
            {
                MessageBox.Show("Se ha producido un error en los datos de entrada", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //evento que muestra informacion de la recta al pasar por encima el raton
            this.chart1.GetToolTipText += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs>(ChartControlGraph.Chart1_GetToolTipText);
        }