/// <summary> /// 读PLC字数据,返回一个Int16型数据 /// </summary> /// <param name="iData">返回数据</param> /// <param name="itemNum">操作的Items,0-sendDB,1-sendflag,2-recvDB,3-recvflag,以此类推</param> /// <returns>true表示成功</returns> public override bool Read(ref Int16 iData, int itemNum) { try { if (m_subscription == null || m_subscription.Items == null || itemNum >= m_subscription.Items.Count()) { return(false); } Item[] r_items = new Item[1]; r_items[0] = m_subscription.Items[itemNum]; ItemValueResult[] values = m_subscription.Read(r_items); if (values[0].Quality == Quality.Good) { iData = System.Convert.ToInt16(values[0].Value); return(true); } else { return(false); } } catch (Exception ex) { CLOGException.Trace("函数CommunicationLib.COPCAccessTimer.Read 异常", CBaseMethods.MyBase.GetExceptionInfo(ex)); return(false); } }
/// <summary> /// 同步方式读取指定item名称的数据内容,不能有重名的数据项 /// </summary> /// <param name="itemNameList">需要读取的数据项名称列表</param> /// <returns>ItemValueResult</returns> public ItemValueResult[] ReadSynchronization(List <string> itemNameList) { List <Item> itemList = new List <Item>(); foreach (string itemName in itemNameList) { if (itemIndexDic.ContainsKey(itemName)) { itemList.Add(subscription.Items[itemIndexDic[itemName]]); } } return(subscription.Read(itemList.ToArray())); }
private void EnableDataReadCallback(Subscription group) { Opc.IRequest req; group.Read(group.Items, 44.0, new ReadCompleteEventHandler(ReadCompleteCallback), out req); Console.WriteLine(); group.State.Active = true; }
/// <summary> /// 读数据 /// </summary> /// <param name="opcDataItem"></param> /// <returns></returns> public OpcDataItem Read(OpcDataItem opcDataItem) { OpcDataItem opcDataItemResult = null; //如果未连接那么返回 if (!this.IsConnected) { if (!Equals(null, OnErrorHappened)) { OnErrorHappened(this, new OpcErrorEventArgs(OpcResult.E_FAIL, "Opc服务器未连接,请先连接再读取数据项", null)); } return(opcDataItemResult); } try { if (Equals(null, opcDataItem)) { throw new ArgumentNullException("opcDataItem参数不能为空。"); } Opc.Da.Subscription tmpSubscription = this.opcServer.Subscriptions.Cast <Opc.Da.Subscription>().FirstOrDefault(a => a.State.UpdateRate == opcDataItem.UpdateRate); var item = tmpSubscription.Items.Where(a => a.ItemName == opcDataItem.Name); var results = tmpSubscription.Read(item.ToArray()); OpcResult opcResult; if (results.Count() < 1 && !Equals(null, OnErrorHappened)) { opcResult = OpcResult.E_UNKNOWN_ITEM_NAME; OnErrorHappened(this, new OpcErrorEventArgs(opcResult, "读取数据项时发生错误,未找到数据项:" + opcDataItem.Name, null)); opcDataItem.Quality = OpcResult.E_UNKNOWN_ITEM_NAME; return(opcDataItem); } foreach (var v in results) { Enum.TryParse <OpcResult>(v.ResultID.ToString(), out opcResult); opcDataItemResult = this.OpcDataItems.FirstOrDefault(a => a.Name == opcDataItem.Name); opcDataItemResult.Quality = opcResult; opcDataItemResult.OldValue = opcDataItemResult.NewValue; opcDataItemResult.NewValue = v.Value; if (v.ResultID != Opc.ResultID.S_OK && !Equals(null, OnErrorHappened)) { Enum.TryParse <OpcResult>(v.ResultID.ToString(), out opcResult); OnErrorHappened(this, new OpcErrorEventArgs(opcResult, "读取数据项时发生错误:" + v.ResultID.Name, null)); } }//end foreach return(opcDataItemResult.Clone() as OpcDataItem); } catch (Exception ex) { if (!Equals(null, OnErrorHappened)) { OnErrorHappened(this, new OpcHelper.OpcErrorEventArgs(OpcResult.E_FAIL, "读取数据时错误。", ex)); } return(opcDataItemResult); } }
/// <summary> /// OPC同步读一个数据 /// </summary> /// <param name="itemName"></param> /// <returns></returns> public string SynReadOpcItem(string itemName) { try { var item = FindOpcItem(itemName); Item[] readItems = { item }; ItemValueResult[] itemValues = OpcGroupClasssubscription.Read(readItems); ItemValueResult itemValue = itemValues[0]; if (itemValue.Quality == Quality.Bad) { return(null); } else { return(itemValue.Value.ToString()); } } catch (Exception ex) { return(null); } }
/// <summary> /// 读取一个字型数据 /// </summary> /// <param name="data">字型数据</param> /// <param name="itemNum">需读取的项号</param> /// <returns></returns> public bool Read(ref Int16 data, int itemNum) { try { Item[] m_items = new Item[1]; m_items[0] = subscription.Items[itemNum]; ItemValueResult[] values = subscription.Read(m_items); if (values[0].Quality == Quality.Good) { data = (Int16)values[0].Value; return(true); } else { return(false); } } catch (Exception ex) { throw new Exception("opc函数Read异常:" + ex.Message); } }
/// <summary> /// 读取PLC发送的全部数据 /// </summary> /// <param name="plcpara"></param> public void Readall(ref PLCPara plcpara) { ItemValueResult[] res = subscription.Read(subscription.Items); System.Type tPLC = plcpara.GetType(); foreach (ItemValueResult item in res) { string key = item.ItemName.Split('.')[2]; //利用反射将更改的值绑定到实体 //todo 可能存在异常情况 if (null != tPLC.GetField(key)) { tPLC.GetField(key).SetValue(plcpara, Opc.Convert.ChangeType(item.Value, tPLC.GetField(key).FieldType)); } } }
/// <summary> /// Synchronize read from the OPC Server /// </summary> /// <param name="results"></param> /// <returns></returns> public bool SyncRead(ref Opc.Da.ItemValueResult[] results) { if (Subscription == null) { return(false); } try { results = Subscription.Read(Subscription.Items); } catch (Exception e) { throw e; } return(results != null && results.Length != 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(); } }