Exemplo n.º 1
0
        /// <summary>
        /// Read a tag
        /// </summary>
        /// <typeparam name="T">The type of tag to read</typeparam>
        /// <param name="tag">The fully-qualified identifier of the tag. You can specify a subfolder by using a comma delimited name.
        /// E.g: the tag `foo.bar` reads the tag `bar` on the folder `foo`</param>
        /// <returns>The value retrieved from the OPC</returns>
        public ReadEvent <T> Read <T>(string tag)
        {
            var item = new OpcDa.Item {
                ItemName = tag
            };

            if (Status == OpcStatus.NotConnected)
            {
                throw new OpcException("Server not connected. Cannot read tag.");
            }
            var result = _server.Read(new[] { item })[0];
            T   casted;

            TryCastResult(result.Value, out casted);

            var readEvent = new ReadEvent <T>();

            readEvent.Value           = casted;
            readEvent.SourceTimestamp = result.Timestamp;
            readEvent.ServerTimestamp = result.Timestamp;
            if (result.Quality == OpcDa.Quality.Good)
            {
                readEvent.Quality = Quality.Good;
            }
            if (result.Quality == OpcDa.Quality.Bad)
            {
                readEvent.Quality = Quality.Bad;
            }

            return(readEvent);
        }
Exemplo n.º 2
0
 public object[] Read(ReadParameter[] readParameters)
 {
     lock (_itemValues)
     {
         if (_canSubscribe)
         {
             SubscribeToRead(readParameters);
         }
         var result = new object[readParameters.Length];
         if (_canSubscribe)
         {
             for (var i = 0; i < readParameters.Length; i++)
             {
                 result[i] = _itemValues[readParameters[i].Address];
             }
         }
         else
         {
             var items = readParameters.Select(p => new Item
             {
                 ItemName = p.Address
             }).ToArray();
             var itemValues = _server.Read(items);
             for (var i = 0; i < readParameters.Length; i++)
             {
                 result[i] = itemValues[i].Value;
             }
         }
         return(result);
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Read a tag
        /// </summary>
        /// <typeparam name="T">The type of tag to read</typeparam>
        /// <param name="tag">The fully-qualified identifier of the tag. You can specify a subfolder by using a comma delimited name.
        /// E.g: the tag `foo.bar` reads the tag `bar` on the folder `foo`</param>
        /// <returns>The value retrieved from the OPC</returns>
        public T Read <T>(string tag)
        {
            var item = new OpcDa.Item {
                ItemName = tag
            };
            var result = _server.Read(new[] { item })[0];

            CheckResult(result, tag);

            return((T)result.Value);
        }
Exemplo n.º 4
0
        static void Main(string[] args)
        {
            Opc.Da.Server server = new Opc.Da.Server(new OpcCom.Factory(), new URL
            {
                Path   = @"Matrikon.OPC.Simulation.1",
                Scheme = Opc.UrlScheme.DA
            });
            server.Connect();

            //Write Values
            int       counter  = 1;
            ItemValue item     = new ItemValue("Bucket Brigade.TestWrite");
            var       itemList = new List <ItemValue>();

            itemList.Add(item);
            Item item_read = new Item();

            item_read.ItemName = "Bucket Brigade.TestWrite";
            item_read.Active   = true;
            List <Item> readItems = new List <Item>();

            readItems.Add(item_read);
            while (true)
            {
                item.Value = "Testing" + counter;
                server.Write(itemList.ToArray());
                counter++;

                var result = server.Read(readItems.ToArray());
                foreach (var value in result)
                {
                    System.Console.WriteLine(value.ItemName + " : " + value.Value.ToString());
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Read a tag
        /// </summary>
        /// <typeparam name="T">The type of tag to read</typeparam>
        /// <param name="tag">The fully-qualified identifier of the tag. You can specify a subfolder by using a comma delimited name.
        /// E.g: the tag `foo.bar` reads the tag `bar` on the folder `foo`</param>
        /// <returns>The value retrieved from the OPC</returns>
        public T Read <T>(string tag)
        {
            var item = new OpcDa.Item {
                ItemName = tag
            };

            if (Status == OpcStatus.NotConnected)
            {
                throw new OpcException("Server not connected. Cannot read tag.");
            }
            var result = _server.Read(new[] { item })[0];

            CheckResult(result, tag);
            T casted;

            TryCastResult(result.Value, out casted);
            return(casted);
        }
Exemplo n.º 6
0
        public static ItemValueResult[] ReadValue(string nodeName)
        {
            Opc.ItemIdentifier itemId = new Opc.ItemIdentifier(nodeName);
            Item it = new Item(itemId);

            ItemValueResult[] results = server.Read(new Item[] { it });

            return(results);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Чтение одного конкретного значения.
        /// В случае успешного чтения возвращает значение в формате string.
        /// Если чтение не удалось, возвращает пустую строку
        /// </summary>
        /// <param name="itemName"> название значения на OPC сервере </param>
        public string Read(string itemName)
        {
            var result = new ItemValueResult[1];

            var items = new Item[1];

            items[0] = new Opc.Da.Item
            {
                ItemName = itemName
            };
            try
            {
                result = serverHandle.Read(items);
                return(result[0].Value.ToString());
            }
            catch (Exception exception)
            {
                Console.WriteLine("Reading value failed - status: {0}", exception);
            }

            return("");
        }
Exemplo n.º 8
0
        /// <summary>
        /// Read values from OPC tags specified in 'itemCollection' array.
        /// </summary>
        /// <returns>Array containing the current values of the OPC tags</returns>
        public ItemValueResult[] Read(Item[] itemCollection)
        {
            if (itemCollection == null)
            {
                return(null);
            }

            if (!_server.IsConnected)
            {
                throw new Exception("Not connected to OPC server");
            }

            return(_server.Read(itemCollection));
        }
Exemplo n.º 9
0
        private string Read(string tag)
        {
            var items = new Item[1];

            items[0] = new Item(new ItemIdentifier(tag));
            try
            {
                ItemValueResult[] values = _server.Read(items);
                string            value  = values[0].Value.ToString();
                return(value);
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
                MessageBox.Show(@"Ошибка построения таблицы: Проверте правельность парметров конфигуратора.");
                throw;
            }
        }
Exemplo n.º 10
0
        public object[] Read(ReadParameter[] readParameters)
        {
            var items = new Item[readParameters.Length];

            for (var i = 0; i < readParameters.Length; i++)
            {
                items[i] = new Item {
                    ItemName = readParameters[i].Address
                };
            }
            var itemValues = _server.Read(items);
            var result     = new Object[itemValues.Length];

            for (var i = 0; i < itemValues.Length; i++)
            {
                result[i] = itemValues[i].Value;
            }
            return(result);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Сигнал со словарем свойств сигнала (propID массив идентификаторов сигнала)
        /// </summary>
        public static string GetPropertyValue(Opc.Da.Server server_da, string tagName, int PropID)
        {
            string tempString = "";

            try
            //Соединяемся с сервером и считываем свойство сигнала PropID
            {
                EventLog.WriteEntry("test", tagName);
                Opc.Da.Item[] temp = new Opc.Da.Item[1];

                temp[0] = new Opc.Da.Item(new Opc.ItemIdentifier(tagName));

                Opc.Da.ItemValueResult[] values = server_da.Read(temp);

                PropertyID[] propId = new PropertyID[1];

                ItemIdentifier[]         itemProp = new ItemIdentifier[] { new ItemIdentifier(tagName) };
                ItemPropertyCollection[] propCollection;
                //EventLog.WriteEntry("test", "GetProperties - " + itemProp[0].ItemName + "; name - " + propId[0].Name);
                propCollection = server_da.GetProperties(itemProp, null, true);

                //EventLog.WriteEntry("test", "GetProperties - ok");
                if (propCollection.Count() > 0)
                {
                    foreach (Opc.Da.ItemProperty prop in propCollection[0])
                    {
                        if (prop.ID.Code == PropID)
                        {
                            tempString = System.Convert.ToString(prop.Value);
                        }
                    }
                }
            }
            catch
            //В случае неудачного чтения, возвращаем null
            {
                tempString = null;
            }
            return(tempString);
        }
Exemplo n.º 12
0
        void ReadMeasurement(PolledMeasurement measurement)
        {
            var item = new OpcDa.Item {
                ItemName = measurement.Path
            };

            if (l_server == null || l_server.GetStatus().ServerState != OpcDa.serverState.running)
            {
                l_logger.ErrorFormat(string.Format("Server not connected. Cannot read path {0}.", measurement.Name));
                throw new Exception(string.Format("Server not connected. Cannot read path {0}.", measurement.Name));
            }
            var result = l_server.Read(new[] { item })[0];

            if (result == null)
            {
                l_logger.Error("the server replied with an empty response!!!");
                throw new Exception("the server replied with an empty response");//if any item cannot read, throw exeption
            }
            if (result.ResultID.ToString() != "S_OK")
            {
                l_logger.ErrorFormat(string.Format("Invalid response from the server. (Response Status: {0}, Opc Tag: {1})", result.ResultID, measurement.Path));
                throw new Exception(string.Format("Invalid response from the server. (Response Status: {0}, Opc Tag: {1})", result.ResultID, measurement.Path));
            }

            OpcMetric metric = new OpcMetric()
            {
                Measurement = measurement,
                Opcstatus   = result.ResultID.ToString(),
                OpcValue    = result.Value,
                Timestamp   = result.Timestamp
            };

            if (OpcHelper.QualifyMetric(ref metric, l_cache))
            {
                l_cache[metric.Measurement.Name] = metric.OpcValue;
                l_metricCollection.Add(metric);
            }
        }
Exemplo n.º 13
0
        public void Work()
        {
            int i = 5;

            if (i == 1)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                Opc.Da.Item[] itemCollection = new Opc.Da.Item[1];
                itemCollection[0] = new Opc.Da.Item {
                    ItemName = "RTOS.TEST.PV", MaxAge = -1
                };
                Opc.Da.ItemValueResult[] result = server.Read(itemCollection);

                Console.WriteLine(result[0].Value);
                server.Disconnect();
            }
            else if (i == 2)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                groupState              = new Opc.Da.SubscriptionState();
                groupState.Name         = "Group";
                groupState.ServerHandle = null;
                groupState.ClientHandle = Guid.NewGuid().ToString();
                groupState.Active       = true;
                groupState.UpdateRate   = 1000;
                groupState.Deadband     = 0;
                groupState.Locale       = null;

                groupRead = (Opc.Da.Subscription)server.CreateSubscription(groupState);


                string[] itemName = { "RTOS.TEST.PV", "RTOR.TI1237.DACA.PV" };

                Opc.Da.Item[] items = new Opc.Da.Item[2];

                for (int j = 0; j < items.Length; j++)
                {
                    items[j] = new Opc.Da.Item();
                    items[j].ClientHandle = Guid.NewGuid().ToString();
                    items[j].ItemPath     = null;
                    items[j].ItemName     = itemName[j];
                }

                groupRead.AddItems(items);
                //groupRead.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);

                Opc.Da.ItemValueResult[] results = groupRead.Read(groupRead.Items);
                foreach (ItemValueResult result in results)
                {
                    Console.WriteLine("{0},{1},{2},{3}", result.ItemName, result.Value, result.Quality, result.Timestamp);
                }
                //groupRead.DataChanged -= new Opc.Da.DataChangedEventHandler(group_DataChanged);

                groupRead.RemoveItems(groupRead.Items);
                server.CancelSubscription(groupRead);
                groupRead.Dispose();
                server.Disconnect();
            }
            else if (i == 3)
            {
                url    = new Opc.URL("opcda://192.168.0.4/OPC.PHDServerDA.1");
                server = new Opc.Da.Server(fact, null);
                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                groupState              = new Opc.Da.SubscriptionState();
                groupState.Name         = "Group";
                groupState.ServerHandle = null;
                groupState.ClientHandle = Guid.NewGuid().ToString();
                groupState.Active       = true;
                groupState.UpdateRate   = 1000;
                groupState.Deadband     = 0;
                groupState.Locale       = null;

                groupWrite = (Opc.Da.Subscription)server.CreateSubscription(groupState);

                string[] itemName = { "RTOS.TEST.PV", "RTOS.TEST2.PV" };

                Opc.Da.Item[] items = new Opc.Da.Item[2];

                for (int j = 0; j < items.Length; j++)
                {
                    items[j] = new Opc.Da.Item();
                    items[j].ClientHandle = Guid.NewGuid().ToString();
                    items[j].ItemPath     = null;
                    items[j].ItemName     = itemName[j];
                }

                groupWrite.AddItems(items);

                //groupRead.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);

                Opc.Da.ItemValue[] writeValues = new Opc.Da.ItemValue[groupWrite.Items.Length];
                for (int k = 0; k < groupWrite.Items.Length; k++)
                {
                    writeValues[k] = new Opc.Da.ItemValue((ItemIdentifier)groupWrite.Items[k]);
                }

                writeValues[0].Value = 5;
                writeValues[1].Value = 6;

                groupWrite.Write(writeValues);

                Console.WriteLine("Press any key to close...");
                Console.ReadLine();

                //groupRead.DataChanged -= new Opc.Da.DataChangedEventHandler(group_DataChanged);

                groupWrite.RemoveItems(groupWrite.Items);
                server.CancelSubscription(groupWrite);
                groupWrite.Dispose();
                server.Disconnect();
            }
            else if (i == 4)
            {
                url       = new Opc.URL("opchda://192.168.0.4/OPC.PHDServerHDA.1");
                serverHda = new Opc.Hda.Server(fact, null);
                serverHda.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                try
                {
                }
                catch (Opc.ConnectFailedException opcConnEx)
                {
                    Console.WriteLine(string.Format("Could not connect to server {0}", "OPC.PHDServerHDA.1"));
                    Console.WriteLine(opcConnEx.ToString());
                }

                Console.WriteLine("Are we connected? " + serverHda.IsConnected);

                string[] itemName = { "RTOS.TEST.PV", "RTOS.TEST2.PV" };

                Opc.Hda.Trend groupHda = new Trend(serverHda);

                groupHda.Name        = "HDA";
                groupHda.AggregateID = AggregateID.NOAGGREGATE;
                DateTime startTime = DateTime.Now.AddHours(-1);
                DateTime endTime   = DateTime.Now;
                groupHda.StartTime     = new Opc.Hda.Time(startTime);
                groupHda.EndTime       = new Opc.Hda.Time(endTime);
                groupHda.MaxValues     = 0;
                groupHda.IncludeBounds = false;

                serverHda.Trends.Add(groupHda);

                Opc.Hda.Item[] items = new Opc.Hda.Item[2];
                for (int m = 0; m < 2; m++)
                {
                    items[m]              = new Opc.Hda.Item();
                    items[m].ItemName     = itemName[m];
                    items[m].ItemPath     = null;
                    items[m].ClientHandle = Guid.NewGuid().ToString();
                }

                IdentifiedResult[] identifiedResult = serverHda.CreateItems(items);

                if (identifiedResult != null)
                {
                    foreach (IdentifiedResult item in identifiedResult)
                    {
                        if (item.ResultID.Succeeded())
                        {
                            groupHda.Items.Add(new Opc.Hda.Item(item));
                        }
                    }
                }

                Opc.Hda.ItemValueCollection[] results = groupHda.ReadRaw();

                Opc.Hda.ItemValueCollection result1 = results[0];

                foreach (Opc.Hda.ItemValue result in result1)
                {
                    Console.WriteLine("{0},{1},{2}", result.Value, result.Quality, result.Timestamp);
                }

                serverHda.Disconnect();
            }
            else if (i == 5)
            {
                url       = new Opc.URL("opchda://192.168.0.4/OPC.PHDServerHDA.1");
                serverHda = new Opc.Hda.Server(fact, null);
                serverHda.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

                try
                {
                }
                catch (Opc.ConnectFailedException opcConnEx)
                {
                    Console.WriteLine(string.Format("Could not connect to server {0}", "OPC.PHDServerHDA.1"));
                    Console.WriteLine(opcConnEx.ToString());
                }

                Console.WriteLine("Are we connected? " + serverHda.IsConnected);

                string[] itemName = { "RTOR.TI1237.DACA.PV", "RTOS.TEST2.PV" };

                Opc.Hda.Trend groupHda = new Trend(serverHda);

                groupHda.Name        = "HDA";
                groupHda.AggregateID = AggregateID.AVERAGE;

                DateTime startTime = DateTime.Now.AddHours(-1);
                DateTime endTime   = DateTime.Now;
                //TimeSpan span = endTime.Subtract(startTime);
                //int calcInterval = ((int)span.TotalSeconds);
                //groupHda.ResampleInterval = (decimal)calcInterval;

                //DateTime startTime = new DateTime(2020, 6, 12, 9, 0, 0, 0);
                //DateTime endTime = new DateTime(2020, 6, 12, 10, 0, 0, 0);
                int calcInterval = 300;
                groupHda.ResampleInterval = (decimal)calcInterval;


                groupHda.StartTime     = new Opc.Hda.Time(startTime);
                groupHda.EndTime       = new Opc.Hda.Time(endTime);
                groupHda.MaxValues     = 0;
                groupHda.IncludeBounds = false;

                serverHda.Trends.Add(groupHda);

                Opc.Hda.Item[] items = new Opc.Hda.Item[2];
                for (int m = 0; m < 2; m++)
                {
                    items[m]              = new Opc.Hda.Item();
                    items[m].ItemName     = itemName[m];
                    items[m].ItemPath     = null;
                    items[m].ClientHandle = Guid.NewGuid().ToString();
                }

                IdentifiedResult[] identifiedResult = serverHda.CreateItems(items);

                if (identifiedResult != null)
                {
                    foreach (IdentifiedResult item in identifiedResult)
                    {
                        if (item.ResultID.Succeeded())
                        {
                            groupHda.Items.Add(new Opc.Hda.Item(item));
                        }
                    }
                }

                Opc.Hda.ItemValueCollection[] results = groupHda.ReadProcessed();

                Opc.Hda.ItemValueCollection result1 = results[0];

                foreach (Opc.Hda.ItemValue result in result1)
                {
                    Console.WriteLine("{0},{1},{2}", result.Value, result.Quality, result.Timestamp);
                }

                serverHda.Disconnect();
            }
        }
Exemplo n.º 14
0
        public string[] GetDataType(List <OPCChannelInfo> Subscribed)
        {
            string serverName = txtOPCServer.Text;
            string hostName   = txtOPCServerPath.Text;

            _server = new Server(fact, null)
            {
                Url = new URL(hostName + "/" +
                              serverName)
            };
            _server.Connect();

            SubscribedCollection = new List <string>();

            for (int i = 0; i < Subscribed.Count; i++)
            {
                SubscribedCollection.Add(Subscribed[i].channel);
            }

            if (SubscriptionOPC == null)
            {
                SubscriptionState.Name = "SubscribedGroup";

                SubscriptionOPC = (Subscription)_server.CreateSubscription(SubscriptionState);
            }
            SubscribedItems = new Item[SubscribedCollection.Count];



            for (int i = 0; i < SubscribedCollection.Count; i++)
            {
                SubscribedItems[i] = new Item
                {
                    ItemName     = SubscribedCollection[i],
                    SamplingRate = 200,
                    Active       = true,
                    ClientHandle = i
                };
            }
            ItemResult = SubscriptionOPC.AddItems(SubscribedItems);

            ItemValue[] values = _server.Read(SubscribedItems);

            int ArraySize = values.Length;

            if (values[0].Value is Array)
            {
                ArraySize = ((Array)values[0].Value).Length - 1;
            }

            string[] ReturnValues = new string[ArraySize];
            for (int i = 0; i < values.Length; i++)
            {
                if (values[i].Value is string)
                {
                    ReturnValues[i] = "String";
                }

                if (values[i].Value is bool)
                {
                    ReturnValues[i] = "Bit";
                }
                else if (values[i].Value is byte)
                {
                    ReturnValues[i] = "Byte";
                }
                else if (values[i].Value is float)
                {
                    ReturnValues[i] = "Float";
                }
                else if (values[i].Value is char)
                {
                    ReturnValues[i] = "char";
                }
                else if (values[i].Value is short)
                {
                    ReturnValues[i] = "Short";
                }
                else if (values[i].Value is int)
                {
                    ReturnValues[i] = "Int";
                }
                else if (values[i].Value is double)
                {
                    ReturnValues[i] = "Double";
                }
                else if (values[i].Value is Array)
                {
                    ReturnValues[i] = "Array";
                }
                else if (values[i].Value is uint)
                {
                    ReturnValues[i] = "UInt";
                }
                else if (values[i].Value is ushort)
                {
                    ReturnValues[i] = "UShort";
                }
                //else
                //{
                //    ReturnValues[i] = "null";
                //}
            }

            if (_server != null)
            {
                if (_server.IsConnected)
                {
                    try
                    {
                        _server.Disconnect();
                    }
                    catch
                    {
                    }
                }

                _server.Dispose();
            }
            return(ReturnValues);
        }
Exemplo n.º 15
0
        void ThreadJob()
        {
            try
            {
                srv = new Opc.Da.Server(new OpcCom.Factory(), new Opc.URL(fullServerName));
                srv.Connect();
                if (!srv.IsConnected)
                {
                    throw new Exception("не удалось подключиться к серверу OPC");
                }
            }
            catch
            {
                if (refMainWindow != null)
                {
                    refMainWindow.Dispatcher.Invoke(refMainWindow.ofsFail);
                }
                return;
            }
            bool isFirstCycle = true;

            while (true)
            {
                //-------------- OPC ----------------
                opcitems.Clear();
                foreach (DIStruct di in DIStruct.items)
                {
                    if ((di.OPCtag != "" && di.IsChanged && di.En) || (isFirstCycle))
                    {
                        itm = new Opc.Da.ItemValue(Properties.Settings.Default.OPCDevice + '!' + di.OPCtag)
                        {
                            Value = di.ValDI ^ di.InvertDI
                        };
                        opcitems.Add(itm);
                        di.IsChanged = false;
                    }
                }

                foreach (AIStruct ai in AIStruct.items)
                {
                    if ((ai.OPCtag != "" && ai.IsChanged && ai.En) || (isFirstCycle))
                    {
                        itm = new Opc.Da.ItemValue(Properties.Settings.Default.OPCDevice + '!' + ai.OPCtag);
                        if (ai.PLCDestType == EPLCDestType.Float)
                        {
                            itm.Value = ai.fValAI;
                        }
                        else
                        {
                            itm.Value = ai.ValACD;
                        }

                        opcitems.Add(itm);
                        ai.IsChanged = false;
                    }
                }
                try
                {
                    // Записываем сигналы DI AI
                    srv.Write(opcitems.ToArray());

                    //читаем сигналы DO для которых задан тег
                    if (opcDOItemsForRead.Length > 0)
                    {
                        readResult = srv.Read(opcDOItemsForRead);

                        for (int i = 0; i < readResult.Length; i++)
                        {
                            try
                            {
                                arrayDO[i].ValDO = (bool)readResult[i].Value;
                            }
                            catch
                            {
                            }
                        }
                    }

                    //читаем сигналы AO для которых задан тег
                    if (opcAOItemsForRead.Length > 0)
                    {
                        readResult = srv.Read(opcAOItemsForRead);
                        for (int i = 0; i < readResult.Length; i++)
                        {
                            try
                            {
                                if (arrayAO[i].PLCDestType == EPLCDestType.ADC)
                                {
                                    object val = readResult[i].Value;
                                    if (val is short)
                                    {
                                        arrayAO[i].ValACD = (ushort)((Int16)readResult[i].Value);
                                    }
                                    if (val is ushort)
                                    {
                                        arrayAO[i].ValACD = (UInt16)readResult[i].Value;
                                    }
                                }
                                else
                                {
                                    arrayAO[i].fVal = (float)readResult[i].Value;
                                }
                            }
                            catch
                            {
                            }
                        }
                        Debug.WriteLine(opcAOItemsForRead.Length.ToString() + " AO tags read");
                    }
                }

                catch
                {
                    //System.Windows.Forms.MessageBox.Show("OPC Thread exception:\n\r" + ex.Message);
                    //  LogWriter.AppendLog("Чтение по OPC прервано"+Environment.NewLine);
                    if (refMainWindow != null)
                    {
                        refMainWindow.Dispatcher.Invoke(refMainWindow.ofsFail);
                    }
                }
                isFirstCycle = false;
                Thread.Sleep(period);
                if (isAbortRequested)
                {
                    return;
                }
            }//loop
        }