public void SendPackage(OpcDaCom opcDaCom, Channel ch, Device dv, DataBlock db)
        {
            try
            {
                SendDone.WaitOne(-1);
                lock (opcDaCom)
                {
                    string[] wdArys = opcDaCom.Read(db.DataBlockName, 250, db);
                    if (wdArys == null || wdArys.Length == 0)
                    {
                        return;
                    }

                    for (int i = 0; i < db.Tags.Count; i++)
                    {
                        db.Tags[i].Value    = wdArys[i];
                        db.Tags[i].TimeSpan = DateTime.Now;
                    }
                }
            }
            catch (Exception ex)
            {
                IsConnected = false;
                EventscadaException?.Invoke(GetType().Name, ex.Message);
            }
        }
        public void Connect()
        {
            try
            {
                lock (myLockRead)
                {
                    Console.WriteLine("STARTED: {0}", ++COUNTER);
                    taskArray = new Task[Channels.Count];
                    if (taskArray == null)
                    {
                        throw new NullReferenceException("No Data");
                    }

                    for (int i = 0; i < Channels.Count; i++)
                    {
                        taskArray[i] = new Task(chParam =>
                        {
                            Channel ch = (Channel)chParam;
                            opcDaCom   = _OpcDaCom[ch.ChannelName];
                            if (opcDaCom != null)
                            {
                                opcDaCom.Connection();
                                IsConnected = opcDaCom.IsConnected;
                                while (IsConnected)
                                {
                                    foreach (Device dv in ch.Devices)
                                    {
                                        foreach (DataBlock db in dv.DataBlocks)
                                        {
                                            if (!IsConnected)
                                            {
                                                break;
                                            }

                                            SendPackage(opcDaCom, ch, dv, db);
                                        }
                                    }
                                }
                            }
                        }, Channels[i]);
                        taskArray[i].Start();
                    }
                    foreach (Task task in taskArray)
                    {
                        Channel data = task.AsyncState as Channel;
                        if (data != null)
                        {
                            EventscadaException?.Invoke(GetType().Name, $"Task #{data.ChannelId} created at {data.ChannelName}, ran on thread #{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}.");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Disconnect();
                EventscadaException?.Invoke(GetType().Name, ex.Message);
            }
        }
        public void WriteTag(string tagName, dynamic value)
        {
            SendDone.Reset();
            string[]    strArrays  = tagName.Split('.');
            List <byte> dataPacket = new List <byte>();

            try
            {
                string str = $"{strArrays[0]}.{strArrays[1]}";
                foreach (Channel ch in Channels)
                {
                    foreach (Device dv in ch.Devices)
                    {
                        bool bEquals = $"{ch.ChannelName}.{dv.DeviceName}".Equals(str);
                        if (bEquals)
                        {
                            opcDaCom = _OpcDaCom[ch.ChannelName];

                            if (opcDaCom == null)
                            {
                                return;
                            }

                            OpcDaCom obj = opcDaCom;
                            lock (obj)
                            {
                                string[] dataAsArray = { value };
                                opcDaCom.Write($"{TagCollection.Tags[tagName].Address}", 1, dataAsArray);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                EventscadaException?.Invoke(GetType().Name, ex.Message);
            }
            finally
            {
                SendDone.Set();
            }
        }
        public void InitializeService(Channel ch)
        {
            try
            {
                lock (this)
                {
                    Channels.Add(ch);

                    if (Channels == null)
                    {
                        return;
                    }
                    // Initialize


                    #region opc.
                    DIEthernet die = (DIEthernet)ch;
                    opcDaCom = new OpcDaCom(ch.Mode, ch.CPU.Trim());
                    _OpcDaCom.Add(ch.ChannelName, opcDaCom);
                    #endregion Initialize

                    foreach (Device dv in ch.Devices)
                    {
                        foreach (DataBlock db in dv.DataBlocks)
                        {
                            DataBlockCollection.DataBlocks.Add($"{ch.ChannelName}.{dv.DeviceName}.{db.DataBlockName}", db);
                            foreach (Tag tg in db.Tags)
                            {
                                TagCollection.Tags.Add(
                                    $"{ch.ChannelName}.{dv.DeviceName}.{db.DataBlockName}.{tg.TagName}", tg);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                EventscadaException?.Invoke(GetType().Name, ex.Message);
            }
        }