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); } }
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 == " ") { } }
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); }