You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2023/02/03 18:48:01 UTC

[plc4x] branch featrue/cdutz/arrays-with-special-variables updated (795fc77c93 -> 812adb8b29)

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

cdutz pushed a change to branch featrue/cdutz/arrays-with-special-variables
in repository https://gitbox.apache.org/repos/asf/plc4x.git


    from 795fc77c93 fix(plc4j/examples/ads): Fixed some wrongly named constants
     add cd61c7555e build(deps): bump equalsverifier from 3.12.3 to 3.12.4 (#774)
     add 5134446182 build(deps): bump jackson.version from 2.14.1 to 2.14.2 (#773)
     add 23fd766221 build(deps): bump mockito.version from 5.0.0 to 5.1.0 (#772)
     add 66cb80729a Plc4j/Profinet (#534)
     add b32e9f43a1 build(deps): bump mockito.version from 5.1.0 to 5.1.1 (#775)
     add cb8402fbf8 fix(plc4j/profinet): Updated magic numbers in discovery packets
     add e5b6cdd663 fix(plc4j/profinet): Updated website page
     add 0e6e0ac1bd fix(plc4j/profinet): Removed dangling bracket from mspec
     add 63b77e10e0 fix(plc4j/examples): Improve java example (#724)
     new d7d5f5d60d Merge remote-tracking branch 'origin/develop' into featrue/cdutz/arrays-with-special-variables
     new 812adb8b29 fix(plc4j/examples/ads): Fixed some wrongly named constants

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.


Summary of changes:
 .gitignore                                         |   6 +-
 .idea/.gitignore                                   |  13 +
 .idea/fileTemplates/includes/File Header Yml.yml   |  18 -
 .../templates/c/complex-type-template.c.ftlh       |  14 +-
 .../parser-serializer-testcase-generator.xsl       |   4 +-
 plc4c/drivers/s7/test/s7_test.c                    |  12 +-
 .../modbus/src/modbus_device_information_object.c  |   2 -
 plc4c/generated-sources/modbus/src/modbus_pdu.c    |  80 +-
 .../modbus_pdu_read_file_record_response_item.c    |   1 -
 .../modbus_pdu_write_file_record_request_item.c    |   1 -
 .../modbus_pdu_write_file_record_response_item.c   |   1 -
 plc4c/generated-sources/plc4x/src/plc4x_message.c  |  56 +-
 .../s7/src/alarm_message_ack_push_type.c           |  14 +-
 .../s7/src/alarm_message_ack_response_type.c       |   2 -
 .../s7/src/alarm_message_ack_type.c                |  14 +-
 .../s7/src/alarm_message_object_push_type.c        |  14 +-
 .../s7/src/alarm_message_push_type.c               |  14 +-
 .../s7/src/alarm_message_query_type.c              |  14 +-
 .../s7/src/associated_value_type.c                 |   2 -
 plc4c/generated-sources/s7/src/cotp_packet.c       |  11 +-
 plc4c/generated-sources/s7/src/cotp_parameter.c    |   2 -
 plc4c/generated-sources/s7/src/s7_parameter.c      |  42 +-
 plc4c/generated-sources/s7/src/s7_payload.c        |  56 +-
 .../s7/src/s7_payload_user_data_item.c             |  30 +-
 .../s7/src/s7_var_payload_data_item.c              |   2 -
 .../generated-sources/s7/src/szl_data_tree_item.c  |   2 -
 .../s7/test/ParserSerializerTestsuite.c            |   4 +-
 plc4j/drivers/profinet/pom.xml                     |  17 +-
 .../{PnIoCm_Block.java => CheckPeers.java}         | 196 +++--
 .../plc4x/java/profinet/readwrite/DataItem.java    | 849 ++++++++++++++++++
 .../java/profinet/readwrite/DceRpc_Packet.java     |  22 +-
 .../{PnIoCm_Block_ArServer.java => EndOfLldp.java} |  41 +-
 .../profinet/readwrite/Ethernet_FramePayload.java  |   2 +
 .../readwrite/Ethernet_FramePayload_IPv4.java      |  96 ++-
 ...Server.java => Ethernet_FramePayload_LLDP.java} |  71 +-
 .../profinet/readwrite/IODWriteRequestHeader.java  | 509 +++++++++++
 .../profinet/readwrite/IODWriteResponseHeader.java | 462 ++++++++++
 .../readwrite/{PnDcp_Pdu.java => LldpUnit.java}    | 109 +--
 .../{PnIoCm_Block_ArServer.java => Lldp_Pdu.java}  |  91 +-
 ...duleType.java => ManagementAddressSubType.java} |  22 +-
 ...java => MultipleInterfaceModeNameOfDevice.java} |  22 +-
 .../java/profinet/readwrite/PDInterfaceAdjust.java | 307 +++++++
 .../{PnIoCm_Block.java => PDPortDataCheck.java}    | 226 +++--
 .../{PnDcp_ServiceType.java => PascalString.java}  | 104 +--
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |  55 +-
 .../PnDcp_Block_DevicePropertiesAliasName.java     |  26 +-
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |  16 +-
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |  15 +-
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |  27 +-
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |  31 +-
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |  26 +-
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |  24 +-
 .../readwrite/PnDcp_Block_IpMacAddress.java        |  15 +-
 .../readwrite/PnDcp_Block_IpParameter.java         |  33 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   2 +
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     | 338 ++++++++
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |  32 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |  39 +-
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |  75 +-
 .../java/profinet/readwrite/PnDcp_ServiceType.java |  16 +-
 .../profinet/readwrite/PnIoCM_Block_Request.java   | 375 ++++++++
 .../profinet/readwrite/PnIoCM_Block_Response.java  | 375 ++++++++
 .../java/profinet/readwrite/PnIoCm_Block.java      |  96 +--
 .../java/profinet/readwrite/PnIoCm_BlockType.java  |  17 +-
 .../readwrite/PnIoCm_Block_AlarmCrReq.java         |  94 +-
 .../readwrite/PnIoCm_Block_AlarmCrRes.java         |  89 +-
 .../profinet/readwrite/PnIoCm_Block_ArReq.java     | 117 ++-
 .../profinet/readwrite/PnIoCm_Block_ArRes.java     |  86 +-
 .../profinet/readwrite/PnIoCm_Block_ArServer.java  | 137 ++-
 .../PnIoCm_Block_ExpectedSubmoduleReq.java         |  83 +-
 .../profinet/readwrite/PnIoCm_Block_IoCrReq.java   | 102 ++-
 .../profinet/readwrite/PnIoCm_Block_IoCrRes.java   |  91 +-
 .../readwrite/PnIoCm_Block_ModuleDiff.java         |  83 +-
 .../profinet/readwrite/PnIoCm_Control_Request.java | 365 ++++++++
 .../readwrite/PnIoCm_Control_Response.java         | 365 ++++++++
 ...iceType.java => PnIoCm_DataUnitDataObject.java} | 116 +--
 ...p_ServiceType.java => PnIoCm_DataUnitIoCs.java} | 101 ++-
 .../java/profinet/readwrite/PnIoCm_Packet_Req.java |  66 +-
 .../java/profinet/readwrite/PnIoCm_Packet_Res.java |  62 +-
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |  13 +-
 .../profinet/readwrite/PnIoCm_SubmoduleType.java   |   2 +
 .../readwrite/PnIoCm_Submodule_InputData.java      | 239 +++++
 .../readwrite/PnIoCm_Submodule_OutputData.java     | 239 +++++
 ...ceType.java => PnIo_CyclicServiceDataUnit.java} | 107 +--
 .../java/profinet/readwrite/ProfinetDataType.java  | 132 +++
 ...SubmoduleType.java => ProfinetDeviceState.java} |  27 +-
 ...p_Block_IpMacAddress.java => TlvChassisId.java} | 100 +--
 .../profinet/readwrite/TlvManagementAddress.java   | 264 ++++++
 .../profinet/readwrite/TlvOrgSpecificIeee8023.java | 213 +++++
 ...k_ArServer.java => TlvOrgSpecificProfibus.java} |  72 +-
 ...ayload.java => TlvOrgSpecificProfibusUnit.java} |  79 +-
 ...acAddress.java => TlvOrganizationSpecific.java} |  93 +-
 ...yload.java => TlvOrganizationSpecificUnit.java} |  64 +-
 ...nDcp_Block_IpMacAddress.java => TlvPortId.java} |  99 +--
 ..._SubmoduleType.java => TlvProfibusSubType.java} |  22 +-
 ...ress.java => TlvProfibusSubTypeChassisMac.java} |  57 +-
 .../readwrite/TlvProfibusSubTypePortStatus.java    | 252 ++++++
 ...IoCm_Block_ArServer.java => TlvTimeToLive.java} |  64 +-
 .../{PnIoCm_SubmoduleType.java => TlvType.java}    |  30 +-
 .../{PnIoCm_Block_ArServer.java => UserData.java}  |  88 +-
 .../apache/plc4x/java/profinet/ProfinetDriver.java |  56 +-
 .../ProfinetPlcQuery.java}                         |  17 +-
 .../profinet/config/ProfinetConfiguration.java     | 146 ++++
 .../profinet/context/ProfinetDeviceContext.java    | 529 ++++++++++++
 .../profinet/context/ProfinetDriverContext.java    | 100 +--
 .../GsdFileMap.java}                               |  20 +-
 .../ProfinetCallable.java}                         |  13 +-
 .../java/profinet/device/ProfinetChannel.java      | 224 +++++
 .../plc4x/java/profinet/device/ProfinetDevice.java | 957 +++++++++++++++++++++
 .../device/ProfinetDeviceMessageHandler.java       |  46 +
 .../ProfinetDevices.java}                          |  18 +-
 .../java/profinet/device/ProfinetEmptyModule.java  | 103 +++
 .../profinet/device/ProfinetMessageWrapper.java    |  70 ++
 .../plc4x/java/profinet/device/ProfinetModule.java |  57 ++
 .../java/profinet/device/ProfinetModuleImpl.java   | 353 ++++++++
 .../ProfinetRunnable.java}                         |  27 +-
 .../device/ProfinetSubscriptionHandle.java         |  71 ++
 .../profinet/discovery/ProfinetPlcDiscoverer.java  | 587 ++++++++-----
 .../profinet/gsdml/ProfinetApplicationProcess.java |  66 ++
 .../ProfinetApplicationRelations.java}             |  30 +-
 .../ProfinetBitDataItem.java}                      |  31 +-
 .../profinet/gsdml/ProfinetCertificationInfo.java  |  50 ++
 .../java/profinet/gsdml/ProfinetDataItem.java      |  63 ++
 .../gsdml/ProfinetDeviceAccessPointItem.java       | 188 ++++
 .../ProfinetDeviceFunction.java}                   |  20 +-
 .../profinet/gsdml/ProfinetDeviceIdentity.java     |  58 ++
 .../ProfinetDeviceItem.java}                       |  17 +-
 .../ProfinetErrorCode2Value.java}                  |  24 +-
 .../ProfinetExternalTextList.java}                 |  21 +-
 .../ProfinetFamily.java}                           |  30 +-
 .../ProfinetGraphicItem.java}                      |  30 +-
 .../ProfinetGraphics.java}                         |  20 +-
 .../ProfinetGraphicsItemRef.java}                  |  30 +-
 .../ProfinetIOConfigData.java}                     |  30 +-
 .../ProfinetISO15745Profile.java}                  |  30 +-
 .../ProfinetISO15745Reference.java}                |  40 +-
 .../gsdml/ProfinetInterfaceSubmoduleItem.java      | 100 +++
 .../plc4x/java/profinet/gsdml/ProfinetIoData.java  |  62 ++
 .../ProfinetIoDataInput.java}                      |  36 +-
 .../ProfinetIoDataOutput.java}                     |  36 +-
 .../ProfinetLogBookEntryItem.java}                 |  37 +-
 .../java/profinet/gsdml/ProfinetModuleInfo.java    |  71 ++
 .../java/profinet/gsdml/ProfinetModuleItem.java    | 102 +++
 .../ProfinetModuleItemRef.java}                    |  30 +-
 .../gsdml/ProfinetParameterRecordDataItem.java     |  59 ++
 .../profinet/gsdml/ProfinetPortSubmoduleItem.java  |  81 ++
 .../ProfinetPrimaryLanguage.java}                  |  24 +-
 .../ProfinetProfileBody.java}                      |  38 +-
 .../java/profinet/gsdml/ProfinetProfileHeader.java |  71 ++
 .../plc4x/java/profinet/gsdml/ProfinetRef.java     |  78 ++
 .../ProfinetSystemDefinedSubmoduleList.java}       |  35 +-
 .../ProfinetTextId.java}                           |  20 +-
 .../ProfinetTextIdValue.java}                      |  30 +-
 .../ProfinetTimingProperties.java}                 |  30 +-
 .../ProfinetValue.java}                            |  20 +-
 .../gsdml/ProfinetVirtualSubmoduleItem.java        |  89 ++
 .../profinet/protocol/ProfinetProtocolLogic.java   | 395 +++------
 .../profinet/readwrite/utils/StaticHelper.java     | 124 ++-
 .../plc4x/java/profinet/tag/ProfinetTag.java       |  30 +-
 .../java/profinet/tag/ProfinetTagHandler.java      |   3 +-
 .../plc4x/java/profinet/ManualProfinetIoTest.java  |  34 +-
 .../plc4x/java/profinet/ProfinetBrowseTests.java   |  82 ++
 .../plc4x/java/profinet/ProfinetCheckSumTests.java | 107 +++
 .../java/profinet/ProfinetDeviceContextTests.java  | 106 +++
 .../apache/plc4x/java/profinet/ProfinetPoc.java    | 166 ----
 .../java/profinet/ProfinetSubscriptionTests.java}  |   9 +-
 .../profinet/gsdml/ProfinetConfigurationTests.java | 147 ++++
 .../profinet/gsdml/ProfinetGSDMLParseTest.java     |  58 ++
 .../drivers/profinet/src/test/resources/gsdml.xml  | 148 ++++
 .../profinet/src/test/resources/logback-test.xml   |   2 +-
 .../examples/helloplc4x/read/HelloPlc4xRead.java   |  30 +-
 pom.xml                                            |   6 +-
 .../resources/protocols/profinet/profinet.mspec    | 476 +++++++++-
 src/site/asciidoc/users/protocols/profinet.adoc    | 164 ++++
 src/site/site.xml                                  |   1 +
 175 files changed, 14134 insertions(+), 2598 deletions(-)
 create mode 100644 .idea/.gitignore
 delete mode 100644 .idea/fileTemplates/includes/File Header Yml.yml
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block.java => CheckPeers.java} (55%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => EndOfLldp.java} (69%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => Ethernet_FramePayload_LLDP.java} (59%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_Pdu.java => LldpUnit.java} (55%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => Lldp_Pdu.java} (56%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_SubmoduleType.java => ManagementAddressSubType.java} (69%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_SubmoduleType.java => MultipleInterfaceModeNameOfDevice.java} (65%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block.java => PDPortDataCheck.java} (51%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_ServiceType.java => PascalString.java} (54%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_ServiceType.java => PnIoCm_DataUnitDataObject.java} (51%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_ServiceType.java => PnIoCm_DataUnitIoCs.java} (56%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_ServiceType.java => PnIo_CyclicServiceDataUnit.java} (56%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_SubmoduleType.java => ProfinetDeviceState.java} (65%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_Block_IpMacAddress.java => TlvChassisId.java} (53%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => TlvOrgSpecificProfibus.java} (55%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{Ethernet_FramePayload.java => TlvOrgSpecificProfibusUnit.java} (60%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_Block_IpMacAddress.java => TlvOrganizationSpecific.java} (54%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{Ethernet_FramePayload.java => TlvOrganizationSpecificUnit.java} (64%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_Block_IpMacAddress.java => TlvPortId.java} (55%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_SubmoduleType.java => TlvProfibusSubType.java} (70%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnDcp_Block_IpMacAddress.java => TlvProfibusSubTypeChassisMac.java} (69%)
 create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => TlvTimeToLive.java} (61%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_SubmoduleType.java => TlvType.java} (63%)
 copy plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/{PnIoCm_Block_ArServer.java => UserData.java} (58%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => browse/ProfinetPlcQuery.java} (69%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDeviceContext.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => device/GsdFileMap.java} (65%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{context/ProfinetDiscoveryContext.java => device/ProfinetCallable.java} (77%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetChannel.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDeviceMessageHandler.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => device/ProfinetDevices.java} (67%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetEmptyModule.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetMessageWrapper.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModule.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => device/ProfinetRunnable.java} (54%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetSubscriptionHandle.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationProcess.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetApplicationRelations.java} (53%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetBitDataItem.java} (56%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetCertificationInfo.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDataItem.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceAccessPointItem.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetDeviceFunction.java} (62%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceIdentity.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{context/ProfinetDiscoveryContext.java => gsdml/ProfinetDeviceItem.java} (69%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetErrorCode2Value.java} (60%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetExternalTextList.java} (59%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetFamily.java} (55%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetGraphicItem.java} (56%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetGraphics.java} (60%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetGraphicsItemRef.java} (54%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetIOConfigData.java} (54%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetISO15745Profile.java} (55%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetISO15745Reference.java} (52%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetInterfaceSubmoduleItem.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoData.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetIoDataInput.java} (52%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetIoDataOutput.java} (52%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetLogBookEntryItem.java} (53%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleInfo.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItem.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetModuleItemRef.java} (53%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetParameterRecordDataItem.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPortSubmoduleItem.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetPrimaryLanguage.java} (55%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetProfileBody.java} (52%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileHeader.java
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetRef.java
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTag.java => gsdml/ProfinetSystemDefinedSubmoduleList.java} (51%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetTextId.java} (63%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetTextIdValue.java} (56%)
 copy plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{tag/ProfinetTagHandler.java => gsdml/ProfinetTimingProperties.java} (54%)
 rename plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => gsdml/ProfinetValue.java} (63%)
 create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetVirtualSubmoduleItem.java
 create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetBrowseTests.java
 create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetCheckSumTests.java
 create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetDeviceContextTests.java
 delete mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetPoc.java
 rename plc4j/drivers/profinet/src/{main/java/org/apache/plc4x/java/profinet/context/ProfinetDiscoveryContext.java => test/java/org/apache/plc4x/java/profinet/ProfinetSubscriptionTests.java} (82%)
 create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetConfigurationTests.java
 create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGSDMLParseTest.java
 create mode 100644 plc4j/drivers/profinet/src/test/resources/gsdml.xml
 create mode 100644 src/site/asciidoc/users/protocols/profinet.adoc


[plc4x] 02/02: fix(plc4j/examples/ads): Fixed some wrongly named constants

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch featrue/cdutz/arrays-with-special-variables
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 812adb8b29b6022ee80aeab1164cad68a309dc9f
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Feb 3 19:47:50 2023 +0100

    fix(plc4j/examples/ads): Fixed some wrongly named constants
---
 .../templates/c/complex-type-template.c.ftlh       | 14 ++--
 .../parser-serializer-testcase-generator.xsl       |  4 +-
 plc4c/drivers/s7/test/s7_test.c                    | 12 ++--
 .../modbus/src/modbus_device_information_object.c  |  2 -
 plc4c/generated-sources/modbus/src/modbus_pdu.c    | 80 +++++++---------------
 .../modbus_pdu_read_file_record_response_item.c    |  1 -
 .../modbus_pdu_write_file_record_request_item.c    |  1 -
 .../modbus_pdu_write_file_record_response_item.c   |  1 -
 plc4c/generated-sources/plc4x/src/plc4x_message.c  | 56 +++++++--------
 .../s7/src/alarm_message_ack_push_type.c           | 14 ++--
 .../s7/src/alarm_message_ack_response_type.c       |  2 -
 .../s7/src/alarm_message_ack_type.c                | 14 ++--
 .../s7/src/alarm_message_object_push_type.c        | 14 ++--
 .../s7/src/alarm_message_push_type.c               | 14 ++--
 .../s7/src/alarm_message_query_type.c              | 14 ++--
 .../s7/src/associated_value_type.c                 |  2 -
 plc4c/generated-sources/s7/src/cotp_packet.c       | 11 ++-
 plc4c/generated-sources/s7/src/cotp_parameter.c    |  2 -
 plc4c/generated-sources/s7/src/s7_parameter.c      | 42 +++++-------
 plc4c/generated-sources/s7/src/s7_payload.c        | 56 +++++++--------
 .../s7/src/s7_payload_user_data_item.c             | 30 ++++----
 .../s7/src/s7_var_payload_data_item.c              |  2 -
 .../generated-sources/s7/src/szl_data_tree_item.c  |  2 -
 .../s7/test/ParserSerializerTestsuite.c            |  4 +-
 .../plc4x/java/profinet/readwrite/CheckPeers.java  |  3 +
 .../plc4x/java/profinet/readwrite/EndOfLldp.java   |  3 +
 .../readwrite/Ethernet_FramePayload_LLDP.java      |  3 +
 .../profinet/readwrite/IODWriteRequestHeader.java  |  3 +
 .../profinet/readwrite/IODWriteResponseHeader.java |  3 +
 .../plc4x/java/profinet/readwrite/LldpUnit.java    |  3 +
 .../plc4x/java/profinet/readwrite/Lldp_Pdu.java    |  3 +
 .../java/profinet/readwrite/PDInterfaceAdjust.java |  3 +
 .../java/profinet/readwrite/PDPortDataCheck.java   |  3 +
 .../java/profinet/readwrite/PascalString.java      |  3 +
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     |  3 +
 .../profinet/readwrite/PnIoCM_Block_Request.java   |  3 +
 .../profinet/readwrite/PnIoCM_Block_Response.java  |  3 +
 .../profinet/readwrite/PnIoCm_Control_Request.java |  3 +
 .../readwrite/PnIoCm_Control_Response.java         |  3 +
 .../readwrite/PnIoCm_DataUnitDataObject.java       |  3 +
 .../profinet/readwrite/PnIoCm_DataUnitIoCs.java    |  3 +
 .../readwrite/PnIoCm_Submodule_InputData.java      |  3 +
 .../readwrite/PnIoCm_Submodule_OutputData.java     |  3 +
 .../readwrite/PnIo_CyclicServiceDataUnit.java      |  3 +
 .../java/profinet/readwrite/TlvChassisId.java      |  3 +
 .../profinet/readwrite/TlvManagementAddress.java   |  3 +
 .../profinet/readwrite/TlvOrgSpecificIeee8023.java |  3 +
 .../profinet/readwrite/TlvOrgSpecificProfibus.java |  3 +
 .../readwrite/TlvOrgSpecificProfibusUnit.java      |  3 +
 .../readwrite/TlvOrganizationSpecific.java         |  3 +
 .../readwrite/TlvOrganizationSpecificUnit.java     |  3 +
 .../plc4x/java/profinet/readwrite/TlvPortId.java   |  3 +
 .../readwrite/TlvProfibusSubTypeChassisMac.java    |  3 +
 .../readwrite/TlvProfibusSubTypePortStatus.java    |  3 +
 .../java/profinet/readwrite/TlvTimeToLive.java     |  3 +
 .../plc4x/java/profinet/readwrite/UserData.java    |  3 +
 56 files changed, 251 insertions(+), 239 deletions(-)

diff --git a/code-generation/language-c/src/main/resources/templates/c/complex-type-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/complex-type-template.c.ftlh
index cf631b7ad1..f081bbd4c8 100644
--- a/code-generation/language-c/src/main/resources/templates/c/complex-type-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/complex-type-template.c.ftlh
@@ -140,7 +140,6 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4x_spi_context ctx,
     // Count array
     uint16_t itemCount = (uint16_t) ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      <#if !elementTypeReference.isSimpleTypeReference()>bool lastItem = curItem == (itemCount - 1);</#if>
       <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
 <#if elementTypeReference.isSimpleTypeReference()>
     <#assign simpleTypeReference = elementTypeReference.asSimpleTypeReference().orElseThrow()>
@@ -154,7 +153,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4x_spi_context ctx,
     <#assign nonSimpleTypeReference = elementTypeReference.asNonSimpleTypeReference().orElseThrow()>
       <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
       ${helper.getCTypeName(nonSimpleTypeReference.name)}* _value = NULL;
-      _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(ctx, readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*)  [...]
       if(_res != OK) {
         return _res;
       }
@@ -471,12 +470,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4x_spi_context
     uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
     for(int curItem = 0; curItem < itemCount; curItem++) {
             <#-- When parsing simple types, there is nothing that could require the "lastItem" -->
-<#if !elementTypeReference.isSimpleTypeReference()>      bool lastItem = curItem == (itemCount - 1);</#if>
       ${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}* _value = (${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
             <#if elementTypeReference.isSimpleTypeReference()>
       ${helper.getWriteBufferWriteMethodCall(elementTypeReference.asSimpleTypeReference().orElseThrow(), "*_value", arrayField)};
             <#else>
-      _res = ${helper.getCTypeName(elementTypeReference.asNonSimpleTypeReference().orElseThrow().name)}_serialize(ctx, writeBuffer, (void*) _value<#--#if helper.getSerializerTerms(field.params.orElse(null))?has_content>, <#list helper.getSerializerTerms(field.params.orElse(null)) as serializerTerm>${helper.toSerializationExpression(baseType, field, serializerTerm, parserArguments)}<#sep>, </#sep></#list></#if-->);
+      _res = ${helper.getCTypeName(elementTypeReference.asNonSimpleTypeReference().orElseThrow().name)}_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value<#--#if helper.getSerializerTerms(field.params.orElse(null))?has_content>, <#list helper.getSerializerTerms(field.params.orElse(null)) as serializerTerm>${helper.toSerializationExpression(baseType, field, serializerTerm, parserArguments)}<#sep>, </#sep></#list></#if-->);
       if(_res != OK) {
         return _res;
       }
@@ -656,10 +654,10 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(plc4x_spi_context ctx,
   lengthInBits += ${simpleTypeReference.sizeInBits} * plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
                 <#else>
   if(_message-><@fieldName baseType=baseType field=arrayField/> != NULL) {
-    plc4c_list_element* curElement = _message-><@fieldName baseType=baseType field=arrayField/>->tail;
-    while (curElement != NULL) {
-      lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(arrayField)}(ctx, (${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
+      lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(arrayField)}(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}*) curElement);
     }
   }
                 </#if>
diff --git a/plc4c/build-utils/parser-serializer-testcase-generator.xsl b/plc4c/build-utils/parser-serializer-testcase-generator.xsl
index e0e155ca7d..2b0de0c784 100644
--- a/plc4c/build-utils/parser-serializer-testcase-generator.xsl
+++ b/plc4c/build-utils/parser-serializer-testcase-generator.xsl
@@ -79,7 +79,7 @@ void <xsl:value-of select="normalize-space($testName)"/>() {
     }
 
     plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>* message = NULL;
-    return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_parse(read_buffer, <xsl:value-of disable-output-escaping="yes" select="'&#038;'"/>message);
+    return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_parse(plc4x_spi_context_background(), read_buffer, <xsl:value-of disable-output-escaping="yes" select="'&#038;'"/>message);
     if (return_code != OK) {
         TEST_FAIL_MESSAGE("Error parsing packet");
     }
@@ -90,7 +90,7 @@ void <xsl:value-of select="normalize-space($testName)"/>() {
         TEST_FAIL_MESSAGE("Error writing to buffer");
     }
 
-    return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_serialize(write_buffer, message);
+    return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_serialize(plc4x_spi_context_background(), write_buffer, message);
     if (return_code != OK) {
         TEST_FAIL_MESSAGE("Error serializing");
     }
diff --git a/plc4c/drivers/s7/test/s7_test.c b/plc4c/drivers/s7/test/s7_test.c
index 53aa8f6e8f..3b53fc485c 100644
--- a/plc4c/drivers/s7/test/s7_test.c
+++ b/plc4c/drivers/s7/test/s7_test.c
@@ -192,11 +192,11 @@ void parse_s7_read_request() {
 }
 
 void parse_s7_read_response() {
-  uint8_t payload[] = {0x03, 0x00, 0x00, 0x2d, 0x02, 0xf0, 0x80, 0x32, 0x03,
-                       0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x18, 0x00,
+  uint8_t payload[] = {0x03, 0x00, 0x00, 0x2C, 0x02, 0xf0, 0x80, 0x32, 0x03,
+                       0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x17, 0x00,
                        0x00, 0x04, 0x04, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00,
                        0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00,
-                       0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00};
+                       0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01};
   internal_parse_serialize_test(payload, sizeof(payload));
 }
 
@@ -209,14 +209,14 @@ void parse_s7_read_error_response() {
 
 void parse_s7_write_request() {
   uint8_t payload[] = {
-      0x03, 0x00, 0x00, 0x5b, 0x02, 0xf0, 0x8e, 0x32, 0x01, 0x00, 0x00, 0x00,
-      0x0e, 0x00, 0x32, 0x00, 0x18, 0x05, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00,
+      0x03, 0x00, 0x00, 0x5A, 0x02, 0xf0, 0x8e, 0x32, 0x01, 0x00, 0x00, 0x00,
+      0x0e, 0x00, 0x32, 0x00, 0x17, 0x05, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00,
       0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00,
       0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x12, 0x0a, 0x10, 0x01, 0x00,
       0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x12, 0x0a, 0x10, 0x01, 0x00,
       0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x03, 0xff, 0x03, 0x00, 0x01, 0x01,
       0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01,
-      0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00};
+      0x00, 0xff, 0x03, 0x00, 0x01, 0x01};
   internal_parse_serialize_test(payload, sizeof(payload));
 }
 
diff --git a/plc4c/generated-sources/modbus/src/modbus_device_information_object.c b/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
index 63e9a72272..e8ae0f2566 100644
--- a/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
+++ b/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
@@ -63,7 +63,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_device_information_object_parse
     // Count array
     uint16_t itemCount = (uint16_t) objectLength;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -96,7 +95,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_device_information_object_seria
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu.c b/plc4c/generated-sources/modbus/src/modbus_pdu.c
index b2d1c87a03..32fbfc17d7 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -214,7 +214,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x02 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -266,7 +265,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x01 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -356,7 +354,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x0F ) && ( response == false )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -428,7 +425,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x04 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -480,7 +476,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x03 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -570,7 +565,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x10 ) && ( response == false )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -658,7 +652,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == false )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -690,7 +683,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -799,7 +791,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) fifoCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       uint16_t* _value = malloc(sizeof(uint16_t));
       _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) _value);
       if(_res != OK) {
@@ -1066,7 +1057,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x0C ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) (byteCount) - (6);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -1101,7 +1091,6 @@ if( ( errorFlag == false ) && ( functionFlag == 0x11 ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -1222,9 +1211,8 @@ if( ( errorFlag == false ) && ( functionFlag == 0x2B ) && ( response == true ) )
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_device_information_object* _value = NULL;
-      _res = plc4c_modbus_read_write_modbus_device_information_object_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_modbus_read_write_modbus_device_information_object_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -1286,7 +1274,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_discrete_inputs_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_discrete_inputs_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1322,7 +1309,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_coils_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_coils_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1386,7 +1372,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_coils_request_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_coils_request_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1438,7 +1423,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_input_registers_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_input_registers_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1474,7 +1458,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_holding_registers_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_holding_registers_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1538,7 +1521,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_holding_registers_request_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_holding_registers_request_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1598,7 +1580,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_request_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1618,7 +1599,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1698,7 +1678,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_fifo_queue_response_fifo_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->modbus_pdu_read_fifo_queue_response_fifo_value, curItem);
       plc4c_spi_write_unsigned_short(writeBuffer, 16, *_value);
     }
