示例#1
0
 /// <summary>
 /// 在队列中增加一个消息
 /// </summary>
 /// <param name="item"></param>
 public void Add(TIRAPOPCTagValueItem item)
 {
     lock (_lockObject)
     {
         queue.Enqueue(item);
     }
 }
示例#2
0
        public TOPCTagValueThread(TIRAPOPCTagValueItem item)
        {
            count++;
            AllThreadID++;
            threadID = AllThreadID;

            this.item = item;
            Debug.WriteLine(string.Format("创建线程对象,当前线程号[#{0}],一共有 [{1}] 个线程对象", threadID, count));
        }
示例#3
0
        /// <summary>
        /// 每当项数据有变化时执行的事件
        /// </summary>
        /// <param name="transactionID"></param>
        /// <param name="numItems"></param>
        /// <param name="clientHandles"></param>
        /// <param name="itemValues"></param>
        /// <param name="qualities"></param>
        /// <param name="timeStamp"></param>
        private void KepGroup_DataChange(
            int transactionID,
            int numItems,
            ref Array clientHandles,
            ref Array itemValues,
            ref Array qualities,
            ref Array timeStamp)
        {
            for (int i = 1; i <= numItems; i++)
            {
                try
                {
                    string strValue   = "";
                    int    idxTagName = -1;

                    idxTagName = int.Parse(clientHandles.GetValue(i).ToString()) - 1;

                    if (idxTagName >= 0 && idxTagName < tags.Count)
                    {
                        if (itemValues.GetValue(i) != null)
                        {
                            strValue = itemValues.GetValue(i).ToString();
                        }

                        TIRAPOPCTagValueItem item = new TIRAPOPCTagValueItem()
                        {
                            KepServerAddress = ipKepServer,
                            KepServerName    = nameKepServer,
                            TagName          = tags[idxTagName].TagName,
                            Value            = strValue,
                            Quality          = qualities.GetValue(i).ToString(),
                            TimeStamp        = timeStamp.GetValue(i).ToString(),
                            ReceiveTime      = DateTime.Now,
                        };

                        //Console.WriteLine(
                        //    string.Format(
                        //        "[{0}]收到消息事件:TagName[{1}],Value[{2}],TimeStamp[{3}]",
                        //        DateTime.Now.ToString("HH:mm:ss.fff"),
                        //        item.TagName, item.Value, item.TimeStamp));

                        // 将收到的消息放入待处理消息队列中
                        //TIRAPOPCTagValueItemQueue.Instance.Add(item);
                        //Debug.WriteLine(
                        //    string.Format(
                        //        "入队:TagName[{0}],Value[{1}],Quality[{2}],TimeStamp[{3}],共[{4}]条消息",
                        //        item.TagName, item.Value, item.Quality, item.TimeStamp,
                        //        TIRAPOPCTagValueItemQueue.Instance.QueueItemCount));

                        // 直接生成消息处理线程处理收到的消息
                        TOPCTagValueThread settleThread = new TOPCTagValueThread(item);
                        Thread             thread       = new Thread(new ThreadStart(settleThread.Start));
                        thread.Start();
                    }
                }
                catch (Exception error)
                {
                    //Debug.WriteLine(string.Format("入队时出错:[{0}]", error.Message));
                    Debug.WriteLine(string.Format("处理时出错:[{0}]", error.Message));
                }
            }
        }
示例#4
0
        private void Settle()
        {
            Debug.WriteLine(
                string.Format(
                    "[线程 #{0}]开始处理 OPC 出队消息",
                    threadID));

            TIRAPOPCTagValueItem value = TIRAPOPCTagValueItemQueue.Instance.Get();

            while (!needStopped || value != null)
            {
                if (value != null)
                {
                    Debug.WriteLine(
                        string.Format(
                            "[线程 #{0}]处理 OPC 出队消息:TagName:[{1}],Value:[{2}]",
                            threadID,
                            value.TagName,
                            value.Value));

                    try
                    {
                        string fullTagName =
                            string.Format(
                                "{0}.{1}",
                                value.KepServerName,
                                value.TagName);
                        Debug.WriteLine(string.Format("TagName:[{0}]", fullTagName));

                        TIRAPOPCTag tag =
                            TIRAPOPCDevices.Instance.FindOPCTagItem(fullTagName);

                        if (tag != null)
                        {
                            Console.WriteLine(
                                string.Format(
                                    "[线程 #{0}]处理 OPC 出队消息:TagName:[{1}],Value:[{2}]",
                                    threadID,
                                    value.TagName,
                                    value.Value));
                            tag.SetTagValue(value.Value, value.TimeStamp);
                        }
                        else
                        {
                            Debug.WriteLine(
                                string.Format(
                                    "KepTag:未注册[{0}]",
                                    fullTagName));
                        }
                    }
                    catch (Exception error)
                    {
                        string errCode = "";
                        string errText = "";

                        if (error.Data["ErrCode"] != null)
                        {
                            errCode = error.Data["ErrCode"].ToString();
                        }
                        if (error.Data["ErrText"] != null)
                        {
                            errText = error.Data["ErrText"].ToString();
                        }
                        else
                        {
                            errText = error.Message;
                        }

                        Debug.WriteLine(
                            string.Format(
                                "[线程 #{0}]处理消息时出错:[({1}){2}]",
                                threadID,
                                errCode,
                                errText));
                    }
                }

                Thread.Sleep(10);

                value = TIRAPOPCTagValueItemQueue.Instance.Get();
            }

            Debug.WriteLine("[线程 #[{0}]已停止。", threadID);
        }