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