@@ -1718,9 +1697,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_request_items, curItem);
-      _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1741,9 +1719,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_response_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_response_items, curItem);
-      _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1764,9 +1741,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_request_items, curItem);
-      _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1787,9 +1763,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_response_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_response_items, curItem);
-      _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1898,7 +1873,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_get_com_event_log_response_events);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_get_com_event_log_response_events, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1922,7 +1896,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_report_server_id_response_value);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_report_server_id_response_value, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
@@ -1994,9 +1967,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_device_identification_response_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_modbus_read_write_modbus_device_information_object* _value = (plc4c_modbus_read_write_modbus_device_information_object*) plc4c_utils_list_get_value(_message->modbus_pdu_read_device_identification_response_objects, curItem);
-      _res = plc4c_modbus_read_write_modbus_device_information_object_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_modbus_read_write_modbus_device_information_object_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -2322,10 +2294,10 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4x_spi_context ctx
 
   // Array field
   if(_message->modbus_pdu_read_file_record_request_items != NULL) {
-    plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_request_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits(ctx, (plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_request_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_request_items, curItem);
+      lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) curElement);
     }
   }
 
@@ -2339,10 +2311,10 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4x_spi_context ctx
 
   // Array field
   if(_message->modbus_pdu_read_file_record_response_items != NULL) {
-    plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_response_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits(ctx, (plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_response_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_response_items, curItem);
+      lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) curElement);
     }
   }
 
