void operatMachine(Func <ProgressToken> operation, Machine m, string operationDescription, MachineOperationToken successfulOperations, Logging.MachineControllerEventIds eventId, Logging.MachineControllerEventIds failEventId)
 {
     try {
         ProgressToken t = operation.Invoke();
         estimateAndAnnounceTimeForProgressToken(t, successfulOperations);
         MachineOperation op = new MachineOperation(m, t, operationDescription, eventId);
         op.Execute(successfulOperations, Logging.MachineControllerEventIds.MachineStartupFailed);
     }
     catch (Exception ex) {
         _log.TraceEvent(TraceEventType.Error, (int)failEventId, "{0} on machine {1} resulted in an error: {2}", operationDescription, m.Name, ex.ToString());
         //no rethrow, because we do not want to interrupt the other processes
     }
 }
        /// <summary>
        /// Await ACPI-Shutdowns according to specified timeouts
        /// </summary>
        void awaitAcpiShutdowns(IEnumerable <MachineProgressTokenTuple> shutdownsInProgress, MachineOperationToken successfulOperations)
        {
            IEnumerable <MachineProgressTokenTuple> unfinishedAcpiShutdowns = shutdownsInProgress.Where(x => !x.Token.Finished);

            if (unfinishedAcpiShutdowns.Count() > 0)
            {
                foreach (var activeShutdown in unfinishedAcpiShutdowns)
                {
                    estimateAndAnnounceTimeForProgressToken(activeShutdown.Token, successfulOperations);
                    MachineOperation op = new MachineOperation(activeShutdown.Machine, activeShutdown.Token, "Await ACPI-Shutdown", Logging.MachineControllerEventIds.MachineShutdown);
                    op.Execute(successfulOperations, Logging.MachineControllerEventIds.MachineShutdownFailed);
                }

                foreach (var activeShutdown in unfinishedAcpiShutdowns)
                {
                    _log.TraceEvent(TraceEventType.Warning, (int)Logging.MachineControllerEventIds.MachineShutdownFailed, "Machine {0} took to long to properly shutdown after ACPI-Command", activeShutdown.Machine.Name);
                }
            }
        }
 public void SuccessfullyOperatedMachine(MachineOperation m)
 {
     _successfullyOperatedMachines.Add(m);
 }
