OPC XML-DA 客户端接口

OPC XML-DA 是 OPC 基金会提出的基于 web 服务远程数据访问的一种规范,能够通过 Internet 远程网络和跨平台进行数据访问。本公司的 X2OPC 服务器、IBMS网关、HMI系列网关、X2BACnet 及 X2Modbus 网关产品均支持 OPC XML-DA 服务端规范。本文档以 X2OPC 服务器举例说。

1.实现过程

 1.1 X2OPCRunTime.exe 版本确定

        打开 X2OPC 下的 www 文件夹,可以看到 OpcXML-Da.wsdl 文件,如下图。
OpcXML-Da.wsdl 文件
如果没有 OpcXML-Da.wsdl 文件,就说明是比较旧的版本,应该是 2015 年 2 月 12日之前编译的版本。

1.2 网页浏览 WSDL 文档

点击 X2OPCRunTime.exe 上的“登陆网页…”按钮
在浏览器里会显示网址的主页,也就是登陆界面,如下图
把 URL 中的 login.html 删除,换成 OpcXML-Da.wsdl。也就说原来的http://127.0.0.1:81/login.html,换成了 http://127.0.0.1:81/OpcXML-Da.wsdl。如图

1.3 C#工程操作步骤

本范例用 VS2008 中的 C#语言开发。打开 VS2008,新建项目,在弹出来的对话框中选择 Visual C#开发语言,用 Windows 窗体应用程序模板,项目名称为XMLDaClient,然后点击“确定”按钮,如下图
新建 XMLDaClient 项目
在资源对话框中增加 2 个按钮,分别来演示如何调用读和写的服务,按钮的名称分别修改成 btnRead 和 btnWrite,接着就添加 Web 引用,如下图
在弹出的对话框中,点击“高级”按钮,接着点击“添加 Web 引用”,在 URL 上输入浏览的 WSDL 的网址 http://127.0.0.1:81/OpcXML-Da.wsdl,并把 Web引用名修改为 XMLWrapper,点击“添加引用”按钮,如下图
添加 Web 引用
添加好 Web 引用后,如下图
添加好 Web 引用后的界面
下面就可以调用 Web 引用里的方法了,分别双击 Read 和 Write 按钮,让开发环境自动产生事件处理的代码。并添加命名空间using XMLDaClient.XMLWrapper;如下图所示:
添加命名空间及事件代码
示例中分别对 2 个 Item 读和对 1 个 Item 写操作,分别调用了 Read 和 Write 的Web 方法。Item 的名称是"TCP.Channel_1.Device_1.4X1"和"TCP.Channel_1.Device_1.4X2", X2OPC.exe 的配置界面如下图所示。
在 Read 和 Write 按钮处理事件代码里编写如下代码:
namespace XMLDaClient { public partial class Form1 : Form { private static bool bSwtichFag1 = true; public Form1() { InitializeComponent(); } private void btnRead_Click(object sender, EventArgs e) { XMLWrapper.OPC_XML_DA_WrapperService service = new XMLWrapper.OPC_XML_DA_WrapperService(); service.Url = "http://192.168.0.102:81/soap"; int nItemCount = 2; ReadRequestItemList iList = new ReadRequestItemList(); RequestOptions rOpt = new RequestOptions(); iList.Items = new ReadRequestItem[nItemCount]; iList.Items[0] = new ReadRequestItem(); iList.Items[0].ClientItemHandle = ""; iList.Items[0].ItemName = "TCP.Channel_1.Device_1.4X1"; iList.Items[1] = new ReadRequestItem(); iList.Items[1].ClientItemHandle = ""; iList.Items[1].ItemName = "TCP.Channel_1.Device_1.4X2"; ReplyItemList rVal; OPCError[] Errors; ReplyBase reply; reply = service.Read(rOpt, iList, out rVal, out Errors); int i = 0; if (rVal.Items.Count() >= 2) { foreach (ItemValue it in rVal.Items) { MessageBox.Show(it.Value.ToString()); ++i; } } } private void btnWrite_Click(object sender, EventArgs e) { RequestOptions Options = new RequestOptions(); WriteRequestItemList iList = new WriteRequestItemList(); ReplyItemList RItemList = new ReplyItemList(); OPCError[] Errors; iList.Items = new ItemValue[1]; iList.Items[0] = new ItemValue(); iList.Items[0].ClientItemHandle = ""; iList.Items[0].ItemName = "TCP.Channel_1.Device_1.4X1"; iList.Items[0].ClientItemHandle = ""; if (bSwtichFag1 == true) { bSwtichFag1 = false; iList.Items[0].Value = 100; } else { bSwtichFag1 = true; iList.Items[0].Value = 0; } XMLWrapper.OPC_XML_DA_WrapperService service = new XMLWrapper.OPC_XML_DA_WrapperService(); service.Url = "http://192.168.0.102:81/soap"; ReplyBase reply; reply = service.Write(Options, iList, false, out RItemList, out Errors); } } }
代码简要分析:service.Url = "http://192.168.0.102:81/soap";代表要访问X2OPCRunTime.exe 的 URL,由于 X2OPCRunTime.exe 是 C++开发的,比较特别点一定要用 soap 关键字结尾。Read 方法里,读 2 个 Item 的数据,并用对话框简单显示出来。Write 方法里,对"TCP.Channel_1.De vice_1.4X1"写值,由 bSwtichFag1 变量控制,点一下写 100,再点一下写入 0。点击“Write”按钮后,接着点击“Read”按钮后,如下图所示:
运行结果
注:提供C#、C++、HTML+JS、JAVA、Python五种语言的OPC XML-DA客户端demo程序,详情请联系技术支持。
2023-08-23
0 0