@@ -2356,10 +2328,10 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4x_spi_context ctx
 
   // Array field
   if(_message->modbus_pdu_write_file_record_request_items != NULL) {
-    plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_request_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits(ctx, (plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_request_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_request_items, curItem);
+      lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) curElement);
     }
   }
 
@@ -2373,10 +2345,10 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4x_spi_context ctx
 
   // Array field
   if(_message->modbus_pdu_write_file_record_response_items != NULL) {
-    plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_response_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits(ctx, (plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_response_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_response_items, curItem);
+      lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) curElement);
     }
   }
 
@@ -2519,10 +2491,10 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4x_spi_context ctx
 
   // Array field
   if(_message->modbus_pdu_read_device_identification_response_objects != NULL) {
-    plc4c_list_element* curElement = _message->modbus_pdu_read_device_identification_response_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_modbus_read_write_modbus_device_information_object_length_in_bits(ctx, (plc4c_modbus_read_write_modbus_device_information_object*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_device_identification_response_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->modbus_pdu_read_device_identification_response_objects, curItem);
+      lengthInBits += plc4c_modbus_read_write_modbus_device_information_object_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_modbus_read_write_modbus_device_information_object*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index ecc5388b49..8d8cc85954 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -96,7 +96,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index 41e2856890..549b1a6eaa 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -124,7 +124,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->record_data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index 0f91db583d..cb0a871a77 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -124,7 +124,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->record_data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/plc4x/src/plc4x_message.c b/plc4c/generated-sources/plc4x/src/plc4x_message.c
index 6980d1b813..2d873475c1 100644
--- a/plc4c/generated-sources/plc4x/src/plc4x_message.c
+++ b/plc4c/generated-sources/plc4x/src/plc4x_message.c
@@ -177,9 +177,8 @@ if( requestType == plc4c_plc4x_read_write_plc4x_request_type_READ_REQUEST ) { /*
     // Count array
     uint16_t itemCount = (uint16_t) numTags;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_request* _value = NULL;
-      _res = plc4c_plc4x_read_write_plc4x_tag_request_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_request_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -227,9 +226,8 @@ if( requestType == plc4c_plc4x_read_write_plc4x_request_type_READ_RESPONSE ) { /
     // Count array
     uint16_t itemCount = (uint16_t) numTags;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_value_response* _value = NULL;
-      _res = plc4c_plc4x_read_write_plc4x_tag_value_response_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_value_response_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -268,9 +266,8 @@ if( requestType == plc4c_plc4x_read_write_plc4x_request_type_WRITE_REQUEST ) { /
     // Count array
     uint16_t itemCount = (uint16_t) numTags;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_value_request* _value = NULL;
-      _res = plc4c_plc4x_read_write_plc4x_tag_value_request_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_value_request_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -318,9 +315,8 @@ if( requestType == plc4c_plc4x_read_write_plc4x_request_type_WRITE_RESPONSE ) {
     // Count array
     uint16_t itemCount = (uint16_t) numTags;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_response* _value = NULL;
-      _res = plc4c_plc4x_read_write_plc4x_tag_response_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_response_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -410,9 +406,8 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_message_serialize(plc4x_spi_conte
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_read_request_tags);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_request* _value = (plc4c_plc4x_read_write_plc4x_tag_request*) plc4c_utils_list_get_value(_message->plc4x_read_request_tags, curItem);
-      _res = plc4c_plc4x_read_write_plc4x_tag_request_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_request_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -445,9 +440,8 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_message_serialize(plc4x_spi_conte
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_read_response_tags);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_value_response* _value = (plc4c_plc4x_read_write_plc4x_tag_value_response*) plc4c_utils_list_get_value(_message->plc4x_read_response_tags, curItem);
-      _res = plc4c_plc4x_read_write_plc4x_tag_value_response_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_value_response_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -474,9 +468,8 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_message_serialize(plc4x_spi_conte
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_write_request_tags);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_value_request* _value = (plc4c_plc4x_read_write_plc4x_tag_value_request*) plc4c_utils_list_get_value(_message->plc4x_write_request_tags, curItem);
-      _res = plc4c_plc4x_read_write_plc4x_tag_value_request_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_value_request_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -509,9 +502,8 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_message_serialize(plc4x_spi_conte
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_write_response_tags);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_plc4x_read_write_plc4x_tag_response* _value = (plc4c_plc4x_read_write_plc4x_tag_response*) plc4c_utils_list_get_value(_message->plc4x_write_response_tags, curItem);
-      _res = plc4c_plc4x_read_write_plc4x_tag_response_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_plc4x_read_write_plc4x_tag_response_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -580,10 +572,10 @@ uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bits(plc4x_spi_context c
 
   // Array field
   if(_message->plc4x_read_request_tags != NULL) {
-    plc4c_list_element* curElement = _message->plc4x_read_request_tags->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_request_length_in_bits(ctx, (plc4c_plc4x_read_write_plc4x_tag_request*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_read_request_tags);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->plc4x_read_request_tags, curItem);
+      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_request_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_plc4x_read_write_plc4x_tag_request*) curElement);
     }
   }
 
@@ -605,10 +597,10 @@ uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bits(plc4x_spi_context c
 
   // Array field
   if(_message->plc4x_read_response_tags != NULL) {
-    plc4c_list_element* curElement = _message->plc4x_read_response_tags->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_value_response_length_in_bits(ctx, (plc4c_plc4x_read_write_plc4x_tag_value_response*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_read_response_tags);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->plc4x_read_response_tags, curItem);
+      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_value_response_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_plc4x_read_write_plc4x_tag_value_response*) curElement);
     }
   }
 
@@ -626,10 +618,10 @@ uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bits(plc4x_spi_context c
 
   // Array field
   if(_message->plc4x_write_request_tags != NULL) {
-    plc4c_list_element* curElement = _message->plc4x_write_request_tags->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_value_request_length_in_bits(ctx, (plc4c_plc4x_read_write_plc4x_tag_value_request*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_write_request_tags);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->plc4x_write_request_tags, curItem);
+      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_value_request_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_plc4x_read_write_plc4x_tag_value_request*) curElement);
     }
   }
 
@@ -651,10 +643,10 @@ uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bits(plc4x_spi_context c
 
   // Array field
   if(_message->plc4x_write_response_tags != NULL) {
-    plc4c_list_element* curElement = _message->plc4x_write_response_tags->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_response_length_in_bits(ctx, (plc4c_plc4x_read_write_plc4x_tag_response*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->plc4x_write_response_tags);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->plc4x_write_response_tags, curItem);
+      lengthInBits += plc4c_plc4x_read_write_plc4x_tag_response_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_plc4x_read_write_plc4x_tag_response*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/alarm_message_ack_push_type.c b/plc4c/generated-sources/s7/src/alarm_message_ack_push_type.c
index db88722415..360407c741 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_ack_push_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_ack_push_type.c
@@ -72,9 +72,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_push_type_parse(plc4x_sp
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_ack_object_push_type* _value = NULL;
-      _res = plc4c_s7_read_write_alarm_message_ack_object_push_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_alarm_message_ack_object_push_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -111,9 +110,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_push_type_serialize(plc4
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_ack_object_push_type* _value = (plc4c_s7_read_write_alarm_message_ack_object_push_type*) plc4c_utils_list_get_value(_message->message_objects, curItem);
-      _res = plc4c_s7_read_write_alarm_message_ack_object_push_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_alarm_message_ack_object_push_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -141,10 +139,10 @@ uint16_t plc4c_s7_read_write_alarm_message_ack_push_type_length_in_bits(plc4x_sp
 
   // Array field
   if(_message->message_objects != NULL) {
-    plc4c_list_element* curElement = _message->message_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_alarm_message_ack_object_push_type_length_in_bits(ctx, (plc4c_s7_read_write_alarm_message_ack_object_push_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->message_objects, curItem);
+      lengthInBits += plc4c_s7_read_write_alarm_message_ack_object_push_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_alarm_message_ack_object_push_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/alarm_message_ack_response_type.c b/plc4c/generated-sources/s7/src/alarm_message_ack_response_type.c
index b7239cde39..eccaebfcd2 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_ack_response_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_ack_response_type.c
@@ -64,7 +64,6 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_response_type_parse(plc4
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       uint8_t* _value = malloc(sizeof(uint8_t));
       _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) _value);
       if(_res != OK) {
@@ -97,7 +96,6 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_response_type_serialize(
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       uint8_t* _value = (uint8_t*) plc4c_utils_list_get_value(_message->message_objects, curItem);
       plc4c_spi_write_unsigned_byte(writeBuffer, 8, *_value);
     }
diff --git a/plc4c/generated-sources/s7/src/alarm_message_ack_type.c b/plc4c/generated-sources/s7/src/alarm_message_ack_type.c
index cf62bbe32b..954eddc8ac 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_ack_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_ack_type.c
@@ -64,9 +64,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_type_parse(plc4x_spi_con
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_ack_type* _value = NULL;
-      _res = plc4c_s7_read_write_alarm_message_object_ack_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_alarm_message_object_ack_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -97,9 +96,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_ack_type_serialize(plc4x_spi
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_ack_type* _value = (plc4c_s7_read_write_alarm_message_object_ack_type*) plc4c_utils_list_get_value(_message->message_objects, curItem);
-      _res = plc4c_s7_read_write_alarm_message_object_ack_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_alarm_message_object_ack_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -124,10 +122,10 @@ uint16_t plc4c_s7_read_write_alarm_message_ack_type_length_in_bits(plc4x_spi_con
 
   // Array field
   if(_message->message_objects != NULL) {
-    plc4c_list_element* curElement = _message->message_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_alarm_message_object_ack_type_length_in_bits(ctx, (plc4c_s7_read_write_alarm_message_object_ack_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->message_objects, curItem);
+      lengthInBits += plc4c_s7_read_write_alarm_message_object_ack_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_alarm_message_object_ack_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/alarm_message_object_push_type.c b/plc4c/generated-sources/s7/src/alarm_message_object_push_type.c
index 2402cee4d1..aca351fe77 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_object_push_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_object_push_type.c
@@ -129,9 +129,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_object_push_type_parse(plc4x
     // Count array
     uint16_t itemCount = (uint16_t) numberOfValues;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_associated_value_type* _value = NULL;
-      _res = plc4c_s7_read_write_associated_value_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_associated_value_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -201,9 +200,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_object_push_type_serialize(p
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->associated_values);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_associated_value_type* _value = (plc4c_s7_read_write_associated_value_type*) plc4c_utils_list_get_value(_message->associated_values, curItem);
-      _res = plc4c_s7_read_write_associated_value_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_associated_value_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -249,10 +247,10 @@ uint16_t plc4c_s7_read_write_alarm_message_object_push_type_length_in_bits(plc4x
 
   // Array field
   if(_message->associated_values != NULL) {
-    plc4c_list_element* curElement = _message->associated_values->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_associated_value_type_length_in_bits(ctx, (plc4c_s7_read_write_associated_value_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->associated_values);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->associated_values, curItem);
+      lengthInBits += plc4c_s7_read_write_associated_value_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_associated_value_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/alarm_message_push_type.c b/plc4c/generated-sources/s7/src/alarm_message_push_type.c
index 2c48105a3a..4e85d035e3 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_push_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_push_type.c
@@ -72,9 +72,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_push_type_parse(plc4x_spi_co
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_push_type* _value = NULL;
-      _res = plc4c_s7_read_write_alarm_message_object_push_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_alarm_message_object_push_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -111,9 +110,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_push_type_serialize(plc4x_sp
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_push_type* _value = (plc4c_s7_read_write_alarm_message_object_push_type*) plc4c_utils_list_get_value(_message->message_objects, curItem);
-      _res = plc4c_s7_read_write_alarm_message_object_push_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_alarm_message_object_push_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -141,10 +139,10 @@ uint16_t plc4c_s7_read_write_alarm_message_push_type_length_in_bits(plc4x_spi_co
 
   // Array field
   if(_message->message_objects != NULL) {
-    plc4c_list_element* curElement = _message->message_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_alarm_message_object_push_type_length_in_bits(ctx, (plc4c_s7_read_write_alarm_message_object_push_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->message_objects, curItem);
+      lengthInBits += plc4c_s7_read_write_alarm_message_object_push_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_alarm_message_object_push_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/alarm_message_query_type.c b/plc4c/generated-sources/s7/src/alarm_message_query_type.c
index 9f889e618d..32e9cdb6e4 100644
--- a/plc4c/generated-sources/s7/src/alarm_message_query_type.c
+++ b/plc4c/generated-sources/s7/src/alarm_message_query_type.c
@@ -97,9 +97,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_query_type_parse(plc4x_spi_c
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_query_type* _value = NULL;
-      _res = plc4c_s7_read_write_alarm_message_object_query_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_alarm_message_object_query_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -145,9 +144,8 @@ plc4c_return_code plc4c_s7_read_write_alarm_message_query_type_serialize(plc4x_s
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_query_type* _value = (plc4c_s7_read_write_alarm_message_object_query_type*) plc4c_utils_list_get_value(_message->message_objects, curItem);
-      _res = plc4c_s7_read_write_alarm_message_object_query_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_alarm_message_object_query_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -181,10 +179,10 @@ uint16_t plc4c_s7_read_write_alarm_message_query_type_length_in_bits(plc4x_spi_c
 
   // Array field
   if(_message->message_objects != NULL) {
-    plc4c_list_element* curElement = _message->message_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_alarm_message_object_query_type_length_in_bits(ctx, (plc4c_s7_read_write_alarm_message_object_query_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->message_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->message_objects, curItem);
+      lengthInBits += plc4c_s7_read_write_alarm_message_object_query_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_alarm_message_object_query_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/associated_value_type.c b/plc4c/generated-sources/s7/src/associated_value_type.c
index bc69a3cd55..00a49c3f7e 100644
--- a/plc4c/generated-sources/s7/src/associated_value_type.c
+++ b/plc4c/generated-sources/s7/src/associated_value_type.c
@@ -68,7 +68,6 @@ plc4c_return_code plc4c_s7_read_write_associated_value_type_parse(plc4x_spi_cont
     // Count array
     uint16_t itemCount = (uint16_t) plc4c_s7_read_write_event_item_length(readBuffer, valueLength);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       uint8_t* _value = malloc(sizeof(uint8_t));
       _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) _value);
       if(_res != OK) {
@@ -107,7 +106,6 @@ plc4c_return_code plc4c_s7_read_write_associated_value_type_serialize(plc4x_spi_
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       uint8_t* _value = (uint8_t*) plc4c_utils_list_get_value(_message->data, curItem);
       plc4c_spi_write_unsigned_byte(writeBuffer, 8, *_value);
     }
diff --git a/plc4c/generated-sources/s7/src/cotp_packet.c b/plc4c/generated-sources/s7/src/cotp_packet.c
index f4beea82df..0b9ccc4ec5 100644
--- a/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -403,9 +403,8 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4x_spi_context ct
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->parameters);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_cotp_parameter* _value = (plc4c_s7_read_write_cotp_parameter*) plc4c_utils_list_get_value(_message->parameters, curItem);
-      _res = plc4c_s7_read_write_cotp_parameter_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_cotp_parameter_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -520,10 +519,10 @@ uint16_t plc4c_s7_read_write_cotp_packet_length_in_bits(plc4x_spi_context ctx, p
 
   // Array field
   if(_message->parameters != NULL) {
-    plc4c_list_element* curElement = _message->parameters->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_cotp_parameter_length_in_bits(ctx, (plc4c_s7_read_write_cotp_parameter*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->parameters);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->parameters, curItem);
+      lengthInBits += plc4c_s7_read_write_cotp_parameter_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_cotp_parameter*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/cotp_parameter.c b/plc4c/generated-sources/s7/src/cotp_parameter.c
index 48c298a2d2..74e4afee85 100644
--- a/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -140,7 +140,6 @@ if( parameterType == 0xE0 ) { /* COTPParameterDisconnectAdditionalInformation */
     // Count array
     uint16_t itemCount = (uint16_t) rest;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -215,7 +214,6 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4x_spi_context
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->cotp_parameter_disconnect_additional_information_data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->cotp_parameter_disconnect_additional_information_data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/s7/src/s7_parameter.c b/plc4c/generated-sources/s7/src/s7_parameter.c
index 00f4b9255b..8b769d4c07 100644
--- a/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -143,9 +143,8 @@ if( ( parameterType == 0x04 ) && ( messageType == 0x01 ) ) { /* S7ParameterReadV
     // Count array
     uint16_t itemCount = (uint16_t) numItems;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_request_parameter_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -186,9 +185,8 @@ if( ( parameterType == 0x05 ) && ( messageType == 0x01 ) ) { /* S7ParameterWrite
     // Count array
     uint16_t itemCount = (uint16_t) numItems;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_request_parameter_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -229,9 +227,8 @@ if( ( parameterType == 0x00 ) && ( messageType == 0x07 ) ) { /* S7ParameterUserD
     // Count array
     uint16_t itemCount = (uint16_t) numItems;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_parameter_user_data_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_parameter_user_data_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -360,9 +357,8 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4x_spi_context c
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_read_var_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_request_parameter_item* _value = (plc4c_s7_read_write_s7_var_request_parameter_item*) plc4c_utils_list_get_value(_message->s7_parameter_read_var_request_items, curItem);
-      _res = plc4c_s7_read_write_s7_var_request_parameter_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_var_request_parameter_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -393,9 +389,8 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4x_spi_context c
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_write_var_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_request_parameter_item* _value = (plc4c_s7_read_write_s7_var_request_parameter_item*) plc4c_utils_list_get_value(_message->s7_parameter_write_var_request_items, curItem);
-      _res = plc4c_s7_read_write_s7_var_request_parameter_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_var_request_parameter_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -426,9 +421,8 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4x_spi_context c
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_user_data_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_parameter_user_data_item* _value = (plc4c_s7_read_write_s7_parameter_user_data_item*) plc4c_utils_list_get_value(_message->s7_parameter_user_data_items, curItem);
-      _res = plc4c_s7_read_write_s7_parameter_user_data_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -527,10 +521,10 @@ uint16_t plc4c_s7_read_write_s7_parameter_length_in_bits(plc4x_spi_context ctx,
 
   // Array field
   if(_message->s7_parameter_read_var_request_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_parameter_read_var_request_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_var_request_parameter_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_read_var_request_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_parameter_read_var_request_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_var_request_parameter_item*) curElement);
     }
   }
 
@@ -551,10 +545,10 @@ uint16_t plc4c_s7_read_write_s7_parameter_length_in_bits(plc4x_spi_context ctx,
 
   // Array field
   if(_message->s7_parameter_write_var_request_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_parameter_write_var_request_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_var_request_parameter_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_write_var_request_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_parameter_write_var_request_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_var_request_parameter_item*) curElement);
     }
   }
 
@@ -575,10 +569,10 @@ uint16_t plc4c_s7_read_write_s7_parameter_length_in_bits(plc4x_spi_context ctx,
 
   // Array field
   if(_message->s7_parameter_user_data_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_parameter_user_data_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_parameter_user_data_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_parameter_user_data_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_parameter_user_data_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_parameter_user_data_item*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/s7_payload.c b/plc4c/generated-sources/s7/src/s7_payload.c
index 7fdcc9825e..f474b2a552 100644
--- a/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/plc4c/generated-sources/s7/src/s7_payload.c
@@ -79,9 +79,8 @@ if( ( plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).param
     // Count array
     uint16_t itemCount = (uint16_t) ((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_read_var_response_num_items;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_data_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -103,9 +102,8 @@ if( ( plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).param
     // Count array
     uint16_t itemCount = (uint16_t) plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_write_var_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_data_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -127,9 +125,8 @@ if( ( plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).param
     // Count array
     uint16_t itemCount = (uint16_t) ((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_write_var_response_num_items;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_status_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_var_payload_status_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -151,9 +148,8 @@ if( ( plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).param
     // Count array
     uint16_t itemCount = (uint16_t) plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_payload_user_data_item* _value = NULL;
-      _res = plc4c_s7_read_write_s7_payload_user_data_item_parse(ctx, readBuffer, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get_value(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items, 0)))->s7_parameter_user_data_item_cpu_functions_cpu_function_type, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get_value(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items, 0)))->s7_parameter_us [...]
+      _res = plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get_value(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items, 0)))->s7_parameter_user_data_item_cpu_functions_cpu_function_type, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get_value(((plc4c_s7_read_write_s7_parameter*) (para [...]
       if(_res != OK) {
         return _res;
       }
@@ -177,9 +173,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4x_spi_context ctx
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_read_var_response_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_data_item* _value = (plc4c_s7_read_write_s7_var_payload_data_item*) plc4c_utils_list_get_value(_message->s7_payload_read_var_response_items, curItem);
-      _res = plc4c_s7_read_write_s7_var_payload_data_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -194,9 +189,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4x_spi_context ctx
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_write_var_request_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_data_item* _value = (plc4c_s7_read_write_s7_var_payload_data_item*) plc4c_utils_list_get_value(_message->s7_payload_write_var_request_items, curItem);
-      _res = plc4c_s7_read_write_s7_var_payload_data_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -211,9 +205,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4x_spi_context ctx
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_write_var_response_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_var_payload_status_item* _value = (plc4c_s7_read_write_s7_var_payload_status_item*) plc4c_utils_list_get_value(_message->s7_payload_write_var_response_items, curItem);
-      _res = plc4c_s7_read_write_s7_var_payload_status_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_var_payload_status_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -228,9 +221,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4x_spi_context ctx
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_s7_payload_user_data_item* _value = (plc4c_s7_read_write_s7_payload_user_data_item*) plc4c_utils_list_get_value(_message->s7_payload_user_data_items, curItem);
-      _res = plc4c_s7_read_write_s7_payload_user_data_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -257,10 +249,10 @@ uint16_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4x_spi_context ctx, pl
 
   // Array field
   if(_message->s7_payload_read_var_response_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_read_var_response_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_var_payload_data_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_read_var_response_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_read_var_response_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_var_payload_data_item*) curElement);
     }
   }
 
@@ -270,10 +262,10 @@ uint16_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4x_spi_context ctx, pl
 
   // Array field
   if(_message->s7_payload_write_var_request_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_write_var_request_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_var_payload_data_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_write_var_request_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_write_var_request_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_var_payload_data_item*) curElement);
     }
   }
 
@@ -283,10 +275,10 @@ uint16_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4x_spi_context ctx, pl
 
   // Array field
   if(_message->s7_payload_write_var_response_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_write_var_response_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_var_payload_status_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_var_payload_status_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_write_var_response_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_write_var_response_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_var_payload_status_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_var_payload_status_item*) curElement);
     }
   }
 
@@ -296,10 +288,10 @@ uint16_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4x_spi_context ctx, pl
 
   // Array field
   if(_message->s7_payload_user_data_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_user_data_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(ctx, (plc4c_s7_read_write_s7_payload_user_data_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_user_data_items, curItem);
+      lengthInBits += plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_s7_payload_user_data_item*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index 7b61934da5..abb76d213e 100644
--- a/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -360,9 +360,8 @@ if( ( cpuFunctionType == 0x08 ) && ( cpuSubfunction == 0x01 ) ) { /* S7PayloadUs
     // Count array
     uint16_t itemCount = (uint16_t) szlItemCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_szl_data_tree_item* _value = NULL;
-      _res = plc4c_s7_read_write_szl_data_tree_item_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_szl_data_tree_item_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -535,9 +534,8 @@ if( ( cpuFunctionType == 0x04 ) && ( cpuSubfunction == 0x0b ) ) { /* S7PayloadUs
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_ack_type* _value = NULL;
-      _res = plc4c_s7_read_write_alarm_message_object_ack_type_parse(ctx, readBuffer, (void*) &_value);
+      _res = plc4c_s7_read_write_alarm_message_object_ack_type_parse(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), readBuffer, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -576,7 +574,6 @@ if( ( cpuFunctionType == 0x08 ) && ( cpuSubfunction == 0x0b ) ) { /* S7PayloadUs
     // Count array
     uint16_t itemCount = (uint16_t) numberOfObjects;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       uint8_t* _value = malloc(sizeof(uint8_t));
       _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) _value);
       if(_res != OK) {
@@ -933,9 +930,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4x_
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_item_cpu_function_read_szl_response_items);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_szl_data_tree_item* _value = (plc4c_s7_read_write_szl_data_tree_item*) plc4c_utils_list_get_value(_message->s7_payload_user_data_item_cpu_function_read_szl_response_items, curItem);
-      _res = plc4c_s7_read_write_szl_data_tree_item_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_szl_data_tree_item_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1054,9 +1050,8 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4x_
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      bool lastItem = curItem == (itemCount - 1);
       plc4c_s7_read_write_alarm_message_object_ack_type* _value = (plc4c_s7_read_write_alarm_message_object_ack_type*) plc4c_utils_list_get_value(_message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects, curItem);
-      _res = plc4c_s7_read_write_alarm_message_object_ack_type_serialize(ctx, writeBuffer, (void*) _value);
+      _res = plc4c_s7_read_write_alarm_message_object_ack_type_serialize(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), writeBuffer, (void*) _value);
       if(_res != OK) {
         return _res;
       }
@@ -1083,7 +1078,6 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4x_
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_item_cpu_function_alarm_ack_response_message_objects);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       uint8_t* _value = (uint8_t*) plc4c_utils_list_get_value(_message->s7_payload_user_data_item_cpu_function_alarm_ack_response_message_objects, curItem);
       plc4c_spi_write_unsigned_byte(writeBuffer, 8, *_value);
     }
@@ -1299,10 +1293,10 @@ uint16_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(plc4x_spi_
 
   // Array field
   if(_message->s7_payload_user_data_item_cpu_function_read_szl_response_items != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_user_data_item_cpu_function_read_szl_response_items->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_szl_data_tree_item_length_in_bits(ctx, (plc4c_s7_read_write_szl_data_tree_item*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_item_cpu_function_read_szl_response_items);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_user_data_item_cpu_function_read_szl_response_items, curItem);
+      lengthInBits += plc4c_s7_read_write_szl_data_tree_item_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_szl_data_tree_item*) curElement);
     }
   }
 
@@ -1385,10 +1379,10 @@ uint16_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(plc4x_spi_
 
   // Array field
   if(_message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects != NULL) {
-    plc4c_list_element* curElement = _message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects->tail;
-    while (curElement != NULL) {
-      lengthInBits += plc4c_s7_read_write_alarm_message_object_ack_type_length_in_bits(ctx, (plc4c_s7_read_write_alarm_message_object_ack_type*) curElement->value);
-      curElement = curElement->next;
+   uint8_t itemCount = plc4c_utils_list_size(_message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects);
+   for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_list_element* curElement = plc4c_utils_list_get_value(_message->s7_payload_user_data_item_cpu_function_alarm_ack_message_objects, curItem);
+      lengthInBits += plc4c_s7_read_write_alarm_message_object_ack_type_length_in_bits(plc4x_spi_context_create_array_context(ctx, itemCount, curItem), (plc4c_s7_read_write_alarm_message_object_ack_type*) curElement);
     }
   }
 
diff --git a/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index 990daa4502..64bb595bbe 100644
--- a/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -71,7 +71,6 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4x_spi_c
     // Count array
     uint16_t itemCount = (uint16_t) ((plc4c_s7_read_write_data_transport_size_get_size_in_bits(transportSize)) ? plc4c_spi_evaluation_helper_ceil((dataLength) / (8.0)) : dataLength);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -123,7 +122,6 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4x_s
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->data);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->data, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/s7/src/szl_data_tree_item.c b/plc4c/generated-sources/s7/src/szl_data_tree_item.c
index 1b91e658a7..4edcf76eb7 100644
--- a/plc4c/generated-sources/s7/src/szl_data_tree_item.c
+++ b/plc4c/generated-sources/s7/src/szl_data_tree_item.c
@@ -56,7 +56,6 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4x_spi_context
     // Count array
     uint16_t itemCount = (uint16_t) 20;
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      
       char* _value = malloc(sizeof(char));
       _res = plc4c_spi_read_char(readBuffer, (char*) _value);
       if(_res != OK) {
@@ -107,7 +106,6 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4x_spi_con
   {
     uint8_t itemCount = plc4c_utils_list_size(_message->mlfb);
     for(int curItem = 0; curItem < itemCount; curItem++) {
-
       char* _value = (char*) plc4c_utils_list_get_value(_message->mlfb, curItem);
       plc4c_spi_write_char(writeBuffer, *_value);
     }
diff --git a/plc4c/generated-sources/s7/test/ParserSerializerTestsuite.c b/plc4c/generated-sources/s7/test/ParserSerializerTestsuite.c
index 26401e79df..12f16cf799 100644
--- a/plc4c/generated-sources/s7/test/ParserSerializerTestsuite.c
+++ b/plc4c/generated-sources/s7/test/ParserSerializerTestsuite.c
@@ -293,7 +293,7 @@ void parser_serializer_test_s7_read_write_s7_read_request() {
 void parser_serializer_test_s7_read_write_s7_read_response() {
             
     uint8_t payload[] = {
-        0x03, 0x00, 0x00, 0x2d, 0x02, 0xf0, 0x80, 0x32, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x04, 0x04, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00
+        0x03, 0x00, 0x00, 0x2c, 0x02, 0xf0, 0x80, 0x32, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x04, 0x04, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01
     };
     uint16_t payload_size = sizeof(payload);
 
@@ -367,7 +367,7 @@ void parser_serializer_test_s7_read_write_s7_read_error_response() {
 void parser_serializer_test_s7_read_write_s7_write_request() {
             
     uint8_t payload[] = {
-        0x03, 0x00, 0x00, 0x5b, 0x02, 0xf0, 0x8e, 0x32, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x32, 0x00, 0x18, 0x05, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x03, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03 [...]
+        0x03, 0x00, 0x00, 0x5a, 0x02, 0xf0, 0x8e, 0x32, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x32, 0x00, 0x17, 0x05, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x12, 0x0a, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x03, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03 [...]
     };
     uint16_t payload_size = sizeof(payload);
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java
index f58c757865..eafb94d21c 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java
@@ -86,6 +86,7 @@ public class CheckPeers extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("CheckPeers");
 
@@ -145,6 +146,7 @@ public class CheckPeers extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     CheckPeers _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -173,6 +175,7 @@ public class CheckPeers extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java
index 2947705527..b94a1d0567 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java
@@ -49,6 +49,7 @@ public class EndOfLldp extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("EndOfLldp");
 
@@ -64,6 +65,7 @@ public class EndOfLldp extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     EndOfLldp _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     return lengthInBits;
   }
@@ -74,6 +76,7 @@ public class EndOfLldp extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     readBuffer.closeContext("EndOfLldp");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java
index d51cdda035..8b9ba68ea6 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java
@@ -58,6 +58,7 @@ public class Ethernet_FramePayload_LLDP extends Ethernet_FramePayload implements
   protected void serializeEthernet_FramePayloadChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("Ethernet_FramePayload_LLDP");
 
@@ -76,6 +77,7 @@ public class Ethernet_FramePayload_LLDP extends Ethernet_FramePayload implements
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     Ethernet_FramePayload_LLDP _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (pdu)
     lengthInBits += pdu.getLengthInBits();
@@ -89,6 +91,7 @@ public class Ethernet_FramePayload_LLDP extends Ethernet_FramePayload implements
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Lldp_Pdu pdu =
         readSimpleField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java
index f75b9ad230..d94faf358a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java
@@ -128,6 +128,7 @@ public class IODWriteRequestHeader extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("IODWriteRequestHeader");
 
@@ -245,6 +246,7 @@ public class IODWriteRequestHeader extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     IODWriteRequestHeader _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -303,6 +305,7 @@ public class IODWriteRequestHeader extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java
index 8cf39b5f00..566cd4c4fa 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java
@@ -121,6 +121,7 @@ public class IODWriteResponseHeader extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("IODWriteResponseHeader");
 
@@ -223,6 +224,7 @@ public class IODWriteResponseHeader extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     IODWriteResponseHeader _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -273,6 +275,7 @@ public class IODWriteResponseHeader extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java
index 4c7574a9a9..ed4489b508 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java
@@ -57,6 +57,7 @@ public abstract class LldpUnit implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("LldpUnit");
 
@@ -86,6 +87,7 @@ public abstract class LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     LldpUnit _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Discriminator Field (tlvId)
     lengthInBits += 7;
@@ -108,6 +110,7 @@ public abstract class LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     TlvType tlvId =
         readDiscriminatorField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java
index a5b7cce63c..d0419ec5b1 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java
@@ -51,6 +51,7 @@ public class Lldp_Pdu implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("Lldp_Pdu");
 
@@ -75,6 +76,7 @@ public class Lldp_Pdu implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     Lldp_Pdu _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Manual Array Field (lldpParameters)
     lengthInBits +=
@@ -95,6 +97,7 @@ public class Lldp_Pdu implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     List<LldpUnit> lldpParameters =
         readManualArrayField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java
index 4f402fcd86..1ff9ae7fc9 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java
@@ -89,6 +89,7 @@ public class PDInterfaceAdjust extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PDInterfaceAdjust");
 
@@ -159,6 +160,7 @@ public class PDInterfaceAdjust extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PDInterfaceAdjust _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -190,6 +192,7 @@ public class PDInterfaceAdjust extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java
index a3aaf00cd5..1dde41898e 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java
@@ -93,6 +93,7 @@ public class PDPortDataCheck extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PDPortDataCheck");
 
@@ -159,6 +160,7 @@ public class PDPortDataCheck extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PDPortDataCheck _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -190,6 +192,7 @@ public class PDPortDataCheck extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java
index 754247568a..54e4776c40 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java
@@ -55,6 +55,7 @@ public class PascalString implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PascalString");
 
@@ -86,6 +87,7 @@ public class PascalString implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     PascalString _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (sLength)
     lengthInBits += 8;
@@ -112,6 +114,7 @@ public class PascalString implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     byte sLength = readImplicitField("sLength", readSignedByte(readBuffer, 8));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
index 336f95fcd3..b07d37ce1c 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
@@ -112,6 +112,7 @@ public class PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message {
   @Override
   protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnDcp_Pdu_AlarmLow");
 
@@ -159,6 +160,7 @@ public class PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnDcp_Pdu_AlarmLow _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (alarmDstEndpoint)
     lengthInBits += 16;
@@ -201,6 +203,7 @@ public class PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int alarmDstEndpoint = readSimpleField("alarmDstEndpoint", readUnsignedInt(readBuffer, 16));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java
index 692db0f405..8ce152c2c9 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java
@@ -97,6 +97,7 @@ public class PnIoCM_Block_Request extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCM_Block_Request");
 
@@ -177,6 +178,7 @@ public class PnIoCM_Block_Request extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCM_Block_Request _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -214,6 +216,7 @@ public class PnIoCM_Block_Request extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java
index 0c9002526a..c606a7b82b 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java
@@ -97,6 +97,7 @@ public class PnIoCM_Block_Response extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCM_Block_Response");
 
@@ -177,6 +178,7 @@ public class PnIoCM_Block_Response extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCM_Block_Response _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -214,6 +216,7 @@ public class PnIoCM_Block_Response extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java
index b54ac870c1..6c0dfc561b 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java
@@ -91,6 +91,7 @@ public class PnIoCm_Control_Request extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_Control_Request");
 
@@ -171,6 +172,7 @@ public class PnIoCm_Control_Request extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCm_Control_Request _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -208,6 +210,7 @@ public class PnIoCm_Control_Request extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java
index e3e3ac74c9..422f2d5630 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java
@@ -91,6 +91,7 @@ public class PnIoCm_Control_Response extends PnIoCm_Block implements Message {
   @Override
   protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_Control_Response");
 
@@ -171,6 +172,7 @@ public class PnIoCm_Control_Response extends PnIoCm_Block implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCm_Control_Response _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (blockLength)
     lengthInBits += 16;
@@ -208,6 +210,7 @@ public class PnIoCm_Control_Response extends PnIoCm_Block implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int blockLength =
         readImplicitField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
index b45aa14894..4fa3f3cf45 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
@@ -62,6 +62,7 @@ public class PnIoCm_DataUnitDataObject implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_DataUnitDataObject");
 
@@ -83,6 +84,7 @@ public class PnIoCm_DataUnitDataObject implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     PnIoCm_DataUnitDataObject _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Array field
     if (dataState != null) {
@@ -121,6 +123,7 @@ public class PnIoCm_DataUnitDataObject implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     byte[] dataState = readBuffer.readByteArray("dataState", Math.toIntExact(dataObjectLength));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
index 03436b8001..12aab1c257 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
@@ -66,6 +66,7 @@ public class PnIoCm_DataUnitIoCs implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_DataUnitIoCs");
 
@@ -96,6 +97,7 @@ public class PnIoCm_DataUnitIoCs implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     PnIoCm_DataUnitIoCs _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (dataState)
     lengthInBits += 1;
@@ -123,6 +125,7 @@ public class PnIoCm_DataUnitIoCs implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     boolean dataState = readSimpleField("dataState", readBoolean(readBuffer));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
index 30adeb1f87..7c9df657e3 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
@@ -92,6 +92,7 @@ public class PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Mess
   protected void serializePnIoCm_SubmoduleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_Submodule_InputData");
 
@@ -121,6 +122,7 @@ public class PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Mess
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCm_Submodule_InputData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Const Field (inputDataDescription)
     lengthInBits += 16;
@@ -143,6 +145,7 @@ public class PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Mess
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int inputDataDescription =
         readConstField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
index be143f12d5..add5348121 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
@@ -92,6 +92,7 @@ public class PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Mes
   protected void serializePnIoCm_SubmoduleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIoCm_Submodule_OutputData");
 
@@ -121,6 +122,7 @@ public class PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Mes
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     PnIoCm_Submodule_OutputData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Const Field (inputDataDescription)
     lengthInBits += 16;
@@ -143,6 +145,7 @@ public class PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Mes
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int inputDataDescription =
         readConstField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java
index a205e12212..6e0a83a23d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java
@@ -55,6 +55,7 @@ public class PnIo_CyclicServiceDataUnit implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("PnIo_CyclicServiceDataUnit");
 
@@ -73,6 +74,7 @@ public class PnIo_CyclicServiceDataUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     PnIo_CyclicServiceDataUnit _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Array field
     if (data != null) {
@@ -108,6 +110,7 @@ public class PnIo_CyclicServiceDataUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     byte[] data = readBuffer.readByteArray("data", Math.toIntExact(dataUnitLength));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java
index 17a0380834..e86f443775 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java
@@ -63,6 +63,7 @@ public class TlvChassisId extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvChassisId");
 
@@ -85,6 +86,7 @@ public class TlvChassisId extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvChassisId _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (chassisIdSubType)
     lengthInBits += 8;
@@ -101,6 +103,7 @@ public class TlvChassisId extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     short chassisIdSubType = readSimpleField("chassisIdSubType", readUnsignedShort(readBuffer, 8));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java
index edbbb9f7ca..89f4afe95e 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java
@@ -87,6 +87,7 @@ public class TlvManagementAddress extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvManagementAddress");
 
@@ -130,6 +131,7 @@ public class TlvManagementAddress extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvManagementAddress _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Implicit Field (addressStringLength)
     lengthInBits += 8;
@@ -158,6 +160,7 @@ public class TlvManagementAddress extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     short addressStringLength =
         readImplicitField("addressStringLength", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java
index bb6e4336b7..28e6a6e37a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java
@@ -77,6 +77,7 @@ public class TlvOrgSpecificIeee8023 extends TlvOrganizationSpecificUnit implemen
   protected void serializeTlvOrganizationSpecificUnitChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvOrgSpecificIeee8023");
 
@@ -105,6 +106,7 @@ public class TlvOrgSpecificIeee8023 extends TlvOrganizationSpecificUnit implemen
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvOrgSpecificIeee8023 _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (subType)
     lengthInBits += 8;
@@ -127,6 +129,7 @@ public class TlvOrgSpecificIeee8023 extends TlvOrganizationSpecificUnit implemen
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     short subType = readSimpleField("subType", readUnsignedShort(readBuffer, 8));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java
index daa2a9034f..f817b5c1c8 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java
@@ -58,6 +58,7 @@ public class TlvOrgSpecificProfibus extends TlvOrganizationSpecificUnit implemen
   protected void serializeTlvOrganizationSpecificUnitChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvOrgSpecificProfibus");
 
@@ -76,6 +77,7 @@ public class TlvOrgSpecificProfibus extends TlvOrganizationSpecificUnit implemen
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvOrgSpecificProfibus _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (specificUnit)
     lengthInBits += specificUnit.getLengthInBits();
@@ -89,6 +91,7 @@ public class TlvOrgSpecificProfibus extends TlvOrganizationSpecificUnit implemen
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     TlvOrgSpecificProfibusUnit specificUnit =
         readSimpleField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java
index c0b137cbce..10238cd117 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java
@@ -49,6 +49,7 @@ public abstract class TlvOrgSpecificProfibusUnit implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvOrgSpecificProfibusUnit");
 
@@ -77,6 +78,7 @@ public abstract class TlvOrgSpecificProfibusUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     TlvOrgSpecificProfibusUnit _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Discriminator Field (subType)
     lengthInBits += 8;
@@ -98,6 +100,7 @@ public abstract class TlvOrgSpecificProfibusUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     TlvProfibusSubType subType =
         readDiscriminatorField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java
index 12357562db..ade6dd29c5 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java
@@ -58,6 +58,7 @@ public class TlvOrganizationSpecific extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvOrganizationSpecific");
 
@@ -79,6 +80,7 @@ public class TlvOrganizationSpecific extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvOrganizationSpecific _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (organizationSpecificUnit)
     lengthInBits += organizationSpecificUnit.getLengthInBits();
@@ -92,6 +94,7 @@ public class TlvOrganizationSpecific extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     TlvOrganizationSpecificUnit organizationSpecificUnit =
         readSimpleField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java
index f396141ab1..2302737fa5 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java
@@ -49,6 +49,7 @@ public abstract class TlvOrganizationSpecificUnit implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvOrganizationSpecificUnit");
 
@@ -70,6 +71,7 @@ public abstract class TlvOrganizationSpecificUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     TlvOrganizationSpecificUnit _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Discriminator Field (uniqueCode)
     lengthInBits += 24;
@@ -91,6 +93,7 @@ public abstract class TlvOrganizationSpecificUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     long uniqueCode = readDiscriminatorField("uniqueCode", readUnsignedLong(readBuffer, 24));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java
index 6cb504968f..5233da6a4a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java
@@ -63,6 +63,7 @@ public class TlvPortId extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvPortId");
 
@@ -84,6 +85,7 @@ public class TlvPortId extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvPortId _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (portIdSubType)
     lengthInBits += 8;
@@ -100,6 +102,7 @@ public class TlvPortId extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     short portIdSubType = readSimpleField("portIdSubType", readUnsignedShort(readBuffer, 8));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java
index f04d0b0e65..b6efd9a576 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java
@@ -58,6 +58,7 @@ public class TlvProfibusSubTypeChassisMac extends TlvOrgSpecificProfibusUnit imp
   protected void serializeTlvOrgSpecificProfibusUnitChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvProfibusSubTypeChassisMac");
 
@@ -76,6 +77,7 @@ public class TlvProfibusSubTypeChassisMac extends TlvOrgSpecificProfibusUnit imp
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvProfibusSubTypeChassisMac _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (macAddress)
     lengthInBits += macAddress.getLengthInBits();
@@ -89,6 +91,7 @@ public class TlvProfibusSubTypeChassisMac extends TlvOrgSpecificProfibusUnit imp
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     MacAddress macAddress =
         readSimpleField(
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java
index 3c926fac96..f935a7cc6f 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java
@@ -81,6 +81,7 @@ public class TlvProfibusSubTypePortStatus extends TlvOrgSpecificProfibusUnit imp
   protected void serializeTlvOrgSpecificProfibusUnitChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvProfibusSubTypePortStatus");
 
@@ -120,6 +121,7 @@ public class TlvProfibusSubTypePortStatus extends TlvOrgSpecificProfibusUnit imp
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvProfibusSubTypePortStatus _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (rtClass2PortStatus)
     lengthInBits += 16;
@@ -148,6 +150,7 @@ public class TlvProfibusSubTypePortStatus extends TlvOrgSpecificProfibusUnit imp
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int rtClass2PortStatus = readSimpleField("rtClass2PortStatus", readUnsignedInt(readBuffer, 16));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java
index c99b3e758f..787e333f28 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java
@@ -57,6 +57,7 @@ public class TlvTimeToLive extends LldpUnit implements Message {
   @Override
   protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("TlvTimeToLive");
 
@@ -75,6 +76,7 @@ public class TlvTimeToLive extends LldpUnit implements Message {
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
     TlvTimeToLive _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (tlvTimeToLiveUnit)
     lengthInBits += 16;
@@ -88,6 +90,7 @@ public class TlvTimeToLive extends LldpUnit implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     int tlvTimeToLiveUnit = readSimpleField("tlvTimeToLiveUnit", readUnsignedInt(readBuffer, 16));
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
index f473813127..1106118f3d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
@@ -55,6 +55,7 @@ public class UserData implements Message {
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("UserData");
 
@@ -73,6 +74,7 @@ public class UserData implements Message {
   public int getLengthInBits() {
     int lengthInBits = 0;
     UserData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Array field
     if (data != null) {
@@ -107,6 +109,7 @@ public class UserData implements Message {
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength));
 


[plc4x] 01/02: Merge remote-tracking branch 'origin/develop' into featrue/cdutz/arrays-with-special-variables

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch featrue/cdutz/arrays-with-special-variables
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit d7d5f5d60dbf02d4624b8d38fcbb5eaefe4c0d38
Merge: 795fc77c93 63b77e10e0
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Feb 3 18:00:50 2023 +0100

    Merge remote-tracking branch 'origin/develop' into featrue/cdutz/arrays-with-special-variables

 .gitignore                                         |   6 +-
 .idea/.gitignore                                   |  13 +
 .idea/fileTemplates/includes/File Header Yml.yml   |  18 -
 plc4j/drivers/profinet/pom.xml                     |  17 +-
 .../{PnIoCm_Block.java => CheckPeers.java}         | 199 +++--
 .../plc4x/java/profinet/readwrite/DataItem.java    | 849 ++++++++++++++++++
 .../java/profinet/readwrite/DceRpc_Packet.java     |  22 +-
 .../{PnIoCm_Block_ArServer.java => EndOfLldp.java} |  44 +-
 .../profinet/readwrite/Ethernet_FramePayload.java  |   2 +
 .../readwrite/Ethernet_FramePayload_IPv4.java      |  96 ++-
 ...Server.java => Ethernet_FramePayload_LLDP.java} |  74 +-
 .../profinet/readwrite/IODWriteRequestHeader.java  | 506 +++++++++++
 .../profinet/readwrite/IODWriteResponseHeader.java | 459 ++++++++++
 .../readwrite/{PnDcp_Pdu.java => LldpUnit.java}    | 112 +--
 .../{PnIoCm_Block_ArServer.java => Lldp_Pdu.java}  |  94 +-
 ...duleType.java => ManagementAddressSubType.java} |  22 +-
 ...java => MultipleInterfaceModeNameOfDevice.java} |  22 +-
 .../java/profinet/readwrite/PDInterfaceAdjust.java | 304 +++++++
 .../{PnIoCm_Block.java => PDPortDataCheck.java}    | 229 +++--
 .../{PnDcp_ServiceType.java => PascalString.java}  | 107 ++-
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |  55 +-
 .../PnDcp_Block_DevicePropertiesAliasName.java     |  26 +-
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |  16 +-
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |  15 +-
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |  27 +-
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |  31 +-
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |  26 +-
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |  24 +-
 .../readwrite/PnDcp_Block_IpMacAddress.java        |  15 +-
 .../readwrite/PnDcp_Block_IpParameter.java         |  33 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   2 +
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     | 335 ++++++++
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |  32 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |  39 +-
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |  75 +-
 .../java/profinet/readwrite/PnDcp_ServiceType.java |  16 +-
 .../profinet/readwrite/PnIoCM_Block_Request.java   | 372 ++++++++
 .../profinet/readwrite/PnIoCM_Block_Response.java  | 372 ++++++++
 .../java/profinet/readwrite/PnIoCm_Block.java      |  96 +--
 .../java/profinet/readwrite/PnIoCm_BlockType.java  |  17 +-
 .../readwrite/PnIoCm_Block_AlarmCrReq.java         |  94 +-
 .../readwrite/PnIoCm_Block_AlarmCrRes.java         |  89 +-
 .../profinet/readwrite/PnIoCm_Block_ArReq.java     | 117 ++-
 .../profinet/readwrite/PnIoCm_Block_ArRes.java     |  86 +-
 .../profinet/readwrite/PnIoCm_Block_ArServer.java  | 137 ++-
 .../PnIoCm_Block_ExpectedSubmoduleReq.java         |  83 +-
 .../profinet/readwrite/PnIoCm_Block_IoCrReq.java   | 102 ++-
 .../profinet/readwrite/PnIoCm_Block_IoCrRes.java   |  91 +-
 .../readwrite/PnIoCm_Block_ModuleDiff.java         |  83 +-
 .../profinet/readwrite/PnIoCm_Control_Request.java | 362 ++++++++
 .../readwrite/PnIoCm_Control_Response.java         | 362 ++++++++
 .../readwrite/PnIoCm_DataUnitDataObject.java       | 167 ++++
 ...p_ServiceType.java => PnIoCm_DataUnitIoCs.java} | 104 ++-
 .../java/profinet/readwrite/PnIoCm_Packet_Req.java |  66 +-
 .../java/profinet/readwrite/PnIoCm_Packet_Res.java |  62 +-
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |  13 +-
 .../profinet/readwrite/PnIoCm_SubmoduleType.java   |   2 +
 .../readwrite/PnIoCm_Submodule_InputData.java      | 236 +++++
 .../readwrite/PnIoCm_Submodule_OutputData.java     | 236 +++++
 ...Server.java => PnIo_CyclicServiceDataUnit.java} |  92 +-
 .../java/profinet/readwrite/ProfinetDataType.java  | 132 +++
 ...SubmoduleType.java => ProfinetDeviceState.java} |  27 +-
 ...nIoCm_Block_ArServer.java => TlvChassisId.java} |  90 +-
 .../profinet/readwrite/TlvManagementAddress.java   | 261 ++++++
 .../profinet/readwrite/TlvOrgSpecificIeee8023.java | 210 +++++
 ...k_ArServer.java => TlvOrgSpecificProfibus.java} |  75 +-
 ...ayload.java => TlvOrgSpecificProfibusUnit.java} |  82 +-
 ...acAddress.java => TlvOrganizationSpecific.java} |  96 +--
 ...yload.java => TlvOrganizationSpecificUnit.java} |  67 +-
 .../{PnIoCm_Block_ArServer.java => TlvPortId.java} |  89 +-
 ..._SubmoduleType.java => TlvProfibusSubType.java} |  22 +-
 ...ress.java => TlvProfibusSubTypeChassisMac.java} |  60 +-
 .../readwrite/TlvProfibusSubTypePortStatus.java    | 249 ++++++
 ...IoCm_Block_ArServer.java => TlvTimeToLive.java} |  67 +-
 .../{PnIoCm_SubmoduleType.java => TlvType.java}    |  30 +-
 .../{PnIoCm_Block_ArServer.java => UserData.java}  |  91 +-
 .../apache/plc4x/java/profinet/ProfinetDriver.java |  56 +-
 .../ProfinetPlcQuery.java}                         |  17 +-
 .../profinet/config/ProfinetConfiguration.java     | 146 ++++
 .../profinet/context/ProfinetDeviceContext.java    | 529 ++++++++++++
 .../profinet/context/ProfinetDriverContext.java    | 100 +--
 .../GsdFileMap.java}                               |  20 +-
 .../ProfinetCallable.java}                         |  13 +-
 .../java/profinet/device/ProfinetChannel.java      | 224 +++++
 .../plc4x/java/profinet/device/ProfinetDevice.java | 957 +++++++++++++++++++++
 .../device/ProfinetDeviceMessageHandler.java       |  46 +
 .../ProfinetDevices.java}                          |  18 +-
 .../java/profinet/device/ProfinetEmptyModule.java  | 103 +++
 .../profinet/device/ProfinetMessageWrapper.java    |  70 ++
 .../plc4x/java/profinet/device/ProfinetModule.java |  57 ++
 .../java/profinet/device/ProfinetModuleImpl.java   | 353 ++++++++
 .../ProfinetRunnable.java}                         |  27 +-
 .../device/ProfinetSubscriptionHandle.java         |  71 ++
 .../profinet/discovery/ProfinetPlcDiscoverer.java  | 587 ++++++++-----
 .../profinet/gsdml/ProfinetApplicationProcess.java |  66 ++
 .../ProfinetApplicationRelations.java}             |  30 +-
 .../ProfinetBitDataItem.java}                      |  31 +-
 .../profinet/gsdml/ProfinetCertificationInfo.java  |  50 ++
 .../java/profinet/gsdml/ProfinetDataItem.java      |  63 ++
 .../gsdml/ProfinetDeviceAccessPointItem.java       | 188 ++++
 .../ProfinetDeviceFunction.java}                   |  20 +-
 .../profinet/gsdml/ProfinetDeviceIdentity.java     |  58 ++
 .../ProfinetDeviceItem.java}                       |  17 +-
 .../ProfinetErrorCode2Value.java}                  |  24 +-
 .../ProfinetExternalTextList.java}                 |  21 +-
 .../ProfinetFamily.java}                           |  30 +-
 .../ProfinetGraphicItem.java}                      |  30 +-
 .../ProfinetGraphics.java}                         |  20 +-
 .../ProfinetGraphicsItemRef.java}                  |  30 +-
 .../ProfinetIOConfigData.java}                     |  30 +-
 .../ProfinetISO15745Profile.java}                  |  30 +-
 .../ProfinetISO15745Reference.java}                |  40 +-
 .../gsdml/ProfinetInterfaceSubmoduleItem.java      | 100 +++
 .../plc4x/java/profinet/gsdml/ProfinetIoData.java  |  62 ++
 .../ProfinetIoDataInput.java}                      |  36 +-
 .../ProfinetIoDataOutput.java}                     |  36 +-
 .../ProfinetLogBookEntryItem.java}                 |  37 +-
 .../java/profinet/gsdml/ProfinetModuleInfo.java    |  71 ++
 .../java/profinet/gsdml/ProfinetModuleItem.java    | 102 +++
 .../ProfinetModuleItemRef.java}                    |  30 +-
 .../gsdml/ProfinetParameterRecordDataItem.java     |  59 ++
 .../profinet/gsdml/ProfinetPortSubmoduleItem.java  |  81 ++
 .../ProfinetPrimaryLanguage.java}                  |  24 +-
 .../ProfinetProfileBody.java}                      |  38 +-
 .../java/profinet/gsdml/ProfinetProfileHeader.java |  71 ++
 .../plc4x/java/profinet/gsdml/ProfinetRef.java     |  78 ++
 .../ProfinetSystemDefinedSubmoduleList.java}       |  35 +-
 .../ProfinetTextId.java}                           |  20 +-
 .../ProfinetTextIdValue.java}                      |  30 +-
 .../ProfinetTimingProperties.java}                 |  30 +-
 .../ProfinetValue.java}                            |  20 +-
 .../gsdml/ProfinetVirtualSubmoduleItem.java        |  89 ++
 .../profinet/protocol/ProfinetProtocolLogic.java   | 395 +++------
 .../profinet/readwrite/utils/StaticHelper.java     | 124 ++-
 .../plc4x/java/profinet/tag/ProfinetTag.java       |  30 +-
 .../java/profinet/tag/ProfinetTagHandler.java      |   3 +-
 .../plc4x/java/profinet/ManualProfinetIoTest.java  |  34 +-
 .../plc4x/java/profinet/ProfinetBrowseTests.java   |  82 ++
 .../plc4x/java/profinet/ProfinetCheckSumTests.java | 107 +++
 .../java/profinet/ProfinetDeviceContextTests.java  | 106 +++
 .../apache/plc4x/java/profinet/ProfinetPoc.java    | 166 ----
 .../java/profinet/ProfinetSubscriptionTests.java}  |   9 +-
 .../profinet/gsdml/ProfinetConfigurationTests.java | 147 ++++
 .../profinet/gsdml/ProfinetGSDMLParseTest.java     |  58 ++
 .../drivers/profinet/src/test/resources/gsdml.xml  | 148 ++++
 .../profinet/src/test/resources/logback-test.xml   |   2 +-
 .../examples/helloplc4x/read/HelloPlc4xRead.java   |  30 +-
 pom.xml                                            |   6 +-
 .../resources/protocols/profinet/profinet.mspec    | 476 +++++++++-
 src/site/asciidoc/users/protocols/profinet.adoc    | 164 ++++
 src/site/site.xml                                  |   1 +
 151 files changed, 14079 insertions(+), 2281 deletions(-)

diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
index 856759e83f,7a3226e372..91f9c99e38
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
@@@ -93,11 -93,7 +94,8 @@@ public class PnDcp_Block_DeviceProperti
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnDcp_Block_DevicePropertiesNameOfStation _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
-     // Reserved Field (reserved)
-     lengthInBits += 16;
- 
      // Array field
      if (nameOfStation != null) {
        lengthInBits += 8 * nameOfStation.length;
@@@ -122,11 -118,7 +120,8 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
-     Integer reservedField0 =
-         readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
- 
      byte[] nameOfStation =
          readBuffer.readByteArray("nameOfStation", Math.toIntExact((blockLength) - (2)));
  
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
index fb797b25d7,1acea8a638..9ed532a12d
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
@@@ -145,8 -173,10 +174,11 @@@ public class PnDcp_Pdu_RealTimeCyclic e
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnDcp_Pdu_RealTimeCyclic _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Manual Field (dataUnit)
+     lengthInBits += ((dataUnit.getLengthInBytes())) * (8);
+ 
      // Simple field (cycleCounter)
      lengthInBits += 16;
  
@@@ -186,8 -216,16 +218,17 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     PnIo_CyclicServiceDataUnit dataUnit =
+         readManualField(
+             "dataUnit",
+             readBuffer,
+             () ->
+                 (PnIo_CyclicServiceDataUnit)
+                     (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.readDataUnit(
+                         readBuffer)));
+ 
      int cycleCounter = readSimpleField("cycleCounter", readUnsignedInt(readBuffer, 16));
  
      boolean ignore = readSimpleField("ignore", readBoolean(readBuffer));
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java
index 4061ad87ca,410da9f80a..ea08b3e6cc
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java
@@@ -220,8 -257,16 +258,17 @@@ public class PnIoCm_Block_AlarmCrReq ex
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_AlarmCrReq _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (alarmType)
      lengthInBits += 16;
  
@@@ -264,8 -309,25 +311,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_AlarmCrType alarmType =
          readEnumField(
              "alarmType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java
index 901d4d31b1,9cdf91aaeb..b20e3da94f
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java
@@@ -115,8 -149,16 +150,17 @@@ public class PnIoCm_Block_AlarmCrRes ex
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_AlarmCrRes _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (alarmType)
      lengthInBits += 16;
  
@@@ -135,8 -177,25 +179,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_AlarmCrType alarmType =
          readEnumField(
              "alarmType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java
index d949811850,c23cc115ba..6c88f4746f
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java
@@@ -338,8 -376,16 +377,17 @@@ public class PnIoCm_Block_ArReq extend
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_ArReq _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (arType)
      lengthInBits += 16;
  
@@@ -409,8 -455,25 +457,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_ArType arType =
          readEnumField(
              "arType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java
index 7b553463a3,a2dd45cf1b..8c14bfcd4e
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java
@@@ -141,8 -175,16 +176,17 @@@ public class PnIoCm_Block_ArRes extend
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_ArRes _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (arType)
      lengthInBits += 16;
  
@@@ -167,8 -209,25 +211,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_ArType arType =
          readEnumField(
              "arType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java
index 261e724080,060a4aa889..d6c6943859
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java
@@@ -65,8 -123,25 +124,26 @@@ public class PnIoCm_Block_ArServer exte
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_ArServer _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
+     // Simple field (stationName)
+     lengthInBits += stationName.getLengthInBits();
+ 
+     // Padding Field (padding)
+     int _timesPadding = (int) (((20) - (6)) - ((stationName.getStringLength())));
+     while (_timesPadding-- > 0) {
+       lengthInBits += 8;
+     }
+ 
      return lengthInBits;
    }
  
@@@ -76,11 -151,39 +153,40 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     PascalString stationName =
+         readSimpleField(
+             "stationName",
+             new DataReaderComplexDefault<>(() -> PascalString.staticParse(readBuffer), readBuffer),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     readPaddingField(
+         readUnsignedShort(readBuffer, 8),
+         (int) (((20) - (6)) - ((stationName.getStringLength()))),
+         WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      readBuffer.closeContext("PnIoCm_Block_ArServer");
      // Create the instance
-     return new PnIoCm_Block_ArServerBuilderImpl();
+     return new PnIoCm_Block_ArServerBuilderImpl(blockVersionHigh, blockVersionLow, stationName);
    }
  
    public static class PnIoCm_Block_ArServerBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder {
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java
index d626e3ff8a,f60a061b8b..6259486614
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java
@@@ -89,8 -123,16 +124,17 @@@ public class PnIoCm_Block_ExpectedSubmo
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_ExpectedSubmoduleReq _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Implicit Field (numberOfApis)
      lengthInBits += 16;
  
@@@ -112,8 -154,25 +156,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      int numberOfApis =
          readImplicitField(
              "numberOfApis",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java
index 5870048cdf,64a9209658..47e22bf4bd
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java
@@@ -373,8 -411,16 +412,17 @@@ public class PnIoCm_Block_IoCrReq exten
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_IoCrReq _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (ioCrType)
      lengthInBits += 16;
  
@@@ -459,8 -505,25 +507,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_IoCrType ioCrType =
          readEnumField(
              "ioCrType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java
index 38a2ed0fea,4916352768..44492f5c1c
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java
@@@ -113,8 -147,16 +148,17 @@@ public class PnIoCm_Block_IoCrRes exten
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_IoCrRes _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Simple field (ioCrType)
      lengthInBits += 16;
  
@@@ -133,8 -175,25 +177,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      PnIoCm_IoCrType ioCrType =
          readEnumField(
              "ioCrType",
diff --cc plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java
index 4c884d240b,ab6f2fcc81..533dabe367
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java
@@@ -87,8 -121,16 +122,17 @@@ public class PnIoCm_Block_ModuleDiff ex
    public int getLengthInBits() {
      int lengthInBits = super.getLengthInBits();
      PnIoCm_Block_ModuleDiff _value = this;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     // Implicit Field (blockLength)
+     lengthInBits += 16;
+ 
+     // Simple field (blockVersionHigh)
+     lengthInBits += 8;
+ 
+     // Simple field (blockVersionLow)
+     lengthInBits += 8;
+ 
      // Implicit Field (numberOfApis)
      lengthInBits += 16;
  
@@@ -110,8 -152,25 +154,26 @@@
      PositionAware positionAware = readBuffer;
      int startPos = positionAware.getPos();
      int curPos;
 +    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
  
+     int blockLength =
+         readImplicitField(
+             "blockLength",
+             readUnsignedInt(readBuffer, 16),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionHigh =
+         readSimpleField(
+             "blockVersionHigh",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
+     short blockVersionLow =
+         readSimpleField(
+             "blockVersionLow",
+             readUnsignedShort(readBuffer, 8),
+             WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+ 
      int numberOfApis =
          readImplicitField(
              "numberOfApis",