<?xml version="1.0" encoding="UTF-8"?>
<Schema name="FDTIOLinkCommunicationSchema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:fdt="x-schema:FDTDataTypesSchema.xml">

	<AttributeType name="schemaVersion" dt:type="number" default="1.00"/>
	<AttributeType name="communicationReference" dt:type="uuid"/>
	<AttributeType name="index" dt:type="ui2"/>
	<AttributeType name="subIndex" dt:type="ui1"/>
	<AttributeType name="systemTag" dt:type="string"/>
	<AttributeType name="errorCode" dt:type="ui1"/>
	<AttributeType name="additionalCode" dt:type="ui1"/>
	<AttributeType name="sequenceTime" dt:type="ui4"/>
	<AttributeType name="delayTime" dt:type="ui4"/>
	<AttributeType name="instance" dt:type="enumeration" dt:values="unknown physicalLayer dataLinkLayer applicationLayer application"/>
	<AttributeType name="type" dt:type="enumeration" dt:values="error warning message"/>
	<AttributeType name="mode" dt:type="enumeration" dt:values="singleshot appears disappears"/>
	<AttributeType name="pdValid" dt:type="boolean"/>
	<AttributeType name="pdValidInput" dt:type="boolean"/>
	<AttributeType name="pdValidOutput" dt:type="boolean"/>
	<AttributeType name="eventErrorCode" dt:type="ui2"/>
	<!-- input: Device ==> PLC/Master; output: PLC/Master ==> Device -->
	<AttributeType name="direction" dt:type="enumeration" dt:values="input output"/>
	
	<!-- Establish connection/Release connection -->
	<ElementType name="ConnectRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="systemTag" required="yes"/>
	</ElementType>
	<ElementType name="ConnectResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
	</ElementType>
	
	<ElementType name="DisconnectRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	<ElementType name="DisconnectResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
	</ElementType>
	
	<!-- On-Request-Data; Service PDUs -->
	<ElementType name="ReadRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="index" required="yes"/>
		<attribute type="subIndex" required="yes"/>
	</ElementType>
	<ElementType name="ReadResponse" content="eltOnly" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
		<element type="fdt:CommunicationData" minOccurs="1" maxOccurs="1"/>
	</ElementType>
	
	<ElementType name="WriteRequest" content="eltOnly" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="index" required="yes"/>
		<attribute type="subIndex" required="yes"/>
		<element type="fdt:CommunicationData" minOccurs="1" maxOccurs="1"/>
	</ElementType>
	<ElementType name="WriteResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
	</ElementType>
	
	<!-- process data exchange -->
	<ElementType name="ReadProcessDataRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="direction" required="yes"/>
	</ElementType>
	<ElementType name="ReadProcessDataResponse" content="eltOnly" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="direction" required="yes"/>
		<attribute type="pdValid" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
		<element type="fdt:CommunicationData" minOccurs="1" maxOccurs="1" />
	</ElementType>

	<ElementType name="WriteOutputProcessDataRequest" content="eltOnly" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="pdValid" required="yes"/>
		<element type="fdt:CommunicationData" minOccurs="1" maxOccurs="1"/>
	</ElementType>
	<ElementType name="WriteOutputProcessDataResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="errorCode" required="yes"/>
		<attribute type="additionalCode" required="yes"/>
	</ElementType>

	<!-- sequences -->
	<ElementType name="SequenceBegin" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
		<attribute type="sequenceTime" required="no"/>
		<attribute type="delayTime" required="no"/>
	</ElementType>
	<ElementType name="SequenceEnd" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	<ElementType name="SequenceStart" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	
	<ElementType name="Abort" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	
	<!-- event subscription/unsubscription -->
	<ElementType name="SubscribeRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	<ElementType name="SubscribeResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	
	<ElementType name="UnsubscribeRequest" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>
	<ElementType name="UnsubscribeResponse" content="empty" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<attribute type="communicationReference" required="yes"/>
	</ElementType>

	<!-- event data -->
	<ElementType name="EventData" content="empty" model="closed">
			<attribute type="fdt:nodeId" required="no"/>
			<attribute type="instance" required="yes"/>
			<attribute type="type" required="yes"/>
			<attribute type="mode" required="yes"/>
			<attribute type="eventErrorCode" required="yes"/>
	</ElementType>
	
	<!-- Poll for event data (excluding Singleshot events) --> 
	<ElementType name="AppearedEventsRequest" content="empty" model="closed">
			<attribute type="fdt:nodeId" required="no"/>
			<attribute type="communicationReference" required="yes"/>
	</ElementType>
	<ElementType name="AppearedEventsResponse" content="eltOnly" model="closed">
			<attribute type="fdt:nodeId" required="no"/>
			<attribute type="communicationReference" required="yes"/>
			<attribute type="pdValidInput" required="yes"/>
			<attribute type="pdValidOutput" required="yes"/>
			<element type="EventData" minOccurs="0" maxOccurs="*"/>
	</ElementType>

	<ElementType name="FDT" content="eltOnly" model="closed">
		<attribute type="fdt:nodeId" required="no"/>
		<group order="one">
			<element type="ConnectRequest"/>
			<element type="ConnectResponse"/>
			
			<element type="DisconnectRequest"/>
			<element type="DisconnectResponse"/>
			
			<element type="Abort"/>
			
			<element type="ReadRequest"/>
			<element type="ReadResponse"/>
			
			<element type="WriteRequest"/>
			<element type="WriteResponse"/>
			
			<element type="ReadProcessDataRequest"/>
			<element type="ReadProcessDataResponse"/>
			<element type="WriteOutputProcessDataRequest"/>
			<element type="WriteOutputProcessDataResponse"/>
			
			<element type="SequenceBegin"/>
			<element type="SequenceEnd"/>
			<element type="SequenceStart"/>
			
			<element type="SubscribeRequest"/>
			<element type="SubscribeResponse"/>
			<element type="UnsubscribeRequest"/>
	   		<element type="UnsubscribeResponse"/>
			
			<element type="AppearedEventsRequest"/>
			<element type="AppearedEventsResponse"/>
			
			<element type="fdt:CommunicationError"/>
		</group>
	</ElementType>
</Schema>