Esempio n. 4
0
        private DataMQC GetDataMQCRealtime(string IP, string line, DataMQC dataOld)
        {
            DataMQC dataMQC = null;

            try
            {
                Plc.Instance.Connect(IP, SettingClass.PLCTimeOut);

                if (Plc.Instance.ConnectionState == ConnectionStates.Online)
                {// doc barcode truoc
                    var ListTag = Plc.Instance.ReadTags(tags);

                    if (ListTag.Count == 4)
                    {
                        MachineOperation ma1 = new MachineOperation();
                        ma1.Line   = line;
                        ma1.IP     = IP;
                        ma1.Output = (ListTag[0].ItemValue.ToString() != null) ? double.Parse(ListTag[0].ItemValue.ToString()) : 0;
                        ma1.NG     = (ListTag[1].ItemValue.ToString() != null) ? double.Parse(ListTag[1].ItemValue.ToString()) : 0;
                        ma1.Rework = (ListTag[2].ItemValue.ToString() != null) ? double.Parse(ListTag[2].ItemValue.ToString()) : 0;
                        ma1.ONOFF  = (ListTag[3].ItemValue.ToString() != null) ? ListTag[3].ItemValue.ToString() : "";
                        ma1.Status = Plc.Instance.ConnectionState.ToString();
                        if (dataOld != null)
                        {
                            #region Running
                            if (dataOld.STARTSTOP == "False" && ma1.ONOFF == "False")
                            {
                                dataMQC                     = new DataMQC();
                                ma1.Lot                     = dataOld.PLC_Barcode;
                                dataMQC.PLC_Barcode         = dataOld.PLC_Barcode;
                                dataMQC.Good_Products_Total = ma1.Output;
                                dataMQC.NG_Products_Total   = ma1.NG;
                                dataMQC.RW_Products_Total   = ma1.Rework;
                                dataMQC.STARTSTOP           = ma1.ONOFF;

                                if (dataOld.PLC_Barcode != null && (dataOld.PLC_Barcode.Contains("0010;B01;B01") || dataOld.PLC_Barcode.Contains("0010;B01;B02")))
                                {
                                    dataMQC.NG_Products_NG_ = new int[38];

                                    int CountNG = 0;
                                    int CountRW = 0;
                                    if (dataMQC.NG_Products_Total > dataOld.NG_Products_Total)
                                    {
                                        var ListNG = Plc.Instance.ReadTags(tagsError);

                                        foreach (var item in ListNG)
                                        {
                                            dataMQC.NG_Products_NG_[CountNG] = int.Parse(item.ItemValue.ToString());
                                            CountNG++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.NG_Products_NG_ = dataOld.NG_Products_NG_;
                                    }
                                    dataMQC.RW_Products_NG_ = new int[38];
                                    if (dataMQC.RW_Products_Total > dataOld.RW_Products_Total)
                                    {
                                        var ListRW = Plc.Instance.ReadTags(tagsRework);

                                        foreach (var item in ListRW)
                                        {
                                            dataMQC.RW_Products_NG_[CountRW] = int.Parse(item.ItemValue.ToString());
                                            CountRW++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.RW_Products_NG_ = dataOld.RW_Products_NG_;
                                    }
                                }
                                else
                                {
                                    var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                    dataMQC.PLC_Barcode = barcode;
                                    ma1.Lot             = barcode;
                                    SystemLog.Output(SystemLog.MSG_TYPE.War, "Barcode is wrong format: IPMachine :", IP);
                                }

                                if (dataMQC.Good_Products_Total == 0 && dataMQC.NG_Products_Total == 0 && dataMQC.RW_Products_Total == 0)
                                {
                                    var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                    dataMQC.PLC_Barcode = barcode;
                                    ma1.Lot             = barcode;
                                }
                                machineOperations.Add(ma1);
                            }

                            #endregion
                            #region chuyen giao giua chay va reset
                            else if (dataOld.STARTSTOP == "False" && ma1.ONOFF == "True")
                            {
                                var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                ma1.Lot = barcode;


                                if (dataOld.PLC_Barcode != null && (dataOld.PLC_Barcode.Contains("0010;B01;B01") || dataOld.PLC_Barcode.Contains("0010;B01;B02")))
                                {
                                    dataMQC                     = new DataMQC();
                                    ma1.Lot                     = barcode;
                                    dataMQC.PLC_Barcode         = barcode;
                                    dataMQC.Good_Products_Total = ma1.Output;
                                    dataMQC.NG_Products_Total   = ma1.NG;
                                    dataMQC.RW_Products_Total   = ma1.Rework;
                                    dataMQC.STARTSTOP           = ma1.ONOFF;


                                    dataMQC.NG_Products_NG_ = new int[38];

                                    int CountNG = 0;
                                    int CountRW = 0;
                                    if (dataMQC.NG_Products_Total > dataOld.NG_Products_Total)
                                    {
                                        var ListNG = Plc.Instance.ReadTags(tagsError);

                                        foreach (var item in ListNG)
                                        {
                                            dataMQC.NG_Products_NG_[CountNG] = int.Parse(item.ItemValue.ToString());
                                            CountNG++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.NG_Products_NG_ = dataOld.NG_Products_NG_;
                                    }
                                    dataMQC.RW_Products_NG_ = new int[38];
                                    if (dataMQC.RW_Products_Total > dataOld.RW_Products_Total)
                                    {
                                        var ListRW = Plc.Instance.ReadTags(tagsRework);

                                        foreach (var item in ListRW)
                                        {
                                            dataMQC.RW_Products_NG_[CountRW] = int.Parse(item.ItemValue.ToString());
                                            CountRW++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.RW_Products_NG_ = dataOld.RW_Products_NG_;
                                    }


                                    Uploaddata uploaddata = new Uploaddata();
                                    uploaddata.InsertToMQC_Realtime(dataOld.PLC_Barcode, line, "", "0", "Reset", 0);
                                    if (SettingClass.usingOfftlineServer)
                                    {
                                        UploadLocalPLCDB uploadLocalPLCDB = new UploadLocalPLCDB();
                                        uploadLocalPLCDB.InsertToMQC_Realtime(dataOld.PLC_Barcode, line, "", "0", "Reset", 0, SettingClass);
                                    }
                                }
                                else
                                {
                                    dataMQC = dataOld;
                                    SystemLog.Output(SystemLog.MSG_TYPE.War, "Barcode is wrong format: IPMachine :", IP);
                                }
                                try
                                {
                                    if (dataOld != null)
                                    {
                                        Uploaddata uploaddata = new Uploaddata();
                                        string     model      = uploaddata.GetModelFromLot(dataOld.PLC_Barcode);
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Line: " + line + " QR code: " + dataOld.PLC_Barcode + " Model: " + model, " Reset ");
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Line: " + line + " QR code: " + dataOld.PLC_Barcode + " Model: " + model, " OP " + dataOld.Good_Products_Total);
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Line: " + line + " QR code: " + dataOld.PLC_Barcode + " Model: " + model, " NG " + dataOld.NG_Products_Total);
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Line: " + line + " QR code: " + dataOld.PLC_Barcode + " Model: " + model, " RW " + dataOld.RW_Products_Total);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    SystemLog.Output(SystemLog.MSG_TYPE.Err, "Write record reset not succesfull" + " Line: " + line + " QR code: " + dataOld.PLC_Barcode, ex.Message);
                                }
                                machineOperations.Add(ma1);
                            }

                            #endregion
                            else if (dataOld.STARTSTOP == "True" && ma1.ONOFF == "True")
                            {
                                var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                ma1.Lot = barcode;
                                machineOperations.Add(ma1);
                                dataMQC             = new DataMQC();
                                dataMQC.STARTSTOP   = ma1.ONOFF;
                                dataMQC.PLC_Barcode = barcode;
                            }
                            else if (dataOld.STARTSTOP == "True" && ma1.ONOFF == "False")
                            {
                                var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                ma1.Lot = barcode;
                                machineOperations.Add(ma1);
                                dataMQC             = new DataMQC();
                                dataMQC.STARTSTOP   = ma1.ONOFF;
                                dataMQC.PLC_Barcode = barcode;
                            }
                            else
                            {
                                if (dataOld.STARTSTOP == null)
                                {
                                    SystemLog.Output(SystemLog.MSG_TYPE.Err, "dataOld.STARTSTOP == null", ma1.Lot);
                                }
                                else if (ma1.ONOFF == null)
                                {
                                    SystemLog.Output(SystemLog.MSG_TYPE.Err, "ma1.ONOFF == null", ma1.Lot);
                                }
                                var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                                ma1.Lot = barcode;
                                machineOperations.Add(ma1);

                                if (barcode != null && (barcode.Contains("0010;B01;B01") || barcode.Contains("0010;B01;B02")))
                                {
                                    dataMQC                     = new DataMQC();
                                    ma1.Lot                     = barcode;
                                    dataMQC.PLC_Barcode         = barcode;
                                    dataMQC.Good_Products_Total = ma1.Output;
                                    dataMQC.NG_Products_Total   = ma1.NG;
                                    dataMQC.RW_Products_Total   = ma1.Rework;
                                    dataMQC.STARTSTOP           = ma1.ONOFF;
                                    dataMQC.NG_Products_NG_     = new int[38];
                                    int CountNG = 0;
                                    int CountRW = 0;
                                    if (dataMQC.NG_Products_Total > dataOld.NG_Products_Total)
                                    {
                                        var ListNG = Plc.Instance.ReadTags(tagsError);

                                        foreach (var item in ListNG)
                                        {
                                            dataMQC.NG_Products_NG_[CountNG] = int.Parse(item.ItemValue.ToString());
                                            CountNG++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.NG_Products_NG_ = dataOld.NG_Products_NG_;
                                    }
                                    dataMQC.RW_Products_NG_ = new int[38];
                                    if (dataMQC.RW_Products_Total > dataOld.RW_Products_Total)
                                    {
                                        var ListRW = Plc.Instance.ReadTags(tagsRework);

                                        foreach (var item in ListRW)
                                        {
                                            dataMQC.RW_Products_NG_[CountRW] = int.Parse(item.ItemValue.ToString());
                                            CountRW++;
                                        }
                                    }
                                    else
                                    {
                                        dataMQC.RW_Products_NG_ = dataOld.RW_Products_NG_;
                                    }
                                }
                                else
                                {
                                    dataMQC = dataOld;
                                    SystemLog.Output(SystemLog.MSG_TYPE.War, "Barcode is wrong format: IPMachine :", IP);
                                }
                            }
                        }
                        else
                        {
                            dataMQC = new DataMQC();
                            var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);
                            ma1.Lot                     = barcode;
                            dataMQC.STARTSTOP           = ma1.ONOFF;
                            dataMQC.PLC_Barcode         = barcode;
                            dataMQC.Good_Products_Total = ma1.Output;
                            dataMQC.NG_Products_Total   = ma1.NG;
                            dataMQC.RW_Products_Total   = ma1.Rework;
                            dataMQC.STARTSTOP           = ma1.ONOFF;
                            machineOperations.Add(ma1);
                            SystemLog.Output(SystemLog.MSG_TYPE.War, "Data old = null: IPMachine :", IP);
                        }
                    }
                    else
                    {
                        MachineOperation ma1 = new MachineOperation();
                        ma1.Line = line;
                        ma1.IP   = IP;

                        ma1.Status = Plc.Instance.ConnectionState.ToString();
                        machineOperations.Add(ma1);
                        dataMQC = dataOld;
                        SystemLog.Output(SystemLog.MSG_TYPE.War, "Readtag fail: IPMachine ", IP);
                    }
                }
                else
                {
                    MachineOperation ma1 = new MachineOperation();
                    ma1.Line   = line;
                    ma1.IP     = IP;
                    ma1.Status = Plc.Instance.ConnectionState.ToString();
                    machineOperations.Add(ma1);
                    dataMQC = dataOld;
                    SystemLog.Output(SystemLog.MSG_TYPE.War, "Machine is offline", IP);
                }
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "DataMQC GetDataMQCRealtime line " + line, ex.Message);
            }

            return(dataMQC);
        }
Esempio n. 5
0
        public void LoadDataMQCStarting()
        {
            stopwatch = new Stopwatch();
            try
            {
                stopwatch.Start();
                if (ListMachines != null)
                {
                    foreach (var machine in ListMachines)
                    {
                        Plc.Instance.Connect(machine.IP, SettingClass.PLCTimeOut);
                        DataMQC dataMQC = null;
                        if (Plc.Instance.ConnectionState == ConnectionStates.Online)
                        {// doc barcode truoc
                            var barcode = Plc.Instance.ReadTagsToString(tagsbarcode);

                            dataMQC             = new DataMQC();
                            dataMQC.PLC_Barcode = barcode;


                            var ListTag = Plc.Instance.ReadTags(tags);
                            if (ListTag != null && ListTag.Count == 4)
                            {
                                MachineOperation ma1 = new MachineOperation();
                                ma1.Line                    = machine.Line;
                                ma1.IP                      = machine.IP;
                                ma1.Output                  = (ListTag[0].ItemValue.ToString() != null) ? double.Parse(ListTag[0].ItemValue.ToString()) : 0;
                                ma1.NG                      = (ListTag[1].ItemValue.ToString() != null) ? double.Parse(ListTag[1].ItemValue.ToString()) : 0;
                                ma1.Rework                  = (ListTag[2].ItemValue.ToString() != null) ? double.Parse(ListTag[2].ItemValue.ToString()) : 0;
                                ma1.ONOFF                   = (ListTag[3].ItemValue.ToString() != null) ? ListTag[3].ItemValue.ToString() : "";
                                ma1.Status                  = Plc.Instance.ConnectionState.ToString();
                                ma1.Lot                     = barcode;
                                dataMQC.DateTimeReset       = DateTime.Now;
                                dataMQC.Good_Products_Total = ma1.Output;
                                dataMQC.NG_Products_Total   = ma1.NG;
                                dataMQC.RW_Products_Total   = ma1.Rework;
                                dataMQC.STARTSTOP           = ma1.ONOFF;

                                dataMQC.NG_Products_NG_ = new int[38];
                                int CountNG = 0;
                                int CountRW = 0;
                                machineOperations.Add(ma1);
                                if (dataMQC.NG_Products_Total > 0)
                                {
                                    var ListNG = Plc.Instance.ReadTags(tagsError);

                                    foreach (var item in ListNG)
                                    {
                                        dataMQC.NG_Products_NG_[CountNG] = int.Parse(item.ItemValue.ToString());
                                        CountNG++;
                                    }
                                }
                                dataMQC.RW_Products_NG_ = new int[38];
                                if (dataMQC.RW_Products_Total > 0)
                                {
                                    var ListRW = Plc.Instance.ReadTags(tagsRework);

                                    foreach (var item in ListRW)
                                    {
                                        dataMQC.RW_Products_NG_[CountRW] = int.Parse(item.ItemValue.ToString());
                                        CountRW++;
                                    }
                                }
                            }
                            else
                            {
                                SystemLog.Output(SystemLog.MSG_TYPE.War, "PLC readtag fail :", machine.IP);
                            }
                            if (dataMQC != null)
                            {
                                UploadLocalPLCDB uploadLocalPLCDB = new UploadLocalPLCDB();
                                if (dataMQC.PLC_Barcode.Contains("0010;B01;B01") || dataMQC.PLC_Barcode.Contains("0010;B01;B02"))
                                {
                                    Uploaddata uploaddata = new Uploaddata();
                                    if (CountRun == 0 && cb_GetFirstValues.IsChecked == true)
                                    {
                                        if (SettingClass.usingOfftlineServer)
                                        {
                                            DateTime FromDate    = DateTime.Now;
                                            var      InsertLocal = uploadLocalPLCDB.InsertMQCUpdateRealtime(dataMQC, machine.Line, false, SettingClass);
                                            if (InsertLocal == false)
                                            {
                                                SystemLog.Output(SystemLog.MSG_TYPE.War, "Insert local data fail", "");
                                            }
                                            else
                                            {
                                                DateTime      ToDate        = DateTime.Now;
                                                LocalToServer localToServer = new LocalToServer();
                                                var           Result        = localToServer.UploadLocalServertoFactoryDB(dataMQC.PLC_Barcode, FromDate, ToDate, SettingClass);
                                                if (Result == false)
                                                {
                                                    SystemLog.Output(SystemLog.MSG_TYPE.War, "insert to local data not success", machine.Line);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var InsertResult = uploaddata.InsertMQCUpdateRealtime(dataMQC, machine.Line, false);
                                            if (InsertResult == false)
                                            {
                                                SystemLog.Output(SystemLog.MSG_TYPE.War, "InsertMQCUpdateRealtime", "");
                                            }
                                        }
                                    }

                                    var StockAvaiable = uploaddata.QuantityCanRun(dataMQC.PLC_Barcode);


                                    if (StockAvaiable > 0)
                                    {
                                        Plc.Instance.Write("DB151.DBW0", (uint)StockAvaiable);
                                    }
                                    else
                                    {
                                        Plc.Instance.Write("DB151.DBW4", (uint)Math.Abs(StockAvaiable));
                                    }
                                }
                                else
                                {
                                    SystemLog.Output(SystemLog.MSG_TYPE.War, "Barcode wrong format :", dataMQC.PLC_Barcode);
                                }
                            }
                            else
                            {
                                SystemLog.Output(SystemLog.MSG_TYPE.War, "Data MQC = null :", machine.IP);
                            }
                        }
                        else
                        {
                            MachineOperation ma1 = new MachineOperation();
                            ma1.Line   = machine.Line;
                            ma1.IP     = machine.IP;
                            ma1.Status = Plc.Instance.ConnectionState.ToString();
                            machineOperations.Add(ma1);
                            SystemLog.Output(SystemLog.MSG_TYPE.War, "machine is not online", machine.IP);
                        }

                        keyValuePairsOld.Add(machine.IP, dataMQC);
                    }
                    datagridMachines.ItemsSource = machineOperations;
                }
                else
                {
                    SystemLog.Output(SystemLog.MSG_TYPE.War, "list machine = null", "");
                }
                stopwatch.Stop();
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "Read PLC fail", ex.Message);
            }
        }
        public void LoadDataMQCStarting()
        {
            try
            {
                stopwatch.Start();
                LoadAdress();
                if (ListMachines.Count > 0)
                {
                    DicMQCVariableIP = new Dictionary <string, MQCVariable>();

                    foreach (var machine in ListMachines)
                    {
                        int                   ConnectionPLC = -1;
                        MQCVariable           mQCVariable   = new MQCVariable();
                        QRMQC_MES             qRMQC_MES     = new QRMQC_MES();
                        QRIDMES               qRIDMES       = new QRIDMES();
                        Sharp.ReadVariablePLC pLC           = new Sharp.ReadVariablePLC(machine.IP, 0, 0, out ConnectionPLC);
                        mQCVariable.Connection = ConnectionPLC;
                        if (ConnectionPLC == 0)
                        {
                            Dictionary <string, bool> DicStatusPLC = new Dictionary <string, bool>();

                            DicStatusPLC             = pLC.ReadStatusPLCMQC();
                            mQCVariable.DicSPLCtatus = DicStatusPLC;

                            if (DicStatusPLC.Count == 4)
                            {
                                if (DicStatusPLC[VariablePLC.FlagKT])
                                {
                                    string QRMES = pLC.ReadAreaByteToString(181, 100, 100);
                                    mQCVariable.QRMES = QRMES;

                                    string QRID = pLC.ReadAreaByteToString(181, 0, 100);
                                    mQCVariable.QRID = QRID;

                                    var ResultValidationQRCode = SubFunction.IsValidationQRCode(QRMES, QRID);
                                    pLC.WriteDinttoPLC(ResultValidationQRCode, 181, 206, 2);//write message error to PLC
                                    if (ResultValidationQRCode == 0)
                                    {
                                        pLC.WritebittoPLC(true, 181, 204, 1);//Write FlagKT to PLC
                                    }
                                    else
                                    {
                                        pLC.WritebittoPLC(false, 181, 204, 1);//Write FlagKT to PLC
                                    }

                                    qRMQC_MES = QRSpilittoClass.QRstring2MQCFormat(mQCVariable.QRMES);
                                    //  get values from db and write value PLC
                                    SQLUpload.SQLQRUpdate sQLQR      = new SQLQRUpdate();
                                    DataTable             dtQRRecord = sQLQR.GetQuanityFromQRMES(mQCVariable.QRMES);

                                    if (dtQRRecord.Rows.Count == 1)
                                    {
                                        var OutputQty = Int16.Parse(dtQRRecord.Rows[0]["OutputQty"].ToString());
                                        var NGQty     = Int16.Parse(dtQRRecord.Rows[0]["NGQty"].ToString());
                                        var RWQty     = Int16.Parse(dtQRRecord.Rows[0]["RWQty"].ToString());
                                        var Total     = Int16.Parse(dtQRRecord.Rows[0]["TotalQty"].ToString());
                                        if (qRMQC_MES.quantity > (OutputQty + NGQty + RWQty) && qRMQC_MES.quantity > Total)
                                        {
                                            pLC.WriteMQCProducedQuantitytoPLC(OutputQty, NGQty, RWQty);
                                        }
                                        else
                                        {
                                            //Write to PLC values to know QR production finished
                                            pLC.WriteDinttoPLC(4, 181, 206, 2);//Completed QR MES
                                        }
                                    }
                                    else if (dtQRRecord.Rows.Count == 0)
                                    {
                                        pLC.WriteMQCProducedQuantitytoPLC(0, 0, 0);
                                    }

                                    List <int> ListMQCQty = pLC.ReadQuantityMQC();
                                    mQCVariable.ListMQCQty = ListMQCQty;
                                    List <int> ListMQCProduced = pLC.ReadQuantityMQCProduced();
                                    mQCVariable.ListQtyProduced = ListMQCProduced;
                                    List <int> ListNG38 = pLC.ReadAreaIntToListInt(3, 4, 76);
                                    mQCVariable.ListNG38 = ListNG38;
                                    List <int> ListRW38 = pLC.ReadAreaIntToListInt(4, 4, 76);
                                    mQCVariable.ListRW38 = ListRW38;
                                }
                            }
                        }

                        DicMQCVariableIP.Add(machine.IP, mQCVariable);
                        pLC.Diconnect();
                        qRMQC_MES = new QRMQC_MES();
                        qRMQC_MES = QRSpilittoClass.QRstring2MQCFormat(mQCVariable.QRMES);
                        qRIDMES   = QRSpilittoClass.QRstring2IDFormat(mQCVariable.QRID);
                        MachineOperation operation = new MachineOperation();
                        operation.IP        = machine.IP;
                        operation.Line      = machine.Line;
                        operation.Lot       = qRMQC_MES.PO;
                        operation.Inspector = qRIDMES.FullName;
                        operation.product   = qRMQC_MES.Product;

                        if (mQCVariable.ListMQCQty.Count == 3)
                        {
                            operation.Output = mQCVariable.ListMQCQty[0];
                            operation.NG     = mQCVariable.ListMQCQty[1];
                            operation.Rework = mQCVariable.ListMQCQty[2];
                            operation.Status = "Updating";
                        }
                        else if (mQCVariable.ListMQCQty.Count == 0)
                        {
                            operation.Output = 0;
                            operation.NG     = 0;
                            operation.Rework = 0;
                            operation.Status = "Waiting";
                        }
                        machineOperations.Add(operation);
                    }
                    datagridMachines.ItemsSource = machineOperations;
                }
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "Read PLC fail", ex.Message);
            }
        }
        void bg_DoWork(object sender, DoWorkEventArgs e)
        {
            // does a job like writing to serial communication, webservices etc
            var worker = sender as BackgroundWorker;

            stopwatch = new Stopwatch();
            try
            {
                stopwatch.Start();
                //    if (ListMachines != null)
                {
                    machineOperations = new List <MachineOperation>();
                    //MachineItem machine = new MachineItem();
                    //machine.IP = "172.16.1.145";
                    //machine.Line = "L03";
                    LoadAdress();//load list PLC machine
                    foreach (var machine in ListMachines)
                    {
                        try
                        {
                            //     machine.IP =
                            MQCVariable mQCOld = new MQCVariable();
                            if (DicMQCVariableIP.ContainsKey(machine.IP))
                            {
                                mQCOld = DicMQCVariableIP[machine.IP];
                            }


                            MQCVariable mQCPLC     = GetMQCVariableRealtime(machine.IP, mQCOld);
                            MQCVariable mQCChanged = new MQCVariable();
                            if (mQCPLC.Connection == 0)
                            {
                                bool          isChanged   = false;
                                List <string> listChanged = new List <string>();
                                //   if (mQCPLC.DicSPLCtatus[VariablePLC.FlagKT] == true)
                                {
                                    mQCChanged = GetMQCVariableDisCrepancy(mQCPLC, mQCOld, ref isChanged, ref listChanged);
                                    if (DicMQCVariableIP.ContainsKey(machine.IP))
                                    {
                                        DicMQCVariableIP[machine.IP] = mQCPLC;
                                    }
                                    else
                                    {
                                        DicMQCVariableIP.Add(machine.IP, mQCPLC);
                                    }
                                    if (listChanged.Contains("Reset"))
                                    {
                                        //MachineOperation operation = new MachineOperation();
                                        //operation.IP = machine.IP;
                                        //operation.Line = machine.Line;
                                        //operation.Lot = qRMQC_MES.PO;
                                        //operation.Inspector = qRIDMES.FullName;
                                        //operation.product = qRMQC_MES.Product;

                                        //operation.Output = mQCPLC.ListMQCQty[0];
                                        //operation.NG = mQCPLC.ListMQCQty[1];
                                        //operation.Rework = mQCPLC.ListMQCQty[2];
                                        //operation.Status = "Reset";
                                        SQLUpload.SQLQRUpdate sQLQRUpdate = new SQLQRUpdate();
                                        sQLQRUpdate.UpdateOrInsertQRRecordTable(mQCOld, machine.Line);

                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "QR MES Reset", mQCOld.QRMES);
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "QR Inspector", mQCOld.QRID);
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Ouput Quantity", mQCOld.ListMQCQty[0].ToString());
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "NG Quantity", mQCOld.ListMQCQty[1].ToString());
                                        SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "RW Quantity", mQCOld.ListMQCQty[2].ToString());
                                        return;
                                    }
                                    UploadPLCtoDatabase(mQCChanged, listChanged, machine.Line);

                                    QRMQC_MES qRMQC_MES = QRSpilittoClass.QRstring2MQCFormat(mQCPLC.QRMES);
                                    QRIDMES   qRIDMES   = QRSpilittoClass.QRstring2IDFormat(mQCPLC.QRID);

                                    MachineOperation operation = new MachineOperation();
                                    operation.IP        = machine.IP;
                                    operation.Line      = machine.Line;
                                    operation.Lot       = qRMQC_MES.PO;
                                    operation.Inspector = qRIDMES.FullName;
                                    operation.product   = qRMQC_MES.Product;
                                    if (mQCPLC.ListMQCQty.Count == 3)
                                    {
                                        operation.Output = mQCPLC.ListMQCQty[0];
                                        operation.NG     = mQCPLC.ListMQCQty[1];
                                        operation.Rework = mQCPLC.ListMQCQty[2];
                                        operation.Status = "Updating";
                                    }
                                    else if (mQCPLC.ListMQCQty.Count == 0)
                                    {
                                        operation.Output = 0;
                                        operation.NG     = 0;
                                        operation.Rework = 0;
                                        operation.Status = "Waiting";
                                    }
                                    //if (listChanged.Contains("Reset"))
                                    //{
                                    //    operation.Status = "Reset";
                                    //    //SQLUpload.SQLQRUpdate sQLQRUpdate = new SQLQRUpdate();
                                    //    //sQLQRUpdate.UpdateOrInsertQRRecordTable(mQCPLC, machine.Line);
                                    //    SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "QR MES Reset", mQCPLC.QRMES);
                                    //    SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "QR Inspector", mQCPLC.QRID);
                                    //    SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "Ouput Quantity", mQCPLC.ListMQCQty[0].ToString());
                                    //    SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "NG Quantity", mQCPLC.ListMQCQty[1].ToString());
                                    //    SystemRecord.Output(SystemRecord.MSG_TYPE.Nor, "RW Quantity", mQCPLC.ListMQCQty[2].ToString());

                                    //}
                                    //else
                                    //{
                                    //    operation.Status = "Updating";
                                    //}

                                    machineOperations.Add(operation);
                                }
                            }
                            else
                            {
                                MachineOperation operation = new MachineOperation();
                                operation.IP   = machine.IP;
                                operation.Line = machine.Line;
                                Sharp7.S7Client client = new Sharp7.S7Client();
                                operation.Status = client.ErrorText(mQCPLC.Connection);
                                machineOperations.Add(operation);
                            }
                        }
                        catch (Exception ex)
                        {
                            SystemLog.Output(SystemLog.MSG_TYPE.Err, "PLC IP : " + machine.IP, ex.Message);
                        }
                    }
                }


                stopwatch.Stop();
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "Read PLC fail", ex.Message);
            }

            System.Threading.Thread.Sleep(100);
        }