OPC客户端搭建
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Console.WriteLine("添加数据项成功!");
}
3)创建浏览器对象
由于服务器端的菜单是树形结构,可以通过创建浏览器对象,一步步浏览菜单,寻找需要浏览的Item。
public void CrteBrowser()
{
string branch;
OPCBrowser OPCBrsr = OPCSvr.CreateBrowser();
{
try
{
OPCSvr = new OPCServer();
object serverList = OPCSvr.GetOPCServers(hostName);
foreach (string server in (Array)serverList)
{
Console.WriteLine("本地OPC服务器:{0}", server);
branch = Console.ReadLine();
OPCBrsr.MoveDown(branch);
OPCBrsr.ShowBranches();
OPCBrsr.ShowLeafs(true);
foreach (object turn in OPCBrsr)
{
Console.WriteLine("服务端:" + turn.ToString());
1.OPC对象的分层结构
OPC数据访问提供从数据源读取和写入特定数据的手段。OPC数据访问对象是由下图所示的分层结构构成。即一个OPC服务器对象(OPCServer)具有一个作为子对象的OPC组集合对象(OPCGroups)。在这个OPC组集合对象里可以添加多个的OPC组对象(OPCGroup)。各个OPC组对象具有一个作为子对象的OPC标签集合对象(OPCItems)。在这个OPC标签集合对象里可以添加多个的OPC标签对象(OPCItem)。此外,作为选用功能,OPC服务器对象还可以包含一个OPC浏览器对象(OPCBrowser)。
}
B.异步读取
public void AsRead(string itemid)//异步读取
{
{
OPCIt[0] = OPCIts.AddItem(itemid, 0);
int[] temp = new int[] { 0, OPCIt[0].ServerHandle };
Array serverHandles = (Array)temp;
}
}
4)读取服务器端数据信息
读取服务端数据信息包括同步读取和异步读取两种方式
异步读取与同步读取的区别:
同步读取适合用来读取少量数据,而异步读取可以读取大量数据而对运行不影响。因为程序运行过程中,调用同步读取函数,直到数据访问结果返回到客户程序之前,客户程序都处于等待之中。异步读取在被调用后,方法几乎立即返回。OPC应用程序随后可以进行其他处理。当OPC服务器完成数据访问时,触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序。
OPCIt[0] = OPCIts.AddItem(itemid, 0);
OPCIt[0].Read(1, out ItemValues, out Qualities, out TimeStamps);
Console.WriteLine("同步读取数据结果如下:");
Console.WriteLine("ID:{0} Vaule:{1} Quality:{2} Timestamp:{3}", OPCIt[0].ItemID,Convert.ToString(ItemValues),Convert.ToString(Qualities),Convert.ToString(TimeStamps));
OPCSvr.OPCGroups.DefaultGroupDeadband = 0;//死区值,设为0时,服务器端该组内任何数据变化都通知组。
OPCSvr.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms
OPCGrp[0].UpdateRate = 100;//刷新频率为1秒。
}
catch (Exception err)
{
Console.WriteLine("连接本地OPC服务器出错:{0}", err.Message);
}
}
2)创建组(OPCGroups)对象和添加数据项对象(OPCItems)
public void CreateGrp()//创建组对象
{
try
{
OPCGrps = OPCSvr.OPCGroups;
OPC对象中的最上层的对象是OPC服务器。一个OPC服务器里可以设置一个以上的OPC组。OPC服务器经常对应于某种特定的控制设备。例如,某种DCS控制系统,或者某种PLC控制装置。OPC组是可以进行某种目的数据访问的多个的OPC标签的集合,例如某监视画面里所有需要更新的位号变量。正因为有了OPC组,OPC应用程序就可以以同时需要的数据为一批的进行数据访问,也可以以OPC组为单位启动或停止数据访问。此外OPC组还提供组内任何OPC标签的数值变化时向OPC应用程序通知的数据变化事件(表1-4)。
//OPCGrp[0].AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
OPCGrp[0].AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);
{
Console.WriteLine("异步读取数据结果如下:");
for (int i = 1; i <= NumItems; i++)
{
Console.WriteLine("ID:{0}Vaule:{1}Quality:{2} Timestamp:{3}",OPCIt[i-1].ItemID,Convert.ToString(ItemValues.GetValue(i)), Convert.ToString(Qualities.GetValue(i)), Convert.ToString(TimeStamps.GetValue(i)));
searchlocalsvr(HostName);
Console.WriteLine("请输入要连接的服务器名字:");
OPCSvrName = Console.ReadLine();
try
{
OPCSvr.Connect(OPCSvrName, "");
Console.WriteLine("连接服务器成功!");
OPCGrp = new OPCAutomation.OPCGroup[2];
OPCGrp[0] = OPCGrps.Add("G1");
OPCGrp[1] = OPCGrps.Add("G2");
SetGroupProperty();
//OPCGrp[0].DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
OPCGrp[0].IsSubscribed = true;//使用订阅功能,即可以异步,默认false
}
public void addItems()//添加数据项
{
OPCIts = OPCGrp[0].OPCItems;
OPCIt = new OPCItem[4];
OPCIt[0] = OPCIts.AddItem("Integer.TAG_I0", 1);
}
}
在异步读取函数完成之后调用本函数,输出数据读取结果。
5)断开与服务器连接
断开服务器得先清除所有组对象及其下的数据项对象。
public void disconnectSvr()//与断开服务器
{
try
{
OPCSvr.OPCGroups.RemoveAll();
OPCSvr.Disconnect();
Console.WriteLine("OPC服务器已断开!");
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
}
3.程序运行样例
运行结果如下所示:
OPCBrsr.ShowBranches();
OPCBrsr.ShowLeafs(true);
foreach (object turn in OPCBrsr)
{
Console.WriteLine("服务端浏览——————:" + turn.ToString());
}
Console.WriteLine("请需要浏览的分支:");
}
}
catch (Exception err)
{
Console.WriteLine("枚举本地OPC服务器出错:{0}", err.Message);
}
}
c)连接服务器。
public void ctOPCSever(string HostName)//连接OPC服务器
{
string OPCSvrName;
但是可以看出同步数据访问相比起来更加容易实现,异步数据访问比较麻烦。
A.同步读取(可以直接调用Item对象的read方法,或者调用组对象的syncread方法)
public void SRead(string itemid)//同步读取
{
object ItemValues; object Qualities; object TimeStamps;
2.OPC客户端搭建过程(部分代码)
1)连接服务器
a)查询服务器端主机的名字。
string hostname = Dns.GetHostName();
b)初始化服务器对象,搜索主机上的服务器ID,并枚举出来。
public void searchlocalsvr(string h百度文库stName)//寻找本地服务器
Console.WriteLine("创建组成功!");
}
catch (Exception err)
{
Console.WriteLine("错误信息:{0}", err);
}
}
public void SetGroupProperty()
{
OPCSvr.OPCGroups.DefaultGroupIsActive = true;//激活组。
OPCIt[1] = OPCIts.AddItem("Integer.TAG_I1", 2);
//OPCIt[1] = OPCIts.AddItem("Item2", 0);
//OPCIt[2] = OPCIts.AddItem("Item3", 0);
//OPCIt[3] = OPCIts.AddItem("Item4", 0);
Array Errors;
int cancelID;
OPCGrp[0].AsyncRead(1, ref serverHandles, out Errors, 1, out cancelID);
}
}
异步读取并不直接输出读取结果
而是调用下面的函数
void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)
}
3)创建浏览器对象
由于服务器端的菜单是树形结构,可以通过创建浏览器对象,一步步浏览菜单,寻找需要浏览的Item。
public void CrteBrowser()
{
string branch;
OPCBrowser OPCBrsr = OPCSvr.CreateBrowser();
{
try
{
OPCSvr = new OPCServer();
object serverList = OPCSvr.GetOPCServers(hostName);
foreach (string server in (Array)serverList)
{
Console.WriteLine("本地OPC服务器:{0}", server);
branch = Console.ReadLine();
OPCBrsr.MoveDown(branch);
OPCBrsr.ShowBranches();
OPCBrsr.ShowLeafs(true);
foreach (object turn in OPCBrsr)
{
Console.WriteLine("服务端:" + turn.ToString());
1.OPC对象的分层结构
OPC数据访问提供从数据源读取和写入特定数据的手段。OPC数据访问对象是由下图所示的分层结构构成。即一个OPC服务器对象(OPCServer)具有一个作为子对象的OPC组集合对象(OPCGroups)。在这个OPC组集合对象里可以添加多个的OPC组对象(OPCGroup)。各个OPC组对象具有一个作为子对象的OPC标签集合对象(OPCItems)。在这个OPC标签集合对象里可以添加多个的OPC标签对象(OPCItem)。此外,作为选用功能,OPC服务器对象还可以包含一个OPC浏览器对象(OPCBrowser)。
}
B.异步读取
public void AsRead(string itemid)//异步读取
{
{
OPCIt[0] = OPCIts.AddItem(itemid, 0);
int[] temp = new int[] { 0, OPCIt[0].ServerHandle };
Array serverHandles = (Array)temp;
}
}
4)读取服务器端数据信息
读取服务端数据信息包括同步读取和异步读取两种方式
异步读取与同步读取的区别:
同步读取适合用来读取少量数据,而异步读取可以读取大量数据而对运行不影响。因为程序运行过程中,调用同步读取函数,直到数据访问结果返回到客户程序之前,客户程序都处于等待之中。异步读取在被调用后,方法几乎立即返回。OPC应用程序随后可以进行其他处理。当OPC服务器完成数据访问时,触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序。
OPCIt[0] = OPCIts.AddItem(itemid, 0);
OPCIt[0].Read(1, out ItemValues, out Qualities, out TimeStamps);
Console.WriteLine("同步读取数据结果如下:");
Console.WriteLine("ID:{0} Vaule:{1} Quality:{2} Timestamp:{3}", OPCIt[0].ItemID,Convert.ToString(ItemValues),Convert.ToString(Qualities),Convert.ToString(TimeStamps));
OPCSvr.OPCGroups.DefaultGroupDeadband = 0;//死区值,设为0时,服务器端该组内任何数据变化都通知组。
OPCSvr.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms
OPCGrp[0].UpdateRate = 100;//刷新频率为1秒。
}
catch (Exception err)
{
Console.WriteLine("连接本地OPC服务器出错:{0}", err.Message);
}
}
2)创建组(OPCGroups)对象和添加数据项对象(OPCItems)
public void CreateGrp()//创建组对象
{
try
{
OPCGrps = OPCSvr.OPCGroups;
OPC对象中的最上层的对象是OPC服务器。一个OPC服务器里可以设置一个以上的OPC组。OPC服务器经常对应于某种特定的控制设备。例如,某种DCS控制系统,或者某种PLC控制装置。OPC组是可以进行某种目的数据访问的多个的OPC标签的集合,例如某监视画面里所有需要更新的位号变量。正因为有了OPC组,OPC应用程序就可以以同时需要的数据为一批的进行数据访问,也可以以OPC组为单位启动或停止数据访问。此外OPC组还提供组内任何OPC标签的数值变化时向OPC应用程序通知的数据变化事件(表1-4)。
//OPCGrp[0].AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
OPCGrp[0].AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);
{
Console.WriteLine("异步读取数据结果如下:");
for (int i = 1; i <= NumItems; i++)
{
Console.WriteLine("ID:{0}Vaule:{1}Quality:{2} Timestamp:{3}",OPCIt[i-1].ItemID,Convert.ToString(ItemValues.GetValue(i)), Convert.ToString(Qualities.GetValue(i)), Convert.ToString(TimeStamps.GetValue(i)));
searchlocalsvr(HostName);
Console.WriteLine("请输入要连接的服务器名字:");
OPCSvrName = Console.ReadLine();
try
{
OPCSvr.Connect(OPCSvrName, "");
Console.WriteLine("连接服务器成功!");
OPCGrp = new OPCAutomation.OPCGroup[2];
OPCGrp[0] = OPCGrps.Add("G1");
OPCGrp[1] = OPCGrps.Add("G2");
SetGroupProperty();
//OPCGrp[0].DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
OPCGrp[0].IsSubscribed = true;//使用订阅功能,即可以异步,默认false
}
public void addItems()//添加数据项
{
OPCIts = OPCGrp[0].OPCItems;
OPCIt = new OPCItem[4];
OPCIt[0] = OPCIts.AddItem("Integer.TAG_I0", 1);
}
}
在异步读取函数完成之后调用本函数,输出数据读取结果。
5)断开与服务器连接
断开服务器得先清除所有组对象及其下的数据项对象。
public void disconnectSvr()//与断开服务器
{
try
{
OPCSvr.OPCGroups.RemoveAll();
OPCSvr.Disconnect();
Console.WriteLine("OPC服务器已断开!");
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
}
3.程序运行样例
运行结果如下所示:
OPCBrsr.ShowBranches();
OPCBrsr.ShowLeafs(true);
foreach (object turn in OPCBrsr)
{
Console.WriteLine("服务端浏览——————:" + turn.ToString());
}
Console.WriteLine("请需要浏览的分支:");
}
}
catch (Exception err)
{
Console.WriteLine("枚举本地OPC服务器出错:{0}", err.Message);
}
}
c)连接服务器。
public void ctOPCSever(string HostName)//连接OPC服务器
{
string OPCSvrName;
但是可以看出同步数据访问相比起来更加容易实现,异步数据访问比较麻烦。
A.同步读取(可以直接调用Item对象的read方法,或者调用组对象的syncread方法)
public void SRead(string itemid)//同步读取
{
object ItemValues; object Qualities; object TimeStamps;
2.OPC客户端搭建过程(部分代码)
1)连接服务器
a)查询服务器端主机的名字。
string hostname = Dns.GetHostName();
b)初始化服务器对象,搜索主机上的服务器ID,并枚举出来。
public void searchlocalsvr(string h百度文库stName)//寻找本地服务器
Console.WriteLine("创建组成功!");
}
catch (Exception err)
{
Console.WriteLine("错误信息:{0}", err);
}
}
public void SetGroupProperty()
{
OPCSvr.OPCGroups.DefaultGroupIsActive = true;//激活组。
OPCIt[1] = OPCIts.AddItem("Integer.TAG_I1", 2);
//OPCIt[1] = OPCIts.AddItem("Item2", 0);
//OPCIt[2] = OPCIts.AddItem("Item3", 0);
//OPCIt[3] = OPCIts.AddItem("Item4", 0);
Array Errors;
int cancelID;
OPCGrp[0].AsyncRead(1, ref serverHandles, out Errors, 1, out cancelID);
}
}
异步读取并不直接输出读取结果
而是调用下面的函数
void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)