OPC XML-DA 示例客户端






3.60/5 (9投票s)
2004年2月17日
2分钟阅读

183481

4542
OPC XML-DA 客户端示例展示了如何从不同类型的桌面和 Web 应用程序访问 OPC XML-DA Web 服务。
引言
OPC XML-DA 标准和目前广泛使用的 OPC DA V2 标准处理相同的任务,但服务器接口却大相径庭,这是因为它们的基础不同,分别是 Web 服务和 DCOM。OPC 客户端应用程序的开发人员必须意识到这些差异。客户端应用程序示例展示了如何从不同类型的应用程序中使用 Read
和 Subscribe
/Poll
函数。VB.NET 和 C# 示例使用 .NET Web 服务支持,而 HTML/ASP 脚本使用 MSSOAP 工具包。
背景
阅读 XMLDA.NET 白皮书,了解 Web 服务与 DCOM 的不同之处,以及这如何影响客户端应用程序的设计。可以下载基于 .NET 的 OPC XML DA 服务器和客户端的评估版本。
Using the Code
VB 和 C# 应用程序通常使用 .NET 功能来访问 Web 服务。桌面和 ASP.NET 应用程序可以用相同的方式访问 OPC XML-DA 服务器。XML-DA 具有无状态设计,非常适合 ASP.NET 应用程序。下面显示的代码片段使用 Read
函数定期从服务器读取两个项目的值。XML-DA Read
函数是独立的,不依赖于任何先前的调用。
' create the server object and set the call options
Dim Srv As localhost.OpcXmlDA = New localhost.OpcXmlDA
Srv.Url = "http://advosol.us/XMLDADemo/ts_sim/OpcDaGateway.asmx"
Dim ReqOptions As localhost.RequestOptions = New localhost.RequestOptions
ReqOptions.ClientRequestHandle = "test"
ReqOptions.ReturnErrorText = True
ReqOptions.ReturnItemName = True
' Data structures for an XML-DA Read call, initialized to read 2 items
Dim ReadReqList As localhost.ReadRequestItemList = New ReadRequestItemList
ReDim ReadReqList.Items(1) ' Item request list for 2 items
ReadReqList.Items(0) = New localhost.ReadRequestItem ' item 1
ReadReqList.Items(0).ItemName = "Test/Integer"
ReadReqList.Items(1) = New localhost.ReadRequestItem ' item 2
ReadReqList.Items(1).ItemName = "Test/Float"
' Data structures for the read reply data
Dim reply As localhost.ReplyBase
Dim ReadReplyList As localhost.ReplyItemList
Dim Errors() As localhost.OPCError
While 1 = 1 ' periodically read the items
Try ' access the server
reply = Srv.Read(ReqOptions, ReadReqList, ReadReplyList, Errors)
' display the result
Console.WriteLine()
Dim i As Int32
For i = 0 To ReadReplyList.Items.Length - 1
If ReadReplyList.Items(i).ResultID Is Nothing Then ' display value
Console.WriteLine(ReadReplyList.Items(i).ItemName + " = " + _
Convert.ToString(ReadReplyList.Items(i).Value))
Else ' display error code
Console.WriteLine(ReadReplyList.Items(i).ItemName + " = " + _
ReadReplyList.Items(i).ResultID.Name)
End If
Next
Catch ex As Exception
Console.WriteLine("Error: " + ex.Message)
End Try
Threading.Thread.Sleep(2000)
End While
可选参数是常见错误的来源。.NET Web 服务接口为每个可选值类型参数都有一个“enable
”参数。如果此参数未设置为“true
”,则设置可选参数无效。
subscription.EnableBuffering = True
subscription.EnableBufferingSpecified = True
XML-DA 函数的使用非常简单,但使用所需的定义初始化数百个项目的请求列表需要大量的代码。在具有许多项目的应用程序中,最好在 XML 文件中定义请求列表,并在应用程序中只调用一个辅助方法,该方法从 XML 文件初始化请求列表对象。Advosol 的 XML-DA 客户端组件提供了这样的支持。下面的代码片段展示了如何使用 SDK 辅助类完成读取调用。下载 XML-DA 客户端 SDK 评估版本以进一步探索。
Private Sub btnRead_Click_1(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRead.Click
Dim srv As XmlServer = New XmlServer(cbURL.Text) ' server object
Dim readItemList As ReadRequestItemList
readItemList = embeddedList.GetReadItemList("OCSTKSimulatedData")
Dim reply As ReplyBase
Dim options As RequestOptions = New RequestOptions
options.ReturnErrorText = True
options.ReturnItemName = True
Dim rslt As ReplyItemList
Dim err As OPCError()
Try
reply = srv.Read(options, readItemList, rslt, err)
If rslt Is Nothing Then
MessageBox.Show(err(0).Text, "Error at Read")
Else
Dim txt As String = ""
Dim iv As ItemValue
For Each iv In rslt.Items
txt += iv.ItemName
If iv.ResultID Is Nothing Then ' success
txt += " = " + iv.Value.ToString() + Environment.NewLine
Else
txt += " : Error: " + iv.ResultID.Name + Environment.NewLine
End If
Next
tbItems.Text = txt
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Exception in Read")
Close()
End Try
End Sub
HTML 和 ASP 应用程序需要从客户端或服务器端脚本进行 OPC XML-DA 服务器访问。源代码下载包含 JavaScript 和 VB 脚本示例。它们展示了如何使用 Read
和更复杂但也更有效的 Subscribe
/Poll
函数。XML-DA Web 服务调用是通过使用 MSSOAP 工具包构建 SOAP 请求消息来完成的。代码片段展示了如何创建 Read
请求消息。
function CreateXMLDAReadRequest(ServerURL)
{
NSxmlda = "http://opcfoundation.org/webservices/XMLDA/1.0/";
var mobjWS = new ActiveXObject("MSSOAP.SoapClient30");
ErrText = "";
if( ! mobjWS )
ErrText = "SoapClient NOT created";
mobjWS.ClientProperty("ServerHTTPRequest") = "true";
mobjWS.MSSoapInit( ServerURL + "?wsdl", "OpcXmlDaSrv", "OpcXmlDaSrvSoap" );
//-------------------- We are going to build the SOAP request message
var oTempXml;
var strXML;
DocXml = new ActiveXObject("msxml2.domdocument.4.0");
if( ! DocXml )
ErrText = "DomDocument NOT created" ;
strXML = "";
DocXml.loadXML( strXML );
oTempXml = DocXml.createElement("Read");
oTempXml.setAttribute( "xmlns", NSxmlda );
// create Options Node
DocXml.documentElement.childNodes(0).appendChild( oTempXml );
oTempXml = DocXml.createNode(1, "Options", NSxmlda );
oTempXml.setAttribute( "ReturnErrorText", "true" );
oTempXml.setAttribute( "ReturnItemTime", "true" );
oTempXml.setAttribute( "ReturnItemName", "true" );
oTempXml.setAttribute( "LocaleID", "en" );
DocXml.selectSingleNode("//Read").appendChild(oTempXml);
// create ItemList node
ItemListNode= DocXml.createNode(1, "ItemList", NSxmlda);
DocXml.selectSingleNode("//Read").appendChild( ItemListNode );
DocXml.setProperty("SelectionNamespaces", "xmlns:xda='" + NSxmlda + "'");
return DocXml ;
}
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。