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