Exemplo n.º 1
0
        /// <summary>
        /// Monitor the specified tag for changes
        /// </summary>
        /// <typeparam name="T">the type of tag to monitor</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` monitors the tag `bar` on the folder `foo`</param>
        /// <param name="callback">the callback to execute when the value is changed.
        /// The first parameter is the new value of the node, the second is an `unsubscribe` function to unsubscribe the callback</param>
        public void Monitor <T>(string tag, Action <T, Action> callback)
        {
            var subItem = new OpcDa.SubscriptionState
            {
                Name       = (++_sub).ToString(CultureInfo.InvariantCulture),
                Active     = true,
                UpdateRate = DefaultMonitorInterval
            };
            var sub = _server.CreateSubscription(subItem);

            // I have to start a new thread here because unsubscribing
            // the subscription during a datachanged event causes a deadlock
            Action unsubscribe = () => new Thread(o =>
                                                  _server.CancelSubscription(sub)).Start();

            sub.DataChanged += (handle, requestHandle, values) =>
            {
                T casted;
                TryCastResult(values[0].Value, out casted);
                callback(casted, unsubscribe);
            };
            sub.AddItems(new[] { new OpcDa.Item {
                                     ItemName = tag
                                 } });
            sub.SetEnabled(true);
        }
Exemplo n.º 2
0
        private void SubscribeToRead(ReadParameter[] readParameters)
        {
            var newParameters = readParameters.Where(p => !_itemValues.ContainsKey(p.Address)).ToArray();

            if (!newParameters.Any())
            {
                return;
            }
            var items = newParameters.Select(p => new Item
            {
                ItemName = p.Address
            }).ToArray();

            try
            {
                _group.AddItems(items);
            }
            catch
            {
                _server.CancelSubscription(_group);
                _canSubscribe = false;
            }
            if (_canSubscribe)
            {
                var itemValues = _server.Read(items);
                foreach (var itemValue in itemValues)
                {
                    _itemValues.Add(itemValue.ItemName, itemValue.Value);
                }
            }
        }
Exemplo n.º 3
0
        public OpcGroup AddGroup(string groupName)
        {
            OpcGroup _group = new OpcGroup {
                IsActive = true, Name = groupName, UpdateRate = new TimeSpan(0, 0, 0, 0, _options.DefaultMonitorInterval)
            };
            var subItem = new OpcDa.SubscriptionState
            {
                Name       = (++_sub).ToString(CultureInfo.InvariantCulture),
                Active     = true,
                UpdateRate = DefaultMonitorInterval
            };

            var    sub         = _server.CreateSubscription(subItem);
            Action unsubscribe = () => new Thread(o =>
                                                  _server.CancelSubscription(sub)).Start();

            dic.Add(groupName, sub);
            sub.DataChanged += (subscriptionHandle, requestHandle, values) =>
            {
                List <OpcItemValue> items = new List <OpcItemValue>();
                foreach (OpcDa.ItemValueResult value in values)
                {
                    OpcItemValue item = new OpcItemValue {
                        GroupName = groupName, Value = value.Value, ItemId = value.ItemName, Quality = value.Quality.ToString(), Timestamp = value.Timestamp
                    };
                    items.Add(item);
                }
                _group.SendValue(items);
            };
            return(_group);
        }
Exemplo n.º 4
0
 /// <summary>
 /// 断开OPC连接
 /// </summary>
 public void OPC_disconnect()
 {
     OpcGroupClasssubscription.DataChanged -= new Opc.Da.DataChangedEventHandler(this.OnDataChange); //取消回调事件
     OpcGroupClasssubscription.RemoveItems(OpcGroupClasssubscription.Items);                         //移除组内item
     //结束:释放各资源
     OpcGroupClassm_server.CancelSubscription(OpcGroupClasssubscription);                            //m_server前文已说明,通知服务器要求删除组。
     OpcGroupClasssubscription.Dispose();                                                            //强制.NET资源回收站回收该subscription的所有资源。
     OpcGroupClassm_server.Disconnect();                                                             //断开服务器连接
     //不相关的
 }
Exemplo n.º 5
0
 /// <summary>
 /// 断开与OPC服务连接,并释放资源
 /// </summary>
 public void Disconect()
 {
     itemIndexDic.Clear();
     //移除组内item
     subscription.RemoveItems(subscription.Items);
     //通知服务器要求删除组。
     m_server.CancelSubscription(subscription);
     subscription.Dispose();
     m_server.Disconnect();
 }
