You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2022/05/25 08:18:42 UTC

[plc4x] 02/02: start of logix development

This is an automated email from the ASF dual-hosted git repository.

hutcheb pushed a commit to branch logix_develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 94aa0010a4b49a36b10bedcf9d4627a3429b867a
Author: Ben Hutcheson <be...@gmail.com>
AuthorDate: Wed May 25 18:17:16 2022 +1000

    start of logix development
---
 protocols/logix/pom.xml                            |  43 +++
 .../apache/plc4x/protocol/logix/LogixProtocol.java |  42 +++
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |  19 ++
 .../src/main/resources/protocols/logix/logix.mspec | 210 +++++++++++++++
 .../plc4x/protocol/logix/LogixProtocolTest.java    |  37 +++
 .../resources/protocols/eip/DriverTestsuite.xml    | 224 ++++++++++++++++
 .../protocols/eip/ParserSerializerTestsuite.xml    | 292 +++++++++++++++++++++
 7 files changed, 867 insertions(+)

diff --git a/protocols/logix/pom.xml b/protocols/logix/pom.xml
new file mode 100644
index 0000000000..a61f5f01ac
--- /dev/null
+++ b/protocols/logix/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4x-protocols</artifactId>
+    <version>0.10.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4x-protocols-logix</artifactId>
+
+  <name>Protocols: Allen Bradley Logix Processors</name>
+  <description>Base protocol specifications for the Allen Bradley Logix Processors</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-code-generation-protocol-base-mspec</artifactId>
+      <version>0.10.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/protocols/logix/src/main/java/org/apache/plc4x/protocol/logix/LogixProtocol.java b/protocols/logix/src/main/java/org/apache/plc4x/protocol/logix/LogixProtocol.java
new file mode 100644
index 0000000000..7f25668042
--- /dev/null
+++ b/protocols/logix/src/main/java/org/apache/plc4x/protocol/logix/LogixProtocol.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.protocol.logix;
+
+import org.apache.plc4x.plugins.codegenerator.language.mspec.parser.MessageFormatParser;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.protocol.ProtocolHelpers;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.protocol.ValidatableTypeContext;
+import org.apache.plc4x.plugins.codegenerator.protocol.Protocol;
+import org.apache.plc4x.plugins.codegenerator.protocol.TypeContext;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
+
+public class LogixProtocol implements Protocol, ProtocolHelpers {
+
+    @Override
+    public String getName() {
+        return "logix";
+    }
+
+    @Override
+    public TypeContext getTypeContext() throws GenerationException {
+        ValidatableTypeContext typeContext = new MessageFormatParser().parse(getMspecStream());
+        typeContext.validate();
+        return typeContext;
+    }
+
+}
diff --git a/protocols/logix/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol b/protocols/logix/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol
new file mode 100644
index 0000000000..a926f952db
--- /dev/null
+++ b/protocols/logix/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.plc4x.protocol.logix.LogixProtocol
\ No newline at end of file
diff --git a/protocols/logix/src/main/resources/protocols/logix/logix.mspec b/protocols/logix/src/main/resources/protocols/logix/logix.mspec
new file mode 100644
index 0000000000..65860e0021
--- /dev/null
+++ b/protocols/logix/src/main/resources/protocols/logix/logix.mspec
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//////////////////////////////////////////////////////////////////
+///EthernetIP Header of size 24
+/////////////////////////////////////////////////////////////////
+
+[discriminatedType EipPacket byteOrder='LITTLE_ENDIAN'
+    [discriminator uint 16 command]
+    [implicit      uint 16 len 'lengthInBytes - 24']
+    [simple        uint 32 sessionHandle]
+    [simple        uint 32 status]
+    [array         uint 8  senderContext count '8']
+    [simple        uint 32 options]
+    [typeSwitch command
+            ['0x0065' EipConnectionRequest
+                [const      uint    16   protocolVersion   0x01]
+                [const      uint    16   flags             0x00]
+            ]
+            ['0x0066' EipDisconnectRequest
+            ]
+            ['0x006F' CipRRData(uint 16 len)
+                [reserved   uint    32    '0x00000000']
+                [simple     uint    16    timeout]
+                [simple     uint    16    itemCount]
+                [simple    CipExchange('len - 6')   exchange]
+            ]
+        ]
+]
+
+[type  CipExchange (uint 16 exchangeLen)  //We pass then length down to evey sub-type to be able to provide the remaining data size
+    [const          uint 32                         nullPtr             0x0                   ]  //NullPointerAddress
+    [const          uint 16                         unconnectedData     0x00B2                ]  //Connection Manager
+    [implicit       uint 16                         size                'lengthInBytes - 8 - 2' ]  //remove fields above and routing
+    [simple         CipService('exchangeLen - 10')  service                                     ]
+]
+
+[discriminatedType  CipService(uint 16 serviceLen)
+    [discriminator  bit     response]
+    [discriminator  uint    7   service]
+    [typeSwitch service,response
+        ['0x4C','false' CipReadRequest
+            [simple     int     8   requestPathSize]
+            [array      byte   tag   length  '(requestPathSize * 2)']
+            [simple     uint    16  elementNb]
+        ]
+        ['0x4C','true' CipReadResponse
+              [reserved   uint            8   '0x00']
+              [simple     uint            8   status]
+              [simple     uint            8   extStatus]
+              [simple     CIPDataTypeCode     dataType]
+              [array      byte   data  count  'serviceLen - 6']
+        ]
+        ['0x4D','false' CipWriteRequest
+            [simple     int     8           requestPathSize]
+            [array      byte           tag   length  'requestPathSize * 2']
+            [simple     CIPDataTypeCode     dataType]
+            [simple     uint    16          elementNb]
+            [array      byte            data  length  'dataType.size * elementNb']
+        ]
+        ['0x4D','true' CipWriteResponse
+            [reserved   uint        8   '0x00']
+            [simple     uint        8   status]
+            [simple     uint        8   extStatus]
+        ]
+        ['0x0A','false' MultipleServiceRequest
+               [const  int     8   requestPathSize   0x02]
+               [const  uint    32  requestPath       0x01240220]   //Logical Segment: Class(0x20) 0x02, Instance(0x24) 01 (Message Router)
+               [simple Services('serviceLen - 6 ')  data ]
+        ]
+        ['0x0A','true' MultipleServiceResponse
+               [reserved   uint    8   '0x0']
+               [simple     uint    8   status]
+               [simple     uint    8   extStatus]
+               [simple     uint    16  serviceNb]
+               [array      uint    16  offsets       count  'serviceNb']
+               [array      byte   servicesData count 'serviceLen - 6 - (2 * serviceNb)']
+        ]
+        ['0x52','false'   CipUnconnectedRequest
+               [implicit   uint    8    requestPathSize ]
+               [optional   PathSegment  pathSegment0 'requestPathSize - pathSegment0.dataSize']
+               [optional   PathSegment  pathSegment1 'requestPathSize - pathSegment0.dataSize - pathSegment1.dataSize']
+
+
+               [reserved   uint    8   '0x20']   // setRequestPathLogicalClassSegment
+               [reserved   uint    8   '0x06']   // set request class path
+               [reserved   uint    8   '0x24']   // setRequestPathLogicalInstanceSegment
+               [reserved   uint    8   '0x01']   // setRequestPathInstance
+               [reserved   uint    16  '0x9D05']   //Timeout 5s
+               [implicit   uint    16  messageSize   'lengthInBytes - 10 - 4']   //subtract above and routing
+               [simple     CipService('messageSize')  unconnectedService ]
+               [const      uint    16  route 0x0001]
+               [simple     int     8   backPlane]
+               [simple     int     8   slot]
+        ]
+        ['0x5B','false'     CipConnectionManagerRequest
+               [simple      int     8           requestPathSize]
+               [simple      ClassSegment        classSegment]
+               [simple      InstanceSegment     instanceSegment]
+               [simple      unit    4           priority]
+               [simple      uint    4           tickTime]
+               [simple      uint    8           timeoutTicks]
+               [simple      uint    16          actualTimeout]
+               [simple      uint    32          otConnectionId]
+               [simple      uint    32          toConnectionId]
+               [simple      uint    16          connectionSerialNumber]
+               [simple      uint    16          originatorVendorId]
+               [simple      uint    32          originatorSerialNumber]
+               [simple      uint    8           timeoutMultiplier]
+               [reserved    uint    24          '0x000000']
+               [simple      uint    32          otRpi]
+               [simple      NetworkConnectionParameters otConnectionParameters]
+               [simple      uint    32          toRpi]
+               [simple      NetworkConnectionParameters toConnectionParameters]
+               [simple      TransportType       transportType]
+               [simple      uint    8           connectionPathSize]
+               [simple      PortSegment         portSegment]
+
+        ]
+        ['0x5B','true'     CipConnectionManagerResponse
+               [simple      uint    32          otConnectionId]
+               [simple      uint    32          toConnectionId]
+               [simple      uint    16          connectionSerialNumber]
+               [simple      uint    16          originatorVendorId]
+               [simple      uint    32          originatorSerialNumber]
+               [simple      uint    32          otApi]
+               [simple      uint    32          toApi]
+               [implicit    uint    8           replySize   'serviceLen - 46']
+               [reserved    uint    8           '0x00']
+        ]
+    ]
+]
+
+[type   InstanceSegment
+                [simple     uint    3   pathSegmentType]
+                [simple     uint    3   logicalSegmentType]
+                [simple     uint    2   logicalSegmentFormat]
+                [simple     uint    8   instance]
+]
+
+[type   ClassSegment
+                [simple     uint    3   pathSegmentType]
+                [simple     uint    3   logicalSegmentType]
+                [simple     uint    2   logicalSegmentFormat]
+                [simple     uint    8   class]
+]
+
+[type   PortSegment
+                [simple     uint    3   portSegmentType]
+                [simple     bool    1   extendedLinkAddress]
+                [simple     uint    4   port]
+                [simple     uint    8   linkAddress]
+]
+
+[type   NetworkConnectionParameters
+               [simple      bool    1   owner]
+               [simple      uint    2   connectionType]
+               [simple      uint    2   priority]
+               [simple      bool    1   connectionSizeType]
+               [simple      uint    16  connectionSize]
+]
+
+[type   TransportType
+               [simple      bool    1   direction]
+               [simple      uint    3   trigger]
+               [simple      uint    4   class]
+]
+
+[type   Services  (uint   16   servicesLen)
+    [simple uint        16  serviceNb]
+    [array  uint        16  offsets       count  'serviceNb']
+    [array  CipService('servicesLen / serviceNb')   services    count  'serviceNb' ]
+]
+
+[enum uint   16   CIPDataTypeCode(uint 8  size)
+    ['0X00C1'   BOOL            ['1']]
+    ['0X00C2'   SINT            ['1']]
+    ['0X00C3'   INT             ['2']]
+    ['0X00C4'   DINT            ['4']]
+    ['0X00C5'   LINT            ['8']]
+    ['0X00CA'   REAL            ['4']]
+    ['0X00D3'   DWORD           ['4']]
+    ['0X02A0'   STRUCTURED      ['88']]
+    ['0X02A0'   STRING          ['88']]
+    ['0X02A0'   STRING36        ['40']]
+    //TODO: -1 is not a valid value for uint
+    //['-1'       UNKNOWN         ['-1']]
+]
+
+[enum   uint    16  EiPCommand
+    ['0x0065'   RegisterSession ]
+    ['0x0066'   UnregisterSession ]
+    ['0x006F'   SendRRData ]
+]
\ No newline at end of file
diff --git a/protocols/logix/src/test/java/org/apache/plc4x/protocol/logix/LogixProtocolTest.java b/protocols/logix/src/test/java/org/apache/plc4x/protocol/logix/LogixProtocolTest.java
new file mode 100644
index 0000000000..a573d2c397
--- /dev/null
+++ b/protocols/logix/src/test/java/org/apache/plc4x/protocol/logix/LogixProtocolTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.protocol.logix;
+
+import org.apache.plc4x.plugins.codegenerator.protocol.TypeContext;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+
+class LogixProtocolTest {
+
+    @Test
+    void getTypeContext() throws Exception {
+        TypeContext typeContext = new LogixProtocol().getTypeContext();
+        assertNotNull(typeContext);
+        assertNotNull(typeContext.getUnresolvedTypeReferences());
+        assertSame(0, typeContext.getUnresolvedTypeReferences().size());
+    }
+
+}
diff --git a/protocols/logix/src/test/resources/protocols/eip/DriverTestsuite.xml b/protocols/logix/src/test/resources/protocols/eip/DriverTestsuite.xml
new file mode 100644
index 0000000000..16bdb77ca0
--- /dev/null
+++ b/protocols/logix/src/test/resources/protocols/eip/DriverTestsuite.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       byteOrder="LITTLE_ENDIAN">
+
+  <name>LOGIX</name>
+
+  <protocolName>logix</protocolName>
+  <outputFlavor>read-write</outputFlavor>
+
+  <driver-name>logix</driver-name>
+
+  <setup>
+    <!-- First the driver is expected to send a RegisterSession connection request -->
+    <outgoing-plc-message name="Send connection request">
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <len dataType="uint" bitLength="16">4</len>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- The PLC will send the connection response with a sender context and session handle-->
+    <incoming-plc-message name="Receive connection response">
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <len dataType="uint" bitLength="16">4</len>
+        <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">2</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+
+    </incoming-plc-message>
+  </setup>
+  <testcase>
+    <name>Single element read request</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest>
+          <fields>
+            <field className="org.apache.plc4x.test.driver.internal.api.TestField">
+              <name>hurz</name>
+              <address>%rate</address>
+            </field>
+          </fields>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipReadRequest to PLC">
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <len dataType="uint" bitLength="16">40</len>
+          <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext isList="true">
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+          </senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <reserved dataType="uint" bitLength="32">0</reserved>
+            <reserved dataType="uint" bitLength="16">0</reserved>
+            <exchange>
+              <CipExchange>
+                <itemCount dataType="uint" bitLength="16">2</itemCount>
+                <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+                <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+                <size dataType="uint" bitLength="16">24</size>
+                <service>
+                  <CipService>
+                    <service dataType="uint" bitLength="8">82</service>
+                    <CipUnconnectedRequest>
+                      <reserved dataType="uint" bitLength="8">2</reserved>
+                      <reserved dataType="uint" bitLength="8">32</reserved>
+                      <reserved dataType="uint" bitLength="8">6</reserved>
+                      <reserved dataType="uint" bitLength="8">36</reserved>
+                      <reserved dataType="uint" bitLength="8">1</reserved>
+                      <reserved dataType="uint" bitLength="16">40197</reserved>
+                      <messageSize dataType="uint" bitLength="16">10</messageSize>
+                      <unconnectedService>
+                        <CipService>
+                          <service dataType="uint" bitLength="8">76</service>
+                          <CipReadRequest>
+                            <requestPathSize dataType="int" bitLength="8">3</requestPathSize>
+                            <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                            <elementNb dataType="uint" bitLength="16">1</elementNb>
+                          </CipReadRequest>
+                        </CipService>
+                      </unconnectedService>
+                      <route dataType="uint" bitLength="16">1</route>
+                      <backPlane dataType="int" bitLength="8">0</backPlane>
+                      <slot dataType="int" bitLength="8">0</slot>
+                    </CipUnconnectedRequest>
+                  </CipService>
+                </service>
+              </CipExchange>
+            </exchange>
+          </CipRRData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipReadResponse from PLC">
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <len dataType="uint" bitLength="16">26</len>
+          <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext isList="true">
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">0</value>
+            <value dataType="uint" bitLength="8">2</value>
+          </senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <reserved dataType="uint" bitLength="32">0</reserved>
+            <reserved dataType="uint" bitLength="16">0</reserved>
+            <exchange>
+              <CipExchange>
+                <itemCount dataType="uint" bitLength="16">2</itemCount>
+                <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+                <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+                <size dataType="uint" bitLength="16">10</size>
+                <service>
+                  <CipService>
+                    <service dataType="uint" bitLength="8">204</service>
+                    <CipReadResponse>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                      <status dataType="uint" bitLength="8">0</status>
+                      <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      <dataType>
+                        <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                        </CIPDataTypeCode>
+                      </dataType>
+                      <data dataType="byte" bitLength="32">0x00000216</data>
+                    </CipReadResponse>
+                  </CipService>
+                </service>
+              </CipExchange>
+            </exchange>
+          </CipRRData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <PlcReadResponse>
+          <PlcReadRequest>
+            <fields>
+              <hurz>
+                <EipField>
+                  <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
+                  <elementNb dataType="uint" bitLength="16">0</elementNb>
+                  <defaultJavaType dataType="string" bitLength="128" encoding="UTF-8">java.lang.Object</defaultJavaType>
+                </EipField>
+              </hurz>
+            </fields>
+          </PlcReadRequest>
+          <values>
+            <hurz>
+              <ResponseItem>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcDINT dataType="int" bitLength="64">369229824</PlcDINT>
+              </ResponseItem>
+            </hurz>
+          </values>
+        </PlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>
\ No newline at end of file
diff --git a/protocols/logix/src/test/resources/protocols/eip/ParserSerializerTestsuite.xml b/protocols/logix/src/test/resources/protocols/eip/ParserSerializerTestsuite.xml
new file mode 100644
index 0000000000..c984885589
--- /dev/null
+++ b/protocols/logix/src/test/resources/protocols/eip/ParserSerializerTestsuite.xml
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:testsuite xmlns:test="https://plc4x.apache.org/schemas/parser-serializer-testsuite.xsd"
+                byteOrder="BIG_ENDIAN">
+
+  <name>LOGIX</name>
+
+  <protocolName>logix</protocolName>
+  <outputFlavor>read-write</outputFlavor>
+
+  <testcase>
+    <name>Register Session</name>
+    <raw>00650004000000000000000000000000000000000000000000010000</raw>
+    <root-type>EipPacket</root-type>
+    <xml>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <len dataType="uint" bitLength="16">4</len>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>CIP Read Request</name>
+    <raw>
+      006F0028000012340000000001000000000000010000000000000000000000020000000000B200185202200624019D05000A4C03910472617465000100010104
+    </raw>
+    <root-type>EipPacket</root-type>
+    <xml>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <len dataType="uint" bitLength="16">40</len>
+        <sessionHandle dataType="uint" bitLength="32">4660</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">1</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">1</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <reserved dataType="uint" bitLength="32">0</reserved>
+          <reserved dataType="uint" bitLength="16">0</reserved>
+          <exchange>
+            <CipExchange>
+              <itemCount dataType="uint" bitLength="16">2</itemCount>
+              <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+              <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+              <size dataType="uint" bitLength="16">24</size>
+              <service>
+                <CipService>
+                  <service dataType="uint" bitLength="8">82</service>
+                  <CipUnconnectedRequest>
+                    <reserved dataType="uint" bitLength="8">2</reserved>
+                    <reserved dataType="uint" bitLength="8">32</reserved>
+                    <reserved dataType="uint" bitLength="8">6</reserved>
+                    <reserved dataType="uint" bitLength="8">36</reserved>
+                    <reserved dataType="uint" bitLength="8">1</reserved>
+                    <reserved dataType="uint" bitLength="16">40197</reserved>
+                    <messageSize dataType="uint" bitLength="16">10</messageSize>
+                    <unconnectedService>
+                      <CipService>
+                        <service dataType="uint" bitLength="8">76</service>
+                        <CipReadRequest>
+                          <requestPathSize dataType="int" bitLength="8">3</requestPathSize>
+                          <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </CipReadRequest>
+                      </CipService>
+                    </unconnectedService>
+                    <route dataType="uint" bitLength="16">1</route>
+                    <backPlane dataType="int" bitLength="8">1</backPlane>
+                    <slot dataType="int" bitLength="8">4</slot>
+                  </CipUnconnectedRequest>
+                </CipService>
+              </service>
+            </CipExchange>
+          </exchange>
+        </CipRRData>
+      </EipPacket>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>CIP Read Response</name>
+    <raw>006F001A000012340000000001000000000000010000000000000000000000020000000000B2000ACC00000000C400000216</raw>
+    <root-type>EipPacket</root-type>
+    <xml>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <len dataType="uint" bitLength="16">26</len>
+        <sessionHandle dataType="uint" bitLength="32">4660</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">1</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">1</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <reserved dataType="uint" bitLength="32">0</reserved>
+          <reserved dataType="uint" bitLength="16">0</reserved>
+          <exchange>
+            <CipExchange>
+              <itemCount dataType="uint" bitLength="16">2</itemCount>
+              <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+              <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+              <size dataType="uint" bitLength="16">10</size>
+              <service>
+                <CipService>
+                  <service dataType="uint" bitLength="8">204</service>
+                  <CipReadResponse>
+                    <reserved dataType="uint" bitLength="8">0</reserved>
+                    <status dataType="uint" bitLength="8">0</status>
+                    <extStatus dataType="uint" bitLength="8">0</extStatus>
+                    <dataType> <!--0xC4-->
+                      <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196</CIPDataTypeCode>
+                    </dataType>
+                    <data dataType="byte" bitLength="32">0x00000216</data>  <!--0x216 but again issue when parsing Object to XML-->
+                  </CipReadResponse>
+                </CipService>
+              </service>
+            </CipExchange>
+          </exchange>
+        </CipRRData>
+      </EipPacket>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>CIP Write Request</name>
+    <raw>
+      006F0034000012340000000001000000000000010000000000000000000000020000000000B200245202200624019D0500164D069116436172746F6E53697A6500C400010000000E00010104
+    </raw>
+    <root-type>EipPacket</root-type>
+    <xml>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <len dataType="uint" bitLength="16">52</len>
+        <sessionHandle dataType="uint" bitLength="32">4660</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">1</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">1</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <reserved dataType="uint" bitLength="32">0</reserved>
+          <reserved dataType="uint" bitLength="16">0</reserved>
+          <exchange>
+            <CipExchange>
+              <itemCount dataType="uint" bitLength="16">2</itemCount>
+              <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+              <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+              <size dataType="uint" bitLength="16">36</size>
+              <service>
+                <CipService>
+                  <service dataType="uint" bitLength="8">82</service>
+                  <CipUnconnectedRequest>
+                    <reserved dataType="uint" bitLength="8">2</reserved>
+                    <reserved dataType="uint" bitLength="8">32</reserved>
+                    <reserved dataType="uint" bitLength="8">6</reserved>
+                    <reserved dataType="uint" bitLength="8">36</reserved>
+                    <reserved dataType="uint" bitLength="8">1</reserved>
+                    <reserved dataType="uint" bitLength="16">40197</reserved>
+                    <messageSize dataType="uint" bitLength="16">22</messageSize>
+                    <unconnectedService>
+                      <CipService>
+                        <service dataType="uint" bitLength="8">77</service>
+                        <CipWriteRequest>
+                          <requestPathSize dataType="int" bitLength="8">6</requestPathSize>
+                          <tag dataType="byte" bitLength="96">0x9116436172746f6e53697a65</tag>
+                          <dataType>
+                            <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196</CIPDataTypeCode>
+                          </dataType>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                          <data dataType="byte" bitLength="32">0x0000000e</data>
+                        </CipWriteRequest>
+                      </CipService>
+                    </unconnectedService>
+                    <route dataType="uint" bitLength="16">1</route>
+                    <backPlane dataType="int" bitLength="8">1</backPlane>
+                    <slot dataType="int" bitLength="8">4</slot>
+                  </CipUnconnectedRequest>
+                </CipService>
+              </service>
+            </CipExchange>
+          </exchange>
+        </CipRRData>
+      </EipPacket>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>CIP Write Response</name>
+    <raw>006F0014000012340000000001000000000000010000000000000000000000020000000000B20004CD000000</raw>
+    <root-type>EipPacket</root-type>
+    <xml>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <len dataType="uint" bitLength="16">20</len>
+        <sessionHandle dataType="uint" bitLength="32">4660</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext isList="true">
+          <value dataType="uint" bitLength="8">1</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">0</value>
+          <value dataType="uint" bitLength="8">1</value>
+        </senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <reserved dataType="uint" bitLength="32">0</reserved>
+          <reserved dataType="uint" bitLength="16">0</reserved>
+          <exchange>
+            <CipExchange>
+              <itemCount dataType="uint" bitLength="16">2</itemCount>
+              <nullPtr dataType="uint" bitLength="32">0</nullPtr>
+              <unconnectedData dataType="uint" bitLength="16">178</unconnectedData>
+              <size dataType="uint" bitLength="16">4</size>
+              <service>
+                <CipService>
+                  <service dataType="uint" bitLength="8">205</service>
+                  <CipWriteResponse>
+                    <reserved dataType="uint" bitLength="8">0</reserved>
+                    <status dataType="uint" bitLength="8">0</status>
+                    <extStatus dataType="uint" bitLength="8">0</extStatus>
+                  </CipWriteResponse>
+                </CipService>
+              </service>
+            </CipExchange>
+          </exchange>
+        </CipRRData>
+      </EipPacket>
+    </xml>
+  </testcase>
+
+
+</test:testsuite>
\ No newline at end of file