Acceso web a un servidor de datos OPC

Alhexis
30 de Junio del 2006
Agradecería si alguién me pudiera facilitar información sobre como realizar un programa para leer y modificar los datos de un servidor OPC mediante un servidor web.

Muchas gracias

enaj
30 de Junio del 2006
Hola!!!
Ufff!!. Así que quieres realizar lecturas y escrituras sobre un servidor OPC-DA mediante una aplicación web en Java.

Para que la aplicación Web se comunique con el servidor OPC (supongamos que esas funcionalidades las hace un servlet ó incluso un applet) habría dos posibilidades:
- Lo ideal sería utilizar la especificación OPC-XMLDA. Existe una librería en desarrollo llamada jxopc pero de la cúal todavía no hay una versión previa. La página del proyecto es http://sourceforge.net/projects/jxopc. Esta opción además tiene el inconveniente de que no todos los servidores OPC soportan TODAVÍA la especificación.
-La otra opción es utilizar la especificación OPC-DA basada en tecnología OLE/COM/DCOM. El inconveniente a utilizar esta especificación es que Java no soporta directamente la tecnología COM. Para resolver esto existen tres alternativas:
>La utilización de Java Native Interface (JNI), es decir, utilizar C/C++ junto con Java.
>La utilización de un puente Java-COM.
>Realizar además de la aplicación Web otra aplicación en Visual C++ (OPC-DA Custom) ó en Visual Basic (OPC-DA Automation) que es la que va a hacer realmente de "cliente OPC" y comunicar esta aplicación con la aplicación Web mediante la utilización, por ejemplo, de un protocolo basado en sockets y cadenas de texto UNICODE.

Puedes encontrar más información en:
http://www.opcconnect.com
http://www.opcfoundation.org

Espero que te haya servido de ayuda.

enaj
30 de Junio del 2006
Hola!!!!

Para obtener una implementación de la especificación OPC-XMLDA en Java solamente es necesario el WSDL del servicio y Java API for XML Web Services (JAX-WS) de Sun o Axis de Apache. Los pasos son los siguientes:

