首Html代码

学有所用,不然就失去意义。

子标题

导航

OPC。NET

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, 
1this.OnReadComplete, out quest);
        }

posted on 2011-05-01 22:14  tssing  阅读(1521)  评论(1编辑  收藏  举报

页脚Html代码