OPC。NET

來源:互聯網
上載者:User
View Code

        private Opc.Da.SubscriptionState state = null;
        private Opc.Da.Subscription subscription = null;
        private Opc.Da.Server m_server = null;
        private OpcCom.ServerEnumerator m_discovery = new OpcCom.ServerEnumerator();

            Specification m_specification = Specification.COM_DA_20;
            string[] hosts = m_discovery.EnumerateHosts();

            Opc.Server[] servers = m_discovery.GetAvailableServers(m_specification, "", null);//遍曆Servers
            m_server = (Opc.Da.Server)servers[0];
            m_server.Connect();

            Opc.Da.BrowsePosition position = null;
            ItemIdentifier itemID = null;
            BrowseFilters m_filters = new BrowseFilters();
            BrowseElement[] elements = m_server.Browse(itemID, m_filters, out position);//遍曆組

            //設定組狀態
            state = new Opc.Da.SubscriptionState();//組(訂閱者)狀態,相當於OPC規範中組的參數
            state.Name = "Channel_1.Device_1";//組名
            state.ServerHandle = null;//伺服器給該組分配的控制代碼。
            state.ClientHandle = Guid.NewGuid().ToString();//用戶端給該組分配的控制代碼。
            state.Active = true;//啟用該組。
            state.UpdateRate = 1000;//重新整理頻率為1秒。
            state.Deadband = 0;// 死區值,設為0時,伺服器端該組內任何資料變化都通知群組。
            state.Locale = null;//不設定地區值。

            subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//建立組

            itemID = new ItemIdentifier("Channel_1.Device_1");//遍曆變數
            elements = m_server.Browse(itemID, m_filters, out position);

            string[] itemName = { "Channel_1.Device_1.Tag_1", 
                                    "Channel_1.Device_1.Tag_2",
                                "Channel_1.Device_1.Tag_3"};

            Item[] items = new Item[itemName.Length];//定義資料項目,即item
            int i;
            for (i = 0; i < items.Length; i++)//item初始化賦值
            {
                items[i] = new Item();//建立一個項Item對象。
                items[i].ClientHandle = Guid.NewGuid().ToString();//用戶端給該資料項目分配的控制代碼。
                items[i].ItemPath = null; //該資料項目在伺服器中的路徑。
                items[i].ItemName = itemName[i]; //該資料項目在伺服器中的名字。
            }

            subscription.AddItems(items);

            subscription.DataChanged += new Opc.Da.DataChangedEventHandler(this.OnDataChange);

        public void OnDataChange(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new SetTextCallback(Method), new object[] { values });
            }
        }

        //ReadComplete回調
        public void OnReadComplete(object requestHandle, Opc.Da.ItemValueResult[] values)
        {
            //if (this.InvokeRequired)
            {
                //this.BeginInvoke(new SetTextCallback(Method), new object[] { values });
            }
        }

        //WriteComplete回調
        public void OnWriteComplete(object requestHandle, IdentifiedResult[] values)
        {
            if (this.InvokeRequired)
            {
                //this.BeginInvoke(new SetTextCallback(Method), new object[] { values });
            }
        }

        public void Method(ItemValueResult[] values)
        {
            foreach (ItemValueResult item in values)
            {
                if (item.ItemName == "Channel_1.Device_1.Tag_1")
                {
                    textBox1.Text = item.Value.ToString();
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ItemValueResult[] values = subscription.Read(subscription.Items);
            Method(values);

            ItemValue[] itemvalues2 = new ItemValue[3];
            itemvalues2[0] = new ItemValue((ItemIdentifier)subscription.Items[0]);//TItem類要先轉成ItemIdentifier,才能轉成ItemValue
            itemvalues2[1] = new ItemValue((ItemIdentifier)subscription.Items[1]);//TItem類要先轉成ItemIdentifier,才能轉成ItemValue
            itemvalues2[2] = new ItemValue((ItemIdentifier)subscription.Items[2]);//TItem類要先轉成ItemIdentifier,才能轉成ItemValue

            foreach (ItemValue item in itemvalues2)
            {
                if (item.ItemName == "Channel_1.Device_1.Tag_1")
                {
                    item.Value = 9999;
                }
            }
            m_server.Write(itemvalues2);
            IRequest quest = null;
            //subscription.Write(itemvalues2, 1, this.OnWriteComplete, out quest);
            MessageBox.Show("hello:");
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            IRequest quest = null;
            subscription.Read(subscription.Items, 1, this.OnReadComplete, out quest);
        }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.