/// <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); }
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); } } }
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); }
/// <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(); //断开服务器连接 //不相关的 }
/// <summary> /// 断开与OPC服务连接,并释放资源 /// </summary> public void Disconect() { itemIndexDic.Clear(); //移除组内item subscription.RemoveItems(subscription.Items); //通知服务器要求删除组。 m_server.CancelSubscription(subscription); subscription.Dispose(); m_server.Disconnect(); }
public void UnsubscribeAll() { try { serverHandle.CancelSubscription(subscription); } catch (Exception exception) { Console.WriteLine("Error in Unsubscribing {0}", exception); } }
/// <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(); // 断开服务器连接 } }
/// <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()); } }
/// <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; }
/// <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); }
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(); } }