コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <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()));
        }
コード例 #3
0
 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;
 }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
 /// <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);
     }
 }
コード例 #6
0
ファイル: COpcServerCOM.cs プロジェクト: moruiyi/Parking2013
 /// <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);
     }
 }
コード例 #7
0
 /// <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));
         }
     }
 }
コード例 #8
0
ファイル: OpcClient.cs プロジェクト: simple555a/OpcLib.Net
        /// <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);
        }
コード例 #9
0
ファイル: Program.cs プロジェクト: ChemIter2018/OPCClient
        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();
            }
        }