You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/01/24 15:38:12 UTC
[incubator-plc4x] branch develop updated: - Fixed the handling of
"CPU Function" packets. - Added a lot of S7 test with real-world packet
captures.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new 15ba63c - Fixed the handling of "CPU Function" packets. - Added a lot of S7 test with real-world packet captures.
15ba63c is described below
commit 15ba63c318114aa66bbb7b2928133c937e3f110d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Jan 24 16:38:06 2019 +0100
- Fixed the handling of "CPU Function" packets.
- Added a lot of S7 test with real-world packet captures.
---
.../protocols/s7-full-stack-protocol.dfdl.xsd | 207 ++--
.../apache/plc4x/protocols/s7-protocol.dfdl.xsd | 6 +-
.../plc4x/protocols/AbstractProtocolTest.java | 2 +-
.../plc4x/protocols/s7-full-stack-protocol.tdml | 1025 +++++++++++++++++++-
4 files changed, 1146 insertions(+), 94 deletions(-)
diff --git a/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-full-stack-protocol.dfdl.xsd b/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-full-stack-protocol.dfdl.xsd
index d9066c1..28d5b00 100644
--- a/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-full-stack-protocol.dfdl.xsd
+++ b/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-full-stack-protocol.dfdl.xsd
@@ -176,7 +176,8 @@
<xs:element dfdl:choiceBranchKey="240" ref="s7f:CotpTpduData"/>
</xs:choice>
<xs:element name="userData" type="s7f:S7MessageType" minOccurs="0"
- dfdl:occursCountKind="expression" dfdl:occursCount="{if((../../length - (../headerLength + 1)) gt 0) then 1 else 0}"/>
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if((../../length - (../headerLength + 1)) gt 0) then 1 else 0}"/>
</xs:sequence>
</xs:complexType>
@@ -348,14 +349,10 @@
(no error code or error class). As mapping to the same type is not allowed,
we map to strings and use that as choice-key.
-->
- <xs:choice dfdl:choiceDispatchKey="{
- if(type eq 1) then 'request'
- else if(type eq 3) then 'response'
- else if(type eq 7) then 'response'
- else 'unknown'
- }">
- <xs:element dfdl:choiceBranchKey="request" ref="s7f:S7RequestMessage"/>
- <xs:element dfdl:choiceBranchKey="response" ref="s7f:S7ResponseMessage"/>
+ <xs:choice dfdl:choiceDispatchKey="{type}">
+ <xs:element dfdl:choiceBranchKey="1" ref="s7f:S7RequestMessage"/>
+ <xs:element dfdl:choiceBranchKey="3" ref="s7f:S7ResponseMessage"/>
+ <xs:element dfdl:choiceBranchKey="7" ref="s7f:S7UserDataMessage"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
@@ -381,8 +378,6 @@
<xs:choice dfdl:choiceDispatchKey="{type}">
<xs:element dfdl:choiceBranchKey="240"
ref="s7f:S7GeneralParameterSetupCommunication"/>
- <xs:element dfdl:choiceBranchKey="0"
- ref="s7f:SS7RequestParameterCPUService"/>
<xs:element dfdl:choiceBranchKey="4" ref="s7f:S7RequestParameterReadVar"/>
<xs:element dfdl:choiceBranchKey="5" ref="s7f:S7RequestParameterWriteVar"/>
</xs:choice>
@@ -406,7 +401,7 @@
<!--
For every parameter we'll be outputting a payload block, even if this might be empty.
This is required in order to find the matching parameter for every payload we might
- be having. We need to match these as otherwise we couldn't determin the type of a
+ be having. We need to match these as otherwise we couldn't determine the type of a
payload as this has no type information and we need to be able to access the number
of items for a read/write request in order to process the correct number of items in
the payload.
@@ -416,10 +411,10 @@
dfdl:occursCount="{fn:count(../../parameters[1]/parameter)}">
<xs:complexType>
<xs:sequence>
- <xs:choice dfdl:choiceDispatchKey="{../../parameters[1]/parameter[dfdl:occursIndex()]/type}">
+ <xs:choice
+ dfdl:choiceDispatchKey="{../../parameters[1]/parameter[dfdl:occursIndex()]/type}">
<xs:element dfdl:choiceBranchKey="240"
ref="s7f:S7GeneralPayloadSetupCommunication"/>
- <xs:element dfdl:choiceBranchKey="0" ref="s7f:S7RequestPayloadCpuServices"/>
<xs:element dfdl:choiceBranchKey="4" ref="s7f:S7RequestPayloadReadVar"/>
<xs:element dfdl:choiceBranchKey="5" ref="s7f:S7RequestPayloadWriteVar"/>
</xs:choice>
@@ -459,8 +454,6 @@
<xs:choice dfdl:choiceDispatchKey="{type}">
<xs:element dfdl:choiceBranchKey="240"
ref="s7f:S7GeneralParameterSetupCommunication"/>
- <xs:element dfdl:choiceBranchKey="0"
- ref="s7f:S7ResponseParameterCPUService"/>
<xs:element dfdl:choiceBranchKey="4" ref="s7f:S7ResponseParameterReadVar"/>
<xs:element dfdl:choiceBranchKey="5" ref="s7f:S7ResponseParameterWriteVar"/>
</xs:choice>
@@ -498,7 +491,6 @@
dfdl:choiceDispatchKey="{../../parameters[1]/parameter[dfdl:occursIndex()]/type}">
<xs:element dfdl:choiceBranchKey="240"
ref="s7f:S7GeneralPayloadSetupCommunication"/>
- <xs:element dfdl:choiceBranchKey="0" ref="s7f:S7ResponsePayloadCpuServices"/>
<xs:element dfdl:choiceBranchKey="4" ref="s7f:S7ResponsePayloadReadVar"/>
<xs:element dfdl:choiceBranchKey="5" ref="s7f:S7ResponsePayloadWriteVar"/>
</xs:choice>
@@ -512,6 +504,74 @@
</xs:complexType>
</xs:element>
+
+ <xs:element name="S7UserDataMessage">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- Reserved value always 0x0000 -->
+ <xs:element name="reserved" type="s7f:short" fixed="0"/>
+ <xs:element name="tpduReference" type="s7f:short"/>
+ <xs:element name="parametersLength" type="s7f:short"/>
+ <xs:element name="payloadsLength" type="s7f:short"/>
+ <xs:element name="parameters" minOccurs="0"
+ dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../parametersLength}"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parameter" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="type" type="s7f:byte"/>
+ <xs:choice dfdl:choiceDispatchKey="{type}">
+ <xs:element dfdl:choiceBranchKey="0"
+ ref="s7f:S7UserDataParameterCPUService"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--
+ As we might be outputting an empty payload block for a parameter that might not have a payload,
+ we have to output this element if the parameters are not empty. The case that the payloads are
+ not empty but the parameters are can't happen during normal operation.
+ -->
+ <xs:element name="payloads" minOccurs="0"
+ dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../payloadsLength}"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+ <xs:complexType>
+ <xs:sequence>
+ <!--
+ For every parameter we'll be outputting a payload block, even if this might be empty.
+ This is required in order to find the matching parameter for every payload we might
+ be having. We need to match these as otherwise we couldn't determine the type of a
+ payload as this has no type information and we need to be able to access the number
+ of items for a read/write request in order to process the correct number of items in
+ the payload.
+ -->
+ <xs:element name="payload" maxOccurs="unbounded"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{fn:count(../../parameters[1]/parameter)}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice
+ dfdl:choiceDispatchKey="{../../parameters[1]/parameter[dfdl:occursIndex()]/type}">
+ <xs:element dfdl:choiceBranchKey="0"
+ ref="s7f:S7UserDataPayloadCpuServices"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
<!--
Parameters.
@@ -530,39 +590,31 @@
</xs:complexType>
</xs:element>
- <xs:element name="SS7RequestParameterCPUService">
+ <xs:element name="S7UserDataParameterCPUService">
<xs:complexType>
<xs:sequence>
<!-- Fixed header 0x0112 274 -> -->
<xs:element name="header" type="s7f:short"/><!-- fixed="274"-->
- <xs:element name="length" type="s7f:byte"/><!-- fixed="4"-->
+ <xs:element name="paramLength" type="s7f:byte"/><!-- fixed="4"-->
<!-- Request: 0x11 -> 17 -->
<xs:element name="typeCode" type="s7f:byte"/><!-- fixed="17"-->
+ <xs:element name="type" type="xs:unsignedByte" dfdl:lengthKind="explicit" dfdl:lengthUnits="bits"
+ dfdl:length="4"/>
<!-- First 4 bits: Request 0x40, last 4 bits: Function Group 0x04 = 0x44 -> 68 -->
- <xs:element name="functionGroup" type="s7f:byte"/><!-- fixed="68"-->
- <!-- READ SSL = 0x01 -->
- <xs:element name="subFunctionGroup" type="s7f:byte"/><!-- fixed="1"-->
- <xs:element name="sequenceNumber" type="s7f:byte"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
-
- <xs:element name="S7ResponseParameterCPUService">
- <xs:complexType>
- <xs:sequence>
- <!-- Fixed header 0x0112 274 -> -->
- <xs:element name="header" type="s7f:short"/><!-- fixed="274"-->
- <xs:element name="paramLength" type="s7f:byte"/><!-- fixed="8"-->
- <!-- Response: 0x12 -> 18 -->
- <xs:element name="typeCode" type="s7f:byte"/><!-- fixed="18"-->
- <!-- First 4 bits: Response 0x80, last 4 bits: Function Group 0x04 = 0x84 -> 132 -->
- <xs:element name="functionGroup" type="s7f:byte"/><!-- fixed="132"-->
+ <xs:element name="functionGroup" type="xs:unsignedByte" dfdl:lengthKind="explicit"
+ dfdl:lengthUnits="bits" dfdl:length="4"/><!-- fixed="68"-->
<!-- READ SSL = 0x01 -->
<xs:element name="subFunctionGroup" type="s7f:byte"/><!-- fixed="1"-->
<xs:element name="sequenceNumber" type="s7f:byte"/>
- <xs:element name="dataUnitReferenceNumber" type="s7f:byte"/>
- <xs:element name="lastDataUnit" type="s7f:byte"/>
- <xs:element name="error" type="s7f:short"/>
+ <xs:element name="dataUnitReferenceNumber" type="s7f:byte" minOccurs="0"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
+ <xs:element name="lastDataUnit" type="s7f:byte" minOccurs="0"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
+ <xs:element name="errorCode" type="s7f:short" minOccurs="0"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -689,49 +741,41 @@
-->
- <xs:element name="S7GeneralPayloadSetupCommunication">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="payload" type="s7f:byte" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
-
- <xs:element name="S7RequestPayloadCpuServices">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="transportSize" type="s7f:byte"/><!-- fixed="9"-->
- <xs:element name="length" type="s7f:byte"/>
- <xs:element name="sslId" type="s7f:short"/>
- <xs:element name="sslIndex" type="s7f:short"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
+ <xs:element name="S7GeneralPayloadSetupCommunication"
+ type="xs:hexBinary" dfdl:lengthKind="explicit" dfdl:length="0"/>
- <xs:element name="S7ResponsePayloadCpuServices">
+ <xs:element name="S7UserDataPayloadCpuServices">
<xs:complexType>
<xs:sequence>
<xs:element name="returnCode" type="s7f:byte"/>
- <!-- Transport Size: Octet String = 0x09 -> 9 -->
<xs:element name="transportSize" type="s7f:byte"/><!-- fixed="9"-->
<xs:element name="length" type="s7f:short"/>
- <xs:element name="sslId" type="s7f:short"/>
- <xs:element name="sslIndex" type="s7f:short"/>
+ <xs:element name="sslId" type="s7f:short" minOccurs="0"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../returnCode eq 255) then 1 else 0}"/>
+ <xs:element name="sslIndex" type="s7f:short" minOccurs="0"
+ dfdl:occursCountKind="expression"
+ dfdl:occursCount="{if(../returnCode eq 255) then 1 else 0}"/>
<xs:element name="partialList" minOccurs="0"
- dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../length - 4}"
- dfdl:occursCountKind="expression" dfdl:occursCount="{../length gt 4}">
+ dfdl:occursCountKind="expression" dfdl:occursCount="{if((../returnCode eq 255) and (../length gt 4)) then 1 else 0}">
<xs:complexType>
<xs:sequence>
- <xs:element name="partialListLengthInWords" type="s7f:short"/>
+ <xs:element name="partialListLengthInBytes" type="s7f:short"/>
<xs:element name="partialListCount" type="s7f:short"/>
<xs:element name="sslDataRecords">
<xs:complexType>
- <xs:sequence dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes"
- dfdl:length="{../length - 8}">
- <xs:choice>
- <xs:element
- ref="s7f:S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification"/>
- </xs:choice>
+ <xs:sequence>
+ <xs:element name="sslDataRecord" maxOccurs="unbounded"
+ dfdl:occursCountKind="expression" dfdl:occursCount="{../../partialListCount}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice dfdl:choiceDispatchKey="{../../../sslId[1]}">
+ <xs:element dfdl:choiceBranchKey="17"
+ ref="s7f:S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -746,8 +790,8 @@
<xs:complexType>
<xs:sequence>
<xs:element name="index" type="s7f:short"/>
- <xs:element name="articleNumber" type="xs:unsignedByte"
- dfdl:lengthUnits="bytes" dfdl:length="20" dfdl:lengthKind="explicit"/>
+ <xs:element name="articleNumber" type="xs:string" dfdl:textTrimKind="none" dfdl:alignmentUnits="bytes"
+ dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="20"/>
<xs:element name="bgType" type="s7f:short"/>
<xs:element name="moduleOrOsVersion" type="s7f:short"/>
<xs:element name="pgDescriptionFileVersion" type="s7f:short"/>
@@ -755,13 +799,8 @@
</xs:complexType>
</xs:element>
- <xs:element name="S7RequestPayloadReadVar">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="payload" type="s7f:byte" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
+ <xs:element name="S7RequestPayloadReadVar"
+ type="xs:hexBinary" dfdl:lengthKind="explicit" dfdl:length="0"/>
<xs:element name="S7ResponsePayloadReadVar">
<xs:complexType>
@@ -793,12 +832,12 @@
Transport sizes: BIT, BYTE_WORD_DWORD and OCTET_STRING require a blank byte.
However only if this is not the last item in the result.
-->
- <xs:element name="reserved" type="s7f:byte" minOccurs="0"
+ <!--xs:element name="reserved" type="s7f:byte" minOccurs="0"
dfdl:occursCountKind="expression" dfdl:occursCount="{
if(((../transportSize eq 3) or
(../transportSize eq 4) or
(../transportSize eq 9)) and
- (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/>
+ (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/-->
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -839,12 +878,12 @@
Actually the S7 device will never process data that contains more
than one item in a write request, so this is rather a cosmetic fine-tuning.
-->
- <xs:element name="reserved" type="s7f:byte" minOccurs="0"
+ <!--xs:element name="reserved" type="s7f:byte" minOccurs="0"
dfdl:occursCountKind="expression" dfdl:occursCount="{
if(((../transportSize eq 3) or
(../transportSize eq 4) or
(../transportSize eq 9)) and
- (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/>
+ (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/-->
</xs:sequence>
</xs:complexType>
</xs:element>
diff --git a/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-protocol.dfdl.xsd b/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-protocol.dfdl.xsd
index fb584ed..0001cdf 100644
--- a/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-protocol.dfdl.xsd
+++ b/protocols/src/main/dfdl/org/apache/plc4x/protocols/s7-protocol.dfdl.xsd
@@ -415,12 +415,12 @@
-->
- <xs:element name="S7GeneralPayloadSetupCommunication">
- <xs:complexType>
+ <xs:element name="S7GeneralPayloadSetupCommunication" type="xs:hexBinary" dfdl:length="0">
+ <!--xs:complexType>
<xs:sequence>
<xs:element name="payload" type="s7f:byte" minOccurs="0"/>
</xs:sequence>
- </xs:complexType>
+ </xs:complexType-->>
</xs:element>
<xs:element name="S7RequestPayloadCpuServices">
diff --git a/protocols/src/test/java/org/apache/plc4x/protocols/AbstractProtocolTest.java b/protocols/src/test/java/org/apache/plc4x/protocols/AbstractProtocolTest.java
index 19e49e4..70efdbc 100644
--- a/protocols/src/test/java/org/apache/plc4x/protocols/AbstractProtocolTest.java
+++ b/protocols/src/test/java/org/apache/plc4x/protocols/AbstractProtocolTest.java
@@ -43,7 +43,7 @@ public abstract class AbstractProtocolTest {
Runner.defaultRoundTripDefaultDefault(), Runner.defaultValidationDefaultDefault());
List<DynamicTest> dynamicTests = new LinkedList<>();
Iterator<String> iterator = testSuite.testCaseMap().keySet().iterator();
- while(iterator.hasNext()) {
+ while (iterator.hasNext()) {
String testcaseName = iterator.next();
String testcaseLabel = testSuite.suiteName() + ": " + testcaseName;
DynamicTest test = DynamicTest.dynamicTest(testcaseLabel, () ->
diff --git a/protocols/src/test/resources/org/apache/plc4x/protocols/s7-full-stack-protocol.tdml b/protocols/src/test/resources/org/apache/plc4x/protocols/s7-full-stack-protocol.tdml
index 73c38c0..c883995 100644
--- a/protocols/src/test/resources/org/apache/plc4x/protocols/s7-full-stack-protocol.tdml
+++ b/protocols/src/test/resources/org/apache/plc4x/protocols/s7-full-stack-protocol.tdml
@@ -23,7 +23,7 @@
xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData"
xmlns:s7="http://plc4x.apache.org/s7-full"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
- suiteName="S7 protocol (Full-Stack KPKT + COTP + S7)"
+ suiteName="S7 protocol (Full-Stack)"
description="Testsuite for the full stack of the S7 protocol"
defaultRoundTrip="true">
@@ -135,7 +135,6 @@
<tdml:parserTestCase name="TPKT: tooLongPayload"
root="tpktMessage"
model="s7Schema">
- ยด
<tdml:document>
<tdml:documentPart type="byte">0300001611D00001000200C00109C1020100C20201021234567890</tdml:documentPart>
</tdml:document>
@@ -155,12 +154,10 @@
root="tpktMessage"
model="s7Schema"
description="Minimal valid COTP Connection Request TPDU">
- <!-- Define the input -->
<tdml:document>
<tdml:documentPart type="byte">0300000706E00001000200</tdml:documentPart>
</tdml:document>
- <!-- Define the expected output -->
<tdml:infoset>
<tdml:dfdlInfoset>
<test:tpktMessage>
@@ -185,12 +182,10 @@
root="tpktMessage"
model="s7Schema"
description="Minimal valid COTP Connection Response TPDU">
- <!-- Define the input -->
<tdml:document>
<tdml:documentPart type="byte">0300000706D00001000200</tdml:documentPart>
</tdml:document>
- <!-- Define the expected output -->
<tdml:infoset>
<tdml:dfdlInfoset>
<test:tpktMessage>
@@ -357,6 +352,19 @@
</tdml:infoset>
</tdml:parserTestCase>
+ <tdml:parserTestCase name="COTP: invalid type"
+ root="tpktMessage"
+ model="s7Schema"
+ description="Invalid type code">
+ <tdml:document>
+ <tdml:documentPart type="byte">030000050420000102</tdml:documentPart>
+ </tdml:document>
+
+ <tdml:errors>
+ <tdml:error>Parse Error</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
<!--
Tests for the parameter types.
@@ -558,6 +566,19 @@
</tdml:infoset>
</tdml:parserTestCase>
+ <tdml:parserTestCase name="COTP: invalid parameter type"
+ root="tpktMessage"
+ model="s7Schema"
+ description="Invalid parameter type">
+ <tdml:document>
+ <tdml:documentPart type="byte">0300000F0EE00001000200A006010203040506</tdml:documentPart>
+ </tdml:document>
+
+ <tdml:errors>
+ <tdml:error>Parse Error</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
<!--
Tests for typical packets used in PLC4X
@@ -738,6 +759,998 @@
</tdml:infoset>
</tdml:parserTestCase>
+ <tdml:parserTestCase name="S7: Setup Communication Request"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001902f08032010000000000080000f0000001000101e0</tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>25</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>1</type>
+ <S7RequestMessage>
+ <reserved>0</reserved>
+ <tpduReference>0</tpduReference>
+ <parametersLength>8</parametersLength>
+ <payloadsLength>0</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>240</type>
+ <S7GeneralParameterSetupCommunication>
+ <reserved>0</reserved>
+ <maxAmqCaller>1</maxAmqCaller>
+ <maxAmqCallee>1</maxAmqCallee>
+ <pduLength>480</pduLength>
+ </S7GeneralParameterSetupCommunication>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7GeneralPayloadSetupCommunication/>
+ </payload>
+ </payloads>
+ </S7RequestMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Setup Communication Response"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001b02f080320300000000000800000000f0000001000100f0</tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>27</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>3</type>
+ <S7ResponseMessage>
+ <reserved>0</reserved>
+ <tpduReference>0</tpduReference>
+ <parametersLength>8</parametersLength>
+ <payloadsLength>0</payloadsLength>
+ <errorClass>0</errorClass>
+ <errorCode>0</errorCode>
+ <parameters>
+ <parameter>
+ <type>240</type>
+ <S7GeneralParameterSetupCommunication>
+ <reserved>0</reserved>
+ <maxAmqCaller>1</maxAmqCaller>
+ <maxAmqCallee>1</maxAmqCallee>
+ <pduLength>240</pduLength>
+ </S7GeneralParameterSetupCommunication>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7GeneralPayloadSetupCommunication/>
+ </payload>
+ </payloads>
+ </S7ResponseMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read SZL CPU Function Request"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300002102f080 320700000100000800080001120411440100ff09000400110000
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>33</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>7</type>
+ <S7UserDataMessage>
+ <reserved>0</reserved>
+ <tpduReference>256</tpduReference>
+ <parametersLength>8</parametersLength>
+ <payloadsLength>8</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>0</type>
+ <S7UserDataParameterCPUService>
+ <header>274</header>
+ <paramLength>4</paramLength>
+ <typeCode>17</typeCode>
+ <type>4</type>
+ <functionGroup>4</functionGroup>
+ <subFunctionGroup>1</subFunctionGroup>
+ <sequenceNumber>0</sequenceNumber>
+ </S7UserDataParameterCPUService>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7UserDataPayloadCpuServices>
+ <returnCode>255</returnCode>
+ <transportSize>9</transportSize>
+ <length>4</length>
+ <sslId>17</sslId>
+ <sslIndex>0</sslIndex>
+ </S7UserDataPayloadCpuServices>
+ </payload>
+ </payloads>
+ </S7UserDataMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read SZL CPU Function Response"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">
+ 0300009902f080320700
+ 000100000c007c000112
+ 081284010200000000ff
+ 09007800110000001c00
+ 04000136455337203331352d32454831342d304142302000c000030001000636455337203331352d32454831342d304142302000c0000300010007202020202020202020202020202020202020202000c0560302070081426f6f74204c6f61646572202020202020202020000041200909
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>153</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>7</type>
+ <S7UserDataMessage>
+ <reserved>0</reserved>
+ <tpduReference>256</tpduReference>
+ <parametersLength>12</parametersLength>
+ <payloadsLength>124</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>0</type>
+ <S7UserDataParameterCPUService>
+ <header>274</header>
+ <paramLength>8</paramLength>
+ <typeCode>18</typeCode>
+ <type>8</type>
+ <functionGroup>4</functionGroup>
+ <subFunctionGroup>1</subFunctionGroup>
+ <sequenceNumber>2</sequenceNumber>
+ <dataUnitReferenceNumber>0</dataUnitReferenceNumber>
+ <lastDataUnit>0</lastDataUnit>
+ <errorCode>0</errorCode>
+ </S7UserDataParameterCPUService>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7UserDataPayloadCpuServices>
+ <returnCode>255</returnCode>
+ <transportSize>9</transportSize>
+ <length>120</length>
+ <sslId>17</sslId>
+ <sslIndex>0</sslIndex>
+ <partialList>
+ <partialListLengthInBytes>28</partialListLengthInBytes>
+ <partialListCount>4</partialListCount>
+ <sslDataRecords>
+ <sslDataRecord>
+ <S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ <index>1</index>
+ <articleNumber><![CDATA[6ES7 315-2EH14-0AB0 ]]></articleNumber>
+ <bgType>192</bgType>
+ <moduleOrOsVersion>3</moduleOrOsVersion>
+ <pgDescriptionFileVersion>1</pgDescriptionFileVersion>
+ </S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ </sslDataRecord>
+ <sslDataRecord>
+ <S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ <index>6</index>
+ <articleNumber><![CDATA[6ES7 315-2EH14-0AB0 ]]></articleNumber>
+ <bgType>192</bgType>
+ <moduleOrOsVersion>3</moduleOrOsVersion>
+ <pgDescriptionFileVersion>1</pgDescriptionFileVersion>
+ </S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ </sslDataRecord>
+ <sslDataRecord>
+ <S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ <index>7</index>
+ <articleNumber><![CDATA[ ]]></articleNumber>
+ <bgType>192</bgType>
+ <moduleOrOsVersion>22019</moduleOrOsVersion>
+ <pgDescriptionFileVersion>519</pgDescriptionFileVersion>
+ </S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ </sslDataRecord>
+ <sslDataRecord>
+ <S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ <index>129</index>
+ <articleNumber><![CDATA[Boot Loader ]]></articleNumber>
+ <bgType>0</bgType>
+ <moduleOrOsVersion>16672</moduleOrOsVersion>
+ <pgDescriptionFileVersion>2313</pgDescriptionFileVersion>
+ </S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification>
+ </sslDataRecord>
+ </sslDataRecords>
+ </partialList>
+ </S7UserDataPayloadCpuServices>
+ </payload>
+ </payloads>
+ </S7UserDataMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read Var Request (Single Item)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001f02f080320100001900000e00000401120a10080001000083000080
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>31</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>1</type>
+ <S7RequestMessage>
+ <reserved>0</reserved>
+ <tpduReference>6400</tpduReference>
+ <parametersLength>14</parametersLength>
+ <payloadsLength>0</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>4</type>
+ <S7RequestParameterReadVar>
+ <numItems>1</numItems>
+ <items>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>8</dataType>
+ <numElements>1</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>131</memoryArea>
+ <byteOffset>16</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ </items>
+ </S7RequestParameterReadVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7RequestPayloadReadVar/>
+ </payload>
+ </payloads>
+ </S7RequestMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read Var Response (Single Item)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001d02f0803203000019000002000800000401ff07000400000000
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>29</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>3</type>
+ <S7ResponseMessage>
+ <reserved>0</reserved>
+ <tpduReference>6400</tpduReference>
+ <parametersLength>2</parametersLength>
+ <payloadsLength>8</payloadsLength>
+ <errorClass>0</errorClass>
+ <errorCode>0</errorCode>
+ <parameters>
+ <parameter>
+ <type>4</type>
+ <S7ResponseParameterReadVar>
+ <numItems>1</numItems>
+ </S7ResponseParameterReadVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7ResponsePayloadReadVar>
+ <numItems>1</numItems>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>7</transportSize>
+ <rawLength>4</rawLength>
+ <lengthInBytes>4</lengthInBytes>
+ <data>00000000</data>
+ </item>
+ </S7ResponsePayloadReadVar>
+ </payload>
+ </payloads>
+ </S7ResponseMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Write Var Request (Single Item)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">
+ 0300002702f080320100001800000e00080501120a100800010000830000800007000479e9f642
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>39</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>1</type>
+ <S7RequestMessage>
+ <reserved>0</reserved>
+ <tpduReference>6144</tpduReference>
+ <parametersLength>14</parametersLength>
+ <payloadsLength>8</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>5</type>
+ <S7RequestParameterWriteVar>
+ <numItems>1</numItems>
+ <items>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>8</dataType>
+ <numElements>1</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>131</memoryArea>
+ <byteOffset>16</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ </items>
+ </S7RequestParameterWriteVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7RequestPayloadWriteVar>
+ <numItems>1</numItems>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>7</transportSize>
+ <rawLength>4</rawLength>
+ <lengthInBytes>4</lengthInBytes>
+ <data>79E9F642</data>
+ </item>
+ </S7RequestPayloadWriteVar>
+ </payload>
+ </payloads>
+ </S7RequestMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Write Var Response (Single Item)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001602f0803203000018000002000100000501ff</tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>22</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>3</type>
+ <S7ResponseMessage>
+ <reserved>0</reserved>
+ <tpduReference>6144</tpduReference>
+ <parametersLength>2</parametersLength>
+ <payloadsLength>1</payloadsLength>
+ <errorClass>0</errorClass>
+ <errorCode>0</errorCode>
+ <parameters>
+ <parameter>
+ <type>5</type>
+ <S7ResponseParameterWriteVar>
+ <numItems>1</numItems>
+ </S7ResponseParameterWriteVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7ResponsePayloadWriteVar>
+ <numItems>1</numItems>
+ <item>
+ <returnCode>255</returnCode>
+ </item>
+ </S7ResponsePayloadWriteVar>
+ </payload>
+ </payloads>
+ </S7ResponseMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read Var Request (Multiple Items)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">
+ 0300004f02f080320100001b00003e00000405120a10020010000083000000120a10020010000081000000120a10020010000082000000120a101d000800001d000000120a101c000800001c000000
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>79</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>1</type>
+ <S7RequestMessage>
+ <reserved>0</reserved>
+ <tpduReference>6912</tpduReference>
+ <parametersLength>62</parametersLength>
+ <payloadsLength>0</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>4</type>
+ <S7RequestParameterReadVar>
+ <numItems>5</numItems>
+ <items>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>2</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>131</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>2</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>129</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>2</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>130</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>29</dataType>
+ <numElements>8</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>29</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterReadVarAnyItem>
+ <paramLength>10</paramLength>
+ <addressingMode>16</addressingMode>
+ <dataType>28</dataType>
+ <numElements>8</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>28</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterReadVarAnyItem>
+ </item>
+ </items>
+ </S7RequestParameterReadVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7RequestPayloadReadVar/>
+ </payload>
+ </payloads>
+ </S7RequestMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Read Var Response (Multiple Items)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">
+ 0300007902f080320300001b000002006400000405ff040080acde000daddeaddeaddeaddeaddeaddeff040080aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbff040080bbbbbbbbbbbbbbbbaddeaddeaddeaddeff09001000000000000000000000000000000000ff09001000110000000000000000000000000000
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>121</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>3</type>
+ <S7ResponseMessage>
+ <reserved>0</reserved>
+ <tpduReference>6912</tpduReference>
+ <parametersLength>2</parametersLength>
+ <payloadsLength>100</payloadsLength>
+ <errorClass>0</errorClass>
+ <errorCode>0</errorCode>
+ <parameters>
+ <parameter>
+ <type>4</type>
+ <S7ResponseParameterReadVar>
+ <numItems>5</numItems>
+ </S7ResponseParameterReadVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7ResponsePayloadReadVar>
+ <numItems>5</numItems>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>128</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>ACDE000DADDEADDEADDEADDEADDEADDE</data>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>128</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB</data>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>128</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>BBBBBBBBBBBBBBBBADDEADDEADDEADDE</data>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>9</transportSize>
+ <rawLength>16</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>00000000000000000000000000000000</data>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ <transportSize>9</transportSize>
+ <rawLength>16</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>00110000000000000000000000000000</data>
+ </item>
+ </S7ResponsePayloadReadVar>
+ </payload>
+ </payloads>
+ </S7ResponseMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Write Var Request (Multiple Items)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">
+ 030000c302f080320100001a00003e00740505120a10040010000083000000120a10020010000081000000120a10020010000082000000120a101d000800001d000000120a101c000800001c00000000040100addeaddeaddeaddeaddeaddeaddeaddeefbeefbeefbeefbeefbeefbeefbeefbe00040080aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb00040080bbbbbbbbbbbbbbbbaddeaddeaddeadde00090010efbeefbeefbeefbeefbeefbeefbeefbe00090010fecafecafecafecafecafecafecafeca
+ </tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>195</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>1</type>
+ <S7RequestMessage>
+ <reserved>0</reserved>
+ <tpduReference>6656</tpduReference>
+ <parametersLength>62</parametersLength>
+ <payloadsLength>116</payloadsLength>
+ <parameters>
+ <parameter>
+ <type>5</type>
+ <S7RequestParameterWriteVar>
+ <numItems>5</numItems>
+ <items>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>4</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>131</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>2</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>129</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>2</dataType>
+ <numElements>16</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>130</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>29</dataType>
+ <numElements>8</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>29</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ <item>
+ <type>18</type>
+ <S7RequestParameterWriteVarAnyItem>
+ <itemLength>10</itemLength>
+ <addressingMode>16</addressingMode>
+ <dataType>28</dataType>
+ <numElements>8</numElements>
+ <dataBlockNumber>0</dataBlockNumber>
+ <memoryArea>28</memoryArea>
+ <byteOffset>0</byteOffset>
+ <bitOffset>0</bitOffset>
+ </S7RequestParameterWriteVarAnyItem>
+ </item>
+ </items>
+ </S7RequestParameterWriteVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7RequestPayloadWriteVar>
+ <numItems>5</numItems>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>256</rawLength>
+ <lengthInBytes>32</lengthInBytes>
+ <data>ADDEADDEADDEADDEADDEADDEADDEADDEEFBEEFBEEFBEEFBEEFBEEFBEEFBEEFBE</data>
+ </item>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>128</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB</data>
+ </item>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>4</transportSize>
+ <rawLength>128</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>BBBBBBBBBBBBBBBBADDEADDEADDEADDE</data>
+ </item>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>9</transportSize>
+ <rawLength>16</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>EFBEEFBEEFBEEFBEEFBEEFBEEFBEEFBE</data>
+ </item>
+ <item>
+ <returnCode>0</returnCode>
+ <transportSize>9</transportSize>
+ <rawLength>16</rawLength>
+ <lengthInBytes>16</lengthInBytes>
+ <data>FECAFECAFECAFECAFECAFECAFECAFECA</data>
+ </item>
+ </S7RequestPayloadWriteVar>
+ </payload>
+ </payloads>
+ </S7RequestMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="S7: Write Var Response (Multiple Items)"
+ root="tpktMessage"
+ model="s7Schema">
+ <!-- Define the input -->
+ <tdml:document>
+ <tdml:documentPart type="byte">0300001a02f080320300001a000002000500000505ffffff0303</tdml:documentPart>
+ </tdml:document>
+
+ <!-- Define the expected output -->
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <test:tpktMessage>
+ <magicByte>3</magicByte>
+ <reserved>0</reserved>
+ <length>26</length>
+ <userData>
+ <headerLength>2</headerLength>
+ <type>240</type>
+ <CotpTpduData>
+ <endOfTransmission>1</endOfTransmission>
+ <tpduRef>0</tpduRef>
+ </CotpTpduData>
+ <userData>
+ <magicByte>50</magicByte>
+ <type>3</type>
+ <S7ResponseMessage>
+ <reserved>0</reserved>
+ <tpduReference>6656</tpduReference>
+ <parametersLength>2</parametersLength>
+ <payloadsLength>5</payloadsLength>
+ <errorClass>0</errorClass>
+ <errorCode>0</errorCode>
+ <parameters>
+ <parameter>
+ <type>5</type>
+ <S7ResponseParameterWriteVar>
+ <numItems>5</numItems>
+ </S7ResponseParameterWriteVar>
+ </parameter>
+ </parameters>
+ <payloads>
+ <payload>
+ <S7ResponsePayloadWriteVar>
+ <numItems>5</numItems>
+ <item>
+ <returnCode>255</returnCode>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ </item>
+ <item>
+ <returnCode>255</returnCode>
+ </item>
+ <item>
+ <returnCode>3</returnCode>
+ </item>
+ <item>
+ <returnCode>3</returnCode>
+ </item>
+ </S7ResponsePayloadWriteVar>
+ </payload>
+ </payloads>
+ </S7ResponseMessage>
+ </userData>
+ </userData>
+ </test:tpktMessage>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
</testSuite>