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程序,详情请联系技术支持。