public async Task <bool> GetPlcDataAsync_old(int timeout_ms,
                                                     SortedList <int, int> addrDM, SortedList <int, int> addrHR, SortedList <int, int> addrWR,
                                                     CancellationToken ct, IProgress <PlcProgressReportModel> progress)
        {
            Dictionary <string, RlistDataModel> retRlist = new Dictionary <string, RlistDataModel>();
            PlcProgressReportModel report    = new PlcProgressReportModel();
            DateTimeOffset         startTime = DateTimeOffset.Now;
            bool timedout = false;
            bool canceled = false;

            if (!mainPort.IsOpen)
            {
                mainPort.Open();
            }

            await Task.Run(() =>
            {
                report.ReadCompleted = OmronFINsProcessor.ReadAllPlcWords(mainPort, addrDM, addrHR, addrWR,
                                                                          out SortedList <int, string> DMstr, out SortedList <int, string> HRstr, out SortedList <int, string> WRstr);
                lock (PlcDataMapper._WordsListLock)
                {
                    OmronFINsProcessor.UpdateStringToWords(PlcMemArea.WR_bit, WRstr);
                    OmronFINsProcessor.UpdateStringToWords(PlcMemArea.HR_bit, HRstr);
                    OmronFINsProcessor.UpdateStringToWords(PlcMemArea.DM, DMstr);
                }

                PlcDataMapper.DMWordsToData(); //4ms
                PlcDataMapper.BitsToData();    //14ms

                lock (PlcDataMapper._RWlistLock)
                {
                    PlcDataMapper.DataToRList();
                }
            });

            report.PercetageComplete = 1 / 2 * 100;
            report.Msg = "Reading finished.. Begining to write..";
            progress.Report(report);
            return(true);
        }
        /// <summary>
        /// Get plc data to Rlist async
        /// </summary>
        /// <param name="timeout_ms"></param>
        /// <param name="ct"></param>
        /// <param name="progress"></param>
        /// <returns></returns>
        public async Task <bool> GetPlcDataAsync(int timeout_ms,
                                                 SortedList <int, int> addrDM, SortedList <int, int> addrHR, SortedList <int, int> addrWR,
                                                 CancellationToken ct, IProgress <PlcProgressReportModel> progress)
        {
            Dictionary <string, RlistDataModel> retRlist = new Dictionary <string, RlistDataModel>();
            PlcProgressReportModel report    = new PlcProgressReportModel();
            DateTimeOffset         startTime = DateTimeOffset.Now;
            bool timedout = false;
            bool canceled = false;
            SortedList <int, string> DMstr = new SortedList <int, string>();
            SortedList <int, string> HRstr = new SortedList <int, string>();
            SortedList <int, string> WRstr = new SortedList <int, string>();

            Stopwatch stopwatch1 = new Stopwatch(); //debug watch
            Stopwatch stopwatch2 = new Stopwatch(); //debug watch
            Stopwatch stopwatch3 = new Stopwatch(); //debug watch
            Stopwatch stopwatch4 = new Stopwatch(); //debug watch
            Stopwatch stopwatch5 = new Stopwatch(); //debug watch

            if (!mainPort.IsOpen)
            {
                mainPort.Open();
            }

            //try
            //{
            await Task.Run(() =>
            {
                stopwatch1.Start();
                report.ReadCompleted = OmronFINsProcessor.ReadAllPlcWords(mainPort, addrDM, addrHR, addrWR,
                                                                          out DMstr, out HRstr, out WRstr);
                stopwatch1.Stop();
            });

            try
            {
                if (DateTimeOffset.Now.Subtract(startTime).TotalMilliseconds > timeout_ms || timedout)
                {
                    timedout = true;
                    throw new TimeoutException("reading PLC timed out..");
                }
                else if (ct.IsCancellationRequested)
                {
                    canceled = true;
                    throw new OperationCanceledException(ct);
                    //throw new Exception();
                    //ct.ThrowIfCancellationRequested();
                    //return false;
                }
            }
            catch (TimeoutException ex)
            {
                report.ClrReport();
                report.Msg = "The operation has timed out";
                progress.Report(report);
                return(false);
            }
            catch (OperationCanceledException ex)
            {
                report.ClrReport();
                report.Msg = "The operation has been canceled";
                progress.Report(report);
                return(false);
            }
            catch (Exception)
            {
                report.ClrReport();
                report.Msg = "Unkmown exception";
                progress.Report(report);
                return(false);
            }

            stopwatch2.Start();
            lock (PlcDataMapper._WordsListLock)
            {
                OmronFINsProcessor.UpdateStringToWords(PlcMemArea.WR_bit, WRstr);
                OmronFINsProcessor.UpdateStringToWords(PlcMemArea.HR_bit, HRstr);
                OmronFINsProcessor.UpdateStringToWords(PlcMemArea.DM, DMstr);
            }
            stopwatch2.Stop();

            stopwatch3.Start();
            PlcDataMapper.DMWordsToData();//4ms
            stopwatch3.Stop();

            stopwatch4.Start();
            PlcDataMapper.BitsToData();//14ms
            stopwatch4.Stop();

            stopwatch5.Start();
            lock (PlcDataMapper._RWlistLock)
            {
                PlcDataMapper.DataToRList();
            }
            stopwatch5.Stop();
            //}
            //catch (TimeoutException ex)
            //{
            //    report.ClrReport();
            //    report.Msg = "The operation has timed out";
            //    progress.Report(report);
            //    return false;
            //}
            //catch(OperationCanceledException ex)
            //{
            //    report.ClrReport();
            //    report.Msg = "The operation has been canceled";
            //    progress.Report(report);
            //    return false;
            //}
            //catch (Exception)
            //{
            //    report.ClrReport();
            //    report.Msg = "Unkmown exception";
            //    progress.Report(report);
            //    return false;
            //}

            //report.PercetageComplete = 1 / 2 * 100;
            report.Msg = "Reading finished.. Begining to write.." + "readAllWords=" + stopwatch1.ElapsedMilliseconds.ToString()
                         + "..updateStrToWords" + stopwatch2.ElapsedMilliseconds.ToString()
                         + "..DMwordsToData" + stopwatch3.ElapsedMilliseconds.ToString()
                         + "..bitsToData" + stopwatch4.ElapsedMilliseconds.ToString()
                         + "..DataToRlist" + stopwatch5.ElapsedMilliseconds.ToString();
            progress.Report(report);
            return(true);
        }