<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="http://www.ORiN.co.jp/ISO20242-4/DCD2" 
targetNamespace="http://www.ORiN.co.jp/ISO20242-4/DCD2" 
elementFormDefault="qualified">
  <xsd:annotation>
    <xsd:appinfo source="http://www.ORiN.jp/ISO20242-4/DCPTHeader.xsd">
      <DCPTHeader>
        <DCPTIdentification>DCD2</DCPTIdentification>
        <DCPTRevision>1.0</DCPTRevision>
        <DCPTName>DCD2</DCPTName>
        <DCPTSource>DCD2.xsd</DCPTSource>
        <DCPTClassID>DCD2</DCPTClassID>
        <DCPTDate>2010-05-26</DCPTDate>
        <ISO20242Reference>
          <ISO20242Edition>1</ISO20242Edition>
          <Technology>ORiN</Technology>
        </ISO20242Reference>
      </DCPTHeader>
    </xsd:appinfo>
  </xsd:annotation>

  <xsd:include schemaLocation="ORiNcommon.xsd"/>

  <!-- Main type is ORiN_DCD with contained Virtual Device Types.
       There may be many different Virtual Device Types contained. -->
  <xsd:element name="DCD2" type="DCDType"/>
  <xsd:complexType name="DCDType">
    <xsd:complexContent>
      <xsd:extension base="ORiN_DCD">
        <xsd:sequence>
          <xsd:element ref="Provider"		minOccurs="0"
maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Virtual Device Types have fixed numbers for identification in moduleID.
       This is a restriction of type ORiN_Module. If You want to avoid
       restriction, move attribute moduleId from type ORiN_Module with a fixed
       number to type ProviderType below, which than is an extension of ORiN_Module
       and type ProviderBaseType will be obsolete. -->
  <xsd:complexType name="ProviderBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Module">
        <xsd:attribute name="moduleId"	type="xsd:unsignedShort"
use="required"		fixed="0"/>
        <xsd:attribute name="provider"	type="xsd:string"
use="required"		fixed="CaoProv.DCD2"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Virtual Device Types typically contain a Create Paramter of a specific
       type and several Function Objects of different types.
       This exemplary Function Object type describes an input channel and it is
       possible to use up to 16 channels with each Virtual Device instance. -->
  <xsd:element name="Provider" type="ProviderType"/>
  <xsd:complexType name="ProviderType">
    <xsd:complexContent>
      <xsd:extension base="ProviderBaseType">
        <xsd:sequence>
          <xsd:element ref="CaoProvController"	maxOccurs="unbounded"/>
          <xsd:element ref="CaoProvVariable"		minOccurs="0"
maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Function Object Types have fixed numbers for identification in funcID.
       This is a restriction of type ORiN_Object. If You want to avoid
       restriction, move attribute funcId from type ORiN_Object with a fixed
       number to type ControllerType below, which than is an extension of
       ORiN_Object and type ControllerBaseType will be obsolete. -->
  <xsd:complexType name="ControllerBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Object">
        <xsd:attribute name="funcId"		type="xsd:unsignedShort"
use="required"		fixed="101"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="VariableBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Object">
        <xsd:attribute name="funcId"		type="xsd:unsignedShort"
use="required"		fixed="106"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- This Function Object type exemplary contains several Operations. -->
  <xsd:element name="CaoProvController" type="ControllerType"/>
  <xsd:complexType name="ControllerType">
    <xsd:complexContent>
      <xsd:extension base="ControllerBaseType">
        <xsd:sequence>
          <xsd:element name="Connect"			type="CtrlConnectType"
minOccurs="0"/>
          <xsd:element name="Disconnect"		type="CtrlDisconnectType"
minOccurs="0"/>
          <xsd:element name="GetVariable"	type="CtrlGetVariableType"
minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- This Function Object type exemplary contains several Communication Objects. -->
  <xsd:element name="CaoProvVariable" type="VariableType"/>
  <xsd:complexType name="VariableType">
    <xsd:complexContent>
      <xsd:extension base="VariableBaseType">
        <xsd:sequence>
          <xsd:element name="Attribute"	type="PropertyROIntType"
minOccurs="0"/>
          <xsd:element name="Value"	type="PropertyRWVariantType"
minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- This Operation has optional input and output values. -->
  <xsd:complexType name="CtrlConnectType">
    <xsd:complexContent>
      <xsd:extension base="CtrlConnectBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter"	type="MethodInGetObjectType"/>
          <xsd:element name="Result"		type="MethodOutVoidType"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CtrlConnectBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId"	type="xsd:unsignedShort"
use="required"			fixed="3"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CtrlDisconnectType">
    <xsd:complexContent>
      <xsd:extension base="CtrlDisconnectBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter"	type="MethodInVoidType"/>
          <xsd:element name="Result"		type="MethodOutVoidType"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CtrlDisconnectBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId"	type="xsd:unsignedShort"
use="required"			fixed="4"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CtrlGetVariableType">
    <xsd:complexContent>
      <xsd:extension base="CtrlGetVariableBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter"	type="MethodInGetObjectType"/>
          <xsd:element name="Result"		type="MethodOUTGetObject"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="CtrlGetVariableBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">

        <xsd:attribute name="operationId"	type="xsd:unsignedShort"
use="required"			fixed="9"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- The input parameters for this operation may be a sequence of values. -->
  <xsd:complexType name="MethodInVoidType">
    <xsd:complexContent>
      <xsd:extension base="MethodInParameter">
        <xsd:sequence>
          <xsd:element name="Value"	type="void"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="MethodInGetObjectType">
    <xsd:complexContent>
      <xsd:extension base="MethodInParameter">
        <xsd:sequence>
          <xsd:element name="Value">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="Name"		type="xsd:string"/>
                <xsd:element name="Option"	type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- The output parameters for this operation is a special type "void",
       which defines, that the accordingly XML element has to be empty. -->
  <xsd:complexType name="MethodOutVoidType">
    <xsd:complexContent>
      <xsd:extension base="MethodOutParameter">
        <xsd:sequence>
          <xsd:element name="Value"	type="void"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name="MethodOUTGetObject">
    <xsd:complexContent>
      <xsd:extension base="MethodOutParameter">
        <xsd:sequence>
          <xsd:element name="Value"	type="xsd:unsignedInt"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- A simple readonly Property for the Function Object -->
  <xsd:complexType name="PropertyROIntType">
    <xsd:complexContent>
      <xsd:extension base="PropertyReadOnly">
        <xsd:sequence>
          <xsd:element name="Value"	type="xsd:int"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- A simple read/write Property for the Function Object -->
  <xsd:complexType name="PropertyRWVariantType">
    <xsd:complexContent>
      <xsd:extension base="PropertyReadWrite">
        <xsd:sequence>
          <xsd:element name="Value"	type="xsd:anyType"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- empty type -->
  <xsd:complexType name="void"/>

</xsd:schema>
