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:40 UTC
[plc4x] branch logix_develop created (now 94aa0010a4)
This is an automated email from the ASF dual-hosted git repository.
hutcheb pushed a change to branch logix_develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
at 94aa0010a4 start of logix development
This branch includes the following new commits:
new 54c90dba81 fix(plc4j/opcua-server): Moved pinned jaxb-runtime from parent to nifi processor. It isn't needed and causes issue with the milo stack
new 94aa0010a4 start of logix development
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[plc4x] 01/02: fix(plc4j/opcua-server): Moved pinned jaxb-runtime from parent to nifi processor. It isn't needed and causes issue with the milo stack
Posted by hu...@apache.org.
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 54c90dba81ed287308fb14c9dec06b8b23310a47
Author: Ben Hutcheson <be...@gmail.com>
AuthorDate: Wed May 25 16:11:17 2022 +1000
fix(plc4j/opcua-server): Moved pinned jaxb-runtime from parent to nifi processor. It isn't needed and causes issue with the milo stack
---
plc4j/integrations/apache-nifi/pom.xml | 16 ++++++++++
plc4j/integrations/opcua-server/pom.xml | 1 +
.../opcua-server/src/main/resources/config.yml | 36 +++++++++++-----------
.../opcua-server/src/test/resources/config.yml | 36 +++++++++++-----------
pom.xml | 20 +-----------
5 files changed, 54 insertions(+), 55 deletions(-)
diff --git a/plc4j/integrations/apache-nifi/pom.xml b/plc4j/integrations/apache-nifi/pom.xml
index de68897213..f89022a2ba 100644
--- a/plc4j/integrations/apache-nifi/pom.xml
+++ b/plc4j/integrations/apache-nifi/pom.xml
@@ -93,6 +93,22 @@
<artifactId>swagger-annotations</artifactId>
<version>1.6.0</version>
</dependency>
+ <dependency>
+ <groupId>org.glassfish.jaxb</groupId>
+ <artifactId>jaxb-runtime</artifactId>
+ <version>${jaxb.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>jakarta.xml.bind</groupId>
+ <artifactId>jakarta.xml.bind-api</artifactId>
+ <version>3.0.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>jakarta.activation</groupId>
+ <artifactId>jakarta.activation-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
</dependencyManagement>
diff --git a/plc4j/integrations/opcua-server/pom.xml b/plc4j/integrations/opcua-server/pom.xml
index 49b8302616..aed25c810a 100644
--- a/plc4j/integrations/opcua-server/pom.xml
+++ b/plc4j/integrations/opcua-server/pom.xml
@@ -106,6 +106,7 @@
<version>0.10.0-SNAPSHOT</version>
</dependency>
+
<!-- Include all drivers -->
<dependency>
<groupId>org.apache.plc4x</groupId>
diff --git a/plc4j/integrations/opcua-server/src/main/resources/config.yml b/plc4j/integrations/opcua-server/src/main/resources/config.yml
index b27a805fea..35aacc7530 100644
--- a/plc4j/integrations/opcua-server/src/main/resources/config.yml
+++ b/plc4j/integrations/opcua-server/src/main/resources/config.yml
@@ -66,38 +66,38 @@ devices:
connectionString: "opcua:tcp://127.0.0.1:12687/plc4x"
tags:
- alias: "Simulated_OPC_BOOL"
- address: "ns=2;s=Simulated_BOOL"
+ address: "ns=1;s=Simulated_BOOL"
- alias: "Simulated_OPC_BYTE"
- address: "ns=2;s=Simulated_BYTE"
+ address: "ns=1;s=Simulated_BYTE"
- alias: "Simulated_OPC_WORD"
- address: "ns=2;s=Simulated_WORD"
+ address: "ns=1;s=Simulated_WORD"
- alias: "Simulated_OPC_DWORD"
- address: "ns=2;s=Simulated_DWORD"
+ address: "ns=1;s=Simulated_DWORD"
- alias: "Simulated_OPC_SINT"
- address: "ns=2;s=Simulated_SINT"
+ address: "ns=1;s=Simulated_SINT"
- alias: "Simulated_OPC_USINT"
- address: "ns=2;s=Simulated_USINT"
+ address: "ns=1;s=Simulated_USINT"
- alias: "Simulated_OPC_INT"
- address: "ns=2;s=Simulated_INT"
+ address: "ns=1;s=Simulated_INT"
- alias: "Simulated_OPC_UINT"
- address: "ns=2;s=Simulated_UINT"
+ address: "ns=1;s=Simulated_UINT"
- alias: "Simulated_OPC_DINT"
- address: "ns=2;s=Simulated_DINT"
+ address: "ns=1;s=Simulated_DINT"
- alias: "Simulated_OPC_UDINT"
- address: "ns=2;s=Simulated_UDINT"
+ address: "ns=1;s=Simulated_UDINT"
- alias: "Simulated_OPC_LINT"
- address: "ns=2;s=Simulated_LINT"
+ address: "ns=1;s=Simulated_LINT"
- alias: "Simulated_OPC_ULINT"
- address: "ns=2;s=Simulated_ULINT"
+ address: "ns=1;s=Simulated_ULINT"
- alias: "Simulated_OPC_REAL"
- address: "ns=2;s=Simulated_REAL"
+ address: "ns=1;s=Simulated_REAL"
- alias: "Simulated_OPC_LREAL"
- address: "ns=2;s=Simulated_LREAL"
+ address: "ns=1;s=Simulated_LREAL"
- alias: "Simulated_OPC_CHAR"
- address: "ns=2;s=Simulated_CHAR"
+ address: "ns=1;s=Simulated_CHAR"
- alias: "Simulated_OPC_WCHAR"
- address: "ns=2;s=Simulated_WCHAR"
+ address: "ns=1;s=Simulated_WCHAR"
- alias: "Simulated_OPC_STRING"
- address: "ns=2;s=Simulated_STRING"
+ address: "ns=1;s=Simulated_STRING"
- alias: "Simulated_OPC_WSTRING"
- address: "ns=2;s=Simulated_WSTRING"
+ address: "ns=1;s=Simulated_WSTRING"
diff --git a/plc4j/integrations/opcua-server/src/test/resources/config.yml b/plc4j/integrations/opcua-server/src/test/resources/config.yml
index 2296449ce0..c950e57019 100644
--- a/plc4j/integrations/opcua-server/src/test/resources/config.yml
+++ b/plc4j/integrations/opcua-server/src/test/resources/config.yml
@@ -66,38 +66,38 @@ devices:
connectionString: "opcua:tcp://127.0.0.1:12673/plc4x"
tags:
- alias: "Simulated_OPC_BOOL"
- address: "ns=2;s=Simulated_BOOL"
+ address: "ns=1;s=Simulated_BOOL"
- alias: "Simulated_OPC_BYTE"
- address: "ns=2;s=Simulated_BYTE"
+ address: "ns=1;s=Simulated_BYTE"
- alias: "Simulated_OPC_WORD"
- address: "ns=2;s=Simulated_WORD"
+ address: "ns=1;s=Simulated_WORD"
- alias: "Simulated_OPC_DWORD"
- address: "ns=2;s=Simulated_DWORD"
+ address: "ns=1;s=Simulated_DWORD"
- alias: "Simulated_OPC_SINT"
- address: "ns=2;s=Simulated_SINT"
+ address: "ns=1;s=Simulated_SINT"
- alias: "Simulated_OPC_USINT"
- address: "ns=2;s=Simulated_USINT"
+ address: "ns=1;s=Simulated_USINT"
- alias: "Simulated_OPC_INT"
- address: "ns=2;s=Simulated_INT"
+ address: "ns=1;s=Simulated_INT"
- alias: "Simulated_OPC_UINT"
- address: "ns=2;s=Simulated_UINT"
+ address: "ns=1;s=Simulated_UINT"
- alias: "Simulated_OPC_DINT"
- address: "ns=2;s=Simulated_DINT"
+ address: "ns=1;s=Simulated_DINT"
- alias: "Simulated_OPC_UDINT"
- address: "ns=2;s=Simulated_UDINT"
+ address: "ns=1;s=Simulated_UDINT"
- alias: "Simulated_OPC_LINT"
- address: "ns=2;s=Simulated_LINT"
+ address: "ns=1;s=Simulated_LINT"
- alias: "Simulated_OPC_ULINT"
- address: "ns=2;s=Simulated_ULINT"
+ address: "ns=1;s=Simulated_ULINT"
- alias: "Simulated_OPC_REAL"
- address: "ns=2;s=Simulated_REAL"
+ address: "ns=1;s=Simulated_REAL"
- alias: "Simulated_OPC_LREAL"
- address: "ns=2;s=Simulated_LREAL"
+ address: "ns=1;s=Simulated_LREAL"
- alias: "Simulated_OPC_CHAR"
- address: "ns=2;s=Simulated_CHAR"
+ address: "ns=1;s=Simulated_CHAR"
- alias: "Simulated_OPC_WCHAR"
- address: "ns=2;s=Simulated_WCHAR"
+ address: "ns=1;s=Simulated_WCHAR"
- alias: "Simulated_OPC_STRING"
- address: "ns=2;s=Simulated_STRING"
+ address: "ns=1;s=Simulated_STRING"
- alias: "Simulated_OPC_WSTRING"
- address: "ns=2;s=Simulated_WSTRING"
+ address: "ns=1;s=Simulated_WSTRING"
diff --git a/pom.xml b/pom.xml
index ff07a2ddaa..676c64d11d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -151,7 +151,7 @@
<junit.platform.version>1.8.2</junit.platform.version>
<logback.version>1.2.10</logback.version>
<maven.clean.plugin.version>3.2.0</maven.clean.plugin.version>
- <milo.version>0.6.3</milo.version>
+ <milo.version>0.6.6</milo.version>
<mockito.version>4.4.0</mockito.version>
<netty.version>4.1.77.Final</netty.version>
<owasp-dependency-check.version>7.0.4</owasp-dependency-check.version>
@@ -637,18 +637,6 @@
<version>${netty.version}</version>
</dependency>
- <dependency>
- <groupId>jakarta.xml.bind</groupId>
- <artifactId>jakarta.xml.bind-api</artifactId>
- <version>3.0.1</version>
- <exclusions>
- <exclusion>
- <groupId>jakarta.activation</groupId>
- <artifactId>jakarta.activation-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
@@ -661,12 +649,6 @@
<version>${apiguardian.version}</version>
</dependency>
- <dependency>
- <groupId>org.glassfish.jaxb</groupId>
- <artifactId>jaxb-runtime</artifactId>
- <version>${jaxb.version}</version>
- </dependency>
-
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
[plc4x] 02/02: start of logix development
Posted by hu...@apache.org.
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