コード例 #1
0
ファイル: OpcUtilHelper.cs プロジェクト: AlphaNugie/CommonLib
        /// <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);
        }
コード例 #2
0
        /// <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
        }
コード例 #3
0
        /// <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);
        }