1.- Descargar Java API for XML Web Services (JAX-WS) de la página de Sun(http://java.sun.com/webservices/reference/api/).
2.-Obtener el WSDL del servicio(OPCXMLDA_1.wsdl) u obtener la dirección de un servidor OPC-XMLDA para acceder a su WSDL(En la página http://opcconnect.com/ existen varios servidores OPC-XMLDA funcionando para hacer pruebas(es necesario registrarse)).
3.- Ejecutar el siguiente comando:
wsimport -keep -d "C:Escritoriobin" -p "org.opcfoundation.xmlda._1" -s "C:Escritoriosrc" OPCXMLDA_1.wsdl
donde:
C:Escritoriobin es la ruta donde se sitúan las clases compiladas
org.opcfoundation.xmlda._1 son los paquetes que se van a generar
C:Escritoriosrc es la ruta donde se sitúa el código fuente
OPCXMLDA_1.wsdl es la ruta del fichero WSDL(o la dirección del servidor OPC-XMLDA).

Tras realizar estos pasos se obtiene un mapeo del WSDL a clases Java y que se van a utilizar para acceder al servidor OPC-XMLDA.

A continuación se muestra el fichero WSDL:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://opcfoundation.org/webservices/XMLDA/1.0/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/">
<s:element name="GetProperties">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ItemIDs" type="tns:ItemIdentifier" />
<s:element minOccurs="0" maxOccurs="unbounded" name="PropertyNames" type="s:QName" />
</s:sequence>
<s:attribute name="LocaleID" type="s:string" />
<s:attribute name="ClientRequestHandle" type="s:string" />
<s:attribute name="ItemPath" type="s:string" />
<s:attribute default="false" name="ReturnAllProperties" type="s:boolean" />
<s:attribute default="false" name="ReturnPropertyValues" type="s:boolean" />
<s:attribute default="false" name="ReturnErrorText" type="s:boolean" />
</s:complexType>
</s:element>
<s:complexType name="ItemIdentifier">
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
</s:complexType>
<s:element name="GetPropertiesResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetPropertiesResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="unbounded" name="PropertyLists" type="tns:PropertyReplyList" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ReplyBase">
<s:attribute name="RcvTime" type="s:dateTime" use="required" />
<s:attribute name="ReplyTime" type="s:dateTime" use="required" />
<s:attribute name="ClientRequestHandle" type="s:string" />
<s:attribute name="RevisedLocaleID" type="s:string" />
<s:attribute name="ServerState" type="tns:serverState" use="required" />
</s:complexType>
<s:simpleType name="serverState">
<s:restriction base="s:string">
<s:enumeration value="running" />
<s:enumeration value="failed" />
<s:enumeration value="noConfig" />
<s:enumeration value="suspended" />
<s:enumeration value="test" />
<s:enumeration value="commFault" />
</s:restriction>
</s:simpleType>
<s:complexType name="PropertyReplyList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Properties" type="tns:ItemProperty" />
</s:sequence>
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ResultID" type="s:QName" use="required" />
</s:complexType>
<s:complexType name="ItemProperty">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Value" />
</s:sequence>
<s:attribute name="Name" type="s:QName" use="required" />
<s:attribute name="Description" type="s:string" />
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ResultID" type="s:QName" use="required" />
</s:complexType>
<s:complexType name="OPCError">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" />
</s:sequence>
<s:attribute name="ID" type="s:QName" use="required" />
</s:complexType>
<s:complexType name="ArrayOfAnyType">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="anyType" nillable="true" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfBoolean">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="boolean" type="s:boolean" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfString">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfDateTime">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="dateTime" type="s:dateTime" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfByte">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="byte" type="s:byte" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfDouble">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="double" type="s:double" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfShort">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="short" type="s:short" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfUnsignedShort">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="unsignedShort" type="s:unsignedShort" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfInt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfDecimal">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="decimal" type="s:decimal" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfUnsignedInt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="unsignedInt" type="s:unsignedInt" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfLong">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="long" type="s:long" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfUnsignedLong">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="unsignedLong" type="s:unsignedLong" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfFloat">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="float" type="s:float" />
</s:sequence>
</s:complexType>
<s:element name="GetStatus">
<s:complexType>
<s:attribute name="LocaleID" type="s:string" />
<s:attribute name="ClientRequestHandle" type="s:string" />
</s:complexType>
</s:element>
<s:complexType name="ServerStatus">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="StatusInfo" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="VendorInfo" type="s:string" />
<s:element minOccurs="0" maxOccurs="unbounded" name="SupportedLocaleIDs" type="s:string" />
<s:element minOccurs="0" maxOccurs="unbounded" name="SupportedInterfaceVersions" type="tns:interfaceVersion" />
</s:sequence>
<s:attribute name="StartTime" type="s:dateTime" use="required" />
<s:attribute name="ProductVersion" type="s:string" />
</s:complexType>
<s:simpleType name="interfaceVersion">
<s:restriction base="s:string">
<s:enumeration value="XML_DA_Version_1_0" />
</s:restriction>
</s:simpleType>
<s:element name="GetStatusResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetStatusResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="1" name="Status" type="tns:ServerStatus" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="Read">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Options" type="tns:RequestOptions" />
<s:element minOccurs="0" maxOccurs="1" name="ItemList" type="tns:ReadRequestItemList" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="RequestOptions">
<s:attribute name="RequestDeadline" type="s:dateTime" />
<s:attribute default="true" name="ReturnErrorText" type="s:boolean" />
<s:attribute default="false" name="ReturnDiagnosticInfo" type="s:boolean" />
<s:attribute default="false" name="ReturnItemTime" type="s:boolean" />
<s:attribute default="false" name="ReturnItemPath" type="s:boolean" />
<s:attribute default="false" name="ReturnItemName" type="s:boolean" />
<s:attribute name="ClientRequestHandle" type="s:string" />
<s:attribute name="LocaleID" type="s:string" />
</s:complexType>
<s:complexType name="ReadRequestItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:ReadRequestItem" />
</s:sequence>
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ReqType" type="s:QName" use="required" />
<s:attribute name="MaxAge" type="s:int" />
</s:complexType>
<s:complexType name="ReadRequestItem">
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ReqType" type="s:QName" use="required" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ClientItemHandle" type="s:string" />
<s:attribute name="MaxAge" type="s:int" />
</s:complexType>
<s:complexType name="ReplyItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:ItemValue" />
</s:sequence>
<s:attribute name="Reserved" type="s:string" />
</s:complexType>
<s:complexType name="ItemValue">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="DiagnosticInfo" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Value" />
<s:element minOccurs="0" maxOccurs="1" name="Quality" type="tns:OPCQuality" />
</s:sequence>
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ClientItemHandle" type="s:string" />
<s:attribute name="Timestamp" type="s:dateTime" />
<s:attribute name="ResultID" type="s:QName" use="required" />
<s:attribute name="ValueTypeQualifier" type="s:QName" use="required" />
</s:complexType>
<s:complexType name="OPCQuality">
<s:attribute default="good" name="QualityField" type="tns:qualityBits" />
<s:attribute default="none" name="LimitField" type="tns:limitBits" />
<s:attribute default="0" name="VendorField" type="s:unsignedByte" />
</s:complexType>
<s:simpleType name="qualityBits">
<s:restriction base="s:string">
<s:enumeration value="bad" />
<s:enumeration value="badConfigurationError" />
<s:enumeration value="badNotConnected" />
<s:enumeration value="badDeviceFailure" />
<s:enumeration value="badSensorFailure" />
<s:enumeration value="badLastKnownValue" />
<s:enumeration value="badCommFailure" />
<s:enumeration value="badOutOfService" />
<s:enumeration value="badWaitingForInitialData" />
<s:enumeration value="uncertain" />
<s:enumeration value="uncertainLastUsableValue" />
<s:enumeration value="uncertainSensorNotAccurate" />
<s:enumeration value="uncertainEUExceeded" />
<s:enumeration value="uncertainSubNormal" />
<s:enumeration value="good" />
<s:enumeration value="goodLocalOverride" />
</s:restriction>
</s:simpleType>
<s:simpleType name="limitBits">
<s:restriction base="s:string">
<s:enumeration value="none" />
<s:enumeration value="low" />
<s:enumeration value="high" />
<s:enumeration value="constant" />
</s:restriction>
</s:simpleType>
<s:element name="ReadResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ReadResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="1" name="RItemList" type="tns:ReplyItemList" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="Write">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Options" type="tns:RequestOptions" />
<s:element minOccurs="0" maxOccurs="1" name="ItemList" type="tns:WriteRequestItemList" />
</s:sequence>
<s:attribute name="ReturnValuesOnReply" type="s:boolean" use="required" />
</s:complexType>
</s:element>
<s:complexType name="WriteRequestItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:ItemValue" />
</s:sequence>
<s:attribute name="ItemPath" type="s:string" />
</s:complexType>
<s:element name="WriteResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="WriteResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="1" name="RItemList" type="tns:ReplyItemList" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="Subscribe">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Options" type="tns:RequestOptions" />
<s:element minOccurs="0" maxOccurs="1" name="ItemList" type="tns:SubscribeRequestItemList" />
</s:sequence>
<s:attribute name="ReturnValuesOnReply" type="s:boolean" use="required" />
<s:attribute default="0" name="SubscriptionPingRate" type="s:int" />
</s:complexType>
</s:element>
<s:complexType name="SubscribeRequestItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:SubscribeRequestItem" />
</s:sequence>
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ReqType" type="s:QName" use="required" />
<s:attribute name="Deadband" type="s:float" />
<s:attribute name="RequestedSamplingRate" type="s:int" />
<s:attribute name="EnableBuffering" type="s:boolean" />
</s:complexType>
<s:complexType name="SubscribeRequestItem">
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ReqType" type="s:QName" use="required" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ClientItemHandle" type="s:string" />
<s:attribute name="Deadband" type="s:float" />
<s:attribute name="RequestedSamplingRate" type="s:int" />
<s:attribute name="EnableBuffering" type="s:boolean" />
</s:complexType>
<s:complexType name="SubscribeReplyItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:SubscribeItemValue" />
</s:sequence>
<s:attribute name="RevisedSamplingRate" type="s:int" />
</s:complexType>
<s:complexType name="SubscribeItemValue">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ItemValue" type="tns:ItemValue" />
</s:sequence>
<s:attribute name="RevisedSamplingRate" type="s:int" />
</s:complexType>
<s:element name="SubscribeResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="SubscribeResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="1" name="RItemList" type="tns:SubscribeReplyItemList" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
<s:attribute name="ServerSubHandle" type="s:string" />
</s:complexType>
</s:element>
<s:element name="SubscriptionPolledRefresh">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Options" type="tns:RequestOptions" />
<s:element minOccurs="0" maxOccurs="unbounded" name="ServerSubHandles" type="s:string" />
</s:sequence>
<s:attribute name="HoldTime" type="s:dateTime" />
<s:attribute default="0" name="WaitTime" type="s:int" />
<s:attribute default="false" name="ReturnAllItems" type="s:boolean" />
</s:complexType>
</s:element>
<s:complexType name="SubscribePolledRefreshReplyItemList">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Items" type="tns:ItemValue" />
</s:sequence>
<s:attribute name="SubscriptionHandle" type="s:string" />
</s:complexType>
<s:element name="SubscriptionPolledRefreshResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="SubscriptionPolledRefreshResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="unbounded" name="InvalidServerSubHandles" type="s:string" />
<s:element minOccurs="0" maxOccurs="unbounded" name="RItemList" type="tns:SubscribePolledRefreshReplyItemList" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
<s:attribute default="false" name="DataBufferOverflow" type="s:boolean" />
</s:complexType>
</s:element>
<s:element name="SubscriptionCancel">
<s:complexType>
<s:attribute name="ServerSubHandle" type="s:string" />
<s:attribute name="ClientRequestHandle" type="s:string" />
</s:complexType>
</s:element>
<s:element name="SubscriptionCancelResponse">
<s:complexType>
<s:attribute name="ClientRequestHandle" type="s:string" />
</s:complexType>
</s:element>
<s:element name="Browse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="PropertyNames" type="s:QName" />
</s:sequence>
<s:attribute name="LocaleID" type="s:string" />
<s:attribute name="ClientRequestHandle" type="s:string" />
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="ContinuationPoint" type="s:string" />
<s:attribute default="0" name="MaxElementsReturned" type="s:int" />
<s:attribute default="all" name="BrowseFilter" type="tns:browseFilter" />
<s:attribute name="ElementNameFilter" type="s:string" />
<s:attribute name="VendorFilter" type="s:string" />
<s:attribute default="false" name="ReturnAllProperties" type="s:boolean" />
<s:attribute default="false" name="ReturnPropertyValues" type="s:boolean" />
<s:attribute default="false" name="ReturnErrorText" type="s:boolean" />
</s:complexType>
</s:element>
<s:simpleType name="browseFilter">
<s:restriction base="s:string">
<s:enumeration value="all" />
<s:enumeration value="branch" />
<s:enumeration value="item" />
</s:restriction>
</s:simpleType>
<s:complexType name="BrowseElement">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Properties" type="tns:ItemProperty" />
</s:sequence>
<s:attribute name="Name" type="s:string" />
<s:attribute name="ItemPath" type="s:string" />
<s:attribute name="ItemName" type="s:string" />
<s:attribute name="IsItem" type="s:boolean" use="required" />
<s:attribute name="HasChildren" type="s:boolean" use="required" />
</s:complexType>
<s:element name="BrowseResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="BrowseResult" type="tns:ReplyBase" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Elements" type="tns:BrowseElement" />
<s:element minOccurs="0" maxOccurs="unbounded" name="Errors" type="tns:OPCError" />
</s:sequence>
<s:attribute name="ContinuationPoint" type="s:string" />
<s:attribute default="false" name="MoreElements" type="s:boolean" />
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="GetPropertiesSoapIn">
<wsdl:part name="parameters" element="tns:GetProperties" />
</wsdl:message>
<wsdl:message name="GetPropertiesSoapOut">
<wsdl:part name="parameters" element="tns:GetPropertiesResponse" />
</wsdl:message>
<wsdl:message name="GetStatusSoapIn">
<wsdl:part name="parameters" element="tns:GetStatus" />
</wsdl:message>
<wsdl:message name="GetStatusSoapOut">
<wsdl:part name="parameters" element="tns:GetStatusResponse" />
</wsdl:message>
<wsdl:message name="ReadSoapIn">
<wsdl:part name="parameters" element="tns:Read" />
</wsdl:message>
<wsdl:message name="ReadSoapOut">
<wsdl:part name="parameters" element="tns:ReadResponse" />
</wsdl:message>
<wsdl:message name="WriteSoapIn">
<wsdl:part name="parameters" element="tns:Write" />
</wsdl:message>
<wsdl:message name="WriteSoapOut">
<wsdl:part name="parameters" element="tns:WriteResponse" />
</wsdl:message>
<wsdl:message name="SubscribeSoapIn">
<wsdl:part name="parameters" element="tns:Subscribe" />
</wsdl:message>
<wsdl:message name="SubscribeSoapOut">
<wsdl:part name="parameters" element="tns:SubscribeResponse" />
</wsdl:message>
<wsdl:message name="SubscriptionPolledRefreshSoapIn">
<wsdl:part name="parameters" element="tns:SubscriptionPolledRefresh" />
</wsdl:message>
<wsdl:message name="SubscriptionPolledRefreshSoapOut">
<wsdl:part name="parameters" element="tns:SubscriptionPolledRefreshResponse" />
</wsdl:message>
<wsdl:message name="SubscriptionCancelSoapIn">
<wsdl:part name="parameters" element="tns:SubscriptionCancel" />
</wsdl:message>
<wsdl:message name="SubscriptionCancelSoapOut">
<wsdl:part name="parameters" element="tns:SubscriptionCancelResponse" />
</wsdl:message>
<wsdl:message name="BrowseSoapIn">
<wsdl:part name="parameters" element="tns:Browse" />
</wsdl:message>
<wsdl:message name="BrowseSoapOut">
<wsdl:part name="parameters" element="tns:BrowseResponse" />
</wsdl:message>
<wsdl:portType name="ServiceSoap">
<wsdl:operation name="GetProperties">
<wsdl:input message="tns:GetPropertiesSoapIn" />
<wsdl:output message="tns:GetPropertiesSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetStatus">
<wsdl:input message="tns:GetStatusSoapIn" />
<wsdl:output message="tns:GetStatusSoapOut" />
</wsdl:operation>
<wsdl:operation name="Read">
<wsdl:input message="tns:ReadSoapIn" />
<wsdl:output message="tns:ReadSoapOut" />
</wsdl:operation>
<wsdl:operation name="Write">
<wsdl:input message="tns:WriteSoapIn" />
<wsdl:output message="tns:WriteSoapOut" />
</wsdl:operation>
<wsdl:operation name="Subscribe">
<wsdl:input message="tns:SubscribeSoapIn" />
<wsdl:output message="tns:SubscribeSoapOut" />
</wsdl:operation>
<wsdl:operation name="SubscriptionPolledRefresh">
<wsdl:input message="tns:SubscriptionPolledRefreshSoapIn" />
<wsdl:output message="tns:SubscriptionPolledRefreshSoapOut" />
</wsdl:operation>
<wsdl:operation name="SubscriptionCancel">
<wsdl:input message="tns:SubscriptionCancelSoapIn" />
<wsdl:output message="tns:SubscriptionCancelSoapOut" />
</wsdl:operation>
<wsdl:operation name="Browse">
<wsdl:input message="tns:BrowseSoapIn" />
<wsdl:output message="tns:BrowseSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
<wsdl:operation name="GetProperties">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/GetProperties" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetStatus">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/GetStatus" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Read">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/Read" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Write">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/Write" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Subscribe">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/Subscribe" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SubscriptionPolledRefresh">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionPolledRefresh" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SubscriptionCancel">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionCancel" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Browse">
<soap:operation soapAction="http://opcfoundation.org/webservices/XMLDA/1.0/Browse" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Service">
<wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
<soap:address location="http://opcfoundation.org" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>