<!-- REQUEST elements --> 
<!ELEMENT Request (FB|Connection|FBType|AdapterType|DataType|Parameter)?> 
<!ATTLIST Request
  ID CDATA #REQUIRED
  Action (CREATE|DELETE|START|STOP|KILL|QUERY|READ|WRITE|RESET) #REQUIRED >
  
<!-- RESPONSE elements --> 
<!ELEMENT Response  (FB | Connection+ | FBType | AdapterType | DataType
      | NameList | FBList |EndpointList | FBStatus | Parameter)?>
<!ATTLIST Response
  ID CDATA #REQUIRED
  Reason (NOT_READY | UNSUPPORTED_CMD | UNSUPPORTED_TYPE |NO_SUCH_OBJECT | INVALID_OBJECT
      | INVALID_OPERATION | INVALID_STATE | OVERFLOW | DUPLICATE_OBJECT | INVALID_DST
      | NULL_POINTER | INTERRUPTED | UNKNOWN) #IMPLIED >

<!ELEMENT NameList (#PCDATA)> 
<!ELEMENT FBList (#PCDATA)> 
<!ELEMENT EndpointList (#PCDATA)> 

<!ELEMENT FBStatus EMPTY> 
<!ATTLIST FBStatus
  Status (IDLE|RUNNING|STOPPED|KILLED) #REQUIRED >
  
<!-- Common elements --> 
<!ELEMENT ByteData (#PCDATA)> 

<!ELEMENT VersionInfo EMPTY> 
<!ATTLIST VersionInfo
  Organization CDATA #REQUIRED
  Version CDATA #REQUIRED
  Date CDATA #REQUIRED > 

<!ELEMENT FB EMPTY> 
<!ATTLIST FB
  Name CDATA #REQUIRED
  Type CDATA #REQUIRED > 

<!ELEMENT Connection EMPTY> 
<!ATTLIST Connection
 Source CDATA #REQUIRED
 Destination CDATA #REQUIRED > 

<!ELEMENT VarDeclaration EMPTY> 
<!ATTLIST VarDeclaration
  Name ID #REQUIRED
  Type CDATA #REQUIRED
  ArraySize CDATA #IMPLIED
  InitialValue CDATA #IMPLIED >
<!-- FBType elements --> 
<!ELEMENT FBType (VersionInfo,InterfaceList,ByteData?) > 
<!ATTLIST FBType
  Name CDATA #REQUIRED > 

<!ELEMENT InterfaceList (EventInputs?,EventOutputs?,InputVars?,OutputVars?, Sockets?, Plugs?)> 

<!ELEMENT EventInputs (Event+)> 
<!ELEMENT EventOutputs (Event+)> 
<!ELEMENT InputVars (VarDeclaration+)> 
<!ELEMENT OutputVars (VarDeclaration+)> 
<!ELEMENT Sockets (AdapterDeclaration+)> 
<!ELEMENT Plugs (AdapterDeclaration+)> 

<!ELEMENT Event EMPTY> 
<!ATTLIST Event
  Name ID #REQUIRED
  Type CDATA #IMPLIED
  With CDATA #IMPLIED > 

<!ELEMENT AdapterDeclaration EMPTY> 
<!ATTLIST AdapterDeclaration
   Name ID #REQUIRED
  Type CDATA #REQUIRED >
<!-- AdapterType elements --> 
<!ELEMENT AdapterType (VersionInfo,InterfaceList,ByteData?)> 
<!ATTLIST AdapterType
  Name ID #REQUIRED >
<!-- DataType elements --> 
<!ELEMENT DataType (VersionInfo,ASN1Tag, (DirectlyDerivedType |EnumeratedType|SubrangeType|ArrayType|StructuredType),ByteData?)> 
<!ATTLIST DataType
  Name ID #REQUIRED > 

<!ELEMENT ASN1Tag EMPTY> 
<!ATTLIST ASN1Tag
  Class (UNIVERSAL | APPLICATION | CONTEXT | PRIVATE) #IMPLIED
  Number CDATA #REQUIRED > 
<!ELEMENT DirectlyDerivedType EMPTY> 
<!ATTLIST DirectlyDerivedType
  BaseType (BOOL | SINT | INT | DINT | LINT | USINT | UINT | UDINT | ULINT | REAL | LREAL | TIME | DATE | TIME_OF_DAY | DATE_AND_TIME | STRING | BYTE | WORD | DWORD | LWORD | WSTRING) #REQUIRED
  InitialValue CDATA #IMPLIED > 
<!ELEMENT EnumeratedType (#PCDATA)> 
<!ATTLIST EnumeratedType
  InitialValue CDATA #IMPLIED > 
<!ELEMENT SubrangeType (Subrange)> 
<!ATTLIST SubrangeType
  BaseType (SINT|INT|DINT|LINT|USINT|UINT|UDINT|ULINT) #REQUIRED
  InitialValue CDATA #IMPLIED > 

<!ELEMENT Subrange EMPTY>
<!ATTLIST Subrange
  LowerLimit CDATA #REQUIRED
  UpperLimit CDATA #REQUIRED > 
<!ELEMENT ArrayType (Subrange)+> 
<!ATTLIST ArrayType
  BaseType CDATA #REQUIRED
  InitialValues CDATA #IMPLIED > 
<!ELEMENT StructuredType (VarDeclaration|ArrayVarDeclaration|SubrangeVarDeclaration)+> 
<!ELEMENT ArrayVarDeclaration (Subrange+) > 
<!ATTLIST ArrayVarDeclaration
  Name ID #REQUIRED
  Type CDATA #REQUIRED
  InitialValues CDATA #IMPLIED > 
<!ELEMENT SubrangeVarDeclaration (Subrange?) > 
<!ATTLIST SubrangeVarDeclaration
  Name ID #REQUIRED
  Type (SINT|INT|DINT|LINT|USINT|UINT|UDINT|ULINT) #REQUIRED
  InitialValue CDATA #IMPLIED >
  
<!ELEMENT Parameter EMPTY>
<!ATTLIST Parameter
	Reference CDATA #IMPLIED
	Value CDATA #IMPLIED >