Exemplo n.º 1
0
        private void AsignarTareaEjecucion(List <SP_BarquillaBuscarInformacionEnSeccion_Result> infoBarquillaSeccion, Maquinas maquina, string codigoEtiqueta)
        {
            if (infoBarquillaSeccion.Any())
            {
                BusEventos.TareasCargando();
                var idsOrden         = infoBarquillaSeccion.Select(x => x.IdOrden);
                var idsOrdenDistinto = idsOrden.Distinct();
                if (idsOrden.Count() != idsOrdenDistinto.Count())
                {
                    // multiOperacion
                    BusEventos.TareasCargadas();
                }
                else
                {
                    var idsTareas = infoBarquillaSeccion.Select(x => x.IdTarea.Value).Distinct().ToList();

                    var control = BuscarControl(infoBarquillaSeccion.First().IdOperacion, maquina);

                    // bd
                    BackgroundWorker            bwActualizarCola = new BackgroundWorker();
                    List <MaquinasColasTrabajo> cola             = new List <MaquinasColasTrabajo>();
                    bwActualizarCola.DoWork += (se, ev) =>
                    {
                        cola = Insert.ActualizarColaTrabajo(codigoEtiqueta, idsTareas, infoBarquillaSeccion.First().Agrupacion ?? 0, maquina.ID, Store.OperarioEjecucion.Id, infoBarquillaSeccion.Sum(x => x.Cantidad), infoBarquillaSeccion.First().Talla);
                    };
                    bwActualizarCola.RunWorkerCompleted += (se, ev) =>
                    {
                        maquina.AsignarColaTrabajo(cola);
                        BusEventos.TareasCargadas();
                    };
                    bwActualizarCola.RunWorkerAsync();

                    // mqtt
                    MqttAsociarBarquilla(infoBarquillaSeccion, maquina);
                }
            }
        }
        private void TimerEventoFichaje_Tick(object sender, EventArgs e)
        {
            FichajeAsociacionEventArgs evento = null;

            try
            {
                if (colaEventosFichaje.Count == 0)
                {
                    return;
                }
                evento = colaEventosFichaje.Dequeue();
                if (evento != null)
                {
                    //asociar
                    Maquinas maquina = null;
                    foreach (var pantalla in this.paginasModulos)
                    {
                        foreach (var m in pantalla.Maquinas)
                        {
                            if (m.CodigoEtiqueta == evento.CodigoMaquina)
                            {
                                maquina = m;
                                break;
                            }
                        }
                    }
                    if (maquina != null)
                    {
                        var infoBarquillaSeccion = daoTarea.BuscarInformacionBarquilla(evento.CodigoBarquilla, maquina.CodSeccion);
                        if (infoBarquillaSeccion.Any())
                        {
                            // check por si hay fallo de barquilla duplicada
                            var agrupacion      = infoBarquillaSeccion.First().Agrupacion;
                            var idOrden         = infoBarquillaSeccion.First().IdOrden;
                            var codigoBarquilla = infoBarquillaSeccion.First().CodigoEtiqueta;
                            if (!infoBarquillaSeccion.All(x => x.Agrupacion == agrupacion && x.CodigoEtiqueta == codigoBarquilla))
                            {
                                infoBarquillaSeccion.RemoveAll(x => x.Agrupacion != agrupacion || x.CodigoEtiqueta != codigoBarquilla);
                            }
                            // fin check

                            var idsOrden         = infoBarquillaSeccion.Select(x => x.IdOrden);
                            var idsOrdenDistinto = idsOrden.Distinct();
                            if (idsOrden.Count() != idsOrdenDistinto.Count())
                            {
                                // multiOperacion
                            }
                            else
                            {
                                var idsTareas = infoBarquillaSeccion.Select(x => x.IdTarea.Value).Distinct().ToList();

                                evento.Control = daoTarea.BuscarControlGuardado(infoBarquillaSeccion.First().IdOperacion, maquina.IdTipo ?? 0);

                                // bd
                                BackgroundWorker            bwActualizarCola = new BackgroundWorker();
                                List <MaquinasColasTrabajo> cola             = new List <MaquinasColasTrabajo>();
                                bwActualizarCola.DoWork += (se, ev) =>
                                {
                                    cola = daoPuesto.ActualizarColaTrabajo(evento.CodigoBarquilla, idsTareas, infoBarquillaSeccion.First().Agrupacion ?? 0, maquina.ID, maquina.OperarioACargo.Id, infoBarquillaSeccion.Sum(x => x.Cantidad));
                                    Dictionary <int, int> idOrdenesOperaciones = new Dictionary <int, int>();
                                    foreach (var info in infoBarquillaSeccion)
                                    {
                                        idOrdenesOperaciones.Add(info.IdOrden, info.IdOperacion);
                                    }
                                    daoBarquilla.Ubicar(idOrdenesOperaciones, maquina.CodSeccion, evento.CodigoBarquilla, maquina.CodUbicacion);
                                };
                                bwActualizarCola.RunWorkerCompleted += (se, ev) =>
                                {
                                    maquina.AsignarColaTrabajo(cola);
                                };
                                bwActualizarCola.RunWorkerAsync();

                                // mqtt
                                MqttAsociarBarquilla(infoBarquillaSeccion, maquina);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                colaEventosFichaje.Enqueue(evento);
                new Log().Escribir(ex);
            }
        }
        private void Normal(string msg, string topicRecibido, Topic topic)
        {
            try
            {
                // recibo consumo
                ConsumoPrensa consumo = JsonConvert.DeserializeObject <ConsumoPrensa>(msg);

                if (consumo == null)
                {
                    Log.Write(new Exception("Consumo recibido nulo " + msg));
                    return;
                }

                string tipoBancada = topicRecibido.Split('/')[topic.IndiceTipoBancada].Trim();
                string ipPlc       = topicRecibido.Split('/')[topic.IndiceIdTopic].Trim();
                consumo.IpPlc = ipPlc;


                // busco la maquina
                Maquinas maquina = Store.Bancada.Maquinas.FirstOrDefault(x => x.IpAutomata == ipPlc && x.Posicion == consumo.Prensa);

                // si encuentro la maquina
                if (maquina != null)
                {
                    // si la maquina no esta en modo normal
                    if (maquina.Modo != ModoMaquina.Normal)
                    {
                        // la pongo en modo normal
                        maquina.CambiarModo(ModoMaquina.Normal);
                    }

                    // si hay operario loggeado
                    if (SesionManager.Sesion.Operario != null)
                    {
                        // pongo en marcha si no estaba la visibilidad del cuadrante de prima
                        Dispatcher.Invoke(() =>
                        {
                            this.primaActual.Visibility  = Visibility.Visible;
                            this.temporizador.Visibility = Visibility.Hidden;
                        });
                        // reseteo el timer de actividad
                        this.timerInactividad.Stop();
                        this.timerInactividad.Start();

                        // cargo informacion del consumo en la maquina por si acaso no estaba
                        maquina.CargarInformacion(consumo);
                        // añado el pulso a la maquina
                        maquina.Pulsos.Add(new PulsoMaquina
                        {
                            CodigoEtiqueta = maquina.TrabajoEjecucion.CodigoEtiquetaFichada,
                            // previamente busco el control en la tienda
                            Control        = BuscarControl(maquina.IdOperacion, maquina),
                            Ciclo          = consumo.SgCiclo,
                            Fecha          = consumo.HoraLocal,
                            Pares          = consumo.ParesUtillaje * consumo.NumMoldes,
                            PosicionGlobal = maquina.PosicionGlobal ?? 0,
                            IdOperario     = SesionManager.Sesion.Operario.Id,
                        });



                        // si lo hemos encontrado y ademas se introdujo una pieza
                        if (maquina.TrabajoEjecucion != null)
                        {
                            if (consumo.PiezaIntroducida == 1)
                            {
                                // insertamos pieza
                                bool insertados = maquina.InsertarPares(maquina.TrabajoEjecucion, consumo.NumMoldes * consumo.ParesUtillaje);
                            }
                        }
                        else
                        {
                            //(background) recuperar cola y publicarla
                            BackgroundWorker            bw          = new BackgroundWorker();
                            List <MaquinasColasTrabajo> colaTrabajo = new List <MaquinasColasTrabajo>();
                            bw.DoWork += (se, ev) =>
                            {
                                colaTrabajo = SelectColaTrabajo.ObtenerColaTrabajoMaquinaPorId(maquina.ID);
                            };
                            bw.RunWorkerCompleted += (se, ev) =>
                            {
                                if (colaTrabajo.Count == 0)
                                {
                                    ClienteMQTT.Publicar(string.Format("/moldeado/fallo/{0}", maquina.IpAutomata.PadLeft(3)),
                                                         string.Format("El automata {0} con maquina {1} no tiene cola de trabajo", maquina.IpAutomata, maquina.Posicion), 1);
                                }
                                maquina.AsignarColaTrabajo(colaTrabajo);
                            };
                            bw.RunWorkerAsync();


                            maquina.ErrorTareaSinEjecutar();
                            maquina.ParesConsumidos();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Write(ex);
            }
        }
        public PrensaGenericaControl(Maquinas maquina, Operarios op)
        {
            InitializeComponent();
            this.DataContext            = this;
            this.Maquina                = maquina;
            this.Maquina.OperarioACargo = op;
            this.MinHeight              = 30;
            Grid.SetRow(this, (int)maquina.Top);
            Grid.SetColumn(this, (int)maquina.Left);
            Maquina.OnParesConsumidos          += Maquina_OnParesConsumidos;
            Maquina.OnInfoEjecucionActualizada += Maquina_OnInfoEjecucionActualizada;
            Maquina.OnModoCambiado             += Maquina_OnModoCambiado;
            Maquina.OnFichajeMaquina           += Maquina_OnFichajeMaquina;
            this.PreviewMouseUp += PrensaLayout_PreviewMouseUp;

            this.timerCalentamiento          = new DispatcherTimer();
            this.timerCalentamiento.Interval = new TimeSpan(0, 0, 0, 0, 400);
            this.timerCalentamiento.Tick    += TimerCalentamiento_Tick;;
            this.timerInactividad            = new DispatcherTimer();
            this.timerInactividad.Interval   = new TimeSpan(0, 10, 0);
            this.timerInactividad.Tick      += TimerInactividad_Tick;
            this.timerLimiteCaja             = new DispatcherTimer();
            this.timerLimiteCaja.Interval    = new TimeSpan(0, 0, 30);
            this.timerLimiteCaja.Tick       += TimerLimiteCaja_Tick;

            this.timerLimiteCaja.Start();
            this.timerInactividad.Start();

            this.PreviewMouseDown += PrensaGenericaControl_PreviewMouseUp;


            try
            {
                BackgroundWorker            bwActualizarCola = new BackgroundWorker();
                List <MaquinasColasTrabajo> cola             = new List <MaquinasColasTrabajo>();
                Maquinas maquinaDb = null;
                List <MaquinasRegistrosDatos> paquetesHistorico = new List <MaquinasRegistrosDatos>();
                DateTime ahora = DateTime.Now;
                Turno    turno = HorarioTurnos.CalcularTurnoAFecha(ahora);
                DateTime fechaInicio;
                DateTime fechaFin;
                HorarioTurnos.CalcularHorarioTurno(turno, ahora, out fechaInicio, out fechaFin);

                maquina.Pulsos.Clear();

                bwActualizarCola.DoWork += (se, ev) =>
                {
                    maquinaDb         = daoPuesto.ObtenerMaquinaConColaTrabajo(maquina.ID);
                    paquetesHistorico = daoTarea.ObtenerHistoricoParesOperario(op.Id, maquina.IpAutomata, maquina.Posicion, fechaInicio, fechaFin);
                };
                bwActualizarCola.RunWorkerCompleted += (se, ev) =>
                {
                    cola = maquinaDb.MaquinasColasTrabajo.ToList();
                    this.Maquina.IpAutomata     = maquinaDb.IpAutomata;
                    this.Maquina.Posicion       = maquinaDb.Posicion;
                    this.Maquina.PosicionGlobal = maquinaDb.PosicionGlobal;

                    this.topicNormal                          = new Topic(string.Format("/{0}/plc/{1}/normal", maquina.Tipo, maquina.IpAutomata), (byte)2, this.Maquina.Nombre);
                    this.topicCalentar                        = new Topic(string.Format("/{0}/plc/{1}/calentar", maquina.Tipo, maquina.IpAutomata), (byte)1, this.Maquina.Nombre);
                    this.topicAsociarTarea                    = new Topic(string.Format("/{0}/plc/{1}/asociarTarea", maquina.Tipo, maquina.IpAutomata), (byte)1, this.Maquina.Nombre);
                    this.topicNormal.OnMensajeRecibido       += TopicNormal_OnMensajeRecibido;
                    this.topicCalentar.OnMensajeRecibido     += TopicCalentar_OnMensajeRecibido;
                    this.topicAsociarTarea.OnMensajeRecibido += TopicAsociarTarea_OnMensajeRecibido;

                    maquina.AsignarColaTrabajo(cola);

                    ClienteMqtt.Suscribir(this.topicNormal);
                    ClienteMqtt.Suscribir(this.topicCalentar);
                    ClienteMqtt.Suscribir(this.topicAsociarTarea);

                    foreach (var paquete in paquetesHistorico.Where(x => x.PiezaIntroducida))
                    {
                        Maquina.Pulsos.Add(new PulsoMaquina
                        {
                            CodigoEtiqueta = paquete.CodigoEtiqueta,
                            Control        = daoTarea.BuscarControlGuardado(paquete.IdOperacion, Maquina.IdTipo ?? 0),
                            Ciclo          = paquete.Ciclo,
                            Fecha          = paquete.FechaCreacion,
                            Pares          = paquete.Pares,
                            PosicionGlobal = Maquina.PosicionGlobal ?? 0,
                            IdOperario     = paquete.IdOperario,
                        });
                    }
                    Notifica("Maquina");
                    Loader.Visibility         = Visibility.Collapsed;
                    PanelPrincipal.Visibility = Visibility.Visible;
                };

                bwActualizarCola.RunWorkerAsync();
            }
            catch (Exception ex)
            {
                new Log().Escribir(ex);
            }
        }