/// <summary> /// 设置默认的OPC项,假如已添加,则移除后再重新添加(同一时刻默认标签只有一个) /// </summary> /// <param name="itemId">标签ID</param> /// <param name="clientHandle">标签的客户端句柄</param> /// <param name="message">返回的错误信息</param> /// <returns></returns> public bool SetItem(string itemId, int clientHandle, out string message) { try { if (DefaultGroupInfo == null) { message = "未找到默认组"; return(false); } //初始化OPC项信息并在默认OPC组中添加 List <OpcItemInfo> list = new List <OpcItemInfo>() { new OpcItemInfo(itemId, clientHandle) }; DefaultGroupInfo.SetItems(list, out message); if (DefaultGroupInfo.ItemCount > 0) { OpcItemInfo item = DefaultGroupInfo.ListItemInfo.Last(); //保存默认OPC项的客户端句柄,服务端句柄,标签名称 ItemHandleClient = item.ClientHandle; ItemId = item.ItemId; ItemHandleServer = item.ServerHandle; } } catch (Exception ex) { ItemHandleClient = 0; message = "移除或添加标签时发生错误:" + ex.Message; return(false); } return(true); }
/// <summary> /// 根据给定的OPC项集合信息添加OPC项 /// </summary> /// <param name="items">给出添加OPC项时所需信息的集合</param> /// <param name="message">返回信息</param> /// <returns></returns> public bool SetItems(IEnumerable <OpcItemInfo> items, out string message) { message = string.Empty; if (items == null || items.Count() == 0) { return(false); } try { //假如已存在OPC项,先移除 if (ItemCount > 0) { OpcGroup.OPCItems.Remove(ItemCount, ref _serverHandles, out _errors); } List <OpcItemInfo> itemList = items.Where(item => !string.IsNullOrWhiteSpace(item.ItemId)).ToList(); //排除id为空的项(后面将重新添加),转换为新List对象,防止枚举改变对象时出现未知影响 ListItemInfo.Clear(); ListItemInfo.Add(_opcPackBasic); itemList.Insert(0, _opcPackBasic); _itemIds = itemList.Select(p => p.ItemId).ToArray(); _clientHandles = itemList.Select(p => p.ClientHandle).ToArray(); OpcGroup.OPCItems.AddItems(itemList.Count - 1, ref _itemIds, ref _clientHandles, out _serverHandles, out _errors); ////添加OPC项后根据ID找到OPC项信息对象并设置服务端句柄,向OPC项信息List中添加 //添加OPC项后根据客户端句柄找到OPC项信息对象并设置服务端句柄,向OPC项信息List中添加 if (_itemIds.Length > 1) { //Type type = _dataSource?.GetType(); for (int i = 1; i < _itemIds.Length; i++) { //OpcItemInfo itemInfo = itemList.Find(p => p.ItemId.Equals(_itemIds.GetValue(i))); OpcItemInfo itemInfo = itemList.Find(p => p.ClientHandle.Equals(int.Parse(_clientHandles.GetValue(i).ToString()))); itemInfo.ServerHandle = int.Parse(_serverHandles.GetValue(i).ToString()); itemInfo.InitTargetProperty(_dataSource); //if (type != null && !string.IsNullOrWhiteSpace(itemInfo.FieldName)) // itemInfo.Property = type.GetProperty(itemInfo.FieldName); ListItemInfo.Add(itemInfo); } } //假如添加后的数量对不上,则至少有一个OPC项未添加成功 if (ListItemInfo.Count < itemList.Count) { message = "至少有1个OPC项未添加成功"; } } catch (Exception ex) { message = string.Format("OPC组{0}移除或添加标签时发生错误:{1}", OpcGroup.Name, ex.Message); return(false); } return(ListItemInfo.Count > 1); //假如至少有1个添加成功,返回true }
/// <summary> /// 为OPC组OPC项List内与给定服务端句柄对应的OPC项读取数据 /// </summary> /// <param name="serverHandles">服务端句柄Array</param> /// <param name="message">返回信息</param> /// <returns></returns> public bool ReadValues(Array serverHandles, out string message) { message = string.Empty; Array values; try { IEnumerable <int> temp = serverHandles == null || serverHandles.Length == 0 ? null : serverHandles.Cast <int>(); Array handles = GetServerHandles(temp); int itemCount = handles.Length - 1; //OPCDataSource指定的是OPCCache或者OPCDevice //它的含义是当你执行同步读操作时,读取的数据来自OPC服务器的缓存还是来自硬件设备 OpcGroup.SyncRead((short)OPCDataSource.OPCDevice, itemCount, ref handles, out values, out _errors, out object qualities, out object timeStamps); //假如至少读取到1个值,根据服务端句柄找到OPC项信息并更新值 if (values.Length > 0) { for (int i = 1; i <= values.Length; i++) { OpcItemInfo itemInfo = ListItemInfo.Find(item => item.ServerHandle.Equals(handles.GetValue(i))); if (itemInfo != null) { itemInfo.Value = values.GetValue(i).ToString(); itemInfo.SetPropertyValue(_dataSource); } } } if (values.Length < itemCount) { message = "至少有1个OPC项的值未找到"; } GC.Collect(); } catch (Exception ex) { message = string.Format("从名称为{0}的OPC组读取值失败:{1}", OpcGroup == null ? "null" : OpcGroup.Name, ex.Message); return(false); } return(values.Length > 0); }