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>