Exemplo n.º 6
0
 public void UnsubscribeAll()
 {
     try
     {
         serverHandle.CancelSubscription(subscription);
     }
     catch (Exception exception)
     {
         Console.WriteLine("Error in Unsubscribing  {0}", exception);
     }
 }
Exemplo n.º 7
0
 /// <summary>
 /// 断开OPC服务器连接
 /// </summary>
 private void DisConnect()
 {
     if (m_server != null)
     {
         m_subscription.RemoveItems(m_subscription.Items);
         // 结束:释放各资源
         m_server.CancelSubscription(m_subscription); // m_server前文已说明,通知服务器要求删除组。
         m_subscription.Dispose();                    // 强制.NET资源回收站回收该subscription的所有资源。
         m_server.Disconnect();                       // 断开服务器连接
     }
 }
Exemplo n.º 8
0
 /// <summary>
 /// OPC断开连接
 /// </summary>
 public void mOpc_DisConn()
 {
     try
     {
         if (m_Server != null)
         {
             subscription.RemoveItems(subscription.Items);
             //结束:释放各资源
             m_Server.CancelSubscription(subscription); //m_server前文已说明,通知服务器要求删除组。
             subscription.Dispose();                    //强制.NET资源回收站回收该subscription的所有资源。
             m_Server.Disconnect();
         }
     }
     catch (Exception ex)
     {
         throw new Exception("OPC断开函数(mOpc_DisConn)异常:" + ex.ToString());
     }
 }
Exemplo n.º 9
0
        /// <summary>
        /// 断开OPC服务器连接
        /// </summary>
        private void DisConnect()
        {
            if (m_server != null)
            {
                m_subscription.RemoveItems(m_subscription.Items);
                // 结束:释放各资源
                m_server.CancelSubscription(m_subscription); // m_server前文已说明,通知服务器要求删除组。
                m_subscription.Dispose();                    // 强制.NET资源回收站回收该subscription的所有资源。
                m_server.Disconnect();                       // 断开服务器连接
            }

            if (null != m_timer)
            {
                m_timer.Stop();
                m_timer.Close();
                m_timer.Dispose();
            }

            m_lstItemValueResult = null;
            m_lstAckTelegram     = null;
        }
Exemplo n.º 10
0
        /// <summary>
        /// Monitor the specified tag for changes
        /// </summary>
        /// <typeparam name="T">the type of tag to monitor</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` monitors the tag `bar` on the folder `foo`</param>
        /// <param name="callback">the callback to execute when the value is changed.
        /// The first parameter is a MonitorEvent object which represents the data point, the second is an `unsubscribe` function to unsubscribe the callback</param>
        public void Monitor <T>(string tag, Action <ReadEvent <T>, Action> callback)
        {
            var subItem = new OpcDa.SubscriptionState
            {
                Name       = (++_sub).ToString(CultureInfo.InvariantCulture),
                Active     = true,
                UpdateRate = DefaultMonitorInterval
            };
            var sub = _server.CreateSubscription(subItem);

            // I have to start a new thread here because unsubscribing
            // the subscription during a datachanged event causes a deadlock
            Action unsubscribe = () => new Thread(o =>
                                                  _server.CancelSubscription(sub)).Start();

            sub.DataChanged += (handle, requestHandle, values) =>
            {
                T casted;
                TryCastResult(values[0].Value, out casted);
                var monitorEvent = new ReadEvent <T>();
                monitorEvent.Value           = casted;
                monitorEvent.SourceTimestamp = values[0].Timestamp;
                monitorEvent.ServerTimestamp = values[0].Timestamp;
                if (values[0].Quality == OpcDa.Quality.Good)
                {
                    monitorEvent.Quality = Quality.Good;
                }
                if (values[0].Quality == OpcDa.Quality.Bad)
                {
                    monitorEvent.Quality = Quality.Bad;
                }
                callback(monitorEvent, unsubscribe);
            };
            sub.AddItems(new[] { new OpcDa.Item {
                                     ItemName = tag
                                 } });
            sub.SetEnabled(true);
        }
Exemplo n.º 11
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();
            }
        }