65.9K
CodeProject 正在变化。 阅读更多。
Home

OPC XML-DA 示例客户端

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.60/5 (9投票s)

2004年2月17日

2分钟阅读

viewsIcon

183481

downloadIcon

4542

OPC XML-DA 客户端示例展示了如何从不同类型的桌面和 Web 应用程序访问 OPC XML-DA Web 服务。

Sample Image - OPC_XML-DA_Clients.jpg

引言

OPC XML-DA 标准和目前广泛使用的 OPC DA V2 标准处理相同的任务,但服务器接口却大相径庭,这是因为它们的基础不同,分别是 Web 服务和 DCOM。OPC 客户端应用程序的开发人员必须意识到这些差异。客户端应用程序示例展示了如何从不同类型的应用程序中使用 ReadSubscribe/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 ;
}

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.