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/04 15:20:12 UTC
[plc4x] 01/02: chore: Started making the PR buildable
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch refactor/cdutz/global-changes-of-spnettech-repo
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 1e8ec2ee3da35671228bebe0415affee6fca694e
Author: Christofer Dutz <ch...@rivian.com>
AuthorDate: Sat Feb 4 13:25:03 2023 +0100
chore: Started making the PR buildable
---
code-generation/language-c/pom.xml | 1 -
.../resources/templates/c/data-io-template.c.ftlh | 4 +
code-generation/language-go/pom.xml | 1 -
.../plc4x/include/plc4c/driver_plc4x_static.h | 2 +
plc4c/drivers/plc4x/src/driver_plc4x_static.c | 28 +
.../s7/include/plc4c/driver_s7_encode_decode.h | 6 +
plc4c/drivers/s7/include/plc4c/driver_s7_static.h | 4 +-
plc4c/drivers/s7/src/driver_s7_encode_decode.c | 66 +-
plc4c/drivers/s7/src/driver_s7_packets.c | 13 +-
plc4c/drivers/s7/src/driver_s7_sm_read.c | 13 +-
plc4c/drivers/s7/src/driver_s7_static.c | 4 +-
plc4c/generated-sources/plc4x/src/plc4x_value.c | 34 +
plc4c/generated-sources/s7/include/data_item.h | 8 +-
plc4c/generated-sources/s7/src/data_item.c | 60 +-
plc4c/generated-sources/s7/src/transport_size.c | 16 +-
plc4go/go.mod | 2 +-
plc4go/internal/s7/Reader.go | 7 +-
plc4go/internal/s7/Tag.go | 54 +-
plc4go/internal/s7/TagHandler.go | 68 +-
plc4go/internal/s7/Writer.go | 2 +-
plc4go/internal/simulated/Reader_test.go | 2 +-
plc4go/internal/simulated/Writer_test.go | 2 +-
.../protocols/abeth/readwrite/XmlParserHelper.go | 4 +-
plc4j/api/pom.xml | 3 +
.../apache/plc4x/java/DefaultPlcDriverManager.java | 41 +-
.../plc4x/java/api/PlcConnectionManager.java | 1 +
.../org/apache/plc4x/java/api/model/PlcTag.java | 13 +
.../apache/plc4x/java/ads/tag/DirectAdsTag.java | 1 +
.../canopen/SDODownloadConversation.java | 2 +-
.../java/firmata/readwrite/tag/FirmataTag.java | 1 +
plc4j/drivers/knxnetip/pom.xml | 2 +-
.../knxnetip/protocol/KnxNetIpProtocolLogic.java | 2 +-
plc4j/drivers/opcua/pom.xml | 14 +-
.../java/opcua/readwrite/OpcuaNodeIdServices.java | 673 +
.../apache/plc4x/java/opcua/OpcuaPlcDriver.java | 1 +
.../plc4x/java/opcua/context/SecureChannel.java | 6 +-
.../plc4x/java/plc4x/readwrite/Plc4xValue.java | 32 +
.../java/plc4x/protocol/Plc4xProtocolLogic.java | 13 +-
.../java/plc4x/readwrite/utils/StaticHelper.java | 94 +
.../plc4x/java/plc4x/tag/Plc4XTagHandler.java | 7 +-
.../org/apache/plc4x/java/plc4x/tag/Plc4xTag.java | 13 +-
plc4j/drivers/pom.xml | 15 +
.../apache/plc4x/java/s7/readwrite/DataItem.java | 72 +-
.../s7/readwrite/S7PayloadReadVarResponse.java | 2 +-
.../java/s7/readwrite/S7VarPayloadDataItem.java | 39 +-
.../plc4x/java/s7/readwrite/TransportSize.java | 18 +-
.../readwrite/configuration/S7Configuration.java | 60 +-
.../java/s7/readwrite/context/S7DriverContext.java | 4 +-
.../optimizer/DefaultS7MessageProcessor.java | 6 +-
.../java/s7/readwrite/optimizer/S7Optimizer.java | 27 +-
.../readwrite/protocol/S7ProtocolEventLogic.java | 6 +-
.../s7/readwrite/protocol/S7ProtocolLogic.java | 188 +-
.../plc4x/java/s7/readwrite/tag/S7StringTag.java | 5 +-
.../apache/plc4x/java/s7/readwrite/tag/S7Tag.java | 103 +-
.../java/s7/readwrite/utils/StaticHelper.java | 212 +-
plc4j/drivers/s7/src/test/java/S7IoTest.java | 9 +-
.../drivers/s7/src/test/resources/logback-test.xml | 2 +-
.../simulated/connection/SimulatedConnection.java | 30 +-
.../examples/connectivity/mqtt/MqttConnector.java | 66 +-
.../src/main/resources/mqtt-connector.yml | 35 +
.../java/examples/helloinflux/HelloInflux.java | 2 +-
plc4j/examples/hello-world-kotlin/pom.xml | 2 +-
plc4j/integrations/apache-kafka/pom.xml | 2 +-
plc4j/integrations/opcua-server/pom.xml | 8 +-
.../opcuaserver/backend/Plc4xCommunication.java | 23 +-
.../java/opcuaserver/backend/Plc4xNamespace.java | 5 +-
plc4j/pom.xml | 3 +
.../apache/plc4x/java/spi/Plc4xNettyWrapper.java | 50 +-
.../apache/plc4x/java/spi/Plc4xProtocolBase.java | 7 +
.../plc4x/java/spi/connection/ChannelFactory.java | 3 +-
.../spi/connection/DefaultNettyPlcConnection.java | 36 +-
.../java/spi/connection/NettyChannelFactory.java | 12 +
.../java/spi/generation/WriteBufferByteBased.java | 2 +
.../java/spi/internal/HandlerRegistration.java | 14 +-
.../java/spi/messages/DefaultPlcWriteRequest.java | 5 +
.../java/spi/model/DefaultPlcSubscriptionTag.java | 4 +-
.../spi/transaction/RequestTransactionManager.java | 37 +-
.../org/apache/plc4x/java/spi/values/PlcBOOL.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcBYTE.java | 8 +-
.../org/apache/plc4x/java/spi/values/PlcCHAR.java | 45 +
.../plc4x/java/spi/values/PlcDATE_AND_TIME.java | 33 +
.../org/apache/plc4x/java/spi/values/PlcDINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcDWORD.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcLINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcLREAL.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcLTIME.java | 16 +
.../org/apache/plc4x/java/spi/values/PlcLWORD.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcSINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcTIME.java | 16 +
.../plc4x/java/spi/values/PlcTIME_OF_DAY.java | 4 +
.../org/apache/plc4x/java/spi/values/PlcUDINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcUINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcULINT.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcUSINT.java | 2 +
.../plc4x/java/spi/values/PlcValueHandler.java | 81 +-
.../org/apache/plc4x/java/spi/values/PlcWCHAR.java | 2 +
.../org/apache/plc4x/java/spi/values/PlcWORD.java | 2 +
.../plc4x/java/spi/Plc4xNettyWrapperTest.java | 4 +-
.../optimizer/RequestTransactionManagerTest.java | 20 +-
.../utils/cache/CachedPlcConnectionManager.java | 23 +-
.../java/utils/cache/LeasedPlcConnection.java | 19 +-
.../plc4x/java/plc4x/readwrite/Plc4xValue.java | 32 +
.../java/plc4x/readwrite/utils/StaticHelper.java | 94 +
.../plc4xserver/protocol/Plc4xServerAdapter.java | 5 +-
plc4j/transports/pom.xml | 16 +-
.../server/s7/protocol/S7Step7ServerAdapter.java | 24 +-
pom.xml | 18 +-
.../opcua/downloads/Opc.Ua.NodeIds.Services.csv | 1749 +
.../opcua/downloads/Opc.Ua.NodeSet2.Services.xml | 63477 +++++++++++++++++++
protocols/opcua/downloads/Opc.Ua.Types.bsd | 3162 +
protocols/opcua/downloads/StatusCode.csv | 261 +
protocols/opcua/pom.xml | 26 +-
.../main/resources/protocols/plc4x/v0/plc4x.mspec | 14 +-
protocols/pom.xml | 3 +
.../s7/src/main/resources/protocols/s7/s7.mspec | 36 +-
116 files changed, 71004 insertions(+), 644 deletions(-)
diff --git a/code-generation/language-c/pom.xml b/code-generation/language-c/pom.xml
index c9cd041200..fd86a7a987 100644
--- a/code-generation/language-c/pom.xml
+++ b/code-generation/language-c/pom.xml
@@ -62,7 +62,6 @@
<extraArtifact>org.apache.plc4x.plugins:plc4x-maven-plugin:${plc4x-code-generation.version}</extraArtifact>
<extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-protocol-base:${plc4x-code-generation.version}</extraArtifact>
<extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version}</extraArtifact>
- <extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version}</extraArtifact>
</extraArtifacts>
<pomIncludes>
<pomInclude>*/pom.xml</pomInclude>
diff --git a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
index 114889903b..bf1a543262 100644
--- a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
@@ -179,7 +179,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
return new PlcStruct(${field.name});
<#break-->
<#case "STRING">
+ <#if (parserArguments?filter(parserArgument->parserArgument.name=="stringLength"))?has_content>
*data_item = plc4c_data_create_string_data(stringLength, ${manualField.name});
+ <#else>
+ *data_item = plc4c_data_create_string_data(strlen(value), ${manualField.name});
+ </#if>
<#break>
<#default>
*data_item = plc4c_data_create_${case.name?lower_case}_data(${manualField.name});
diff --git a/code-generation/language-go/pom.xml b/code-generation/language-go/pom.xml
index a452077012..cc2f201576 100644
--- a/code-generation/language-go/pom.xml
+++ b/code-generation/language-go/pom.xml
@@ -62,7 +62,6 @@
<extraArtifact>org.apache.plc4x.plugins:plc4x-maven-plugin:${plc4x-code-generation.version}</extraArtifact>
<extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-protocol-base:${plc4x-code-generation.version}</extraArtifact>
<extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version}</extraArtifact>
- <extraArtifact>org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version}</extraArtifact>
</extraArtifacts>
<pomIncludes>
<pomInclude>*/pom.xml</pomInclude>
diff --git a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
index 4a6d28aada..1e6cdc2bc6 100644
--- a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
@@ -36,6 +36,8 @@ extern "C" {
uint8_t plc4c_spi_evaluation_helper_str_len(char* str);
+char* plc4c_plc4x_read_write_parse_string(plc4c_spi_read_buffer* io, char* encoding);
+
#ifdef __cplusplus
}
#endif
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_static.c b/plc4c/drivers/plc4x/src/driver_plc4x_static.c
index 9eff097145..fda73bf88b 100644
--- a/plc4c/drivers/plc4x/src/driver_plc4x_static.c
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_static.c
@@ -30,3 +30,31 @@ uint8_t plc4c_spi_evaluation_helper_str_len(char* str) {
return strlen(str);
}
+char* plc4c_plc4x_read_write_parse_string(plc4c_spi_read_buffer* io, char* encoding) {
+ if (strcmp(encoding, "UTF-8") == 0) {
+ // Read the max length (which is not interesting for us.
+ uint8_t length;
+ plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &length);
+ if (res != OK) {
+ return NULL;
+ }
+ char* result = malloc(sizeof(char) * (length + 1));
+ if (result == NULL) {
+ return NULL;
+ }
+ char* curPos = result;
+ for(int i = 0; i < length; i++) {
+ uint8_t val;
+ plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val);
+ if (res != OK) {
+ return NULL;
+ }
+ *curPos = (char) val;
+ curPos++;
+ }
+ *curPos = '\0';
+ return result;
+ } else if (strcmp(encoding, "UTF-16") == 0) {
+ }
+ return "";
+}
diff --git a/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h b/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h
index 28da28458b..b771f5bed9 100644
--- a/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h
+++ b/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h
@@ -27,6 +27,12 @@ extern "C" {
#include "plc4c/driver_s7.h"
#include "s7_var_request_parameter_item.h"
+struct plc4c_s7_read_write_s7_var_request_parameter_item_field {
+ plc4c_s7_read_write_s7_var_request_parameter_item* parameter_item;
+ char* s7_address_any_encoding_of_string;
+};
+typedef struct plc4c_s7_read_write_s7_var_request_parameter_item_field plc4c_s7_read_write_s7_var_request_parameter_item_field;
+
uint16_t plc4c_driver_s7_encode_tsap_id(
plc4c_driver_s7_device_group device_group, uint8_t rack, uint8_t slot);
diff --git a/plc4c/drivers/s7/include/plc4c/driver_s7_static.h b/plc4c/drivers/s7/include/plc4c/driver_s7_static.h
index 2b52cec337..05ba1d9cc8 100644
--- a/plc4c/drivers/s7/include/plc4c/driver_s7_static.h
+++ b/plc4c/drivers/s7/include/plc4c/driver_s7_static.h
@@ -48,9 +48,9 @@ uint16_t plc4c_s7_read_write_s7msec_to_int(plc4c_spi_read_buffer* io);
plc4c_return_code plc4c_s7_read_write_int_to_s7msec(plc4c_spi_write_buffer* writeBuffer, uint16_t value);
-char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding);
+char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding, char* stringEncoding);
-char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding);
+char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding, char* stringEncoding);
time_t plc4c_s7_read_write_parse_tia_time(plc4c_spi_read_buffer* io);
diff --git a/plc4c/drivers/s7/src/driver_s7_encode_decode.c b/plc4c/drivers/s7/src/driver_s7_encode_decode.c
index 9b9043b591..024f4b3593 100644
--- a/plc4c/drivers/s7/src/driver_s7_encode_decode.c
+++ b/plc4c/drivers/s7/src/driver_s7_encode_decode.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include <tpkt_packet.h>
+#include "plc4c/driver_s7_encode_decode.h"
uint16_t plc4c_driver_s7_encode_tsap_id(
plc4c_driver_s7_device_group device_group, uint8_t rack, uint8_t slot) {
@@ -114,6 +115,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
// Parser logic
char* cur_pos = address;
char* last_pos = address;
+ char* string_encoding = NULL;
// - Does it start with "%"?
if (*cur_pos == '%') {
cur_pos++;
@@ -247,6 +249,19 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
*(num_elements + len) = '\0';
}
+ if (*cur_pos == '|') {
+ // Next comes the num_elements
+ cur_pos++;
+ last_pos = cur_pos;
+ while (*cur_pos != '\0') {
+ cur_pos++;
+ }
+ len = cur_pos - last_pos;
+ string_encoding = malloc(sizeof(char) * (len + 1));
+ strncpy(string_encoding, last_pos, len);
+ *(string_encoding + len) = '\0';
+ }
+
////////////////////////////////////////////////////////////////////////////
// Now parse the contents.
////////////////////////////////////////////////////////////////////////////
@@ -261,6 +276,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
free(data_type);
free(string_length);
free(num_elements);
+ free(string_encoding);
free(s7_item);
return NO_MEMORY;
}
@@ -283,6 +299,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
free(data_type);
free(string_length);
free(num_elements);
+ free(string_encoding);
free(any_address);
free(s7_item);
return INVALID_ADDRESS;
@@ -320,15 +337,50 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
// TODO: THis should be moved to "driver_s7_packets.c->plc4c_return_code plc4c_driver_s7_create_s7_read_request"
if (any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_TIME ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_LINT ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_ULINT ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_LWORD ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_LREAL ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_REAL ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_LTIME ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_DATE ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_TIME_OF_DAY ||
+ any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_DATE_AND_TIME) {
+ any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE;
+ any_address->s7_address_any_number_of_elements =
+ plc4c_s7_read_write_transport_size_length_in_bytes(&(any_address->s7_address_any_transport_size)) *
+ any_address->s7_address_any_number_of_elements;
+ } else if (any_address->s7_address_any_transport_size ==
plc4c_s7_read_write_transport_size_STRING) {
+ any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE;
if (string_length != NULL) {
any_address->s7_address_any_number_of_elements =
- strtol(string_length, 0, 10) *
+ (strtol(string_length, 0, 10) +2) *
any_address->s7_address_any_number_of_elements;
- } else if (any_address->s7_address_any_transport_size ==
- plc4c_s7_read_write_transport_size_STRING) {
+ } else {
+ any_address->s7_address_any_number_of_elements =
+ 256 * any_address->s7_address_any_number_of_elements;
+ }
+ } else if (any_address->s7_address_any_transport_size ==
+ plc4c_s7_read_write_transport_size_WSTRING) {
+ any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE;
+ if (string_length != NULL) {
+ any_address->s7_address_any_number_of_elements =
+ (strtol(string_length, 0, 10) +2) * 2 *
+ any_address->s7_address_any_number_of_elements;
+ } else {
any_address->s7_address_any_number_of_elements =
- 254 * any_address->s7_address_any_number_of_elements;
+ 512 * any_address->s7_address_any_number_of_elements;
}
} else if (any_address->s7_address_any_transport_size ==
plc4c_s7_read_write_transport_size_TOD) {
@@ -396,8 +448,12 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) {
free(read_buffer);
free(raw_data);
}
+ plc4c_s7_read_write_s7_var_request_parameter_item_field* s7_item_field;
- *item = s7_item;
+ s7_item_field = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item_field));
+ s7_item_field->parameter_item = s7_item;
+ s7_item_field->s7_address_any_encoding_of_string = string_encoding;
+ *item = s7_item_field;
return OK;
}
diff --git a/plc4c/drivers/s7/src/driver_s7_packets.c b/plc4c/drivers/s7/src/driver_s7_packets.c
index 3742f9a73e..bf68e8455a 100644
--- a/plc4c/drivers/s7/src/driver_s7_packets.c
+++ b/plc4c/drivers/s7/src/driver_s7_packets.c
@@ -713,9 +713,9 @@ plc4c_return_code plc4c_driver_s7_create_s7_read_request(
plc4c_s7_read_write_s7_var_request_parameter_item* updated_item_address;
item = cur_item->value;
-
+ plc4c_s7_read_write_s7_var_request_parameter_item_field* field = item->address;
// Get the item address from the API request.
- parsed_item_address = item->address;
+ parsed_item_address = field->parameter_item;
// Create a copy of the request item...
updated_item_address = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
@@ -723,14 +723,14 @@ plc4c_return_code plc4c_driver_s7_create_s7_read_request(
return NO_MEMORY;
}
updated_item_address->_type = parsed_item_address->_type;
- updated_item_address->s7_var_request_parameter_item_address_address =
+ updated_item_address->s7_var_request_parameter_item_address_address =
malloc(sizeof(plc4c_s7_read_write_s7_address));
if (updated_item_address->s7_var_request_parameter_item_address_address == NULL) {
return NO_MEMORY;
}
// Memcpy inplace of fields assignment, as all fields where assigned
memcpy(updated_item_address->s7_var_request_parameter_item_address_address,
- parsed_item_address->s7_var_request_parameter_item_address_address,
+ parsed_item_address->s7_var_request_parameter_item_address_address,
sizeof(plc4c_s7_read_write_s7_address));
// In case of TIME values, we read 4 bytes for each value instead.
@@ -855,7 +855,10 @@ plc4c_return_code plc4c_driver_s7_create_s7_write_request(
// Get the item address from the API request.
item = list_item->value;
parsed_item = item->item;
- parsed_param = parsed_item->address;
+
+ plc4c_s7_read_write_s7_var_request_parameter_item_field* field = parsed_item->address;
+
+ parsed_param = field->parameter_item;
parsed_value = item->value;
// Make a copy of the param
diff --git a/plc4c/drivers/s7/src/driver_s7_sm_read.c b/plc4c/drivers/s7/src/driver_s7_sm_read.c
index 2a41ab9c3f..2a07026a47 100644
--- a/plc4c/drivers/s7/src/driver_s7_sm_read.c
+++ b/plc4c/drivers/s7/src/driver_s7_sm_read.c
@@ -203,6 +203,7 @@ plc4c_return_code plc4c_driver_s7_parse_read_response(
plc4c_data* data_item;
plc4c_response_value_item* response_value_item;
char* data_protocol_id;
+ char* string_encoding;
uint16_t num_elements;
int32_t string_length;
uint8_t* byte_array;
@@ -225,11 +226,13 @@ plc4c_return_code plc4c_driver_s7_parse_read_response(
// Get the protocol id for the current item from the corresponding
// request item. Also get the number of elements, if it's an array.
- request_address = request_item->address;
+ plc4c_s7_read_write_s7_var_request_parameter_item_field* field = request_item->address;
+ request_address = field->parameter_item;
transport_size = request_address->s7_var_request_parameter_item_address_address->s7_address_any_transport_size;
num_elements = request_address->s7_var_request_parameter_item_address_address->s7_address_any_number_of_elements;
data_protocol_id = plc4c_s7_read_write_transport_size_get_data_protocol_id(transport_size);
-
+ string_encoding = field->s7_address_any_encoding_of_string;
+
if (transport_size == plc4c_s7_read_write_transport_size_STRING) {
// TODO: This needs to be changed to read arrays of strings.
string_length = num_elements;
@@ -257,12 +260,12 @@ plc4c_return_code plc4c_driver_s7_parse_read_response(
all_data_item = plc4c_data_create_list_data(all_list);
free(all_list);
for (idx = 0; idx < num_elements ; idx++) {
- plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, &data_item);
- plc4c_utils_list_insert_head_value(all_data_item->data.list_value, (void*)data_item);
+ plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, string_encoding, &data_item);
+ plc4c_utils_list_insert_head_value(&all_data_item->data.list_value, (void*)data_item);
}
data_item = all_data_item;
} else {
- plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, &data_item);
+ plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length,string_encoding, &data_item);
}
// Create a new response value-item
diff --git a/plc4c/drivers/s7/src/driver_s7_static.c b/plc4c/drivers/s7/src/driver_s7_static.c
index 42dc91f2ed..dff33e5bb6 100644
--- a/plc4c/drivers/s7/src/driver_s7_static.c
+++ b/plc4c/drivers/s7/src/driver_s7_static.c
@@ -53,7 +53,7 @@ uint16_t plc4c_s7_read_write_s7msec_to_int(plc4c_spi_read_buffer* io) {
char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io,
int32_t stringLength,
- char* encoding) {
+ char* encoding, char* stringEncoding) {
if (strcmp(encoding, "UTF-8") == 0) {
// Read the max length (which is not interesting for us.
uint8_t maxLen;
@@ -89,7 +89,7 @@ char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io,
}
char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io,
- char* encoding) {
+ char* encoding, char* stringEncoding) {
if (strcmp(encoding, "UTF-8") == 0) {
char* result = malloc(sizeof(char) * 2);
if (result == NULL) {
diff --git a/plc4c/generated-sources/plc4x/src/plc4x_value.c b/plc4c/generated-sources/plc4x/src/plc4x_value.c
index b464bd1bc5..371df66267 100644
--- a/plc4c/generated-sources/plc4x/src/plc4x_value.c
+++ b/plc4c/generated-sources/plc4x/src/plc4x_value.c
@@ -235,6 +235,20 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_parse(plc4c_spi_read_buffer
*data_item = plc4c_data_create_string_data(16, value);
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */
+
+ // Manual Field (value)
+ char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-8"));
+
+ *data_item = plc4c_data_create_string_data(strlen(value), value);
+
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */
+
+ // Manual Field (value)
+ char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-16"));
+
+ *data_item = plc4c_data_create_string_data(strlen(value), value);
+
} else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */
// Simple Field (milliseconds)
@@ -452,6 +466,12 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_serialize(plc4c_spi_write_b
if(_res != OK) {
return _res;
}
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */
+
+ // Manual Field (value)
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */
+
+ // Manual Field (value)
} else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */
// Simple field (milliseconds)
@@ -590,6 +610,20 @@ uint16_t plc4c_plc4x_read_write_plc4x_value_length_in_bits(plc4c_data* data_item
// Simple field (value)
lengthInBits += 16;
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */
+
+ // Manual Field (value)
+ {
+ char* _value = data_item->data.string_value;
+ lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) + (1))) * (8);
+ }
+ } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */
+
+ // Manual Field (value)
+ {
+ char* _value = data_item->data.string_value;
+ lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) + (1))) * (16);
+ }
} else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */
// Simple field (milliseconds)
diff --git a/plc4c/generated-sources/s7/include/data_item.h b/plc4c/generated-sources/s7/include/data_item.h
index 3974923a86..a7f40affcc 100644
--- a/plc4c/generated-sources/s7/include/data_item.h
+++ b/plc4c/generated-sources/s7/include/data_item.h
@@ -27,12 +27,12 @@
// Code generated by code-generation. DO NOT EDIT.
-plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item);
+plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item);
-plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item);
+plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item);
-uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength);
+uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding);
-uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength);
+uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding);
#endif // PLC4C_S7_READ_WRITE_DATA_ITEM_H_
diff --git a/plc4c/generated-sources/s7/src/data_item.c b/plc4c/generated-sources/s7/src/data_item.c
index 6f4a261e64..2ef40e710c 100644
--- a/plc4c/generated-sources/s7/src/data_item.c
+++ b/plc4c/generated-sources/s7/src/data_item.c
@@ -31,7 +31,7 @@
// Code generated by code-generation. DO NOT EDIT.
// Parse function.
-plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item) {
+plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item) {
uint16_t startPos = plc4c_spi_read_get_pos(readBuffer);
uint16_t curPos;
plc4c_return_code _res = OK;
@@ -215,39 +215,31 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* rea
} else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */
- // Simple Field (value)
- char* value = "";
- _res = plc4c_spi_read_string(readBuffer, 8, "UTF-8", (char**) &value);
- if(_res != OK) {
- return _res;
- }
+ // Manual Field (value)
+ char* value = (char*) (plc4c_s7_read_write_parse_s7_char(readBuffer, "UTF-8", stringEncoding));
*data_item = plc4c_data_create_char_data(value);
} else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */
- // Simple Field (value)
- char* value = "";
- _res = plc4c_spi_read_string(readBuffer, 16, "UTF-16", (char**) &value);
- if(_res != OK) {
- return _res;
- }
+ // Manual Field (value)
+ char* value = (char*) (plc4c_s7_read_write_parse_s7_char(readBuffer, "UTF-16", stringEncoding));
*data_item = plc4c_data_create_char_data(value);
} else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */
// Manual Field (value)
- char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-8"));
+ char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-8", stringEncoding));
- *data_item = plc4c_data_create_string_data(stringLength, value);
+ *data_item = plc4c_data_create_string_data(stringLength, value);
} else if(strcmp(dataProtocolId, "IEC61131_WSTRING") == 0) { /* STRING */
// Manual Field (value)
- char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-16"));
+ char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-16", stringEncoding));
- *data_item = plc4c_data_create_string_data(stringLength, value);
+ *data_item = plc4c_data_create_string_data(stringLength, value);
} else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */
@@ -390,7 +382,7 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* rea
return OK;
}
-plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item) {
+plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item) {
plc4c_return_code _res = OK;
if(strcmp(dataProtocolId, "IEC61131_BOOL") == 0) { /* BOOL */
@@ -501,18 +493,10 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer
}
} else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */
- // Simple field (value)
- _res = plc4c_spi_write_string(writeBuffer, 8, "UTF-8", (*data_item)->data.char_value);
- if(_res != OK) {
- return _res;
- }
+ // Manual Field (value)
} else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */
- // Simple field (value)
- _res = plc4c_spi_write_string(writeBuffer, 16, "UTF-16", (*data_item)->data.char_value);
- if(_res != OK) {
- return _res;
- }
+ // Manual Field (value)
} else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */
// Manual Field (value)
@@ -607,11 +591,11 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer
return OK;
}
-uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* data_protocol_id, int32_t string_length) {
- return plc4c_s7_read_write_data_item_length_in_bits(data_item, data_protocol_id, string_length) / 8;
+uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* data_protocol_id, int32_t string_length, char* string_encoding) {
+ return plc4c_s7_read_write_data_item_length_in_bits(data_item, data_protocol_id, string_length, string_encoding) / 8;
}
-uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength) {
+uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding) {
uint16_t lengthInBits = 0;
if(strcmp(dataProtocolId, "IEC61131_BOOL") == 0) { /* BOOL */
@@ -678,26 +662,20 @@ uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, cha
lengthInBits += 64;
} else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */
- // Simple field (value)
+ // Manual Field (value)
lengthInBits += 8;
} else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */
- // Simple field (value)
+ // Manual Field (value)
lengthInBits += 16;
} else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */
// Manual Field (value)
- {
- char* _value = data_item->data.string_value;
- lengthInBits += (plc4c_spi_evaluation_helper_str_len(_value)) + (2);
- }
+ lengthInBits += (((stringLength) + (2))) * (8);
} else if(strcmp(dataProtocolId, "IEC61131_WSTRING") == 0) { /* STRING */
// Manual Field (value)
- {
- char* _value = data_item->data.string_value;
- lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) * (2))) + (2);
- }
+ lengthInBits += (((stringLength) + (2))) * (16);
} else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */
// Simple field (milliseconds)
diff --git a/plc4c/generated-sources/s7/src/transport_size.c b/plc4c/generated-sources/s7/src/transport_size.c
index d7e50f7020..bd41e92140 100644
--- a/plc4c/generated-sources/s7/src/transport_size.c
+++ b/plc4c/generated-sources/s7/src/transport_size.c
@@ -1093,28 +1093,28 @@ plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_d
return plc4c_s7_read_write_data_transport_size_INTEGER;
}
case plc4c_s7_read_write_transport_size_LINT: { /* '0x0C' */
- return -1;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_ULINT: { /* '0x0D' */
- return -1;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_REAL: { /* '0x0E' */
- return plc4c_s7_read_write_data_transport_size_REAL;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_LREAL: { /* '0x0F' */
- return -1;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_CHAR: { /* '0x10' */
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_WCHAR: { /* '0x11' */
- return -1;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_STRING: { /* '0x12' */
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_WSTRING: { /* '0x13' */
- return -1;
+ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return -1;
@@ -1363,10 +1363,10 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_t
return plc4c_s7_read_write_transport_size_INT;
}
case plc4c_s7_read_write_transport_size_LINT: { /* '0x0C' */
- return plc4c_s7_read_write_transport_size_INT;
+ return -1;
}
case plc4c_s7_read_write_transport_size_ULINT: { /* '0x0D' */
- return plc4c_s7_read_write_transport_size_INT;
+ return -1;
}
case plc4c_s7_read_write_transport_size_REAL: { /* '0x0E' */
return -1;
diff --git a/plc4go/go.mod b/plc4go/go.mod
index cb23e942a1..42981266a4 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -19,7 +19,7 @@
module github.com/apache/plc4x/plc4go
-go 1.18
+go 1.19
require (
github.com/IBM/netaddr v1.5.0
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index 85664a7125..7df4362469 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -210,13 +210,16 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ
for i, tagName := range readRequest.GetTagNames() {
tag := readRequest.GetTag(tagName).(PlcTag)
payloadItem := payloadItems[i]
-
+ stringLength := uint16(254)
+ if s7StringTag, ok := tag.(PlcStringTag); ok {
+ stringLength = s7StringTag.stringLength
+ }
responseCode := decodeResponseCode(payloadItem.GetReturnCode())
// Decode the data according to the information from the request
log.Trace().Msg("decode data")
responseCodes[tagName] = responseCode
if responseCode == model.PlcResponseCode_OK {
- plcValue, err := readWriteModel.DataItemParse(payloadItem.GetData(), tag.GetDataType().DataProtocolId(), int32(tag.GetNumElements()))
+ plcValue, err := readWriteModel.DataItemParse(payloadItem.GetData(), tag.GetDataType().DataProtocolId(), int32(stringLength), tag.GetStringEncoding())
if err != nil {
return nil, errors.Wrap(err, "Error parsing data item")
}
diff --git a/plc4go/internal/s7/Tag.go b/plc4go/internal/s7/Tag.go
index 9dac023754..bb0edd8383 100644
--- a/plc4go/internal/s7/Tag.go
+++ b/plc4go/internal/s7/Tag.go
@@ -39,27 +39,30 @@ type PlcTag interface {
GetMemoryArea() readWriteModel.MemoryArea
GetByteOffset() uint16
GetBitOffset() uint8
+ GetStringEncoding() string
}
type plcTag struct {
- TagType TagType
- MemoryArea readWriteModel.MemoryArea
- BlockNumber uint16
- ByteOffset uint16
- BitOffset uint8
- NumElements uint16
- Datatype readWriteModel.TransportSize
+ TagType TagType
+ MemoryArea readWriteModel.MemoryArea
+ BlockNumber uint16
+ ByteOffset uint16
+ BitOffset uint8
+ NumElements uint16
+ Datatype readWriteModel.TransportSize
+ StringEncoding string
}
-func NewTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize) PlcTag {
+func NewTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize, stringEncoding string) PlcTag {
return plcTag{
- TagType: S7Tag,
- MemoryArea: memoryArea,
- BlockNumber: blockNumber,
- ByteOffset: byteOffset,
- BitOffset: bitOffset,
- NumElements: numElements,
- Datatype: datatype,
+ TagType: S7Tag,
+ MemoryArea: memoryArea,
+ BlockNumber: blockNumber,
+ ByteOffset: byteOffset,
+ BitOffset: bitOffset,
+ NumElements: numElements,
+ Datatype: datatype,
+ StringEncoding: stringEncoding,
}
}
@@ -68,16 +71,17 @@ type PlcStringTag struct {
stringLength uint16
}
-func NewStringTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize) PlcStringTag {
+func NewStringTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize, stringEncoding string) PlcStringTag {
return PlcStringTag{
plcTag: plcTag{
- TagType: S7StringTag,
- MemoryArea: memoryArea,
- BlockNumber: blockNumber,
- ByteOffset: byteOffset,
- BitOffset: bitOffset,
- NumElements: numElements,
- Datatype: datatype,
+ TagType: S7StringTag,
+ MemoryArea: memoryArea,
+ BlockNumber: blockNumber,
+ ByteOffset: byteOffset,
+ BitOffset: bitOffset,
+ NumElements: numElements,
+ Datatype: datatype,
+ StringEncoding: stringEncoding,
},
stringLength: stringLength,
}
@@ -142,6 +146,10 @@ func (m plcTag) Serialize() ([]byte, error) {
return wb.GetBytes(), nil
}
+func (m plcTag) GetStringEncoding() string {
+ return m.StringEncoding
+}
+
func (m plcTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error {
if err := writeBuffer.PushContext(m.TagType.GetName()); err != nil {
return err
diff --git a/plc4go/internal/s7/TagHandler.go b/plc4go/internal/s7/TagHandler.go
index 6c2bc99cb0..d7f21cce66 100644
--- a/plc4go/internal/s7/TagHandler.go
+++ b/plc4go/internal/s7/TagHandler.go
@@ -57,11 +57,11 @@ func NewTagHandler() TagHandler {
return TagHandler{
addressPattern: regexp.MustCompile(`^%(?P<memoryArea>.)(?P<transferSizeCode>[XBWD]?)(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>[a-zA-Z_]+)(\[(?P<numElements>\d+)])?`),
//blockNumber usually has its max hat around 64000 --> 5digits
- dataBlockAddressPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}).DB(?P<transferSizeCode>[XBWD]?)(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>[a-zA-Z_]+)(\[(?P<numElements>\d+)])?`),
- dataBlockShortPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}):(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>[a-zA-Z_]+)(\[(?P<numElements>\d+)])?`),
- dataBlockStringAddressPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}).DB(?P<transferSizeCode>[XBWD]?)(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numElements>\d+)])?`),
- dataBlockStringShortPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}):(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numElements>\d+)])?`),
- plcProxyAddressPattern: regexp.MustCompile(`[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}`),
+ dataBlockAddressPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}).DB(?P<transferSizeCode>[XBWD]?)(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>[a-zA-Z_]+)(\[(?P<numElements>\d+)])?(\|(?P<stringEncoding>[a-z0-9A-Z_-]+))?`),
+ dataBlockShortPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}):(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>[a-zA-Z_]+)(\[(?P<numElements>\d+)])?(\|(?P<stringEncoding>[a-z0-9A-Z_-]+))?`),
+ dataBlockStringAddressPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}).DB(?P<transferSizeCode>[XBWD]?)(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numElements>\d+)])?(\|(?P<stringEncoding>[a-z0-9A-Z_-]+))?`),
+ dataBlockStringShortPattern: regexp.MustCompile(`^%DB(?P<blockNumber>\d{1,5}):(?P<byteOffset>\d{1,7})(.(?P<bitOffset>[0-7]))?:(?P<dataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numElements>\d+)])?(\|(?P<stringEncoding>[a-z0-9A-Z_-]+))?`),
+ plcProxyAddressPattern: regexp.MustCompile(`[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}(\|(?P<stringEncoding>[a-z0-9A-Z_-]+))?`),
}
}
@@ -119,8 +119,15 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
if (transferSizeCode != 0) && (dataType.ShortName() != transferSizeCode) {
return nil, errors.Errorf("Transfer size code '%d' doesn't match specified data type '%s'", transferSizeCode, dataType)
}
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
- return NewStringTag(memoryArea, 0, byteOffset, bitOffset, numElements, stringLength, dataType), nil
+ return NewStringTag(memoryArea, 0, byteOffset, bitOffset, numElements, stringLength, dataType, stringEncoding), nil
} else if match := utils.GetSubgroupMatches(m.dataBlockStringShortPattern, tagAddress); match != nil {
dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE])
if !ok {
@@ -157,8 +164,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
}
numElements = uint16(parsedNumElements)
}
-
- return NewStringTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, dataType), nil
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
+ return NewStringTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, dataType, stringEncoding), nil
} else if match := utils.GetSubgroupMatches(m.dataBlockAddressPattern, tagAddress); match != nil {
dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE])
if !ok {
@@ -204,8 +217,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
if (transferSizeCode != 0) && (dataType.ShortName() != transferSizeCode) {
return nil, errors.Errorf("Transfer size code '%d' doesn't match specified data type '%s'", transferSizeCode, dataType)
}
-
- return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType), nil
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
+ return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil
} else if match := utils.GetSubgroupMatches(m.dataBlockShortPattern, tagAddress); match != nil {
dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE])
if !ok {
@@ -246,8 +265,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
}
numElements = uint16(parsedNumElements)
}
-
- return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType), nil
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
+ return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil
} else if match := utils.GetSubgroupMatches(m.plcProxyAddressPattern, tagAddress); match != nil {
addressData, err := hex.DecodeString(strings.ReplaceAll(tagAddress, "[-]", ""))
if err != nil {
@@ -261,7 +286,13 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
if (s7AddressAny.GetTransportSize() != readWriteModel.TransportSize_BOOL) && s7AddressAny.GetBitAddress() != 0 {
return nil, errors.New("A bit offset other than 0 is only supported for type BOOL")
}
-
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if s7AddressAny.GetTransportSize() == readWriteModel.TransportSize_WSTRING || s7AddressAny.GetTransportSize() == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
return NewTag(
s7AddressAny.GetArea(),
s7AddressAny.GetDbNumber(),
@@ -269,6 +300,7 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
s7AddressAny.GetBitAddress(),
s7AddressAny.GetNumberOfElements(),
s7AddressAny.GetTransportSize(),
+ stringEncoding,
), nil
} else if match := utils.GetSubgroupMatches(m.addressPattern, tagAddress); match != nil {
dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE])
@@ -313,8 +345,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
if (dataType != readWriteModel.TransportSize_BOOL) && bitOffset != 0 {
return nil, errors.New("A bit offset other than 0 is only supported for type BOOL")
}
-
- return NewTag(memoryArea, 0, byteOffset, bitOffset, numElements, dataType), nil
+ stringEncoding := match["stringEncoding"]
+ if stringEncoding == "" {
+ stringEncoding = "UTF-8"
+ if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR {
+ stringEncoding = "UTF-16"
+ }
+ }
+ return NewTag(memoryArea, 0, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil
}
return nil, errors.Errorf("Unable to parse %s", tagAddress)
}
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index cd33c379e7..85bef3fa25 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -231,7 +231,7 @@ func serializePlcValue(tag model.PlcTag, plcValue values.PlcValue) (readWriteMod
if s7StringTag, ok := tag.(*PlcStringTag); ok {
stringLength = s7StringTag.stringLength
}
- data, err := readWriteModel.DataItemSerialize(plcValue, s7Tag.GetDataType().DataProtocolId(), int32(stringLength))
+ data, err := readWriteModel.DataItemSerialize(plcValue, s7Tag.GetDataType().DataProtocolId(), int32(stringLength), s7Tag.GetStringEncoding())
if err != nil {
return nil, errors.Wrapf(err, "Error serializing tag item of type: '%v'", s7Tag.GetDataType())
}
diff --git a/plc4go/internal/simulated/Reader_test.go b/plc4go/internal/simulated/Reader_test.go
index 41e9bace88..59007c5389 100644
--- a/plc4go/internal/simulated/Reader_test.go
+++ b/plc4go/internal/simulated/Reader_test.go
@@ -145,7 +145,7 @@ func TestReader_Read(t *testing.T) {
},
args: args{
fields: map[string]model.PlcTag{
- "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
+ "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL, "UTF-8"),
},
fieldNames: []string{"test"},
},
diff --git a/plc4go/internal/simulated/Writer_test.go b/plc4go/internal/simulated/Writer_test.go
index 9f0b10e97b..64af673d4f 100644
--- a/plc4go/internal/simulated/Writer_test.go
+++ b/plc4go/internal/simulated/Writer_test.go
@@ -154,7 +154,7 @@ func TestWriter_Write(t *testing.T) {
},
args: args{
fields: map[string]model.PlcTag{
- "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
+ "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL, "UTF-8"),
},
values: map[string]values.PlcValue{
"test": values2.NewPlcBOOL(false),
diff --git a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
index 50923103b5..8a902da368 100644
--- a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
@@ -23,8 +23,8 @@ import (
"github.com/apache/plc4x/plc4go/protocols/abeth/readwrite/model"
"github.com/apache/plc4x/plc4go/spi/utils"
"github.com/pkg/errors"
- "strconv"
- "strings"
+ "strings"
+ "strconv"
)
// Code generated by code-generation. DO NOT EDIT.
diff --git a/plc4j/api/pom.xml b/plc4j/api/pom.xml
index f4efa24820..28dd1d940f 100644
--- a/plc4j/api/pom.xml
+++ b/plc4j/api/pom.xml
@@ -42,6 +42,9 @@
com.fasterxml.jackson.annotation;resolution:=optional,
*
</Import-Package>
+ <SPI-Consumer>
+ *
+ </SPI-Consumer>
</instructions>
</configuration>
</plugin>
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
index fc5a3c8274..e39c6a7f9b 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
@@ -71,16 +71,21 @@ public class DefaultPlcDriverManager implements PlcDriverManager, PlcConnectionM
* @throws PlcConnectionException an exception if the connection attempt failed.
*/
public PlcConnection getConnection(String url) throws PlcConnectionException {
- ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(this.classLoader);
PlcConnection connection;
- try {
+ if (this.classLoader == null) {
PlcDriver driver = getDriverForUrl(url);
connection = driver.getConnection(url);
- connection.connect();
- } finally {
- Thread.currentThread().setContextClassLoader(originalClassLoader);
+ } else {
+ final ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(classLoader);
+ try {
+ PlcDriver driver = getDriverForUrl(url);
+ connection = driver.getConnection(url);
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ }
}
+ connection.connect();
return connection;
}
@@ -93,19 +98,29 @@ public class DefaultPlcDriverManager implements PlcDriverManager, PlcConnectionM
* @throws PlcConnectionException an exception if the connection attempt failed.
*/
public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException {
- ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(this.classLoader);
PlcConnection connection;
- try {
+ if (this.classLoader == null) {
PlcDriver driver = getDriverForUrl(url);
- connection = driver.getConnection(url, authentication);
- connection.connect();
- } finally {
- Thread.currentThread().setContextClassLoader(originalClassLoader);
+ connection = driver.getConnection(url);
+ } else {
+ final ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(classLoader);
+ try {
+ PlcDriver driver = getDriverForUrl(url);
+ connection = driver.getConnection(url, authentication);
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ }
}
+ connection.connect();
return connection;
}
+ @Override
+ public PlcDriverManager getDriverManager() {
+ return this;
+ }
+
/**
* Returns the codes of all of the drivers which are currently registered at the PlcDriverManager
* @return Set of driver codes for all drivers registered
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java
index 98511ad75a..e8515ef5a5 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java
@@ -41,5 +41,6 @@ public interface PlcConnectionManager {
* @throws PlcConnectionException an exception if the connection attempt failed.
*/
PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException;
+ PlcDriverManager getDriverManager();
}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java
index 5cdbd794a6..a0cf8e959d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java
@@ -47,6 +47,15 @@ public interface PlcTag {
*/
String getAddressString();
+ /**
+ * Returns the number of elements, that this tag would be parsed from.
+ *
+ * @return the number of elements representing this Tag
+ */
+ default int getNumberOfElements(){
+ return 1;
+ }
+
/**
* Returns the "datatype" of the response one can expect from this tag.
* I.e. The mapping between this string and the PlcValue datatype is handled in the ValueHandler class.
@@ -63,6 +72,10 @@ public interface PlcTag {
return PlcValueType.NULL;
}
+ @JsonIgnore
+ default void setPlcValueType(PlcValueType plcValueType){
+ }
+
/**
* Returns the number of elements to expect of the response one can expect from this field.
*
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java
index 9ece366ea5..bacceba34b 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java
@@ -115,6 +115,7 @@ public class DirectAdsTag implements AdsTag {
return adsDataTypeName;
}
+ @Override
public int getNumberOfElements() {
return numberOfElements;
}
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java
index 3336e548d1..25991d8f0b 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java
@@ -44,7 +44,7 @@ public class SDODownloadConversation extends CANOpenConversationBase {
try {
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(value, type, null), ByteOrder.LITTLE_ENDIAN);
DataItem.staticSerialize(writeBuffer, value, type, null, ByteOrder.LITTLE_ENDIAN);
- data = writeBuffer.getData();
+ data = writeBuffer.getBytes();
} catch (SerializationException e) {
throw new PlcRuntimeException("Could not serialize data", e);
}
diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java
index 48f7cf4f0b..1728abe317 100644
--- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java
+++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java
@@ -57,6 +57,7 @@ public abstract class FirmataTag implements PlcTag {
return address;
}
+ @Override
public int getNumberOfElements() {
return quantity;
}
diff --git a/plc4j/drivers/knxnetip/pom.xml b/plc4j/drivers/knxnetip/pom.xml
index dda734fe8e..a45c69463d 100644
--- a/plc4j/drivers/knxnetip/pom.xml
+++ b/plc4j/drivers/knxnetip/pom.xml
@@ -161,7 +161,7 @@
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15on</artifactId>
+ <artifactId>bcprov-jdk18on</artifactId>
</dependency>
<dependency>
diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
index c3eaafba96..ba6688b099 100644
--- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
@@ -286,7 +286,7 @@ public class KnxNetIpProtocolLogic extends Plc4xProtocolBase<KnxNetIpMessage> im
try {
final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(KnxDatapoint.getLengthInBytes(value, groupAddress.getType()));
KnxDatapoint.staticSerialize(writeBuffer, value, groupAddress.getType());
- final byte[] serialized = writeBuffer.getData();
+ final byte[] serialized = writeBuffer.getBytes();
dataFirstByte = serialized[0];
data = new byte[serialized.length - 1];
System.arraycopy(serialized, 1, data, 0, serialized.length - 1);
diff --git a/plc4j/drivers/opcua/pom.xml b/plc4j/drivers/opcua/pom.xml
index 23ac7aa6cb..cb57d776c2 100644
--- a/plc4j/drivers/opcua/pom.xml
+++ b/plc4j/drivers/opcua/pom.xml
@@ -161,11 +161,11 @@
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcpkix-jdk15on</artifactId>
+ <artifactId>bcpkix-jdk18on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15on</artifactId>
+ <artifactId>bcprov-jdk18on</artifactId>
</dependency>
<dependency>
@@ -193,6 +193,16 @@
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>server-examples</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk15on</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcpkix-jdk15on</artifactId>
+ </exclusion>
+ </exclusions>
<scope>test</scope>
</dependency>
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java
index 197af70fe5..51b95b69a7 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java
@@ -28,6 +28,14 @@ public enum OpcuaNodeIdServices {
AccessLevelType((int) 15031L),
AccessRestrictionType((int) 95L),
AcknowledgeableConditionType((int) 2881L),
+ ActivateSessionRequest((int) 465L),
+ ActivateSessionRequest_Encoding_DefaultBinary((int) 467L),
+ ActivateSessionRequest_Encoding_DefaultJson((int) 15145L),
+ ActivateSessionRequest_Encoding_DefaultXml((int) 466L),
+ ActivateSessionResponse((int) 468L),
+ ActivateSessionResponse_Encoding_DefaultBinary((int) 470L),
+ ActivateSessionResponse_Encoding_DefaultJson((int) 15146L),
+ ActivateSessionResponse_Encoding_DefaultXml((int) 469L),
AdditionalParametersType((int) 16313L),
AdditionalParametersType_Encoding_DefaultBinary((int) 17537L),
AdditionalParametersType_Encoding_DefaultJson((int) 17547L),
@@ -36,16 +44,44 @@ public enum OpcuaNodeIdServices {
AddNodesItem_Encoding_DefaultBinary((int) 378L),
AddNodesItem_Encoding_DefaultJson((int) 15165L),
AddNodesItem_Encoding_DefaultXml((int) 377L),
+ AddNodesRequest((int) 486L),
+ AddNodesRequest_Encoding_DefaultBinary((int) 488L),
+ AddNodesRequest_Encoding_DefaultJson((int) 15167L),
+ AddNodesRequest_Encoding_DefaultXml((int) 487L),
+ AddNodesResponse((int) 489L),
+ AddNodesResponse_Encoding_DefaultBinary((int) 491L),
+ AddNodesResponse_Encoding_DefaultJson((int) 15168L),
+ AddNodesResponse_Encoding_DefaultXml((int) 490L),
+ AddNodesResult((int) 483L),
+ AddNodesResult_Encoding_DefaultBinary((int) 485L),
+ AddNodesResult_Encoding_DefaultJson((int) 15166L),
+ AddNodesResult_Encoding_DefaultXml((int) 484L),
AddReferencesItem((int) 379L),
AddReferencesItem_Encoding_DefaultBinary((int) 381L),
AddReferencesItem_Encoding_DefaultJson((int) 15169L),
AddReferencesItem_Encoding_DefaultXml((int) 380L),
+ AddReferencesRequest((int) 492L),
+ AddReferencesRequest_Encoding_DefaultBinary((int) 494L),
+ AddReferencesRequest_Encoding_DefaultJson((int) 15170L),
+ AddReferencesRequest_Encoding_DefaultXml((int) 493L),
+ AddReferencesResponse((int) 495L),
+ AddReferencesResponse_Encoding_DefaultBinary((int) 497L),
+ AddReferencesResponse_Encoding_DefaultJson((int) 15171L),
+ AddReferencesResponse_Encoding_DefaultXml((int) 496L),
AddressSpaceFileType((int) 11595L),
AggregateConfiguration((int) 948L),
AggregateConfiguration_Encoding_DefaultBinary((int) 950L),
AggregateConfiguration_Encoding_DefaultJson((int) 15304L),
AggregateConfiguration_Encoding_DefaultXml((int) 949L),
AggregateConfigurationType((int) 11187L),
+ AggregateFilter((int) 728L),
+ AggregateFilter_Encoding_DefaultBinary((int) 730L),
+ AggregateFilter_Encoding_DefaultJson((int) 15312L),
+ AggregateFilter_Encoding_DefaultXml((int) 729L),
+ AggregateFilterResult((int) 737L),
+ AggregateFilterResult_Encoding_DefaultBinary((int) 739L),
+ AggregateFilterResult_Encoding_DefaultJson((int) 15315L),
+ AggregateFilterResult_Encoding_DefaultXml((int) 738L),
AggregateFunction_AnnotationCount((int) 2351L),
AggregateFunction_Average((int) 2342L),
AggregateFunction_Count((int) 2352L),
@@ -216,6 +252,44 @@ public enum OpcuaNodeIdServices {
BrokerWriterGroupTransportDataType_Encoding_DefaultJson((int) 16524L),
BrokerWriterGroupTransportDataType_Encoding_DefaultXml((int) 16021L),
BrokerWriterGroupTransportType((int) 21136L),
+ BrowseDescription((int) 514L),
+ BrowseDescription_Encoding_DefaultBinary((int) 516L),
+ BrowseDescription_Encoding_DefaultJson((int) 15180L),
+ BrowseDescription_Encoding_DefaultXml((int) 515L),
+ BrowseDirection((int) 510L),
+ BrowseNextRequest((int) 531L),
+ BrowseNextRequest_Encoding_DefaultBinary((int) 533L),
+ BrowseNextRequest_Encoding_DefaultJson((int) 15186L),
+ BrowseNextRequest_Encoding_DefaultXml((int) 532L),
+ BrowseNextResponse((int) 534L),
+ BrowseNextResponse_Encoding_DefaultBinary((int) 536L),
+ BrowseNextResponse_Encoding_DefaultJson((int) 15187L),
+ BrowseNextResponse_Encoding_DefaultXml((int) 535L),
+ BrowsePath((int) 543L),
+ BrowsePath_Encoding_DefaultBinary((int) 545L),
+ BrowsePath_Encoding_DefaultJson((int) 15190L),
+ BrowsePath_Encoding_DefaultXml((int) 544L),
+ BrowsePathResult((int) 549L),
+ BrowsePathResult_Encoding_DefaultBinary((int) 551L),
+ BrowsePathResult_Encoding_DefaultJson((int) 15192L),
+ BrowsePathResult_Encoding_DefaultXml((int) 550L),
+ BrowsePathTarget((int) 546L),
+ BrowsePathTarget_Encoding_DefaultBinary((int) 548L),
+ BrowsePathTarget_Encoding_DefaultJson((int) 15191L),
+ BrowsePathTarget_Encoding_DefaultXml((int) 547L),
+ BrowseRequest((int) 525L),
+ BrowseRequest_Encoding_DefaultBinary((int) 527L),
+ BrowseRequest_Encoding_DefaultJson((int) 15184L),
+ BrowseRequest_Encoding_DefaultXml((int) 526L),
+ BrowseResponse((int) 528L),
+ BrowseResponse_Encoding_DefaultBinary((int) 530L),
+ BrowseResponse_Encoding_DefaultJson((int) 15185L),
+ BrowseResponse_Encoding_DefaultXml((int) 529L),
+ BrowseResult((int) 522L),
+ BrowseResult_Encoding_DefaultBinary((int) 524L),
+ BrowseResult_Encoding_DefaultJson((int) 15183L),
+ BrowseResult_Encoding_DefaultXml((int) 523L),
+ BrowseResultMask((int) 517L),
BuildInfo((int) 338L),
BuildInfo_Encoding_DefaultBinary((int) 340L),
BuildInfo_Encoding_DefaultJson((int) 15361L),
@@ -223,6 +297,30 @@ public enum OpcuaNodeIdServices {
BuildInfoType((int) 3051L),
Byte((int) 3L),
ByteString((int) 15L),
+ CallMethodRequest((int) 704L),
+ CallMethodRequest_Encoding_DefaultBinary((int) 706L),
+ CallMethodRequest_Encoding_DefaultJson((int) 15289L),
+ CallMethodRequest_Encoding_DefaultXml((int) 705L),
+ CallMethodResult((int) 707L),
+ CallMethodResult_Encoding_DefaultBinary((int) 709L),
+ CallMethodResult_Encoding_DefaultJson((int) 15290L),
+ CallMethodResult_Encoding_DefaultXml((int) 708L),
+ CallRequest((int) 710L),
+ CallRequest_Encoding_DefaultBinary((int) 712L),
+ CallRequest_Encoding_DefaultJson((int) 15291L),
+ CallRequest_Encoding_DefaultXml((int) 711L),
+ CallResponse((int) 713L),
+ CallResponse_Encoding_DefaultBinary((int) 715L),
+ CallResponse_Encoding_DefaultJson((int) 15292L),
+ CallResponse_Encoding_DefaultXml((int) 714L),
+ CancelRequest((int) 477L),
+ CancelRequest_Encoding_DefaultBinary((int) 479L),
+ CancelRequest_Encoding_DefaultJson((int) 15149L),
+ CancelRequest_Encoding_DefaultXml((int) 478L),
+ CancelResponse((int) 480L),
+ CancelResponse_Encoding_DefaultBinary((int) 482L),
+ CancelResponse_Encoding_DefaultJson((int) 15150L),
+ CancelResponse_Encoding_DefaultXml((int) 481L),
CartesianCoordinates((int) 18809L),
CartesianCoordinates_Encoding_DefaultBinary((int) 18818L),
CartesianCoordinates_Encoding_DefaultJson((int) 19067L),
@@ -233,7 +331,27 @@ public enum OpcuaNodeIdServices {
CertificateGroupType((int) 12555L),
CertificateType((int) 12556L),
CertificateUpdatedAuditEventType((int) 12620L),
+ ChannelSecurityToken((int) 441L),
+ ChannelSecurityToken_Encoding_DefaultBinary((int) 443L),
+ ChannelSecurityToken_Encoding_DefaultJson((int) 15131L),
+ ChannelSecurityToken_Encoding_DefaultXml((int) 442L),
ChoiceStateType((int) 15109L),
+ CloseSecureChannelRequest((int) 450L),
+ CloseSecureChannelRequest_Encoding_DefaultBinary((int) 452L),
+ CloseSecureChannelRequest_Encoding_DefaultJson((int) 15134L),
+ CloseSecureChannelRequest_Encoding_DefaultXml((int) 451L),
+ CloseSecureChannelResponse((int) 453L),
+ CloseSecureChannelResponse_Encoding_DefaultBinary((int) 455L),
+ CloseSecureChannelResponse_Encoding_DefaultJson((int) 15135L),
+ CloseSecureChannelResponse_Encoding_DefaultXml((int) 454L),
+ CloseSessionRequest((int) 471L),
+ CloseSessionRequest_Encoding_DefaultBinary((int) 473L),
+ CloseSessionRequest_Encoding_DefaultJson((int) 15147L),
+ CloseSessionRequest_Encoding_DefaultXml((int) 472L),
+ CloseSessionResponse((int) 474L),
+ CloseSessionResponse_Encoding_DefaultBinary((int) 476L),
+ CloseSessionResponse_Encoding_DefaultJson((int) 15148L),
+ CloseSessionResponse_Encoding_DefaultXml((int) 475L),
Communication((int) 24227L),
ComplexNumberType((int) 12171L),
ComplexNumberType_Encoding_DefaultBinary((int) 12181L),
@@ -258,14 +376,55 @@ public enum OpcuaNodeIdServices {
ContentFilterElement_Encoding_DefaultBinary((int) 585L),
ContentFilterElement_Encoding_DefaultJson((int) 15204L),
ContentFilterElement_Encoding_DefaultXml((int) 584L),
+ ContentFilterElementResult((int) 604L),
+ ContentFilterElementResult_Encoding_DefaultBinary((int) 606L),
+ ContentFilterElementResult_Encoding_DefaultJson((int) 15211L),
+ ContentFilterElementResult_Encoding_DefaultXml((int) 605L),
+ ContentFilterResult((int) 607L),
+ ContentFilterResult_Encoding_DefaultBinary((int) 609L),
+ ContentFilterResult_Encoding_DefaultJson((int) 15228L),
+ ContentFilterResult_Encoding_DefaultXml((int) 608L),
ContinuationPoint((int) 521L),
Counter((int) 289L),
+ CreateMonitoredItemsRequest((int) 749L),
+ CreateMonitoredItemsRequest_Encoding_DefaultBinary((int) 751L),
+ CreateMonitoredItemsRequest_Encoding_DefaultJson((int) 15323L),
+ CreateMonitoredItemsRequest_Encoding_DefaultXml((int) 750L),
+ CreateMonitoredItemsResponse((int) 752L),
+ CreateMonitoredItemsResponse_Encoding_DefaultBinary((int) 754L),
+ CreateMonitoredItemsResponse_Encoding_DefaultJson((int) 15324L),
+ CreateMonitoredItemsResponse_Encoding_DefaultXml((int) 753L),
+ CreateSessionRequest((int) 459L),
+ CreateSessionRequest_Encoding_DefaultBinary((int) 461L),
+ CreateSessionRequest_Encoding_DefaultJson((int) 15138L),
+ CreateSessionRequest_Encoding_DefaultXml((int) 460L),
+ CreateSessionResponse((int) 462L),
+ CreateSessionResponse_Encoding_DefaultBinary((int) 464L),
+ CreateSessionResponse_Encoding_DefaultJson((int) 15139L),
+ CreateSessionResponse_Encoding_DefaultXml((int) 463L),
+ CreateSubscriptionRequest((int) 785L),
+ CreateSubscriptionRequest_Encoding_DefaultBinary((int) 787L),
+ CreateSubscriptionRequest_Encoding_DefaultJson((int) 15337L),
+ CreateSubscriptionRequest_Encoding_DefaultXml((int) 786L),
+ CreateSubscriptionResponse((int) 788L),
+ CreateSubscriptionResponse_Encoding_DefaultBinary((int) 790L),
+ CreateSubscriptionResponse_Encoding_DefaultJson((int) 15338L),
+ CreateSubscriptionResponse_Encoding_DefaultXml((int) 789L),
CubeItemType((int) 12057L),
CurrencyUnit((int) 23501L),
CurrencyUnitType((int) 23498L),
CurrencyUnitType_Encoding_DefaultBinary((int) 23507L),
CurrencyUnitType_Encoding_DefaultJson((int) 23528L),
CurrencyUnitType_Encoding_DefaultXml((int) 23520L),
+ DataChangeFilter((int) 722L),
+ DataChangeFilter_Encoding_DefaultBinary((int) 724L),
+ DataChangeFilter_Encoding_DefaultJson((int) 15294L),
+ DataChangeFilter_Encoding_DefaultXml((int) 723L),
+ DataChangeNotification((int) 809L),
+ DataChangeNotification_Encoding_DefaultBinary((int) 811L),
+ DataChangeNotification_Encoding_DefaultJson((int) 15345L),
+ DataChangeNotification_Encoding_DefaultXml((int) 810L),
+ DataChangeTrigger((int) 717L),
DatagramConnectionTransportDataType((int) 17467L),
DatagramConnectionTransportDataType_Encoding_DefaultBinary((int) 17468L),
DatagramConnectionTransportDataType_Encoding_DefaultJson((int) 17476L),
@@ -316,6 +475,10 @@ public enum OpcuaNodeIdServices {
DataSetWriterTransportDataType_Encoding_DefaultXml((int) 15956L),
DataSetWriterTransportType((int) 15305L),
DataSetWriterType((int) 15298L),
+ DataTypeAttributes((int) 370L),
+ DataTypeAttributes_Encoding_DefaultBinary((int) 372L),
+ DataTypeAttributes_Encoding_DefaultJson((int) 15161L),
+ DataTypeAttributes_Encoding_DefaultXml((int) 371L),
DataTypeDefinition((int) 97L),
DataTypeDefinition_Encoding_DefaultBinary((int) 121L),
DataTypeDefinition_Encoding_DefaultJson((int) 15063L),
@@ -327,6 +490,10 @@ public enum OpcuaNodeIdServices {
DataTypeDescriptionType((int) 69L),
DataTypeDictionaryType((int) 72L),
DataTypeEncodingType((int) 76L),
+ DataTypeNode((int) 282L),
+ DataTypeNode_Encoding_DefaultBinary((int) 284L),
+ DataTypeNode_Encoding_DefaultJson((int) 15079L),
+ DataTypeNode_Encoding_DefaultXml((int) 283L),
DataTypeSchemaHeader((int) 15534L),
DataTypeSchemaHeader_Encoding_DefaultBinary((int) 15676L),
DataTypeSchemaHeader_Encoding_DefaultJson((int) 16151L),
@@ -337,19 +504,68 @@ public enum OpcuaNodeIdServices {
Date((int) 293L),
DateString((int) 12881L),
DateTime((int) 13L),
+ DeadbandType((int) 718L),
Decimal((int) 50L),
+ DecimalDataType((int) 17861L),
+ DecimalDataType_Encoding_DefaultBinary((int) 17863L),
+ DecimalDataType_Encoding_DefaultJson((int) 15045L),
+ DecimalDataType_Encoding_DefaultXml((int) 17862L),
DecimalString((int) 12878L),
DefaultBinary((int) 3062L),
DefaultInstanceBrowseName((int) 17605L),
DefaultXml((int) 3063L),
+ DeleteAtTimeDetails((int) 689L),
+ DeleteAtTimeDetails_Encoding_DefaultBinary((int) 691L),
+ DeleteAtTimeDetails_Encoding_DefaultJson((int) 15284L),
+ DeleteAtTimeDetails_Encoding_DefaultXml((int) 690L),
+ DeleteEventDetails((int) 692L),
+ DeleteEventDetails_Encoding_DefaultBinary((int) 694L),
+ DeleteEventDetails_Encoding_DefaultJson((int) 15285L),
+ DeleteEventDetails_Encoding_DefaultXml((int) 693L),
+ DeleteMonitoredItemsRequest((int) 779L),
+ DeleteMonitoredItemsRequest_Encoding_DefaultBinary((int) 781L),
+ DeleteMonitoredItemsRequest_Encoding_DefaultJson((int) 15335L),
+ DeleteMonitoredItemsRequest_Encoding_DefaultXml((int) 780L),
+ DeleteMonitoredItemsResponse((int) 782L),
+ DeleteMonitoredItemsResponse_Encoding_DefaultBinary((int) 784L),
+ DeleteMonitoredItemsResponse_Encoding_DefaultJson((int) 15336L),
+ DeleteMonitoredItemsResponse_Encoding_DefaultXml((int) 783L),
DeleteNodesItem((int) 382L),
DeleteNodesItem_Encoding_DefaultBinary((int) 384L),
DeleteNodesItem_Encoding_DefaultJson((int) 15172L),
DeleteNodesItem_Encoding_DefaultXml((int) 383L),
+ DeleteNodesRequest((int) 498L),
+ DeleteNodesRequest_Encoding_DefaultBinary((int) 500L),
+ DeleteNodesRequest_Encoding_DefaultJson((int) 15173L),
+ DeleteNodesRequest_Encoding_DefaultXml((int) 499L),
+ DeleteNodesResponse((int) 501L),
+ DeleteNodesResponse_Encoding_DefaultBinary((int) 503L),
+ DeleteNodesResponse_Encoding_DefaultJson((int) 15174L),
+ DeleteNodesResponse_Encoding_DefaultXml((int) 502L),
+ DeleteRawModifiedDetails((int) 686L),
+ DeleteRawModifiedDetails_Encoding_DefaultBinary((int) 688L),
+ DeleteRawModifiedDetails_Encoding_DefaultJson((int) 15283L),
+ DeleteRawModifiedDetails_Encoding_DefaultXml((int) 687L),
DeleteReferencesItem((int) 385L),
DeleteReferencesItem_Encoding_DefaultBinary((int) 387L),
DeleteReferencesItem_Encoding_DefaultJson((int) 15175L),
DeleteReferencesItem_Encoding_DefaultXml((int) 386L),
+ DeleteReferencesRequest((int) 504L),
+ DeleteReferencesRequest_Encoding_DefaultBinary((int) 506L),
+ DeleteReferencesRequest_Encoding_DefaultJson((int) 15176L),
+ DeleteReferencesRequest_Encoding_DefaultXml((int) 505L),
+ DeleteReferencesResponse((int) 507L),
+ DeleteReferencesResponse_Encoding_DefaultBinary((int) 509L),
+ DeleteReferencesResponse_Encoding_DefaultJson((int) 15177L),
+ DeleteReferencesResponse_Encoding_DefaultXml((int) 508L),
+ DeleteSubscriptionsRequest((int) 845L),
+ DeleteSubscriptionsRequest_Encoding_DefaultBinary((int) 847L),
+ DeleteSubscriptionsRequest_Encoding_DefaultJson((int) 15359L),
+ DeleteSubscriptionsRequest_Encoding_DefaultXml((int) 846L),
+ DeleteSubscriptionsResponse((int) 848L),
+ DeleteSubscriptionsResponse_Encoding_DefaultBinary((int) 850L),
+ DeleteSubscriptionsResponse_Encoding_DefaultJson((int) 15360L),
+ DeleteSubscriptionsResponse_Encoding_DefaultXml((int) 849L),
DeviceFailureEventType((int) 2131L),
DiagnosticInfo((int) 25L),
DiagnosticsLevel((int) 19723L),
@@ -377,6 +593,7 @@ public enum OpcuaNodeIdServices {
EccBrainpoolP384r1ApplicationCertificateType((int) 23541L),
EccCurve25519ApplicationCertificateType((int) 23542L),
EccCurve448ApplicationCertificateType((int) 23543L),
+ EccEncryptedSecret((int) 17546L),
EccNistP256ApplicationCertificateType((int) 23538L),
EccNistP384ApplicationCertificateType((int) 23539L),
ElementOperand((int) 592L),
@@ -428,10 +645,22 @@ public enum OpcuaNodeIdServices {
EUInformation_Encoding_DefaultBinary((int) 889L),
EUInformation_Encoding_DefaultJson((int) 15376L),
EUInformation_Encoding_DefaultXml((int) 888L),
+ EventFieldList((int) 917L),
+ EventFieldList_Encoding_DefaultBinary((int) 919L),
+ EventFieldList_Encoding_DefaultJson((int) 15348L),
+ EventFieldList_Encoding_DefaultXml((int) 918L),
EventFilter((int) 725L),
EventFilter_Encoding_DefaultBinary((int) 727L),
EventFilter_Encoding_DefaultJson((int) 15295L),
EventFilter_Encoding_DefaultXml((int) 726L),
+ EventFilterResult((int) 734L),
+ EventFilterResult_Encoding_DefaultBinary((int) 736L),
+ EventFilterResult_Encoding_DefaultJson((int) 15314L),
+ EventFilterResult_Encoding_DefaultXml((int) 735L),
+ EventNotificationList((int) 914L),
+ EventNotificationList_Encoding_DefaultBinary((int) 916L),
+ EventNotificationList_Encoding_DefaultJson((int) 15347L),
+ EventNotificationList_Encoding_DefaultXml((int) 915L),
EventNotifierType((int) 15033L),
EventQueueOverflowEventType((int) 3035L),
EventTypesFolder((int) 3048L),
@@ -461,6 +690,22 @@ public enum OpcuaNodeIdServices {
FilterOperand_Encoding_DefaultJson((int) 15206L),
FilterOperand_Encoding_DefaultXml((int) 590L),
FilterOperator((int) 576L),
+ FindServersOnNetworkRequest((int) 12190L),
+ FindServersOnNetworkRequest_Encoding_DefaultBinary((int) 12208L),
+ FindServersOnNetworkRequest_Encoding_DefaultJson((int) 15096L),
+ FindServersOnNetworkRequest_Encoding_DefaultXml((int) 12196L),
+ FindServersOnNetworkResponse((int) 12191L),
+ FindServersOnNetworkResponse_Encoding_DefaultBinary((int) 12209L),
+ FindServersOnNetworkResponse_Encoding_DefaultJson((int) 15097L),
+ FindServersOnNetworkResponse_Encoding_DefaultXml((int) 12197L),
+ FindServersRequest((int) 420L),
+ FindServersRequest_Encoding_DefaultBinary((int) 422L),
+ FindServersRequest_Encoding_DefaultJson((int) 15093L),
+ FindServersRequest_Encoding_DefaultXml((int) 421L),
+ FindServersResponse((int) 423L),
+ FindServersResponse_Encoding_DefaultBinary((int) 425L),
+ FindServersResponse_Encoding_DefaultJson((int) 15094L),
+ FindServersResponse_Encoding_DefaultXml((int) 424L),
FiniteStateMachineType((int) 2771L),
FiniteStateVariableType((int) 2760L),
FiniteTransitionVariableType((int) 2767L),
@@ -474,6 +719,22 @@ public enum OpcuaNodeIdServices {
FromState((int) 51L),
GeneralModelChangeEventType((int) 2133L),
GeneratesEvent((int) 41L),
+ GenericAttributes((int) 17607L),
+ GenericAttributes_Encoding_DefaultBinary((int) 17611L),
+ GenericAttributes_Encoding_DefaultJson((int) 15164L),
+ GenericAttributes_Encoding_DefaultXml((int) 17609L),
+ GenericAttributeValue((int) 17606L),
+ GenericAttributeValue_Encoding_DefaultBinary((int) 17610L),
+ GenericAttributeValue_Encoding_DefaultJson((int) 15163L),
+ GenericAttributeValue_Encoding_DefaultXml((int) 17608L),
+ GetEndpointsRequest((int) 426L),
+ GetEndpointsRequest_Encoding_DefaultBinary((int) 428L),
+ GetEndpointsRequest_Encoding_DefaultJson((int) 15100L),
+ GetEndpointsRequest_Encoding_DefaultXml((int) 427L),
+ GetEndpointsResponse((int) 429L),
+ GetEndpointsResponse_Encoding_DefaultBinary((int) 431L),
+ GetEndpointsResponse_Encoding_DefaultJson((int) 15101L),
+ GetEndpointsResponse_Encoding_DefaultXml((int) 430L),
GuardVariableType((int) 15113L),
Guid((int) 14L),
HAConfiguration((int) 11202L),
@@ -515,6 +776,10 @@ public enum OpcuaNodeIdServices {
HighlyManagedAlarmConditionClassType((int) 17219L),
HistoricalDataConfigurationType((int) 2318L),
HistoricalEventFilter((int) 11215L),
+ HistoryData((int) 656L),
+ HistoryData_Encoding_DefaultBinary((int) 658L),
+ HistoryData_Encoding_DefaultJson((int) 15270L),
+ HistoryData_Encoding_DefaultXml((int) 657L),
HistoryEvent((int) 659L),
HistoryEvent_Encoding_DefaultBinary((int) 661L),
HistoryEvent_Encoding_DefaultJson((int) 15273L),
@@ -523,8 +788,48 @@ public enum OpcuaNodeIdServices {
HistoryEventFieldList_Encoding_DefaultBinary((int) 922L),
HistoryEventFieldList_Encoding_DefaultJson((int) 15349L),
HistoryEventFieldList_Encoding_DefaultXml((int) 921L),
+ HistoryModifiedData((int) 11217L),
+ HistoryModifiedData_Encoding_DefaultBinary((int) 11227L),
+ HistoryModifiedData_Encoding_DefaultJson((int) 15272L),
+ HistoryModifiedData_Encoding_DefaultXml((int) 11219L),
+ HistoryReadDetails((int) 641L),
+ HistoryReadDetails_Encoding_DefaultBinary((int) 643L),
+ HistoryReadDetails_Encoding_DefaultJson((int) 15261L),
+ HistoryReadDetails_Encoding_DefaultXml((int) 642L),
+ HistoryReadRequest((int) 662L),
+ HistoryReadRequest_Encoding_DefaultBinary((int) 664L),
+ HistoryReadRequest_Encoding_DefaultJson((int) 15274L),
+ HistoryReadRequest_Encoding_DefaultXml((int) 663L),
+ HistoryReadResponse((int) 665L),
+ HistoryReadResponse_Encoding_DefaultBinary((int) 667L),
+ HistoryReadResponse_Encoding_DefaultJson((int) 15275L),
+ HistoryReadResponse_Encoding_DefaultXml((int) 666L),
+ HistoryReadResult((int) 638L),
+ HistoryReadResult_Encoding_DefaultBinary((int) 640L),
+ HistoryReadResult_Encoding_DefaultJson((int) 15260L),
+ HistoryReadResult_Encoding_DefaultXml((int) 639L),
+ HistoryReadValueId((int) 635L),
+ HistoryReadValueId_Encoding_DefaultBinary((int) 637L),
+ HistoryReadValueId_Encoding_DefaultJson((int) 15259L),
+ HistoryReadValueId_Encoding_DefaultXml((int) 636L),
HistoryServerCapabilities((int) 11192L),
HistoryServerCapabilitiesType((int) 2330L),
+ HistoryUpdateDetails((int) 677L),
+ HistoryUpdateDetails_Encoding_DefaultBinary((int) 679L),
+ HistoryUpdateDetails_Encoding_DefaultJson((int) 15279L),
+ HistoryUpdateDetails_Encoding_DefaultXml((int) 678L),
+ HistoryUpdateRequest((int) 698L),
+ HistoryUpdateRequest_Encoding_DefaultBinary((int) 700L),
+ HistoryUpdateRequest_Encoding_DefaultJson((int) 15287L),
+ HistoryUpdateRequest_Encoding_DefaultXml((int) 699L),
+ HistoryUpdateResponse((int) 701L),
+ HistoryUpdateResponse_Encoding_DefaultBinary((int) 703L),
+ HistoryUpdateResponse_Encoding_DefaultJson((int) 15288L),
+ HistoryUpdateResponse_Encoding_DefaultXml((int) 702L),
+ HistoryUpdateResult((int) 695L),
+ HistoryUpdateResult_Encoding_DefaultBinary((int) 697L),
+ HistoryUpdateResult_Encoding_DefaultJson((int) 15286L),
+ HistoryUpdateResult_Encoding_DefaultXml((int) 696L),
HistoryUpdateType((int) 11234L),
HttpsCertificateType((int) 12558L),
IBaseEthernetCapabilitiesType((int) 24167L),
@@ -555,6 +860,10 @@ public enum OpcuaNodeIdServices {
Index((int) 17588L),
InitialStateType((int) 2309L),
InputArguments((int) 3072L),
+ InstanceNode((int) 11879L),
+ InstanceNode_Encoding_DefaultBinary((int) 11889L),
+ InstanceNode_Encoding_DefaultJson((int) 15069L),
+ InstanceNode_Encoding_DefaultXml((int) 11887L),
InstrumentDiagnosticAlarmType((int) 18347L),
Int16((int) 4L),
Int32((int) 6L),
@@ -619,20 +928,78 @@ public enum OpcuaNodeIdServices {
MdnsDiscoveryConfiguration_Encoding_DefaultJson((int) 15106L),
MdnsDiscoveryConfiguration_Encoding_DefaultXml((int) 12893L),
MessageSecurityMode((int) 302L),
+ MethodAttributes((int) 358L),
+ MethodAttributes_Encoding_DefaultBinary((int) 360L),
+ MethodAttributes_Encoding_DefaultJson((int) 15157L),
+ MethodAttributes_Encoding_DefaultXml((int) 359L),
+ MethodNode((int) 276L),
+ MethodNode_Encoding_DefaultBinary((int) 278L),
+ MethodNode_Encoding_DefaultJson((int) 15077L),
+ MethodNode_Encoding_DefaultXml((int) 277L),
ModelChangeStructureDataType((int) 877L),
ModelChangeStructureDataType_Encoding_DefaultBinary((int) 879L),
ModelChangeStructureDataType_Encoding_DefaultJson((int) 15373L),
ModelChangeStructureDataType_Encoding_DefaultXml((int) 878L),
+ ModelChangeStructureVerbMask((int) 11941L),
ModellingRule_ExposesItsArray((int) 83L),
ModellingRule_Mandatory((int) 78L),
ModellingRule_MandatoryPlaceholder((int) 11510L),
ModellingRule_Optional((int) 80L),
ModellingRule_OptionalPlaceholder((int) 11508L),
ModellingRuleType((int) 77L),
+ ModificationInfo((int) 11216L),
+ ModificationInfo_Encoding_DefaultBinary((int) 11226L),
+ ModificationInfo_Encoding_DefaultJson((int) 15271L),
+ ModificationInfo_Encoding_DefaultXml((int) 11218L),
+ ModifyMonitoredItemsRequest((int) 761L),
+ ModifyMonitoredItemsRequest_Encoding_DefaultBinary((int) 763L),
+ ModifyMonitoredItemsRequest_Encoding_DefaultJson((int) 15327L),
+ ModifyMonitoredItemsRequest_Encoding_DefaultXml((int) 762L),
+ ModifyMonitoredItemsResponse((int) 764L),
+ ModifyMonitoredItemsResponse_Encoding_DefaultBinary((int) 766L),
+ ModifyMonitoredItemsResponse_Encoding_DefaultJson((int) 15328L),
+ ModifyMonitoredItemsResponse_Encoding_DefaultXml((int) 765L),
+ ModifySubscriptionRequest((int) 791L),
+ ModifySubscriptionRequest_Encoding_DefaultBinary((int) 793L),
+ ModifySubscriptionRequest_Encoding_DefaultJson((int) 15339L),
+ ModifySubscriptionRequest_Encoding_DefaultXml((int) 792L),
+ ModifySubscriptionResponse((int) 794L),
+ ModifySubscriptionResponse_Encoding_DefaultBinary((int) 796L),
+ ModifySubscriptionResponse_Encoding_DefaultJson((int) 15340L),
+ ModifySubscriptionResponse_Encoding_DefaultXml((int) 795L),
+ MonitoredItemCreateRequest((int) 743L),
+ MonitoredItemCreateRequest_Encoding_DefaultBinary((int) 745L),
+ MonitoredItemCreateRequest_Encoding_DefaultJson((int) 15321L),
+ MonitoredItemCreateRequest_Encoding_DefaultXml((int) 744L),
+ MonitoredItemCreateResult((int) 746L),
+ MonitoredItemCreateResult_Encoding_DefaultBinary((int) 748L),
+ MonitoredItemCreateResult_Encoding_DefaultJson((int) 15322L),
+ MonitoredItemCreateResult_Encoding_DefaultXml((int) 747L),
+ MonitoredItemModifyRequest((int) 755L),
+ MonitoredItemModifyRequest_Encoding_DefaultBinary((int) 757L),
+ MonitoredItemModifyRequest_Encoding_DefaultJson((int) 15325L),
+ MonitoredItemModifyRequest_Encoding_DefaultXml((int) 756L),
+ MonitoredItemModifyResult((int) 758L),
+ MonitoredItemModifyResult_Encoding_DefaultBinary((int) 760L),
+ MonitoredItemModifyResult_Encoding_DefaultJson((int) 15326L),
+ MonitoredItemModifyResult_Encoding_DefaultXml((int) 759L),
+ MonitoredItemNotification((int) 806L),
+ MonitoredItemNotification_Encoding_DefaultBinary((int) 808L),
+ MonitoredItemNotification_Encoding_DefaultJson((int) 15346L),
+ MonitoredItemNotification_Encoding_DefaultXml((int) 807L),
MonitoringFilter((int) 719L),
MonitoringFilter_Encoding_DefaultBinary((int) 721L),
MonitoringFilter_Encoding_DefaultJson((int) 15293L),
MonitoringFilter_Encoding_DefaultXml((int) 720L),
+ MonitoringFilterResult((int) 731L),
+ MonitoringFilterResult_Encoding_DefaultBinary((int) 733L),
+ MonitoringFilterResult_Encoding_DefaultJson((int) 15313L),
+ MonitoringFilterResult_Encoding_DefaultXml((int) 732L),
+ MonitoringMode((int) 716L),
+ MonitoringParameters((int) 740L),
+ MonitoringParameters_Encoding_DefaultBinary((int) 742L),
+ MonitoringParameters_Encoding_DefaultJson((int) 15320L),
+ MonitoringParameters_Encoding_DefaultXml((int) 741L),
MultiStateDictionaryEntryDiscreteBaseType((int) 19077L),
MultiStateDictionaryEntryDiscreteType((int) 19084L),
MultiStateDiscreteType((int) 2376L),
@@ -657,9 +1024,25 @@ public enum OpcuaNodeIdServices {
NetworkGroupDataType_Encoding_DefaultJson((int) 15364L),
NetworkGroupDataType_Encoding_DefaultXml((int) 11950L),
NetworkInterfaces((int) 24229L),
+ Node((int) 258L),
+ Node_Encoding_DefaultBinary((int) 260L),
+ Node_Encoding_DefaultJson((int) 15068L),
+ Node_Encoding_DefaultXml((int) 259L),
+ NodeAttributes((int) 349L),
+ NodeAttributes_Encoding_DefaultBinary((int) 351L),
+ NodeAttributes_Encoding_DefaultJson((int) 15151L),
+ NodeAttributes_Encoding_DefaultXml((int) 350L),
NodeAttributesMask((int) 348L),
NodeClass((int) 257L),
NodeId((int) 17L),
+ NodeReference((int) 580L),
+ NodeReference_Encoding_DefaultBinary((int) 582L),
+ NodeReference_Encoding_DefaultJson((int) 15203L),
+ NodeReference_Encoding_DefaultXml((int) 581L),
+ NodeTypeDescription((int) 573L),
+ NodeTypeDescription_Encoding_DefaultBinary((int) 575L),
+ NodeTypeDescription_Encoding_DefaultJson((int) 15201L),
+ NodeTypeDescription_Encoding_DefaultXml((int) 574L),
NodeVersion((int) 3068L),
NonExclusiveDeviationAlarmType((int) 10368L),
NonExclusiveLevelAlarmType((int) 10060L),
@@ -669,9 +1052,33 @@ public enum OpcuaNodeIdServices {
NonTransparentNetworkRedundancyType((int) 11945L),
NonTransparentRedundancyType((int) 2039L),
NormalizedString((int) 12877L),
+ NotificationData((int) 945L),
+ NotificationData_Encoding_DefaultBinary((int) 947L),
+ NotificationData_Encoding_DefaultJson((int) 15344L),
+ NotificationData_Encoding_DefaultXml((int) 946L),
+ NotificationMessage((int) 803L),
+ NotificationMessage_Encoding_DefaultBinary((int) 805L),
+ NotificationMessage_Encoding_DefaultJson((int) 15343L),
+ NotificationMessage_Encoding_DefaultXml((int) 804L),
Number((int) 26L),
NumericRange((int) 291L),
+ ObjectAttributes((int) 352L),
+ ObjectAttributes_Encoding_DefaultBinary((int) 354L),
+ ObjectAttributes_Encoding_DefaultJson((int) 15152L),
+ ObjectAttributes_Encoding_DefaultXml((int) 353L),
+ ObjectNode((int) 261L),
+ ObjectNode_Encoding_DefaultBinary((int) 263L),
+ ObjectNode_Encoding_DefaultJson((int) 15071L),
+ ObjectNode_Encoding_DefaultXml((int) 262L),
ObjectsFolder((int) 85L),
+ ObjectTypeAttributes((int) 361L),
+ ObjectTypeAttributes_Encoding_DefaultBinary((int) 363L),
+ ObjectTypeAttributes_Encoding_DefaultJson((int) 15158L),
+ ObjectTypeAttributes_Encoding_DefaultXml((int) 362L),
+ ObjectTypeNode((int) 264L),
+ ObjectTypeNode_Encoding_DefaultBinary((int) 266L),
+ ObjectTypeNode_Encoding_DefaultJson((int) 15073L),
+ ObjectTypeNode_Encoding_DefaultXml((int) 265L),
ObjectTypesFolder((int) 88L),
OffNormalAlarmType((int) 10637L),
OPCBinarySchema_TypeSystem((int) 93L),
@@ -679,6 +1086,14 @@ public enum OpcuaNodeIdServices {
OpcUa_XmlSchema((int) 8252L),
OPCUANamespaceMetadata((int) 15957L),
OpenFileMode((int) 11939L),
+ OpenSecureChannelRequest((int) 444L),
+ OpenSecureChannelRequest_Encoding_DefaultBinary((int) 446L),
+ OpenSecureChannelRequest_Encoding_DefaultJson((int) 15132L),
+ OpenSecureChannelRequest_Encoding_DefaultXml((int) 445L),
+ OpenSecureChannelResponse((int) 447L),
+ OpenSecureChannelResponse_Encoding_DefaultBinary((int) 449L),
+ OpenSecureChannelResponse_Encoding_DefaultJson((int) 15133L),
+ OpenSecureChannelResponse_Encoding_DefaultXml((int) 448L),
OperationLimitsType((int) 11564L),
OptionSet((int) 12755L),
OptionSet_Encoding_DefaultBinary((int) 12765L),
@@ -695,6 +1110,10 @@ public enum OpcuaNodeIdServices {
OrientationType((int) 18779L),
OutputArguments((int) 3073L),
OverrideValueHandling((int) 15874L),
+ ParsingResult((int) 610L),
+ ParsingResult_Encoding_DefaultBinary((int) 612L),
+ ParsingResult_Encoding_DefaultJson((int) 15236L),
+ ParsingResult_Encoding_DefaultXml((int) 611L),
PerformUpdateType((int) 11293L),
PermissionType((int) 94L),
ProcessConditionClassType((int) 11164L),
@@ -736,6 +1155,14 @@ public enum OpcuaNodeIdServices {
PublishedVariableDataType_Encoding_DefaultBinary((int) 14323L),
PublishedVariableDataType_Encoding_DefaultJson((int) 15060L),
PublishedVariableDataType_Encoding_DefaultXml((int) 14319L),
+ PublishRequest((int) 824L),
+ PublishRequest_Encoding_DefaultBinary((int) 826L),
+ PublishRequest_Encoding_DefaultJson((int) 15352L),
+ PublishRequest_Encoding_DefaultXml((int) 825L),
+ PublishResponse((int) 827L),
+ PublishResponse_Encoding_DefaultBinary((int) 829L),
+ PublishResponse_Encoding_DefaultJson((int) 15353L),
+ PublishResponse_Encoding_DefaultXml((int) 828L),
PublishSubscribe((int) 14443L),
PublishSubscribeType((int) 14416L),
PubSubCommunicationFailureEventType((int) 15563L),
@@ -768,6 +1195,30 @@ public enum OpcuaNodeIdServices {
PubSubStatusType((int) 14643L),
PubSubTransportLimitsExceedEventType((int) 15548L),
QualifiedName((int) 20L),
+ QueryDataDescription((int) 570L),
+ QueryDataDescription_Encoding_DefaultBinary((int) 572L),
+ QueryDataDescription_Encoding_DefaultJson((int) 15200L),
+ QueryDataDescription_Encoding_DefaultXml((int) 571L),
+ QueryDataSet((int) 577L),
+ QueryDataSet_Encoding_DefaultBinary((int) 579L),
+ QueryDataSet_Encoding_DefaultJson((int) 15202L),
+ QueryDataSet_Encoding_DefaultXml((int) 578L),
+ QueryFirstRequest((int) 613L),
+ QueryFirstRequest_Encoding_DefaultBinary((int) 615L),
+ QueryFirstRequest_Encoding_DefaultJson((int) 15244L),
+ QueryFirstRequest_Encoding_DefaultXml((int) 614L),
+ QueryFirstResponse((int) 616L),
+ QueryFirstResponse_Encoding_DefaultBinary((int) 618L),
+ QueryFirstResponse_Encoding_DefaultJson((int) 15252L),
+ QueryFirstResponse_Encoding_DefaultXml((int) 617L),
+ QueryNextRequest((int) 619L),
+ QueryNextRequest_Encoding_DefaultBinary((int) 621L),
+ QueryNextRequest_Encoding_DefaultJson((int) 15254L),
+ QueryNextRequest_Encoding_DefaultXml((int) 620L),
+ QueryNextResponse((int) 622L),
+ QueryNextResponse_Encoding_DefaultBinary((int) 624L),
+ QueryNextResponse_Encoding_DefaultJson((int) 15255L),
+ QueryNextResponse_Encoding_DefaultXml((int) 623L),
Range((int) 884L),
Range_Encoding_DefaultBinary((int) 886L),
Range_Encoding_DefaultJson((int) 15375L),
@@ -777,6 +1228,14 @@ public enum OpcuaNodeIdServices {
RationalNumber_Encoding_DefaultJson((int) 19064L),
RationalNumber_Encoding_DefaultXml((int) 18851L),
RationalNumberType((int) 17709L),
+ ReadAnnotationDataDetails((int) 23497L),
+ ReadAnnotationDataDetails_Encoding_DefaultBinary((int) 23500L),
+ ReadAnnotationDataDetails_Encoding_DefaultJson((int) 23512L),
+ ReadAnnotationDataDetails_Encoding_DefaultXml((int) 23506L),
+ ReadAtTimeDetails((int) 653L),
+ ReadAtTimeDetails_Encoding_DefaultBinary((int) 655L),
+ ReadAtTimeDetails_Encoding_DefaultJson((int) 15269L),
+ ReadAtTimeDetails_Encoding_DefaultXml((int) 654L),
ReaderGroupDataType((int) 15520L),
ReaderGroupDataType_Encoding_DefaultBinary((int) 21153L),
ReaderGroupDataType_Encoding_DefaultJson((int) 21201L),
@@ -792,12 +1251,52 @@ public enum OpcuaNodeIdServices {
ReaderGroupTransportDataType_Encoding_DefaultXml((int) 15995L),
ReaderGroupTransportType((int) 21090L),
ReaderGroupType((int) 17999L),
+ ReadEventDetails((int) 644L),
+ ReadEventDetails_Encoding_DefaultBinary((int) 646L),
+ ReadEventDetails_Encoding_DefaultJson((int) 15262L),
+ ReadEventDetails_Encoding_DefaultXml((int) 645L),
+ ReadProcessedDetails((int) 650L),
+ ReadProcessedDetails_Encoding_DefaultBinary((int) 652L),
+ ReadProcessedDetails_Encoding_DefaultJson((int) 15264L),
+ ReadProcessedDetails_Encoding_DefaultXml((int) 651L),
+ ReadRawModifiedDetails((int) 647L),
+ ReadRawModifiedDetails_Encoding_DefaultBinary((int) 649L),
+ ReadRawModifiedDetails_Encoding_DefaultJson((int) 15263L),
+ ReadRawModifiedDetails_Encoding_DefaultXml((int) 648L),
+ ReadRequest((int) 629L),
+ ReadRequest_Encoding_DefaultBinary((int) 631L),
+ ReadRequest_Encoding_DefaultJson((int) 15257L),
+ ReadRequest_Encoding_DefaultXml((int) 630L),
+ ReadResponse((int) 632L),
+ ReadResponse_Encoding_DefaultBinary((int) 634L),
+ ReadResponse_Encoding_DefaultJson((int) 15258L),
+ ReadResponse_Encoding_DefaultXml((int) 633L),
+ ReadValueId((int) 626L),
+ ReadValueId_Encoding_DefaultBinary((int) 628L),
+ ReadValueId_Encoding_DefaultJson((int) 15256L),
+ ReadValueId_Encoding_DefaultXml((int) 627L),
RedundancySupport((int) 851L),
RedundantServerDataType((int) 853L),
RedundantServerDataType_Encoding_DefaultBinary((int) 855L),
RedundantServerDataType_Encoding_DefaultJson((int) 15362L),
RedundantServerDataType_Encoding_DefaultXml((int) 854L),
+ ReferenceDescription((int) 518L),
+ ReferenceDescription_Encoding_DefaultBinary((int) 520L),
+ ReferenceDescription_Encoding_DefaultJson((int) 15182L),
+ ReferenceDescription_Encoding_DefaultXml((int) 519L),
+ ReferenceNode((int) 285L),
+ ReferenceNode_Encoding_DefaultBinary((int) 287L),
+ ReferenceNode_Encoding_DefaultJson((int) 15080L),
+ ReferenceNode_Encoding_DefaultXml((int) 286L),
References((int) 31L),
+ ReferenceTypeAttributes((int) 367L),
+ ReferenceTypeAttributes_Encoding_DefaultBinary((int) 369L),
+ ReferenceTypeAttributes_Encoding_DefaultJson((int) 15160L),
+ ReferenceTypeAttributes_Encoding_DefaultXml((int) 368L),
+ ReferenceTypeNode((int) 273L),
+ ReferenceTypeNode_Encoding_DefaultBinary((int) 275L),
+ ReferenceTypeNode_Encoding_DefaultJson((int) 15076L),
+ ReferenceTypeNode_Encoding_DefaultXml((int) 274L),
ReferenceTypesFolder((int) 91L),
RefreshEndEventType((int) 2788L),
RefreshRequiredEventType((int) 2789L),
@@ -806,6 +1305,30 @@ public enum OpcuaNodeIdServices {
RegisteredServer_Encoding_DefaultBinary((int) 434L),
RegisteredServer_Encoding_DefaultJson((int) 15102L),
RegisteredServer_Encoding_DefaultXml((int) 433L),
+ RegisterNodesRequest((int) 558L),
+ RegisterNodesRequest_Encoding_DefaultBinary((int) 560L),
+ RegisterNodesRequest_Encoding_DefaultJson((int) 15195L),
+ RegisterNodesRequest_Encoding_DefaultXml((int) 559L),
+ RegisterNodesResponse((int) 561L),
+ RegisterNodesResponse_Encoding_DefaultBinary((int) 563L),
+ RegisterNodesResponse_Encoding_DefaultJson((int) 15196L),
+ RegisterNodesResponse_Encoding_DefaultXml((int) 562L),
+ RegisterServer2Request((int) 12193L),
+ RegisterServer2Request_Encoding_DefaultBinary((int) 12211L),
+ RegisterServer2Request_Encoding_DefaultJson((int) 15107L),
+ RegisterServer2Request_Encoding_DefaultXml((int) 12199L),
+ RegisterServer2Response((int) 12194L),
+ RegisterServer2Response_Encoding_DefaultBinary((int) 12212L),
+ RegisterServer2Response_Encoding_DefaultJson((int) 15130L),
+ RegisterServer2Response_Encoding_DefaultXml((int) 12200L),
+ RegisterServerRequest((int) 435L),
+ RegisterServerRequest_Encoding_DefaultBinary((int) 437L),
+ RegisterServerRequest_Encoding_DefaultJson((int) 15103L),
+ RegisterServerRequest_Encoding_DefaultXml((int) 436L),
+ RegisterServerResponse((int) 438L),
+ RegisterServerResponse_Encoding_DefaultBinary((int) 440L),
+ RegisterServerResponse_Encoding_DefaultJson((int) 15104L),
+ RegisterServerResponse_Encoding_DefaultXml((int) 439L),
RelativePath((int) 540L),
RelativePath_Encoding_DefaultBinary((int) 542L),
RelativePath_Encoding_DefaultJson((int) 15189L),
@@ -814,7 +1337,23 @@ public enum OpcuaNodeIdServices {
RelativePathElement_Encoding_DefaultBinary((int) 539L),
RelativePathElement_Encoding_DefaultJson((int) 15188L),
RelativePathElement_Encoding_DefaultXml((int) 538L),
+ RepublishRequest((int) 830L),
+ RepublishRequest_Encoding_DefaultBinary((int) 832L),
+ RepublishRequest_Encoding_DefaultJson((int) 15354L),
+ RepublishRequest_Encoding_DefaultXml((int) 831L),
+ RepublishResponse((int) 833L),
+ RepublishResponse_Encoding_DefaultBinary((int) 835L),
+ RepublishResponse_Encoding_DefaultJson((int) 15355L),
+ RepublishResponse_Encoding_DefaultXml((int) 834L),
+ RequestHeader((int) 389L),
+ RequestHeader_Encoding_DefaultBinary((int) 391L),
+ RequestHeader_Encoding_DefaultJson((int) 15088L),
+ RequestHeader_Encoding_DefaultXml((int) 390L),
Resources((int) 24226L),
+ ResponseHeader((int) 392L),
+ ResponseHeader_Encoding_DefaultBinary((int) 394L),
+ ResponseHeader_Encoding_DefaultJson((int) 15089L),
+ ResponseHeader_Encoding_DefaultXml((int) 393L),
RoleMappingRuleChangedAuditEventType((int) 17641L),
RolePermissionType((int) 96L),
RolePermissionType_Encoding_DefaultBinary((int) 128L),
@@ -823,6 +1362,7 @@ public enum OpcuaNodeIdServices {
RoleSetType((int) 15607L),
RoleType((int) 15620L),
RootFolder((int) 84L),
+ RsaEncryptedSecret((int) 17545L),
RsaMinApplicationCertificateType((int) 12559L),
RsaSha256ApplicationCertificateType((int) 12560L),
SafetyConditionClassType((int) 17218L),
@@ -873,6 +1413,10 @@ public enum OpcuaNodeIdServices {
ServiceCounterDataType_Encoding_DefaultBinary((int) 873L),
ServiceCounterDataType_Encoding_DefaultJson((int) 15370L),
ServiceCounterDataType_Encoding_DefaultXml((int) 872L),
+ ServiceFault((int) 395L),
+ ServiceFault_Encoding_DefaultBinary((int) 397L),
+ ServiceFault_Encoding_DefaultJson((int) 15090L),
+ ServiceFault_Encoding_DefaultXml((int) 396L),
SessionAuthenticationToken((int) 388L),
SessionDiagnosticsArrayType((int) 2196L),
SessionDiagnosticsDataType((int) 865L),
@@ -881,6 +1425,14 @@ public enum OpcuaNodeIdServices {
SessionDiagnosticsDataType_Encoding_DefaultXml((int) 866L),
SessionDiagnosticsObjectType((int) 2029L),
SessionDiagnosticsVariableType((int) 2197L),
+ SessionlessInvokeRequestType((int) 15901L),
+ SessionlessInvokeRequestType_Encoding_DefaultBinary((int) 15903L),
+ SessionlessInvokeRequestType_Encoding_DefaultJson((int) 15091L),
+ SessionlessInvokeRequestType_Encoding_DefaultXml((int) 15902L),
+ SessionlessInvokeResponseType((int) 20999L),
+ SessionlessInvokeResponseType_Encoding_DefaultBinary((int) 21001L),
+ SessionlessInvokeResponseType_Encoding_DefaultJson((int) 15092L),
+ SessionlessInvokeResponseType_Encoding_DefaultXml((int) 21000L),
SessionsDiagnosticsSummaryType((int) 2026L),
SessionSecurityDiagnosticsArrayType((int) 2243L),
SessionSecurityDiagnosticsDataType((int) 868L),
@@ -888,7 +1440,35 @@ public enum OpcuaNodeIdServices {
SessionSecurityDiagnosticsDataType_Encoding_DefaultJson((int) 15369L),
SessionSecurityDiagnosticsDataType_Encoding_DefaultXml((int) 869L),
SessionSecurityDiagnosticsType((int) 2244L),
+ SetMonitoringModeRequest((int) 767L),
+ SetMonitoringModeRequest_Encoding_DefaultBinary((int) 769L),
+ SetMonitoringModeRequest_Encoding_DefaultJson((int) 15329L),
+ SetMonitoringModeRequest_Encoding_DefaultXml((int) 768L),
+ SetMonitoringModeResponse((int) 770L),
+ SetMonitoringModeResponse_Encoding_DefaultBinary((int) 772L),
+ SetMonitoringModeResponse_Encoding_DefaultJson((int) 15331L),
+ SetMonitoringModeResponse_Encoding_DefaultXml((int) 771L),
+ SetPublishingModeRequest((int) 797L),
+ SetPublishingModeRequest_Encoding_DefaultBinary((int) 799L),
+ SetPublishingModeRequest_Encoding_DefaultJson((int) 15341L),
+ SetPublishingModeRequest_Encoding_DefaultXml((int) 798L),
+ SetPublishingModeResponse((int) 800L),
+ SetPublishingModeResponse_Encoding_DefaultBinary((int) 802L),
+ SetPublishingModeResponse_Encoding_DefaultJson((int) 15342L),
+ SetPublishingModeResponse_Encoding_DefaultXml((int) 801L),
+ SetTriggeringRequest((int) 773L),
+ SetTriggeringRequest_Encoding_DefaultBinary((int) 775L),
+ SetTriggeringRequest_Encoding_DefaultJson((int) 15332L),
+ SetTriggeringRequest_Encoding_DefaultXml((int) 774L),
+ SetTriggeringResponse((int) 776L),
+ SetTriggeringResponse_Encoding_DefaultBinary((int) 778L),
+ SetTriggeringResponse_Encoding_DefaultJson((int) 15333L),
+ SetTriggeringResponse_Encoding_DefaultXml((int) 777L),
ShelvedStateMachineType((int) 2929L),
+ SignatureData((int) 456L),
+ SignatureData_Encoding_DefaultBinary((int) 458L),
+ SignatureData_Encoding_DefaultJson((int) 15137L),
+ SignatureData_Encoding_DefaultXml((int) 457L),
SignedSoftwareCertificate((int) 344L),
SignedSoftwareCertificate_Encoding_DefaultBinary((int) 346L),
SignedSoftwareCertificate_Encoding_DefaultJson((int) 15136L),
@@ -905,6 +1485,10 @@ public enum OpcuaNodeIdServices {
StateType((int) 2307L),
StateVariableType((int) 2755L),
StatisticalConditionClassType((int) 18665L),
+ StatusChangeNotification((int) 818L),
+ StatusChangeNotification_Encoding_DefaultBinary((int) 820L),
+ StatusChangeNotification_Encoding_DefaultJson((int) 15350L),
+ StatusChangeNotification_Encoding_DefaultXml((int) 819L),
StatusCode((int) 19L),
StatusResult((int) 299L),
StatusResult_Encoding_DefaultBinary((int) 301L),
@@ -936,6 +1520,10 @@ public enum OpcuaNodeIdServices {
SubscribedDataSetMirrorDataType_Encoding_DefaultXml((int) 16012L),
SubscribedDataSetMirrorType((int) 15127L),
SubscribedDataSetType((int) 15108L),
+ SubscriptionAcknowledgement((int) 821L),
+ SubscriptionAcknowledgement_Encoding_DefaultBinary((int) 823L),
+ SubscriptionAcknowledgement_Encoding_DefaultJson((int) 15351L),
+ SubscriptionAcknowledgement_Encoding_DefaultXml((int) 822L),
SubscriptionDiagnosticsArrayType((int) 2171L),
SubscriptionDiagnosticsDataType((int) 874L),
SubscriptionDiagnosticsDataType_Encoding_DefaultBinary((int) 876L),
@@ -977,6 +1565,7 @@ public enum OpcuaNodeIdServices {
ThreeDVector_Encoding_DefaultXml((int) 18853L),
ThreeDVectorType((int) 17716L),
Time((int) 292L),
+ TimestampsToReturn((int) 625L),
TimeString((int) 12880L),
TimeZoneDataType((int) 8912L),
TimeZoneDataType_Encoding_DefaultBinary((int) 8917L),
@@ -985,9 +1574,29 @@ public enum OpcuaNodeIdServices {
Topics((int) 23488L),
ToState((int) 52L),
TrainingConditionClassType((int) 17220L),
+ TransferResult((int) 836L),
+ TransferResult_Encoding_DefaultBinary((int) 838L),
+ TransferResult_Encoding_DefaultJson((int) 15356L),
+ TransferResult_Encoding_DefaultXml((int) 837L),
+ TransferSubscriptionsRequest((int) 839L),
+ TransferSubscriptionsRequest_Encoding_DefaultBinary((int) 841L),
+ TransferSubscriptionsRequest_Encoding_DefaultJson((int) 15357L),
+ TransferSubscriptionsRequest_Encoding_DefaultXml((int) 840L),
+ TransferSubscriptionsResponse((int) 842L),
+ TransferSubscriptionsResponse_Encoding_DefaultBinary((int) 844L),
+ TransferSubscriptionsResponse_Encoding_DefaultJson((int) 15358L),
+ TransferSubscriptionsResponse_Encoding_DefaultXml((int) 843L),
TransitionEventType((int) 2311L),
TransitionType((int) 2310L),
TransitionVariableType((int) 2762L),
+ TranslateBrowsePathsToNodeIdsRequest((int) 552L),
+ TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary((int) 554L),
+ TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultJson((int) 15193L),
+ TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml((int) 553L),
+ TranslateBrowsePathsToNodeIdsResponse((int) 555L),
+ TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary((int) 557L),
+ TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultJson((int) 15194L),
+ TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml((int) 556L),
TransparentRedundancyType((int) 2036L),
TripAlarmType((int) 10751L),
TrustListDataType((int) 12554L),
@@ -1004,6 +1613,10 @@ public enum OpcuaNodeIdServices {
TsnTalkerStatus((int) 24222L),
TwoStateDiscreteType((int) 2373L),
TwoStateVariableType((int) 8995L),
+ TypeNode((int) 11880L),
+ TypeNode_Encoding_DefaultBinary((int) 11890L),
+ TypeNode_Encoding_DefaultJson((int) 15070L),
+ TypeNode_Encoding_DefaultXml((int) 11888L),
TypesFolder((int) 86L),
UABinaryFileDataType((int) 15006L),
UABinaryFileDataType_Encoding_DefaultBinary((int) 15422L),
@@ -1034,10 +1647,30 @@ public enum OpcuaNodeIdServices {
Union_Encoding_DefaultBinary((int) 12766L),
Union_Encoding_DefaultJson((int) 15085L),
Union_Encoding_DefaultXml((int) 12758L),
+ UnregisterNodesRequest((int) 564L),
+ UnregisterNodesRequest_Encoding_DefaultBinary((int) 566L),
+ UnregisterNodesRequest_Encoding_DefaultJson((int) 15197L),
+ UnregisterNodesRequest_Encoding_DefaultXml((int) 565L),
+ UnregisterNodesResponse((int) 567L),
+ UnregisterNodesResponse_Encoding_DefaultBinary((int) 569L),
+ UnregisterNodesResponse_Encoding_DefaultJson((int) 15198L),
+ UnregisterNodesResponse_Encoding_DefaultXml((int) 568L),
UnsignedRationalNumber((int) 24107L),
UnsignedRationalNumber_Encoding_DefaultBinary((int) 24110L),
UnsignedRationalNumber_Encoding_DefaultJson((int) 24134L),
UnsignedRationalNumber_Encoding_DefaultXml((int) 24122L),
+ UpdateDataDetails((int) 680L),
+ UpdateDataDetails_Encoding_DefaultBinary((int) 682L),
+ UpdateDataDetails_Encoding_DefaultJson((int) 15280L),
+ UpdateDataDetails_Encoding_DefaultXml((int) 681L),
+ UpdateEventDetails((int) 683L),
+ UpdateEventDetails_Encoding_DefaultBinary((int) 685L),
+ UpdateEventDetails_Encoding_DefaultJson((int) 15282L),
+ UpdateEventDetails_Encoding_DefaultXml((int) 684L),
+ UpdateStructureDataDetails((int) 11295L),
+ UpdateStructureDataDetails_Encoding_DefaultBinary((int) 11300L),
+ UpdateStructureDataDetails_Encoding_DefaultJson((int) 15281L),
+ UpdateStructureDataDetails_Encoding_DefaultXml((int) 11296L),
UriDictionaryEntryType((int) 17600L),
UserCredentialCertificateType((int) 15181L),
UserIdentityToken((int) 316L),
@@ -1055,6 +1688,22 @@ public enum OpcuaNodeIdServices {
UserTokenType((int) 303L),
UtcTime((int) 294L),
ValueAsText((int) 11433L),
+ VariableAttributes((int) 355L),
+ VariableAttributes_Encoding_DefaultBinary((int) 357L),
+ VariableAttributes_Encoding_DefaultJson((int) 15153L),
+ VariableAttributes_Encoding_DefaultXml((int) 356L),
+ VariableNode((int) 267L),
+ VariableNode_Encoding_DefaultBinary((int) 269L),
+ VariableNode_Encoding_DefaultJson((int) 15074L),
+ VariableNode_Encoding_DefaultXml((int) 268L),
+ VariableTypeAttributes((int) 364L),
+ VariableTypeAttributes_Encoding_DefaultBinary((int) 366L),
+ VariableTypeAttributes_Encoding_DefaultJson((int) 15159L),
+ VariableTypeAttributes_Encoding_DefaultXml((int) 365L),
+ VariableTypeNode((int) 270L),
+ VariableTypeNode_Encoding_DefaultBinary((int) 272L),
+ VariableTypeNode_Encoding_DefaultJson((int) 15075L),
+ VariableTypeNode_Encoding_DefaultXml((int) 271L),
VariableTypesFolder((int) 89L),
Vector((int) 18807L),
Vector_Encoding_DefaultBinary((int) 18816L),
@@ -1063,6 +1712,18 @@ public enum OpcuaNodeIdServices {
VectorType((int) 17714L),
VendorServerInfoType((int) 2033L),
VersionTime((int) 20998L),
+ ViewAttributes((int) 373L),
+ ViewAttributes_Encoding_DefaultBinary((int) 375L),
+ ViewAttributes_Encoding_DefaultJson((int) 15162L),
+ ViewAttributes_Encoding_DefaultXml((int) 374L),
+ ViewDescription((int) 511L),
+ ViewDescription_Encoding_DefaultBinary((int) 513L),
+ ViewDescription_Encoding_DefaultJson((int) 15179L),
+ ViewDescription_Encoding_DefaultXml((int) 512L),
+ ViewNode((int) 279L),
+ ViewNode_Encoding_DefaultBinary((int) 281L),
+ ViewNode_Encoding_DefaultJson((int) 15078L),
+ ViewNode_Encoding_DefaultXml((int) 280L),
ViewsFolder((int) 87L),
ViewVersion((int) 12170L),
WellKnownRole_Anonymous((int) 15644L),
@@ -1073,6 +1734,14 @@ public enum OpcuaNodeIdServices {
WellKnownRole_Operator((int) 15680L),
WellKnownRole_SecurityAdmin((int) 15704L),
WellKnownRole_Supervisor((int) 15692L),
+ WriteRequest((int) 671L),
+ WriteRequest_Encoding_DefaultBinary((int) 673L),
+ WriteRequest_Encoding_DefaultJson((int) 15277L),
+ WriteRequest_Encoding_DefaultXml((int) 672L),
+ WriteResponse((int) 674L),
+ WriteResponse_Encoding_DefaultBinary((int) 676L),
+ WriteResponse_Encoding_DefaultJson((int) 15278L),
+ WriteResponse_Encoding_DefaultXml((int) 675L),
WriterGroupDataType((int) 15480L),
WriterGroupDataType_Encoding_DefaultBinary((int) 21150L),
WriterGroupDataType_Encoding_DefaultJson((int) 21198L),
@@ -1088,6 +1757,10 @@ public enum OpcuaNodeIdServices {
WriterGroupTransportDataType_Encoding_DefaultXml((int) 15990L),
WriterGroupTransportType((int) 17997L),
WriterGroupType((int) 17725L),
+ WriteValue((int) 668L),
+ WriteValue_Encoding_DefaultBinary((int) 670L),
+ WriteValue_Encoding_DefaultJson((int) 15276L),
+ WriteValue_Encoding_DefaultXml((int) 669L),
X509IdentityToken((int) 325L),
X509IdentityToken_Encoding_DefaultBinary((int) 327L),
X509IdentityToken_Encoding_DefaultJson((int) 15143L),
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
index 10cbe9dec1..bb12ee521a 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
@@ -121,6 +121,7 @@ public class OpcuaPlcDriver extends GeneratedDriverBase<OpcuaAPU> {
return new PlcValueHandler();
}
+ @Override
protected boolean awaitDisconnectComplete() {
return true;
}
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
index 32bcf40694..e1f6ca4718 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
@@ -85,7 +85,7 @@ public class SecureChannel {
"(?<transportHost>[\\w.-]+)(:" +
"(?<transportPort>\\d*))?");
- public static final Pattern URI_PATTERN = Pattern.compile("^(?<protocolCode>opc)" +
+ public static final Pattern URI_PATTERN = Pattern.compile("^(?<protocolCode>opc|https)" +
INET_ADDRESS_PATTERN +
"(?<transportEndpoint>[\\w/=]*)[\\?]?"
);
@@ -580,7 +580,7 @@ public class SecureChannel {
}
public void onDisconnect(ConversationContext<OpcuaAPU> context) {
- LOGGER.info("Disconnecting");
+ LOGGER.debug("Disconnecting");
int requestHandle = getRequestHandle();
if (keepAlive != null) {
@@ -879,7 +879,7 @@ public class SecureChannel {
for (ExtensionObjectDefinition endpoint : endpoints) {
EndpointDescription endpointDescription = (EndpointDescription) endpoint;
if (endpointDescription.getEndpointUrl().getStringValue().equals(this.endpoint.getStringValue()) && endpointDescription.getSecurityPolicyUri().getStringValue().equals(this.securityPolicy)) {
- LOGGER.info("Found OPC UA endpoint {}", this.endpoint.getStringValue());
+ LOGGER.debug("Found OPC UA endpoint {}", this.endpoint.getStringValue());
this.configuration.setSenderCertificate(endpointDescription.getServerCertificate().getStringValue());
}
}
diff --git a/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java b/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
index 6d856ea448..07c90775b6 100644
--- a/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
+++ b/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
@@ -158,6 +158,24 @@ public class Plc4xValue {
String value = /*TODO: migrate me*/ /*TODO: migrate me*/
readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+ return new PlcSTRING(value);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString(
+ readBuffer, "UTF-8"));
+
+ return new PlcSTRING(value);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString(
+ readBuffer, "UTF-16"));
+
return new PlcSTRING(value);
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
@@ -325,6 +343,14 @@ public class Plc4xValue {
/*TODO: migrate me*/
/*TODO: migrate me*/ writeBuffer.writeString(
"", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+ // Manual Field (value)
+ org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString(
+ writeBuffer, _value, "UTF-8");
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+ // Manual Field (value)
+ org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString(
+ writeBuffer, _value, "UTF-16");
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
// Simple Field (milliseconds)
long milliseconds = (long) _value.getLong();
@@ -436,6 +462,12 @@ public class Plc4xValue {
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.WCHAR)) { // STRING
// Simple Field (value)
sizeInBits += 16;
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+ // Manual Field (value)
+ sizeInBits += (((STR_LEN(_value)) + (1))) * (8);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+ // Manual Field (value)
+ sizeInBits += (((STR_LEN(_value)) + (1))) * (16);
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
// Simple Field (milliseconds)
sizeInBits += 32;
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
index 4d8cf54c98..77f5edee4f 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
@@ -20,6 +20,7 @@ package org.apache.plc4x.java.plc4x.protocol;
import org.apache.plc4x.java.api.messages.*;
import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.types.PlcValueType;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.plc4x.config.Plc4xConfiguration;
import org.apache.plc4x.java.plc4x.tag.Plc4xTag;
@@ -96,7 +97,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
final Plc4xTag plc4xTag =
(Plc4xTag) apiReadRequest.getTag(tagName);
Plc4xTagRequest plc4XTagRequest = new Plc4xTagRequest(
- new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() + ":" + plc4xTag.getPlcValueType().name()));
+ new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString()));
plc4xTags.add(plc4XTagRequest);
}
final int requestId = txIdGenerator.getAndIncrement();
@@ -104,7 +105,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Send the request and await a response.
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
- context.sendRequest(plc4xReadRequest)
+ transaction.submit(() -> context.sendRequest(plc4xReadRequest)
.expectResponse(Plc4xMessage.class, requestTimeout)
.onTimeout(future::completeExceptionally)
.check(plc4xMessage -> plc4xMessage.getRequestId() == requestId)
@@ -125,7 +126,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Finish the request-transaction.
transaction.endRequest();
- });
+ }));
return future;
}
@@ -140,7 +141,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
final Plc4xValueType plc4xValueType = Plc4xValueType.valueOf(plc4xTag.getPlcValueType().name());
final PlcValue plcValue = writeRequest.getPlcValue(tagName);
Plc4xTagValueRequest tagRequest = new Plc4xTagValueRequest(
- new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() + ":" + plc4xTag.getPlcValueType().name()), plc4xValueType, plcValue);
+ new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() ), plc4xValueType, plcValue);
tags.add(tagRequest);
}
final int requestId = txIdGenerator.getAndIncrement();
@@ -148,7 +149,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Send the request and await a response.
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
- context.sendRequest(write)
+ transaction.submit(() ->context.sendRequest(write)
.expectResponse(Plc4xMessage.class, requestTimeout)
.onTimeout(future::completeExceptionally)
.check(p -> p.getRequestId() == requestId)
@@ -168,7 +169,7 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Finish the request-transaction.
transaction.endRequest();
- });
+ }));
return future;
}
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java
new file mode 100644
index 0000000000..69be217621
--- /dev/null
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.plc4x.readwrite.utils;
+
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.SerializationException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+
+import java.nio.charset.StandardCharsets;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class StaticHelper {
+
+ public static String parseString(ReadBuffer io, String encoding) {
+ try {
+ if ("UTF-8".equalsIgnoreCase(encoding)) {
+ // This is the maximum number of bytes a string can be long.
+ short stringLength = io.readUnsignedShort(8);
+ // This is the total length of the string on the PLC (Not necessarily the number of characters read)
+ final byte[] byteArray = new byte[stringLength];
+ for (int i = 0; (i < stringLength) && io.hasMore(8); i++) {
+ final byte curByte = io.readByte();
+ byteArray[i] = curByte;
+ }
+ return new String(byteArray, StandardCharsets.UTF_8);
+ } else if ("UTF-16".equalsIgnoreCase(encoding)) {
+ // This is the maximum number of bytes a string can be long.
+ int stringLength = io.readUnsignedInt(16);
+ final byte[] byteArray = new byte[stringLength * 2];
+ for (int i = 0; (i < stringLength) && io.hasMore(16); i++) {
+ final short curShort = io.readShort(16);
+ byteArray[i * 2] = (byte) (curShort >>> 8);
+ byteArray[(i * 2) + 1] = (byte) (curShort & 0xFF);
+ }
+ return new String(byteArray, StandardCharsets.UTF_16);
+ } else {
+ throw new PlcRuntimeException("Unsupported string encoding " + encoding);
+ }
+ } catch (ParseException e) {
+ throw new PlcRuntimeException("Error parsing string", e);
+ }
+ }
+ public static void serializeString(WriteBuffer io, PlcValue value, String encoding) {
+ String valueString = value.getString();
+ valueString = valueString == null ? "" : valueString;
+
+ if ("UTF-8".equalsIgnoreCase(encoding)) {
+ final byte[] raw = valueString.getBytes(StandardCharsets.UTF_8);
+ try {
+ io.writeByte((byte) raw.length);
+ for (byte b : raw) {
+ io.writeByte(b);
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else if ("UTF-16".equalsIgnoreCase(encoding)) {
+ final byte[] raw = valueString.getBytes(StandardCharsets.UTF_16);
+ try {
+ io.writeUnsignedInt(16, raw.length);
+ for (int i = 0; i < raw.length; i++) {
+ io.writeByte( raw[i]);
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else {
+ throw new PlcRuntimeException("Unsupported string encoding " + encoding);
+ }
+
+ }
+}
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java
index 83ac0fe9fb..fabb55fc13 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java
@@ -28,12 +28,7 @@ public class Plc4XTagHandler implements PlcTagHandler {
@Override
public PlcTag parseTag(String tagAddress) {
- if(!tagAddress.contains(":")) {
- throw new PlcInvalidTagException(tagAddress);
- }
- String address = tagAddress.substring(0, tagAddress.lastIndexOf(":"));
- String dataType = tagAddress.substring(tagAddress.lastIndexOf(":") + 1);
- return new Plc4xTag(address, PlcValueType.valueOf(dataType));
+ return new Plc4xTag(tagAddress);
}
@Override
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java
index c3d5aa7fdd..a85e2fd0d6 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java
@@ -32,11 +32,10 @@ import java.util.List;
public class Plc4xTag implements PlcTag, Serializable {
private final String address;
- private final PlcValueType valueType;
+ private PlcValueType valueType = PlcValueType.NULL;
- public Plc4xTag(String address, PlcValueType valueType) {
+ public Plc4xTag(String address) {
this.address = address;
- this.valueType = valueType;
}
@Override
@@ -48,7 +47,13 @@ public class Plc4xTag implements PlcTag, Serializable {
public PlcValueType getPlcValueType() {
return valueType;
}
-
+ @Override
+ public void setPlcValueType(PlcValueType plcValueType) {
+ this.valueType = plcValueType;
+ }
+ public void setValueType(PlcValueType valueType) {
+ this.valueType = valueType;
+ }
@Override
public List<ArrayInfo> getArrayInfo() {
return PlcTag.super.getArrayInfo();
diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml
index c0b47ba33a..995ee913d0 100644
--- a/plc4j/drivers/pom.xml
+++ b/plc4j/drivers/pom.xml
@@ -53,4 +53,19 @@
<module>simulated</module>
</modules>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <SPI-Provider>
+ *
+ </SPI-Provider>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java
index 7c5fb803ef..2db355b2db 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java
@@ -24,7 +24,6 @@ import java.math.BigInteger;
import java.time.*;
import java.util.*;
import org.apache.plc4x.java.api.value.*;
-import org.apache.plc4x.java.spi.codegen.WithOption;
import org.apache.plc4x.java.spi.generation.ByteOrder;
import org.apache.plc4x.java.spi.generation.EvaluationHelper;
import org.apache.plc4x.java.spi.generation.ParseException;
@@ -42,7 +41,8 @@ public class DataItem {
private static final Logger LOGGER = LoggerFactory.getLogger(DataItem.class);
public static PlcValue staticParse(
- ReadBuffer readBuffer, String dataProtocolId, Integer stringLength) throws ParseException {
+ ReadBuffer readBuffer, String dataProtocolId, Integer stringLength, String stringEncoding)
+ throws ParseException {
if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
@@ -147,16 +147,20 @@ public class DataItem {
return new PlcLREAL(value);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
- // Simple Field (value)
- String value = /*TODO: migrate me*/ /*TODO: migrate me*/
- readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7Char(
+ readBuffer, "UTF-8", stringEncoding));
return new PlcCHAR(value);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
- // Simple Field (value)
- String value = /*TODO: migrate me*/ /*TODO: migrate me*/
- readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7Char(
+ readBuffer, "UTF-16", stringEncoding));
return new PlcCHAR(value);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
@@ -165,7 +169,7 @@ public class DataItem {
String value =
(String)
(org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String(
- readBuffer, stringLength, "UTF-8"));
+ readBuffer, stringLength, "UTF-8", stringEncoding));
return new PlcSTRING(value);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
@@ -174,7 +178,7 @@ public class DataItem {
String value =
(String)
(org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String(
- readBuffer, stringLength, "UTF-16"));
+ readBuffer, stringLength, "UTF-16", stringEncoding));
return new PlcSTRING(value);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
@@ -253,9 +257,14 @@ public class DataItem {
}
public static void staticSerialize(
- WriteBuffer writeBuffer, PlcValue _value, String dataProtocolId, Integer stringLength)
+ WriteBuffer writeBuffer,
+ PlcValue _value,
+ String dataProtocolId,
+ Integer stringLength,
+ String stringEncoding)
throws SerializationException {
- staticSerialize(writeBuffer, _value, dataProtocolId, stringLength, ByteOrder.BIG_ENDIAN);
+ staticSerialize(
+ writeBuffer, _value, dataProtocolId, stringLength, stringEncoding, ByteOrder.BIG_ENDIAN);
}
public static void staticSerialize(
@@ -263,6 +272,7 @@ public class DataItem {
PlcValue _value,
String dataProtocolId,
Integer stringLength,
+ String stringEncoding,
ByteOrder byteOrder)
throws SerializationException {
if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
@@ -345,25 +355,21 @@ public class DataItem {
/*TODO: migrate me*/
/*TODO: migrate me*/ writeBuffer.writeDouble("", 64, (value));
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
- // Simple Field (value)
- String value = (String) _value.getString();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeString(
- "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+ // Manual Field (value)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7Char(
+ writeBuffer, _value, "UTF-8", stringEncoding);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
- // Simple Field (value)
- String value = (String) _value.getString();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeString(
- "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+ // Manual Field (value)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7Char(
+ writeBuffer, _value, "UTF-16", stringEncoding);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
// Manual Field (value)
org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String(
- writeBuffer, _value, stringLength, "UTF-8");
+ writeBuffer, _value, stringLength, "UTF-8", stringEncoding);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
// Manual Field (value)
org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String(
- writeBuffer, _value, stringLength, "UTF-16");
+ writeBuffer, _value, stringLength, "UTF-16", stringEncoding);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
// Simple Field (milliseconds)
long milliseconds = (long) _value.getLong();
@@ -431,11 +437,15 @@ public class DataItem {
}
}
- public static int getLengthInBytes(PlcValue _value, String dataProtocolId, Integer stringLength) {
- return (int) Math.ceil((float) getLengthInBits(_value, dataProtocolId, stringLength) / 8.0);
+ public static int getLengthInBytes(
+ PlcValue _value, String dataProtocolId, Integer stringLength, String stringEncoding) {
+ return (int)
+ Math.ceil(
+ (float) getLengthInBits(_value, dataProtocolId, stringLength, stringEncoding) / 8.0);
}
- public static int getLengthInBits(PlcValue _value, String dataProtocolId, Integer stringLength) {
+ public static int getLengthInBits(
+ PlcValue _value, String dataProtocolId, Integer stringLength, String stringEncoding) {
int sizeInBits = 0;
if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
// Reserved Field
@@ -485,17 +495,17 @@ public class DataItem {
// Simple Field (value)
sizeInBits += 64;
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
- // Simple Field (value)
+ // Manual Field (value)
sizeInBits += 8;
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
- // Simple Field (value)
+ // Manual Field (value)
sizeInBits += 16;
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
// Manual Field (value)
- sizeInBits += (STR_LEN(_value)) + (2);
+ sizeInBits += (((stringLength) + (2))) * (8);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
// Manual Field (value)
- sizeInBits += (((STR_LEN(_value)) * (2))) + (2);
+ sizeInBits += (((stringLength) + (2))) * (16);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
// Simple Field (milliseconds)
sizeInBits += 32;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
index c83a8af4c6..17e1c818e9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
@@ -107,7 +107,7 @@ public class S7PayloadReadVarResponse extends S7Payload implements Message {
readCountArrayField(
"items",
new DataReaderComplexDefault<>(
- () -> S7VarPayloadDataItem.staticParse(readBuffer, (boolean) (true)), readBuffer),
+ () -> S7VarPayloadDataItem.staticParse(readBuffer), readBuffer),
CAST(parameter, S7ParameterReadVarResponse.class).getNumItems());
readBuffer.closeContext("S7PayloadReadVarResponse");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
index f08cb90ecd..8334154158 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
@@ -42,19 +42,12 @@ public class S7VarPayloadDataItem implements Message {
protected final DataTransportSize transportSize;
protected final byte[] data;
- // Arguments.
- protected final Boolean hasNext;
-
public S7VarPayloadDataItem(
- DataTransportErrorCode returnCode,
- DataTransportSize transportSize,
- byte[] data,
- Boolean hasNext) {
+ DataTransportErrorCode returnCode, DataTransportSize transportSize, byte[] data) {
super();
this.returnCode = returnCode;
this.transportSize = transportSize;
this.data = data;
- this.hasNext = hasNext;
}
public DataTransportErrorCode getReturnCode() {
@@ -109,10 +102,7 @@ public class S7VarPayloadDataItem implements Message {
// Padding Field (padding)
writePaddingField(
- "padding",
- (int) (((PADCOUNT(data, hasNext)) % (2))),
- (short) 0x00,
- writeUnsignedShort(writeBuffer, 8));
+ "padding", (int) (((COUNT(data)) % (2))), (short) 0x00, writeUnsignedShort(writeBuffer, 8));
writeBuffer.popContext("S7VarPayloadDataItem");
}
@@ -142,7 +132,7 @@ public class S7VarPayloadDataItem implements Message {
}
// Padding Field (padding)
- int _timesPadding = (int) (((PADCOUNT(data, hasNext)) % (2)));
+ int _timesPadding = (int) (((COUNT(data)) % (2)));
while (_timesPadding-- > 0) {
lengthInBits += 8;
}
@@ -153,25 +143,10 @@ public class S7VarPayloadDataItem implements Message {
public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Object... args)
throws ParseException {
PositionAware positionAware = readBuffer;
- if ((args == null) || (args.length != 1)) {
- throw new PlcRuntimeException(
- "Wrong number of arguments, expected 1, but got " + args.length);
- }
- Boolean hasNext;
- if (args[0] instanceof Boolean) {
- hasNext = (Boolean) args[0];
- } else if (args[0] instanceof String) {
- hasNext = Boolean.valueOf((String) args[0]);
- } else {
- throw new PlcRuntimeException(
- "Argument 0 expected to be of type Boolean or a string which is parseable but was "
- + args[0].getClass().getName());
- }
- return staticParse(readBuffer, hasNext);
+ return staticParse(readBuffer);
}
- public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Boolean hasNext)
- throws ParseException {
+ public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7VarPayloadDataItem");
PositionAware positionAware = readBuffer;
int startPos = positionAware.getPos();
@@ -199,12 +174,12 @@ public class S7VarPayloadDataItem implements Message {
Math.toIntExact(
((transportSize.getSizeInBits()) ? CEIL((dataLength) / (8.0)) : dataLength)));
- readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((PADCOUNT(data, hasNext)) % (2))));
+ readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((COUNT(data)) % (2))));
readBuffer.closeContext("S7VarPayloadDataItem");
// Create the instance
S7VarPayloadDataItem _s7VarPayloadDataItem;
- _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data, hasNext);
+ _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data);
return _s7VarPayloadDataItem;
}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
index 28940ae38e..a6ea4032f0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
@@ -179,9 +179,9 @@ public enum TransportSize {
(boolean) false,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_LINT",
- TransportSize.INT),
+ null),
ULINT(
(short) 0x0D,
(boolean) false,
@@ -192,9 +192,9 @@ public enum TransportSize {
(boolean) false,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_ULINT",
- TransportSize.INT),
+ null),
REAL(
(short) 0x0E,
(boolean) true,
@@ -205,7 +205,7 @@ public enum TransportSize {
(boolean) true,
(short) 'D',
(boolean) true,
- DataTransportSize.REAL,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_REAL",
null),
LREAL(
@@ -218,7 +218,7 @@ public enum TransportSize {
(boolean) true,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_LREAL",
TransportSize.REAL),
CHAR(
@@ -244,7 +244,7 @@ public enum TransportSize {
(boolean) true,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_WCHAR",
null),
STRING(
@@ -270,7 +270,7 @@ public enum TransportSize {
(boolean) true,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_WSTRING",
null),
TIME(
@@ -281,7 +281,7 @@ public enum TransportSize {
(short) 4,
(boolean) true,
(boolean) true,
- (short) 'D',
+ (short) 'X',
(boolean) true,
null,
(String) "IEC61131_TIME",
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
index 55c50bd0d6..ae7553812b 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
@@ -25,19 +25,25 @@ import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultVa
import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
public class S7Configuration implements Configuration, TcpTransportConfiguration {
+ @ConfigurationParameter("local-group")
+ @IntDefaultValue(3)
+ public int localGroup = 3;
@ConfigurationParameter("local-rack")
@IntDefaultValue(1)
public int localRack = 1;
- @ConfigurationParameter("local-slot")
- @IntDefaultValue(1)
- public int localSlot = 1;
-
@ConfigurationParameter("local-tsap")
@IntDefaultValue(0)
public int localTsap = 0;
+ @ConfigurationParameter("local-slot")
+ @IntDefaultValue(1)
+ public int localSlot = 1;
+
+ @ConfigurationParameter("remote-group")
+ @IntDefaultValue(1)
+ public int remoteGroup = 1;
@ConfigurationParameter("remote-rack")
@IntDefaultValue(0)
public int remoteRack = 0;
@@ -65,6 +71,31 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
@ConfigurationParameter("controller-type")
public String controllerType;
+ @ConfigurationParameter("timeout-request")
+ @IntDefaultValue(4000)
+ protected int timeoutRequest;
+ public int getLocalGroup() {
+ return localGroup;
+ }
+
+ public void setLocalGroup(int localGroup) {
+ this.localGroup = localGroup;
+ }
+ public int getLocalTsap() {
+ return localTsap;
+ }
+
+ public void setLocalTsap(int localTsap) {
+ this.localTsap = localTsap;
+ }
+ public int getRemoteGroup() {
+ return remoteGroup;
+ }
+
+ public void setRemoteGroup(int remoteGroup) {
+ this.remoteGroup = remoteGroup;
+ }
+
public int getLocalRack() {
return localRack;
}
@@ -81,14 +112,6 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
this.localSlot = localSlot;
}
- public int getLocalTsap() {
- return localTsap;
- }
-
- public void setLocalTsap(int localTsap) {
- this.localTsap = localTsap;
- }
-
public int getRemoteRack() {
return remoteRack;
}
@@ -104,7 +127,6 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
public void setRemoteSlot(int remoteSlot) {
this.remoteSlot = remoteSlot;
}
-
public int getRemoteTsap() {
return remoteTsap;
}
@@ -112,7 +134,6 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
public void setRemoteTsap(int remoteTsap) {
this.remoteTsap = remoteTsap;
}
-
public int getPduSize() {
return pduSize;
}
@@ -145,6 +166,12 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
this.controllerType = controllerType;
}
+ public int getTimeoutRequest() {
+ return timeoutRequest;
+ }
+ public void setTimeoutRequest(int timeoutRequest) {
+ this.timeoutRequest = timeoutRequest;
+ }
/**
* Per default port for the S7 protocol is 102.
* @return 102
@@ -158,15 +185,18 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
public String toString() {
return "Configuration{" +
"local-rack=" + localRack +
+ ", local-group=" + localGroup +
", local-slot=" + localSlot +
", local-tsap=" + localTsap +
+ ", remote-group=" + remoteGroup +
", remote-rack=" + remoteRack +
", remote-slot=" + remoteSlot +
", remote-tsap=" + remoteTsap +
", pduSize=" + pduSize +
", maxAmqCaller=" + maxAmqCaller +
", maxAmqCallee=" + maxAmqCallee +
- ", controllerType='" + controllerType + '\'' +
+ ", controllerType='" + controllerType +
+ ", timeoutRequest='" + timeoutRequest + '\'' +
'}';
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
index 7b40d9b3d1..25edebf811 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
@@ -39,9 +39,9 @@ public class S7DriverContext implements DriverContext, HasConfiguration<S7Config
@Override
public void setConfiguration(S7Configuration configuration) {
- this.callingTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.OTHERS,
+ this.callingTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.enumForValue((byte)configuration.localGroup),
configuration.localRack, configuration.localSlot);
- this.calledTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.PG_OR_PC,
+ this.calledTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.enumForValue((byte)configuration.remoteGroup),
configuration.remoteRack, configuration.remoteSlot);
if (configuration.localTsap > 0) {
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
index ce987e1090..8e4a51347a 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
@@ -48,11 +48,11 @@ public class DefaultS7MessageProcessor implements S7MessageProcessor {
public static final int EMPTY_READ_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterReadVarRequest(
Collections.emptyList()), null).getLengthInBytes();
public static final int EMPTY_READ_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterReadVarResponse(
- (short) 0), new S7PayloadReadVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes();
+ (short) 0), new S7PayloadReadVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes();
public static final int EMPTY_WRITE_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterWriteVarRequest(
- Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList(), null)).getLengthInBytes();
+ Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList())).getLengthInBytes();
public static final int EMPTY_WRITE_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterWriteVarResponse(
- (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes();
+ (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes();
public DefaultS7MessageProcessor(AtomicInteger tpduGenerator) {
this.tpduRefGen = tpduGenerator;
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
index 85c6d9d4f3..f5767654cf 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
@@ -24,6 +24,7 @@ import org.apache.plc4x.java.api.model.PlcTag;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.s7.readwrite.*;
import org.apache.plc4x.java.s7.readwrite.context.S7DriverContext;
+import org.apache.plc4x.java.s7.readwrite.tag.S7StringTag;
import org.apache.plc4x.java.s7.readwrite.tag.S7Tag;
import org.apache.plc4x.java.s7.readwrite.MemoryArea;
import org.apache.plc4x.java.s7.readwrite.TransportSize;
@@ -65,7 +66,12 @@ public class S7Optimizer extends BaseOptimizer {
S7Tag tag = (S7Tag) readRequest.getTag(tagName);
int readRequestItemSize = S7_ADDRESS_ANY_SIZE;
- int readResponseItemSize = 4 + (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes());
+ int length = 1;
+ if(tag instanceof S7StringTag)
+ {
+ length = (((S7StringTag)tag).getStringLength() +2) * 8;
+ }
+ int readResponseItemSize = 4 + (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes() * length);
// If it's an odd number of bytes, add one to make it even
if (readResponseItemSize % 2 == 1) {
readResponseItemSize++;
@@ -83,8 +89,10 @@ public class S7Optimizer extends BaseOptimizer {
// If they would exceed, start a new request.
else {
// Create a new PlcReadRequest containing the current tag item.
- processedRequests.add(new DefaultPlcReadRequest(
- ((DefaultPlcReadRequest) readRequest).getReader(), curTags));
+ if(!curTags.isEmpty()) {
+ processedRequests.add(new DefaultPlcReadRequest(
+ ((DefaultPlcReadRequest) readRequest).getReader(), curTags));
+ }
// Reset the size and item lists.
curRequestSize = EMPTY_READ_REQUEST_SIZE + readRequestItemSize;
@@ -130,7 +138,12 @@ public class S7Optimizer extends BaseOptimizer {
if (tag.getDataType() == TransportSize.BOOL) {
writeRequestItemSize += Math.ceil((double) tag.getNumberOfElements() / 8);
} else {
- writeRequestItemSize += (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes());
+ int length = 1;
+ if(tag instanceof S7StringTag)
+ {
+ length = (((S7StringTag)tag).getStringLength() + 2) * 8;
+ }
+ writeRequestItemSize += (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes() * length);
}
// If it's an odd number of bytes, add one to make it even
if (writeRequestItemSize % 2 == 1) {
@@ -150,8 +163,10 @@ public class S7Optimizer extends BaseOptimizer {
// If adding them would exceed, start a new request.
else {
// Create a new PlcWriteRequest containing the current tag item.
- processedRequests.add(new DefaultPlcWriteRequest(
- ((DefaultPlcWriteRequest) writeRequest).getWriter(), curTags));
+ if(!curTags.isEmpty()) {
+ processedRequests.add(new DefaultPlcWriteRequest(
+ ((DefaultPlcWriteRequest) writeRequest).getWriter(), curTags));
+ }
// Reset the size and item lists.
curRequestSize = EMPTY_WRITE_REQUEST_SIZE + writeRequestItemSize;
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
index a46b496bdb..04828519a3 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
@@ -73,7 +73,7 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
public void start() {
processor.start();
- dispacher.start();
+ dispacher.start();
}
public void stop(){
@@ -154,7 +154,7 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex);
}
}
- System.out.println("ObjectProcessor Bye!");
+ logger.debug("ObjectProcessor Bye!");
}
public void doShutdown(){
@@ -203,7 +203,7 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex);
}
}
- System.out.println("EventDispacher Bye!");
+ logger.debug("EventDispacher Bye!");
}
public void doShutdown(){
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
index 5cda8f5018..b8b3a47e35 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
@@ -19,6 +19,7 @@
package org.apache.plc4x.java.s7.readwrite.protocol;
import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.s7.readwrite.configuration.S7Configuration;
import org.apache.plc4x.java.s7.readwrite.utils.S7PlcSubscriptionHandle;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -30,6 +31,7 @@ import org.apache.plc4x.java.api.messages.PlcResponse;
import org.apache.plc4x.java.api.messages.PlcWriteRequest;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.spi.configuration.HasConfiguration;
import org.apache.plc4x.java.spi.generation.*;
import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag;
import org.apache.plc4x.java.spi.values.PlcNull;
@@ -58,15 +60,11 @@ import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.stream.IntStream;
-import org.apache.commons.lang3.concurrent.BasicThreadFactory;
-import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -83,22 +81,12 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
* So we need to limit those.
* Thus, each request goes to a Work Queue and this Queue ensures, that only 3 are open at the same time.
*/
-public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
-
- public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
+public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> implements HasConfiguration<S7Configuration> {
private final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class);
- private final AtomicInteger tpduGenerator = new AtomicInteger(10);
-
- /*
- * Task group for managing connection redundancy.
- */
- private ExecutorService clientExecutorService = Executors.newFixedThreadPool(4, new BasicThreadFactory.Builder()
- .namingPattern("plc4x-app-thread-%d")
- .daemon(true)
- .priority(Thread.MAX_PRIORITY)
- .build());
-
+ private final AtomicInteger tpduGenerator = new AtomicInteger(1);
+
+ private S7Configuration configuration;
/*
* Take into account that the size of this buffer depends on the final device.
* S7-300 goes from 20 to 300 and for S7-400 it goes from 300 to 10000.
@@ -114,17 +102,6 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
private final S7PlcSubscriptionHandle usrHandle = new S7PlcSubscriptionHandle(EventType.USR, EventLogic);
private final S7PlcSubscriptionHandle almHandle = new S7PlcSubscriptionHandle(EventType.ALM, EventLogic);
- /*
- * For the reconnection functionality by a "TimeOut" of the connection,
- * you must keep track of open transactions. In general, an S7 device
- * supports a couple of simultaneous requests.
- * The rhythm of execution must be determined by the TransactionManager.
- * So far it is the way to indicate to the user that he must redo
- * his request.
- */
- private HashMap<Object,MutablePair<RequestTransactionManager.RequestTransaction, Object>> active_requests = new HashMap<>();
-
-
private S7DriverContext s7DriverContext;
private RequestTransactionManager tm;
@@ -141,7 +118,10 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
this.tm = new RequestTransactionManager(1);
EventLogic.start();
}
-
+ @Override
+ public void setConfiguration(S7Configuration configuration) {
+ this.configuration = configuration;
+ }
@Override
public void onConnect(ConversationContext<TPKTPacket> context) {
if (context.isPassive()) {
@@ -164,7 +144,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
logger.warn("Timeout during Connection establishing, closing channel...");
context.getChannel().close();
})
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.check(p -> p.getPayload() instanceof COTPPacketConnectionResponse)
.unwrap(p -> (COTPPacketConnectionResponse) p.getPayload())
.handle(cotpPacketConnectionResponse -> {
@@ -175,7 +155,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
logger.warn("Timeout during Connection establishing, closing channel...");
context.getChannel().close();
})
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.unwrap(TPKTPacket::getPayload)
.only(COTPPacketData.class)
.unwrap(COTPPacket::getPayload)
@@ -212,7 +192,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
logger.warn("Timeout during Connection establishing, closing channel...");
context.getChannel().close();
})
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.check(p -> p.getPayload() instanceof COTPPacketData)
.unwrap(p -> ((COTPPacketData) p.getPayload()))
.check(p -> p.getPayload() instanceof S7MessageUserData)
@@ -227,27 +207,21 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
});
}
-
+
/*
- * It performs the sequential and safe shutdown of the driver.
+ * It performs the sequential and safe shutdown of the driver.
* Completion of pending requests, executors and associated tasks.
- */
+ */
@Override
public void onDisconnect(ConversationContext<TPKTPacket> context) {
- //1. Clear all pending requests and their associated transaction
- cleanFutures();
- //2. Here we shutdown the local task executor.
- clientExecutorService.shutdown();
- //3. Performs the shutdown of the transaction executor.
tm.shutdown();
- //4. Finish the execution of the tasks for the handling of Events.
+ //4. Finish the execution of the tasks for the handling of Events.
EventLogic.stop();
- //5. Executes the closing of the main channel.
- context.getChannel().close();
- //6. Here is the stop of any task or state machine that is added.
+ context.fireDisconnected();
+ //6. Here is the stop of any task or state machine that is added.
}
-
+
@Override
public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
DefaultPlcReadRequest request = (DefaultPlcReadRequest) readRequest;
@@ -289,22 +263,27 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
*/
private CompletableFuture<S7Message> readInternal(S7MessageRequest request) {
CompletableFuture<S7Message> future = new CompletableFuture<>();
- int tpduId = tpduGenerator.getAndIncrement();
+ int thisTpduId = 0;
+ if (this.s7DriverContext.getControllerType() != S7ControllerType.S7_200)
+ {
+ thisTpduId = tpduGenerator.getAndIncrement();
+ }
+ final int tpduId = thisTpduId;
// If we've reached the max value for a 16 bit transaction identifier, reset back to 1
- if (tpduGenerator.get() == 0xFFFF) {
- tpduGenerator.set(1);
+ if(tpduGenerator.get() == 0xFFFF) {
+ tpduGenerator.set(0);
}
// Create a new Request with correct tpuId (is not known before)
S7MessageRequest s7MessageRequest = new S7MessageRequest(tpduId, request.getParameter(), request.getPayload());
- TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, s7MessageRequest, true, (short) tpduId, 9999));
+ TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, s7MessageRequest, true, (short) tpduId));
// Start a new request-transaction (Is ended in the response-handler)
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
transaction.submit(() -> context.sendRequest(tpktPacket)
.onTimeout(new TransactionErrorCallback<>(future, transaction))
.onError(new TransactionErrorCallback<>(future, transaction))
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.check(p -> p.getPayload() instanceof COTPPacketData)
.unwrap(p -> (COTPPacketData) p.getPayload())
.check(p -> p.getPayload() != null)
@@ -326,17 +305,17 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
List<S7VarPayloadDataItem> payloadItems = new ArrayList<>(request.getNumberOfTags());
Iterator<String> iter = request.getTagNames().iterator();
-
+
String tagName = null;
while(iter.hasNext()) {
tagName = iter.next();
final S7Tag tag = (S7Tag) request.getTag(tagName);
final PlcValue plcValue = request.getPlcValue(tagName);
parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
- payloadItems.add(serializePlcValue(tag, plcValue, iter.hasNext()));
+ payloadItems.add(serializePlcValue(tag, plcValue, iter.hasNext()));
}
-
-
+
+
// for (String tagName : request.getTagNames()) {
// final S7Tag tag = (S7Tag) request.getTag(tagName);
// final PlcValue plcValue = request.getPlcValue(tagName);
@@ -344,9 +323,9 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
// payloadItems.add(serializePlcValue(tag, plcValue));
//
// }
-
-
-
+
+
+
final int tpduId = tpduGenerator.getAndIncrement();
// If we've reached the max value for a 16 bit transaction identifier, reset back to 1
if (tpduGenerator.get() == 0xFFFF) {
@@ -358,19 +337,19 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
null,
new S7MessageRequest(tpduId,
new S7ParameterWriteVarRequest(parameterItems),
- new S7PayloadWriteVarRequest(payloadItems, null)
+ new S7PayloadWriteVarRequest(payloadItems)
),
true,
- (short) tpduId, 9999
+ (short) tpduId
)
);
-
+
// Start a new request-transaction (Is ended in the response-handler)
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
transaction.submit(() -> context.sendRequest(tpktPacket)
.onTimeout(new TransactionErrorCallback<>(future, transaction))
.onError(new TransactionErrorCallback<>(future, transaction))
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.check(p -> p.getPayload() instanceof COTPPacketData)
.unwrap(p -> ((COTPPacketData) p.getPayload()))
.unwrap(COTPPacket::getPayload)
@@ -434,15 +413,15 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
new S7MessageUserData(tpduId,
new S7ParameterUserData(parameterItems),
- new S7PayloadUserData(payloadItems, null)),
- true, (short) tpduId, 9999));
+ new S7PayloadUserData(payloadItems)),
+ true, (short) tpduId));
// Start a new request-transaction (Is ended in the response-handler)
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
transaction.submit(() -> context.sendRequest(tpktPacket)
.onTimeout(new TransactionErrorCallback<>(future, transaction))
.onError(new TransactionErrorCallback<>(future, transaction))
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
.check(p -> p.getPayload() instanceof COTPPacketData)
.unwrap(p -> ((COTPPacketData) p.getPayload()))
.unwrap(COTPPacket::getPayload)
@@ -734,8 +713,8 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
new S7ParameterUserDataItemCPUFunctions((short) 0x11, (byte) 0x4, (byte) 0x4, (short) 0x01, (short) 0x00, null, null, null)
)), new S7PayloadUserData(Collections.singletonList(
new S7PayloadUserDataItemCpuFunctionReadSzlRequest(DataTransportErrorCode.OK, DataTransportSize.OCTET_STRING, new SzlId(SzlModuleTypeClass.CPU, (byte) 0x00, SzlSublist.MODULE_IDENTIFICATION), 0x0000)
- ), null));
- COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2, 9999);
+ )));
+ COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2);
return new TPKTPacket(cotpPacketData);
}
@@ -763,19 +742,18 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
new S7ParameterSetupCommunication(
s7DriverContext.getMaxAmqCaller(), s7DriverContext.getMaxAmqCallee(), s7DriverContext.getPduSize());
S7Message s7Message = new S7MessageRequest(0, s7ParameterSetupCommunication,
- null);
- COTPPacketData cotpPacketData = new COTPPacketData(null, s7Message, true, (short) 1, 9999);
-
+ null);
+ COTPPacketData cotpPacketData = new COTPPacketData(null, s7Message, true, (short) 1);
return new TPKTPacket(cotpPacketData);
}
private COTPPacketConnectionRequest createCOTPConnectionRequest(int calledTsapId, int callingTsapId, COTPTpduSize cotpTpduSize) {
return new COTPPacketConnectionRequest(
Arrays.asList(
- new COTPParameterCallingTsap(callingTsapId,(short) 0),
- new COTPParameterCalledTsap(calledTsapId, (short) 0),
- new COTPParameterTpduSize(cotpTpduSize, (short) 0)
- ), null, (short) 0x0000, (short) 0x000F, COTPProtocolClass.CLASS_0, 0);
+ new COTPParameterCallingTsap(callingTsapId),
+ new COTPParameterCalledTsap(calledTsapId),
+ new COTPParameterTpduSize(cotpTpduSize)
+ ), null, (short) 0x0000, (short) 0x000F, COTPProtocolClass.CLASS_0);
}
private PlcResponse decodeReadResponse(S7Message responseMessage, PlcReadRequest plcReadRequest) throws PlcProtocolException {
@@ -921,18 +899,18 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
int stringLength = (tag instanceof S7StringTag) ? ((S7StringTag) tag).getStringLength() : 254;
ByteBuffer byteBuffer = null;
for (int i = 0; i < tag.getNumberOfElements(); i++) {
- final int lengthInBits = DataItem.getLengthInBits(plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength);
- final WriteBufferByteBased writeBuffer = new WriteBufferByteBased((int) Math.ceil(((float) lengthInBits) / 8.0f));
- DataItem.staticSerialize(writeBuffer, plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength);
+ final int lengthInBytes = DataItem.getLengthInBytes(plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength, tag.getStringEncoding());
+ final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(lengthInBytes);
+ DataItem.staticSerialize(writeBuffer, plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength, tag.getStringEncoding());
// Allocate enough space for all items.
if (byteBuffer == null) {
- byteBuffer = ByteBuffer.allocate(writeBuffer.getBytes().length * tag.getNumberOfElements());
+ byteBuffer = ByteBuffer.allocate(lengthInBytes * tag.getNumberOfElements());
}
byteBuffer.put(writeBuffer.getBytes());
}
if (byteBuffer != null) {
byte[] data = byteBuffer.array();
- return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data, hasNext);
+ return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data/*, hasNext*/);
}
} catch (SerializationException e) {
logger.warn("Error serializing tag item of type: '{}'", tag.getDataType().name(), e);
@@ -946,13 +924,13 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
int stringLength = (tag instanceof S7StringTag) ? ((S7StringTag) tag).getStringLength() : 254;
if (tag.getNumberOfElements() == 1) {
return DataItem.staticParse(readBuffer, tag.getDataType().getDataProtocolId(),
- stringLength);
+ stringLength, tag.getStringEncoding());
} else {
// Fetch all
final PlcValue[] resultItems = IntStream.range(0, tag.getNumberOfElements()).mapToObj(i -> {
try {
return DataItem.staticParse(readBuffer, tag.getDataType().getDataProtocolId(),
- stringLength);
+ stringLength, tag.getStringEncoding());
} catch (ParseException e) {
logger.warn("Error parsing tag item of type: '{}' (at position {}})", tag.getDataType().name(), i, e);
}
@@ -1036,17 +1014,34 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
// For these date-types we have to convert the requests to simple byte-array requests
// As otherwise the S7 will deny them with "Data type not supported" replies.
if ((transportSize == TransportSize.TIME) /*|| (transportSize == TransportSize.S7_S5TIME)*/ ||
- (transportSize == TransportSize.LTIME) || (transportSize == TransportSize.DATE) ||
- (transportSize == TransportSize.TIME_OF_DAY) || (transportSize == TransportSize.DATE_AND_TIME)) {
+ (transportSize == TransportSize.LINT) ||
+ (transportSize == TransportSize.ULINT) ||
+ (transportSize == TransportSize.LWORD) ||
+ (transportSize == TransportSize.LREAL) ||
+ (transportSize == TransportSize.REAL) ||
+ (transportSize == TransportSize.LTIME) ||
+ (transportSize == TransportSize.DATE) ||
+ (transportSize == TransportSize.TIME_OF_DAY) ||
+ (transportSize == TransportSize.DATE_AND_TIME)
+ ) {
numElements = numElements * transportSize.getSizeInBytes();
+ //((S7Field) field).setDataType(transportSize);
transportSize = TransportSize.BYTE;
}
+ if (transportSize == TransportSize.CHAR) {
+ transportSize = TransportSize.BYTE;
+ numElements = numElements * transportSize.getSizeInBytes();
+ }
+ if (transportSize == TransportSize.WCHAR) {
+ transportSize = TransportSize.BYTE;
+ numElements = numElements * transportSize.getSizeInBytes() * 2;
+ }
if (transportSize == TransportSize.STRING) {
- transportSize = TransportSize.CHAR;
+ transportSize = TransportSize.BYTE;
int stringLength = (s7Tag instanceof S7StringTag) ? ((S7StringTag) s7Tag).getStringLength() : 254;
numElements = numElements * (stringLength + 2);
} else if (transportSize == TransportSize.WSTRING) {
- transportSize = TransportSize.CHAR;
+ transportSize = TransportSize.BYTE;
int stringLength = (s7Tag instanceof S7StringTag) ? ((S7StringTag) s7Tag).getStringLength() : 254;
numElements = numElements * (stringLength + 2) * 2;
}
@@ -1079,27 +1074,4 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
future.completeExceptionally(e);
}
}
-
- private void cleanFutures(){
- //TODO: Debe ser ejecutado si la conexion esta levanta.
- active_requests.forEach((f,p)->{
- CompletableFuture<Object> cf = (CompletableFuture<Object>) f;
- try {
- if (!cf.isDone()) {
- logger.info("CF");
- cf.cancel(true);
- logger.info("ClientCF");
- ((CompletableFuture<Object>) p.getRight()).completeExceptionally(new PlcRuntimeException("Disconnected"));
- logger.info("TM");
- p.getLeft().endRequest();
- };
- } catch (Exception ex){
- logger.info(ex.toString());
- }
- });
- active_requests.clear();
-
- }
-
-
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java
index 2435717c44..b4285ba0fb 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java
@@ -36,8 +36,9 @@ public class S7StringTag extends S7Tag {
protected S7StringTag(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea,
@JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
@JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements,
- @JsonProperty("stringLength") int stringLength) {
- super(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
+ @JsonProperty("stringLength") int stringLength,
+ @JsonProperty("stringEncoding") String stringEncoding) {
+ super(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements,stringEncoding);
this.stringLength = stringLength;
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java
index 2a78a33da6..5a92175fb1 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java
@@ -47,24 +47,23 @@ public class S7Tag implements PlcTag, Serializable {
//byteOffset theoretically can reach up to 2097151 ... see checkByteOffset() below --> 7digits
private static final Pattern ADDRESS_PATTERN =
- Pattern.compile("^%(?<memoryArea>.)(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
+ Pattern.compile("^%(?<memoryArea>.)(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
//blockNumber usually has its max hat around 64000 --> 5digits
private static final Pattern DATA_BLOCK_ADDRESS_PATTERN =
- Pattern.compile("^%DB(?<blockNumber>\\d{1,5}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
+ Pattern.compile("^%DB(?<blockNumber>\\d{1,5}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
private static final Pattern DATA_BLOCK_SHORT_PATTERN =
- Pattern.compile("^%DB(?<blockNumber>\\d{1,5}):(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
+ Pattern.compile("^%DB(?<blockNumber>\\d{1,5}):(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
private static final Pattern DATA_BLOCK_STRING_ADDRESS_PATTERN =
- Pattern.compile("^%DB(?<blockNumber>\\d{1,5}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>STRING|WSTRING)\\((?<stringLength>\\d{1,3})\\)(\\[(?<numElements>\\d+)])?");
+ Pattern.compile("^%DB(?<blockNumber>\\d{1,5}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>STRING|WSTRING)\\((?<stringLength>\\d{1,3})\\)(\\[(?<numElements>\\d+)])?(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
private static final Pattern DATA_BLOCK_STRING_SHORT_PATTERN =
- Pattern.compile("^%DB(?<blockNumber>\\d{1,5}):(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>STRING|WSTRING)\\((?<stringLength>\\d{1,3})\\)(\\[(?<numElements>\\d+)])?");
+ Pattern.compile("^%DB(?<blockNumber>\\d{1,5}):(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>STRING|WSTRING)\\((?<stringLength>\\d{1,3})\\)(\\[(?<numElements>\\d+)])?(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
private static final Pattern PLC_PROXY_ADDRESS_PATTERN =
- Pattern.compile("[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}");
-
+ Pattern.compile("[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}(\\|(?<stringEncoding>[a-z0-9A-Z_-]+))?");
private static final String DATA_TYPE = "dataType";
private static final String STRING_LENGTH = "stringLength";
private static final String TRANSFER_SIZE_CODE = "transferSizeCode";
@@ -73,6 +72,7 @@ public class S7Tag implements PlcTag, Serializable {
private static final String BIT_OFFSET = "bitOffset";
private static final String NUM_ELEMENTS = "numElements";
private static final String MEMORY_AREA = "memoryArea";
+ private static final String STRING_ENCODING = "stringEncoding";
private final TransportSize dataType;
private final MemoryArea memoryArea;
@@ -81,16 +81,20 @@ public class S7Tag implements PlcTag, Serializable {
private final byte bitOffset;
private final int numElements;
+ private final String stringEncoding;
+
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
protected S7Tag(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea,
@JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
- @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements) {
+ @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements,
+ @JsonProperty("stringEncoding") String stringEncoding) {
this.dataType = dataType;
this.memoryArea = memoryArea;
this.blockNumber = blockNumber;
this.byteOffset = byteOffset;
this.bitOffset = bitOffset;
this.numElements = numElements;
+ this.stringEncoding = stringEncoding;
}
@Override
@@ -135,6 +139,10 @@ public class S7Tag implements PlcTag, Serializable {
return bitOffset;
}
+ public String getStringEncoding() {
+ return stringEncoding;
+ }
+ @Override
public int getNumberOfElements() {
return numElements;
}
@@ -162,7 +170,7 @@ public class S7Tag implements PlcTag, Serializable {
if (matcher.group(BIT_OFFSET) != null) {
bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET));
} else if (dataType == TransportSize.BOOL) {
- throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
+ //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
}
int numElements = 1;
if (matcher.group(NUM_ELEMENTS) != null) {
@@ -173,8 +181,16 @@ public class S7Tag implements PlcTag, Serializable {
throw new PlcInvalidTagException("Transfer size code '" + transferSizeCode +
"' doesn't match specified data type '" + dataType.name() + "'");
}
-
- return new S7StringTag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength);
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
+ return new S7StringTag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, stringEncoding);
} else if ((matcher = DATA_BLOCK_STRING_SHORT_PATTERN.matcher(tagString)).matches()) {
TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
int stringLength = Integer.parseInt(matcher.group(STRING_LENGTH));
@@ -186,9 +202,17 @@ public class S7Tag implements PlcTag, Serializable {
if (matcher.group(NUM_ELEMENTS) != null) {
numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
}
-
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
return new S7StringTag(dataType, memoryArea, blockNumber,
- byteOffset, bitOffset, numElements, stringLength);
+ byteOffset, bitOffset, numElements, stringLength, stringEncoding);
} else if ((matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(tagString)).matches()) {
TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
@@ -210,8 +234,16 @@ public class S7Tag implements PlcTag, Serializable {
throw new PlcInvalidTagException("Transfer size code '" + transferSizeCode +
"' doesn't match specified data type '" + dataType.name() + "'");
}
-
- return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
+ return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringEncoding);
} else if ((matcher = DATA_BLOCK_SHORT_PATTERN.matcher(tagString)).matches()) {
TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
@@ -221,15 +253,23 @@ public class S7Tag implements PlcTag, Serializable {
if (matcher.group(BIT_OFFSET) != null) {
bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET));
} else if (dataType == TransportSize.BOOL) {
- throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
+ //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
}
int numElements = 1;
if (matcher.group(NUM_ELEMENTS) != null) {
numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
}
-
- return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
- } else if (PLC_PROXY_ADDRESS_PATTERN.matcher(tagString).matches()) {
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
+ return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringEncoding);
+ } else if ((matcher = PLC_PROXY_ADDRESS_PATTERN.matcher(tagString)).matches()) {
try {
byte[] addressData = Hex.decodeHex(tagString.replaceAll("[-]", ""));
ReadBuffer rb = new ReadBufferByteBased(addressData);
@@ -240,10 +280,18 @@ public class S7Tag implements PlcTag, Serializable {
if ((s7AddressAny.getTransportSize() != TransportSize.BOOL) && s7AddressAny.getBitAddress() != 0) {
throw new PlcInvalidTagException("A bit offset other than 0 is only supported for type BOOL");
}
-
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (s7AddressAny.getTransportSize() == TransportSize.WSTRING || s7AddressAny.getTransportSize() == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
return new S7Tag(s7AddressAny.getTransportSize(), s7AddressAny.getArea(),
s7AddressAny.getDbNumber(), s7AddressAny.getByteAddress(),
- s7AddressAny.getBitAddress(), s7AddressAny.getNumberOfElements());
+ s7AddressAny.getBitAddress(), s7AddressAny.getNumberOfElements(), stringEncoding);
} else {
throw new PlcInvalidTagException("Unsupported address type.");
}
@@ -259,7 +307,7 @@ public class S7Tag implements PlcTag, Serializable {
if (matcher.group(BIT_OFFSET) != null) {
bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET));
} else if (dataType == TransportSize.BOOL) {
- throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
+ //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters.");
}
int numElements = 1;
if (matcher.group(NUM_ELEMENTS) != null) {
@@ -273,8 +321,17 @@ public class S7Tag implements PlcTag, Serializable {
if ((dataType != TransportSize.BOOL) && bitOffset != 0) {
throw new PlcInvalidTagException("A bit offset other than 0 is only supported for type BOOL");
}
+ String stringEncoding = matcher.group(STRING_ENCODING);
+ if (stringEncoding==null || "".equals(stringEncoding))
+ {
+ stringEncoding = "UTF-8";
+ if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR)
+ {
+ stringEncoding = "UTF-16";
+ }
+ }
- return new S7Tag(dataType, memoryArea, (short) 0, byteOffset, bitOffset, numElements);
+ return new S7Tag(dataType, memoryArea, (short) 0, byteOffset, bitOffset, numElements, stringEncoding);
}
throw new PlcInvalidTagException("Unable to parse address: " + tagString);
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
index 3fda942897..f1ab55296d 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
@@ -36,14 +36,22 @@ import org.apache.plc4x.java.spi.generation.ParseException;
import org.apache.plc4x.java.spi.generation.ReadBuffer;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.values.PlcList;
+import org.apache.plc4x.java.spi.values.PlcWCHAR;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
@@ -127,6 +135,87 @@ import java.util.regex.Pattern;
*/
public class StaticHelper {
+ private static final String[] DEFAULTCHARSETS = {"ASCII", "UTF-8", "GBK", "GB2312", "BIG5", "GB18030"};
+
+ public static Charset detectCharset(String firstMaTch, byte[] bytes) {
+
+ Charset charset = null;
+ if (firstMaTch!=null && !"".equals(firstMaTch))
+ {
+ try {
+ charset = Charset.forName(firstMaTch.replaceAll("[^a-zA-Z0-9]", ""));
+ }catch (Exception ignored) {
+ }
+ return charset;
+ }
+ for (String charsetName : DEFAULTCHARSETS) {
+ charset = detectCharset(bytes, Charset.forName(charsetName), bytes.length);
+ if (charset != null) {
+ break;
+ }
+ }
+
+ return charset;
+ }
+
+ private static Charset detectCharset(byte[] bytes, Charset charset, int length) {
+ try {
+ BufferedInputStream input = new BufferedInputStream(new ByteArrayInputStream(bytes, 0, length));
+
+ CharsetDecoder decoder = charset.newDecoder();
+ decoder.reset();
+
+ byte[] buffer = new byte[512];
+ boolean identified = false;
+ while (input.read(buffer) != -1 && !identified) {
+ identified = identify(buffer, decoder);
+ }
+
+ input.close();
+
+ if (identified) {
+ return charset;
+ } else {
+ return null;
+ }
+
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private static boolean identify(byte[] bytes, CharsetDecoder decoder) {
+ try {
+ decoder.decode(ByteBuffer.wrap(bytes));
+ } catch (CharacterCodingException e) {
+ return false;
+ }
+ return true;
+ }
+ public static Charset getEncoding(String firstMaTch, String str) {
+ if (str == null || str.trim().length() < 1) {
+ return null;
+ }
+ Charset charset = null;
+ if (firstMaTch!=null && !"".equals(firstMaTch))
+ {
+ try {
+ charset = Charset.forName(firstMaTch.replaceAll("[^a-zA-Z0-9]", ""));
+ }catch (Exception ignored) {
+ }
+ return charset;
+ }
+ for (String encode : DEFAULTCHARSETS) {
+ try {
+ Charset charset1 = Charset.forName(encode);
+ if (str.equals(new String(str.getBytes(charset1), charset1))) {
+ return charset1;
+ }
+ } catch (Exception er) {
+ }
+ }
+ return null;
+ }
public enum OB {
FREE_CYC(0X0000, "OB1 Free cycle"),
@@ -1931,7 +2020,7 @@ public class StaticHelper {
throw new NotImplementedException("Serializing DATE_AND_TIME not implemented");
}
- public static String parseS7Char(ReadBuffer io, String encoding) throws ParseException {
+ public static String parseS7Char(ReadBuffer io, String encoding, String stringEncoding) throws ParseException{
if ("UTF-8".equalsIgnoreCase(encoding)) {
return io.readString(8, WithOption.WithEncoding(encoding));
} else if ("UTF-16".equalsIgnoreCase(encoding)) {
@@ -1941,14 +2030,14 @@ public class StaticHelper {
}
}
- public static String parseS7String(ReadBuffer io, int stringLength, String encoding) {
+ public static String parseS7String(ReadBuffer io, int stringLength, String encoding, String stringEncoding) {
try {
if ("UTF-8".equalsIgnoreCase(encoding)) {
// This is the maximum number of bytes a string can be long.
short maxLength = io.readUnsignedShort(8);
// This is the total length of the string on the PLC (Not necessarily the number of characters read)
short totalStringLength = io.readUnsignedShort(8);
-
+ totalStringLength = (short) Math.min(maxLength, totalStringLength);
final byte[] byteArray = new byte[totalStringLength];
for (int i = 0; (i < stringLength) && io.hasMore(8); i++) {
final byte curByte = io.readByte();
@@ -1963,13 +2052,25 @@ public class StaticHelper {
break;
}
}
- return new String(byteArray, StandardCharsets.UTF_8);
+ Charset charset = detectCharset(null,byteArray);
+ if (charset == null) {
+ try {
+ charset = Charset.forName(stringEncoding.replaceAll("[^a-zA-Z0-9]", ""));
+ }catch (Exception ignored) {
+ }
+ if (charset == null) {
+ charset = StandardCharsets.UTF_8;
+ }
+ }
+ String substr = new String(byteArray, charset);
+ substr = substr.replaceAll("[^\u0020-\u9FA5]", "");
+ return substr;
} else if ("UTF-16".equalsIgnoreCase(encoding)) {
// This is the maximum number of bytes a string can be long.
int maxLength = io.readUnsignedInt(16);
// This is the total length of the string on the PLC (Not necessarily the number of characters read)
int totalStringLength = io.readUnsignedInt(16);
-
+ totalStringLength = Math.min(maxLength, totalStringLength);
final byte[] byteArray = new byte[totalStringLength * 2];
for (int i = 0; (i < stringLength) && io.hasMore(16); i++) {
final short curShort = io.readShort(16);
@@ -1985,7 +2086,17 @@ public class StaticHelper {
break;
}
}
- return new String(byteArray, StandardCharsets.UTF_16);
+ Charset charset = detectCharset(stringEncoding,byteArray);
+ if (charset == null) {
+ try {
+ charset = Charset.forName(stringEncoding.replaceAll("[^a-zA-Z0-9]", ""));
+ }catch (Exception ignored) {
+ }
+ if (charset == null) {
+ charset = StandardCharsets.UTF_16;
+ }
+ }
+ return new String(byteArray, charset);
} else {
throw new PlcRuntimeException("Unsupported string encoding " + encoding);
}
@@ -1997,12 +2108,29 @@ public class StaticHelper {
/*
* A variable of data type CHAR (character) occupies one byte.
*/
- public static void serializeS7Char(WriteBuffer io, PlcValue value, String encoding) {
- // TODO: Need to implement the serialization or we can't write strings
+ public static void serializeS7Char(WriteBuffer io, PlcValue value, String encoding, String stringEncoding) {
+ if (value instanceof PlcList) {
+ PlcList list = (PlcList) value;
+ list.getList().forEach(v -> writeChar(io, v, encoding,stringEncoding));
+ } else {
+ writeChar(io, value, encoding,stringEncoding);
+ }
+ }
+ private static void writeChar(WriteBuffer io, PlcValue value, String encoding, String stringEncoding) {
if ("UTF-8".equalsIgnoreCase(encoding)) {
- //return io.readString(8, encoding);
+ try {
+ byte valueByte = value.getByte();
+ io.writeByte(valueByte);
+ } catch (SerializationException e) {
+ throw new PlcRuntimeException("writeChar error");
+ }
} else if ("UTF-16".equalsIgnoreCase(encoding)) {
- //return io.readString(16, encoding);
+ try {
+ byte[] bytes = ((PlcWCHAR) value).getBytes();
+ io.writeByteArray(bytes);
+ } catch (SerializationException e) {
+ throw new PlcRuntimeException("writeWChar error");
+ }
} else {
throw new PlcRuntimeException("Unsupported encoding");
}
@@ -2032,23 +2160,57 @@ public class StaticHelper {
* If your application does not handle S7string, you can handle
* the String as char arrays from your application.
*/
- public static void serializeS7String(WriteBuffer io, PlcValue value, int stringLength, String encoding) {
- int k = 0xFF & ((stringLength > 250) ? 250 : stringLength);
- int m = 0xFF & value.getString().length();
- m = (m > k) ? k : m;
- byte[] chars = new byte[m];
- for (int i = 0; i < m; ++i) {
- char c = value.getString().charAt(i);
- chars[i] = (byte) c;
+ public static void serializeS7String(WriteBuffer io, PlcValue value, int stringLength, String encoding, String stringEncoding) {
+ stringLength = Math.min(stringLength, 254);
+ String valueString = (String) value.getObject();
+ valueString = valueString == null ? "" : valueString;
+ if ("AUTO".equalsIgnoreCase(stringEncoding))
+ {
+ stringEncoding = null;
+ }
+ Charset charsetTemp = getEncoding(stringEncoding,valueString);
+ if ("UTF-8".equalsIgnoreCase(encoding)) {
+ if (charsetTemp == null) {
+ charsetTemp = StandardCharsets.UTF_8;
+ }
+ final byte[] raw = valueString.getBytes(charsetTemp);
+ try {
+ io.writeByte((byte) stringLength);
+ io.writeByte((byte) raw.length);
+ for (int i = 0; i < stringLength; i++) {
+ if (i >= raw.length) {
+ io.writeByte((byte) 0x00);
+ } else {
+ io.writeByte( raw[i]);
+ }
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else if ("UTF-16".equalsIgnoreCase(encoding)) {
+ if (charsetTemp == null) {
+ charsetTemp = StandardCharsets.UTF_16;
+ }
+ final byte[] raw = valueString.getBytes(charsetTemp);
+ try {
+ io.writeUnsignedInt(16, stringLength);
+ io.writeUnsignedInt(16, raw.length / 2);
+ for (int i = 0; i < stringLength * 2; i++) {
+ if (i >= raw.length) {
+ io.writeByte((byte) 0x00);
+ } else {
+ io.writeByte( raw[i]);
+ }
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else {
+ throw new PlcRuntimeException("Unsupported string encoding " + encoding);
}
- try {
- io.writeByte((byte)(k & 0xFF));
- io.writeByte((byte)(m & 0xFF));
- io.writeByteArray(chars);
- } catch (SerializationException ex) {
- Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
- }
}
}
diff --git a/plc4j/drivers/s7/src/test/java/S7IoTest.java b/plc4j/drivers/s7/src/test/java/S7IoTest.java
index a9ceea4a72..2c23628e3d 100644
--- a/plc4j/drivers/s7/src/test/java/S7IoTest.java
+++ b/plc4j/drivers/s7/src/test/java/S7IoTest.java
@@ -331,7 +331,7 @@ public class S7IoTest {
TPKTPacket tpktPacket = new TPKTPacket(
new COTPPacketData(
- Collections.singletonList(new COTPParameterTpduSize(COTPTpduSize.SIZE_4096, (short) 0)),
+ Collections.singletonList(new COTPParameterTpduSize(COTPTpduSize.SIZE_4096)),
new S7MessageResponseData(
11,
new S7ParameterReadVarResponse((short) 1),
@@ -340,16 +340,15 @@ public class S7IoTest {
new S7VarPayloadDataItem(
DataTransportErrorCode.OK,
DataTransportSize.BIT,
- new byte[]{0x1},
- false
+ new byte[]{0x1}
)
- ), null
+ )
),
(short) 0,
(short) 0
),
false,
- (short) 13, 0
+ (short) 13
)
);
// To string
diff --git a/plc4j/drivers/s7/src/test/resources/logback-test.xml b/plc4j/drivers/s7/src/test/resources/logback-test.xml
index 33ae65561c..3020916362 100644
--- a/plc4j/drivers/s7/src/test/resources/logback-test.xml
+++ b/plc4j/drivers/s7/src/test/resources/logback-test.xml
@@ -27,7 +27,7 @@
</encoder>
</appender>
- <root level="error">
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
index 515d3e1eb1..b533477fd3 100644
--- a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
@@ -18,31 +18,16 @@
*/
package org.apache.plc4x.java.simulated.connection;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
-import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.*;
import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
-import org.apache.plc4x.java.api.model.PlcSubscriptionTag;
import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.api.model.PlcSubscriptionTag;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.simulated.tag.SimulatedTag;
import org.apache.plc4x.java.simulated.tag.SimulatedTagHandler;
import org.apache.plc4x.java.spi.connection.AbstractPlcConnection;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionEvent;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse;
-import org.apache.plc4x.java.spi.messages.PlcReader;
-import org.apache.plc4x.java.spi.messages.PlcSubscriber;
-import org.apache.plc4x.java.spi.messages.PlcWriter;
+import org.apache.plc4x.java.spi.messages.*;
import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration;
import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionHandle;
@@ -51,12 +36,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Instant;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
@@ -65,7 +45,7 @@ import java.util.function.Consumer;
* Connection to a test device.
* This class is not thread-safe.
*/
-public class SimulatedConnection extends AbstractPlcConnection implements PlcReader, PlcWriter, PlcSubscriber {
+public class SimulatedConnection extends AbstractPlcConnection {
private static final Logger LOGGER = LoggerFactory.getLogger(SimulatedConnection.class);
diff --git a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
index 54c2b203c4..09d036d93c 100644
--- a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
+++ b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
@@ -24,10 +24,10 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.hivemq.client.mqtt.MqttClient;
import com.hivemq.client.mqtt.datatypes.MqttQos;
-import com.hivemq.client.mqtt.mqtt3.Mqtt3RxClient;
-import com.hivemq.client.mqtt.mqtt3.message.connect.connack.Mqtt3ConnAck;
-import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3Publish;
-import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3PublishResult;
+import com.hivemq.client.mqtt.mqtt5.Mqtt5RxClient;
+import com.hivemq.client.mqtt.mqtt5.message.connect.connack.Mqtt5ConnAck;
+import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish;
+import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult;
import io.reactivex.Flowable;
import io.reactivex.Single;
import org.apache.commons.lang3.StringUtils;
@@ -43,6 +43,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.net.URL;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@@ -53,14 +54,18 @@ public class MqttConnector {
private Configuration config;
private MqttConnector(String propsPath) {
- if(StringUtils.isEmpty(propsPath)) {
+ if (StringUtils.isEmpty(propsPath)) {
logger.error("Empty configuration file parameter");
throw new IllegalArgumentException("Empty configuration file parameter");
}
File propsFile = new File(propsPath);
- if(!(propsFile.exists() && propsFile.isFile())) {
- logger.error("Invalid configuration file {}", propsFile.getPath());
- throw new IllegalArgumentException("Invalid configuration file " + propsFile.getPath());
+ if (!(propsFile.exists() && propsFile.isFile())) {
+ URL url = getClass().getClassLoader().getResource(propsPath);
+ if (url == null) {
+ logger.error("Invalid configuration file {}", propsFile.getPath());
+ throw new IllegalArgumentException("Invalid configuration file " + propsFile.getPath());
+ }
+ propsFile = new File(url.getFile());
}
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try {
@@ -72,15 +77,15 @@ public class MqttConnector {
private void run() throws PlcException {
// Create a new MQTT client.
- final Mqtt3RxClient client = MqttClient.builder()
+ final Mqtt5RxClient client = MqttClient.builder()
.identifier(UUID.randomUUID().toString())
.serverHost(config.getMqttConfig().getServerHost())
.serverPort(config.getMqttConfig().getServerPort())
- .useMqttVersion3()
+ .useMqttVersion5()
.buildRx();
// Connect to the MQTT broker.
- final Single<Mqtt3ConnAck> connAckSingle = client.connect().timeout(10, TimeUnit.SECONDS);
+ final Single<Mqtt5ConnAck> connAckSingle = client.connect().timeout(10, TimeUnit.SECONDS);
// Connect to the PLC.
try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(config.getPlcConfig().getConnection())) {
@@ -99,30 +104,36 @@ public class MqttConnector {
PlcReadRequest readRequest = builder.build();
// Send a message containing the PLC read response.
- Flowable<Mqtt3Publish> messagesToPublish = Flowable.generate(emitter -> {
- PlcReadResponse response = readRequest.execute().get();
- String jsonPayload = getPayload(response);
- final Mqtt3Publish publishMessage = Mqtt3Publish.builder()
- .topic(config.getMqttConfig().getTopicName())
- .qos(MqttQos.AT_LEAST_ONCE)
- .payload(jsonPayload.getBytes())
- .build();
- emitter.onNext(publishMessage);
+ Flowable<Mqtt5Publish> messagesToPublish = Flowable.generate(emitter -> {
+ readRequest.execute().whenComplete((response, err) -> {
+ String jsonPayload = new JsonObject().toString();
+ if (err == null) {
+ jsonPayload = getPayload(response);
+ }
+
+ final Mqtt5Publish publishMessage = Mqtt5Publish.builder()
+ .topic(config.getMqttConfig().getTopicName())
+ .qos(MqttQos.AT_LEAST_ONCE)
+ .payload(jsonPayload.getBytes())
+ .build();
+ emitter.onNext(publishMessage);
+ });
+
});
// Emit 1 message only every 100 milliseconds.
messagesToPublish = messagesToPublish.zipWith(Flowable.interval(
config.getPollingInterval(), TimeUnit.MILLISECONDS), (publish, aLong) -> publish);
- final Single<Mqtt3ConnAck> connectScenario = connAckSingle
- .doOnSuccess(connAck -> System.out.println("Connected with return code " + connAck.getReturnCode()))
+ final Single<Mqtt5ConnAck> connectScenario = connAckSingle
+ .doOnSuccess(connAck -> System.out.println("Connected with return code " + connAck.getReasonCode()))
.doOnError(throwable -> System.out.println("Connection failed, " + throwable.getMessage()));
- final Flowable<Mqtt3PublishResult> publishScenario = client.publish(messagesToPublish)
+ final Flowable<Mqtt5PublishResult> publishScenario = client.publish(messagesToPublish)
.doOnNext(publishResult -> System.out.println(
"Publish acknowledged: " + new String(publishResult.getPublish().getPayloadAsBytes())));
- connectScenario.toCompletable().andThen(publishScenario).blockingSubscribe();
+ connectScenario.ignoreElement().andThen(publishScenario).blockingSubscribe();
} catch (Exception e) {
throw new PlcException("Error creating connection to " + config.getPlcConfig().getConnection(), e);
}
@@ -143,10 +154,11 @@ public class MqttConnector {
}
public static void main(String[] args) throws Exception {
- if(args.length != 1) {
- System.out.println("Usage: MqttConnector {path-to-mqtt-connector.yml}");
+ String fileName = "mqtt-connector.yml";
+ if (args.length >= 1) {
+ fileName = args[0];
}
- MqttConnector mqttConnector = new MqttConnector(args[0]);
+ MqttConnector mqttConnector = new MqttConnector(fileName);
mqttConnector.run();
}
diff --git a/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml b/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml
new file mode 100644
index 0000000000..1bccd427a9
--- /dev/null
+++ b/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml
@@ -0,0 +1,35 @@
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+---
+mqtt:
+ topic-name: plc4x/test-topic
+ server-host: test.mosquitto.org
+ server-port: 1883
+plc:
+ connection: simulated://127.0.0.1
+ addresses:
+ - name: intParam
+ address: RANDOM/foo:INT
+ size: 1
+ type: java.lang.Integer
+ - name: intParam2
+ address: RANDOM/bar:INT
+ size: 1
+ type: java.lang.Integer
+polling-interval: 2000
diff --git a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
index d89e4d35ea..1cd49b5e1b 100644
--- a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
+++ b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
@@ -61,7 +61,7 @@ public class HelloInflux {
public void run() {
InfluxDBClient dbConnection = connectToDb();
- WriteApi writeApi = dbConnection.getWriteApi();
+ WriteApi writeApi = dbConnection.makeWriteApi();
try {
PlcConnection plcConnection = connectToPlc();
diff --git a/plc4j/examples/hello-world-kotlin/pom.xml b/plc4j/examples/hello-world-kotlin/pom.xml
index 6931049aa0..771e2e82bf 100644
--- a/plc4j/examples/hello-world-kotlin/pom.xml
+++ b/plc4j/examples/hello-world-kotlin/pom.xml
@@ -54,7 +54,7 @@
<!--dependency>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-driver-modbus</artifactId>
- <version>0.10.0-SNAPSHOT</version>
+ <version>0.11.0-SNAPSHOT</version>
<scope>runtime</scope>
</dependency-->
diff --git a/plc4j/integrations/apache-kafka/pom.xml b/plc4j/integrations/apache-kafka/pom.xml
index 6f6fcebc12..75fd02e15f 100644
--- a/plc4j/integrations/apache-kafka/pom.xml
+++ b/plc4j/integrations/apache-kafka/pom.xml
@@ -32,7 +32,7 @@
<description>Integration module for integrating PLC4X into Apache Kafka (Kafka-Connect-Plugin)</description>
<properties>
- <kafka.version>3.2.0</kafka.version>
+ <kafka.version>3.2.3</kafka.version>
<kafka.connect.maven.plugin.version>0.12.0</kafka.connect.maven.plugin.version>
</properties>
diff --git a/plc4j/integrations/opcua-server/pom.xml b/plc4j/integrations/opcua-server/pom.xml
index ee1a38db54..17ef31bfce 100644
--- a/plc4j/integrations/opcua-server/pom.xml
+++ b/plc4j/integrations/opcua-server/pom.xml
@@ -168,18 +168,18 @@
<scope>runtime</scope>
</dependency>
- <!-- Logging dependancies -->
+ <!-- Logging dependencies -->
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcmail-jdk15on</artifactId>
+ <artifactId>bcmail-jdk18on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcpkix-jdk15on</artifactId>
+ <artifactId>bcpkix-jdk18on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15on</artifactId>
+ <artifactId>bcprov-jdk18on</artifactId>
</dependency>
<dependency>
diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
index e2ff465107..e7c5a81dc3 100644
--- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
+++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
@@ -18,7 +18,9 @@
*/
package org.apache.plc4x.java.opcuaserver.backend;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcConnectionManager;
import org.apache.plc4x.java.api.PlcDriverManager;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -53,9 +55,7 @@ import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.
public class Plc4xCommunication extends AbstractLifecycle {
-
- private PlcDriverManager driverManager;
- private CachedPlcConnectionManager cachedPlcConnectionManager;
+ private PlcConnectionManager plcConnectionManager;
private final Logger logger = LoggerFactory.getLogger(getClass());
private final Integer DEFAULT_TIMEOUT = 1000000;
private final Integer DEFAULT_RETRY_BACKOFF = 5000;
@@ -71,7 +71,7 @@ public class Plc4xCommunication extends AbstractLifecycle {
@Override
protected void onStartup() {
- setDriverManager(PlcDriverManager.getDefault());
+ setConnectionManager(CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).build());
}
@Override
@@ -79,17 +79,16 @@ public class Plc4xCommunication extends AbstractLifecycle {
//Do Nothing
}
- public PlcDriverManager getDriverManager() {
- return driverManager;
+ public PlcConnectionManager getConnectionManager() {
+ return plcConnectionManager;
}
- public void setDriverManager(PlcDriverManager driverManager) {
- this.driverManager = driverManager;
- this.cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(driverManager.getConnectionManager()).build();
+ public void setConnectionManager(PlcConnectionManager connectionManager) {
+ this.plcConnectionManager = connectionManager;
}
public PlcTag getTag(String tag, String connectionString) throws PlcConnectionException {
- return driverManager.getDriverForUrl(connectionString).prepareTag(tag);
+ return plcConnectionManager.getDriverManager().getDriverForUrl(connectionString).prepareTag(tag);
}
public void addTag(DataItem item) {
@@ -156,7 +155,7 @@ public class Plc4xCommunication extends AbstractLifecycle {
//Try to connect to PLC
try {
- connection = cachedPlcConnectionManager.getConnection(connectionString);
+ connection = plcConnectionManager.getConnection(connectionString);
logger.debug(connectionString + " Connected");
} catch (PlcConnectionException e) {
logger.error("Failed to connect to device, error raised - " + e);
@@ -248,7 +247,7 @@ public class Plc4xCommunication extends AbstractLifecycle {
}
public void setValue(String tag, String value, String connectionString) {
- try (PlcConnection connection = cachedPlcConnectionManager.getConnection(connectionString)) {
+ try (PlcConnection connection = plcConnectionManager.getConnection(connectionString)) {
if (!connection.getMetadata().canWrite()) {
logger.error("This connection doesn't support writing.");
return;
diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
index fd4d6e9188..87f2fe6047 100644
--- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
+++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.opcuaserver.configuration.Configuration;
import org.apache.plc4x.java.opcuaserver.configuration.DeviceConfiguration;
import org.apache.plc4x.java.opcuaserver.configuration.Tag;
+import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager;
import org.eclipse.milo.opcua.sdk.core.AccessLevel;
import org.eclipse.milo.opcua.sdk.core.Reference;
import org.eclipse.milo.opcua.sdk.core.ValueRank;
@@ -184,9 +185,9 @@ public class Plc4xNamespace extends ManagedNamespaceWithLifecycle {
for (DataItem item : dataItems) {
plc4xServer.addTag(item);
- if (plc4xServer.getDriverManager() == null) {
+ if (plc4xServer.getConnectionManager() == null) {
plc4xServer.removeTag(item);
- plc4xServer.setDriverManager(new DefaultPlcDriverManager());
+ plc4xServer.setConnectionManager(CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).build());
}
}
diff --git a/plc4j/pom.xml b/plc4j/pom.xml
index 192b24edba..4af3e39966 100644
--- a/plc4j/pom.xml
+++ b/plc4j/pom.xml
@@ -126,6 +126,9 @@
<goal>check</goal>
</goals>
<configuration>
+ <excludes>
+ <exclude>**/Identifiers</exclude>
+ </excludes>
<!-- TODO: Turn this on as soon as possible. -->
<haltOnFailure>false</haltOnFailure>
<rules>
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java
index 33ef316673..e6007b9a50 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java
@@ -22,6 +22,9 @@ import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.MessageToMessageCodec;
+import io.netty.util.HashedWheelTimer;
+import io.netty.util.Timeout;
+import io.netty.util.Timer;
import io.vavr.control.Either;
import org.apache.plc4x.java.api.authentication.PlcAuthentication;
import org.apache.plc4x.java.spi.configuration.Configuration;
@@ -39,6 +42,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -53,13 +57,12 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
private final PlcAuthentication authentication;
private final Queue<HandlerRegistration> registeredHandlers;
- private final ChannelPipeline pipeline;
+ private Timer timer = null;
private final boolean passive;
public Plc4xNettyWrapper(ChannelPipeline pipeline, boolean passive, Plc4xProtocolBase<T> protocol,
PlcAuthentication authentication, Class<T> clazz) {
super(clazz, Object.class);
- this.pipeline = pipeline;
this.passive = passive;
this.registeredHandlers = new ConcurrentLinkedQueue<>();
this.protocolBase = protocol;
@@ -105,6 +108,7 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
public SendRequestContext<T> sendRequest(T packet) {
return new DefaultSendRequestContext<>(handler -> {
logger.trace("Adding Response Handler ...");
+ handler.setTimeoutHandle(createTimeout(handler));
registeredHandlers.add(handler);
}, packet, this);
}
@@ -113,13 +117,33 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
public ExpectRequestContext<T> expectRequest(Class<T> clazz, Duration timeout) {
return new DefaultExpectRequestContext<>(handler -> {
logger.trace("Adding Request Handler ...");
+ handler.setTimeoutHandle(createTimeout(handler));
registeredHandlers.add(handler);
}, clazz, timeout, this);
}
});
}
-
+ private Timeout createTimeout(HandlerRegistration handler)
+ {
+ Timer createdTimer = this.protocolBase.timer;
+ if(createdTimer==null) {
+ if(this.timer == null) {
+ this.timer = new HashedWheelTimer();
+ }
+ createdTimer = this.timer;
+ }
+ return createdTimer.newTimeout(tt -> {
+ if (tt.isCancelled()) {
+ return;
+ }
+ if( registeredHandlers.remove(handler))
+ {
+ handler.cancel();
+ handler.getOnTimeoutConsumer().accept(new TimeoutException());
+ }
+ }, handler.getTimeout().toMillis(), TimeUnit.MILLISECONDS);
+ }
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, List<Object> list) throws Exception {
// logger.trace("Encoding {}", plcRequestContainer);
@@ -145,21 +169,15 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
HandlerRegistration registration = iter.next();
// Check if the handler can still be used or should be removed
// Was cancelled?
+ if(registration.getTimeoutHandle()!=null && !registration.getTimeoutHandle().isCancelled()) {
+ registration.getTimeoutHandle().cancel();
+ }
if (registration.isCancelled()) {
logger.debug("Removing {} as it was cancelled!", registration);
iter.remove();
continue;
}
- // Timeout?
- final Instant now = Instant.now();
- if (registration.getTimeoutAt().isBefore(now)) {
- logger.debug("Removing {} as its timed out (timeout of {} was set till {} and now is {})",
- registration, registration.getTimeout(), registration.getTimeoutAt(), now);
- // pass timeout back to caller so it can do ie. transaction compensation
- registration.getOnTimeoutConsumer().accept(new TimeoutException());
- iter.remove();
- continue;
- }
+
logger.trace("Checking handler {} for Object of type {}", registration, t.getClass().getSimpleName());
if (registration.getExpectClazz().isInstance(t)) {
logger.trace("Handler {} has right expected type {}, checking condition", registration, registration.getExpectClazz().getSimpleName());
@@ -207,6 +225,10 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
this.protocolBase.onDiscover(new DefaultConversationContext<>(ctx, authentication, passive));
} else if (evt instanceof CloseConnectionEvent) {
this.protocolBase.close(new DefaultConversationContext<>(ctx, authentication, passive));
+ if(this.timer!=null) {
+ this.timer.stop();
+ this.timer = null;
+ }
} else {
super.userEventTriggered(ctx, evt);
}
@@ -268,6 +290,7 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
public SendRequestContext<T1> sendRequest(T1 packet) {
return new DefaultSendRequestContext<>(handler -> {
logger.trace("Adding Response Handler ...");
+ handler.setTimeoutHandle(createTimeout(handler));
registeredHandlers.add(handler);
}, packet, this);
}
@@ -276,6 +299,7 @@ public class Plc4xNettyWrapper<T> extends MessageToMessageCodec<T, Object> {
public ExpectRequestContext<T1> expectRequest(Class<T1> clazz, Duration timeout) {
return new DefaultExpectRequestContext<>(handler -> {
logger.trace("Adding Request Handler ...");
+ handler.setTimeoutHandle(createTimeout(handler));
registeredHandlers.add(handler);
}, clazz, timeout, this);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java
index dbbabb51e8..cf7bf45811 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java
@@ -18,6 +18,7 @@
*/
package org.apache.plc4x.java.spi;
+import io.netty.util.Timer;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.plc4x.java.api.messages.*;
import org.apache.plc4x.java.spi.context.DriverContext;
@@ -28,6 +29,8 @@ public abstract class Plc4xProtocolBase<T> {
protected ConversationContext<T> context;
+ protected Timer timer;
+
protected DriverContext driverContext;
public void setDriverContext(DriverContext driverContext) {
@@ -42,6 +45,10 @@ public abstract class Plc4xProtocolBase<T> {
this.context = context;
}
+ public void setTimer(Timer timer) {
+ this.timer = timer;
+ }
+
public void onConnect(ConversationContext<T> context) {
// Intentionally do nothing here
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java
index cd034bda35..69801c3908 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java
@@ -21,10 +21,11 @@ package org.apache.plc4x.java.spi.connection;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelPipeline;
+import io.netty.util.Timer;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
public interface ChannelFactory {
-
+ Timer getTimer();
Channel createChannel(ChannelHandler channelHandler) throws PlcConnectionException;
boolean isPassive();
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
index 7e30104318..e2221492d0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
@@ -28,6 +28,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIoException;
import org.apache.plc4x.java.api.listener.ConnectionStateListener;
import org.apache.plc4x.java.api.listener.EventListener;
import org.apache.plc4x.java.api.value.PlcValueHandler;
+import org.apache.plc4x.java.spi.Plc4xProtocolBase;
import org.apache.plc4x.java.spi.configuration.Configuration;
import org.apache.plc4x.java.spi.configuration.ConfigurationFactory;
import org.apache.plc4x.java.spi.events.*;
@@ -123,6 +124,7 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements
channel = channelFactory.createChannel(getChannelHandler(sessionSetupCompleteFuture, sessionDisconnectCompleteFuture, sessionDiscoveredCompleteFuture));
channel.closeFuture().addListener(future -> {
if (!sessionSetupCompleteFuture.isDone()) {
+ channel.pipeline().fireUserEventTriggered(new CloseConnectionEvent());
sessionSetupCompleteFuture.completeExceptionally(
new PlcIoException("Connection terminated by remote"));
}
@@ -152,6 +154,11 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements
*/
@Override
public void close() throws PlcConnectionException {
+ if(channel == null)
+ {
+ connected = false;
+ return;
+ }
logger.debug("Closing connection to PLC, await for disconnect = {}", awaitSessionDisconnectComplete);
channel.pipeline().fireUserEventTriggered(new DisconnectEvent());
try {
@@ -212,22 +219,45 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements
} else if (evt instanceof DisconnectedEvent) {
sessionDisconnectCompleteFuture.complete(null);
eventListeners.forEach(ConnectionStateListener::disconnected);
+ super.userEventTriggered(ctx, evt);
} else if (evt instanceof DiscoveredEvent) {
sessionDiscoverCompleteFuture.complete(((DiscoveredEvent) evt).getConfiguration());
+ } else if (evt instanceof ConnectEvent) {
+ if (!sessionSetupCompleteFuture.isCompletedExceptionally()) {
+ if (awaitSessionSetupComplete) {
+ setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(),
+ channelFactory.isPassive()));
+ }
+ super.userEventTriggered(ctx, evt);
+ }
} else {
super.userEventTriggered(ctx, evt);
}
}
});
+ pipeline.addLast(new ChannelInboundHandlerAdapter() {
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws PlcConnectionException {
+ logger.error("unknown error, close the connection", cause);
+ close();
+ }
+ }
+ );
// Initialize via Transport Layer
channelFactory.initializePipeline(pipeline);
// Initialize Protocol Layer
- setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(),
- channelFactory.isPassive()));
+ if (!awaitSessionSetupComplete) {
+ setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(),
+ channelFactory.isPassive()));
+ }
}
};
}
-
+ @Override
+ public void setProtocol(Plc4xProtocolBase<?> protocol) {
+ super.setProtocol(protocol);
+ protocol.setTimer(channelFactory.getTimer());
+ }
protected void sendChannelCreatedEvent() {
logger.trace("Channel was created, firing ChannelCreated Event");
// Send an event to the pipeline telling the Protocol filters what's going on.
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java
index 8c9d6f9128..8220ae60d1 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java
@@ -24,6 +24,8 @@ import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.util.HashedWheelTimer;
+import io.netty.util.Timer;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,6 +44,14 @@ public abstract class NettyChannelFactory implements ChannelFactory {
private static final Logger logger = LoggerFactory.getLogger(NettyChannelFactory.class);
+ protected static HashedWheelTimer timer = new HashedWheelTimer();
+ @Override
+ public Timer getTimer(){
+ if(timer==null){
+ timer = new HashedWheelTimer();
+ }
+ return timer;
+ }
private final Map<Channel, EventLoopGroup> eventLoops = new ConcurrentHashMap<>();
/**
@@ -151,6 +161,8 @@ public abstract class NettyChannelFactory implements ChannelFactory {
EventLoopGroup eventExecutors = eventLoops.get(channel);
eventLoops.remove(channel);
eventExecutors.shutdownGracefully().awaitUninterruptibly();
+ timer.stop();
+ timer = null;
logger.info("Worker Group was closed successfully!");
} else {
logger.warn("Trying to remove EventLoop for Channel {} but have none stored", channel);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java
index 9f918cdc81..2c28e8608b 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java
@@ -45,10 +45,12 @@ public class WriteBufferByteBased implements WriteBuffer, BufferCommons {
this.byteOrder = byteOrder;
}
+ @Override
public ByteOrder getByteOrder() {
return byteOrder;
}
+ @Override
public void setByteOrder(ByteOrder byteOrder) {
this.byteOrder = byteOrder;
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java
index 7dc9216d8b..bef8bc6f07 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java
@@ -18,13 +18,12 @@
*/
package org.apache.plc4x.java.spi.internal;
+import io.netty.util.Timeout;
import io.vavr.control.Either;
import java.time.Duration;
-import java.time.Instant;
import java.util.Deque;
import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -46,7 +45,7 @@ public class HandlerRegistration {
private final BiConsumer<?, ? extends Throwable> errorConsumer;
private final Duration timeout;
- private final Instant timeoutAt;
+ private Timeout timeoutHandle;
private volatile boolean cancelled = false;
private volatile boolean handled = false;
@@ -58,7 +57,6 @@ public class HandlerRegistration {
this.onTimeoutConsumer = onTimeoutConsumer;
this.errorConsumer = errorConsumer;
this.timeout = timeout;
- this.timeoutAt = Instant.now().plus(timeout);
}
public Deque<Either<Function<?, ?>, Predicate<?>>> getCommands() {
@@ -85,8 +83,12 @@ public class HandlerRegistration {
return timeout;
}
- public Instant getTimeoutAt() {
- return timeoutAt;
+ public void setTimeoutHandle(Timeout timeoutHandle) {
+ this.timeoutHandle = timeoutHandle;
+ }
+
+ public Timeout getTimeoutHandle() {
+ return timeoutHandle;
}
public void cancel() {
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
index 2a5b2953e4..91f2605b67 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
@@ -27,6 +27,7 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.messages.PlcWriteRequest;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.api.types.PlcValueType;
import org.apache.plc4x.java.spi.codegen.WithOption;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -93,6 +94,7 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, Serializable {
return tags.values().stream().map(TagValueItem::getTag).collect(Collectors.toCollection(LinkedList::new));
}
+ @Override
@JsonIgnore
public PlcValue getPlcValue(String name) {
return tags.get(name).getValue();
@@ -194,6 +196,9 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, Serializable {
PlcTag tag = tagValues.getLeft().get();
Object[] value = tagValues.getRight();
PlcValue plcValue = valueHandler.newPlcValue(tag, value);
+ if(tag.getPlcValueType()== PlcValueType.NULL){
+ tag.setPlcValueType(plcValue.getPlcValueType());
+ }
parsedTags.put(name, new TagValueItem(tag, plcValue));
});
return new DefaultPlcWriteRequest(writer, parsedTags);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java
index 8d4f3d41f5..9fb29c0246 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java
@@ -59,7 +59,7 @@ public class DefaultPlcSubscriptionTag implements PlcSubscriptionTag {
public List<ArrayInfo> getArrayInfo() {
return plcTag.getArrayInfo();
}
-
+ @Override
public PlcSubscriptionType getPlcSubscriptionType() {
return plcSubscriptionType;
}
@@ -67,7 +67,7 @@ public class DefaultPlcSubscriptionTag implements PlcSubscriptionTag {
public PlcTag getTag() {
return plcTag;
}
-
+ @Override
public Optional<Duration> getDuration() {
return Optional.ofNullable(duration);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java
index 3592ff2e55..4fba021075 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java
@@ -18,21 +18,16 @@
*/
package org.apache.plc4x.java.spi.transaction;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
import java.util.Objects;
import java.util.Queue;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
-import org.apache.commons.lang3.concurrent.BasicThreadFactory;
/**
* This is a limited Queue of Requests, a Protocol can use.
@@ -49,25 +44,23 @@ public class RequestTransactionManager {
private static final Logger logger = LoggerFactory.getLogger(RequestTransactionManager.class);
/** Executor that performs all operations */
- //static final ExecutorService executor = Executors.newScheduledThreadPool(4);
-
- final ExecutorService executor = Executors.newFixedThreadPool(4, new BasicThreadFactory.Builder()
- .namingPattern("plc4x-tm-thread-%d")
- .daemon(true)
- .priority(Thread.MAX_PRIORITY)
- .build());
-
+ private final ExecutorService executor;
private final Set<RequestTransaction> runningRequests;
/** How many Transactions are allowed to run at the same time? */
private int numberOfConcurrentRequests;
/** Assigns each request a Unique Transaction Id, especially important for failure handling */
- private AtomicInteger transactionId = new AtomicInteger(0);
+ private final AtomicInteger transactionId = new AtomicInteger(0);
/** Important, this is a FIFO Queue for Fairness! */
- private Queue<RequestTransaction> workLog = new ConcurrentLinkedQueue<>();
+ private final Queue<RequestTransaction> workLog = new ConcurrentLinkedQueue<>();
public RequestTransactionManager(int numberOfConcurrentRequests) {
this.numberOfConcurrentRequests = numberOfConcurrentRequests;
// Immutable Map
+ executor = new ThreadPoolExecutor(0, numberOfConcurrentRequests,
+ 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>(1024),
+ new BasicThreadFactory.Builder().namingPattern("RequestTransactionManager-pool-%d").daemon(true).build(),
+ new ThreadPoolExecutor.AbortPolicy());;
runningRequests = ConcurrentHashMap.newKeySet();
}
@@ -91,13 +84,13 @@ public class RequestTransactionManager {
// As we might have increased the number, try to send some more requests.
processWorklog();
}
-
+
/*
* It allows the sequential shutdown of the associated driver.
*/
public void shutdown(){
executor.shutdown();
- }
+ }
public void submit(Consumer<RequestTransaction> context) {
RequestTransaction transaction = startRequest();
@@ -114,7 +107,7 @@ public class RequestTransactionManager {
processWorklog();
}
- private void processWorklog() {
+ private synchronized void processWorklog() {
while (runningRequests.size() < getNumberOfConcurrentRequests() && !workLog.isEmpty()) {
RequestTransaction next = workLog.poll();
if (next != null) {
@@ -219,11 +212,11 @@ public class RequestTransactionManager {
this.delegate = delegate;
}
- //TODO: Check MDC used. Created exception in Hop application
+ //TODO: Check MDC used. Created exception in Hop application
@Override
public void run() {
//try (final MDC.MDCCloseable closeable = MDC.putCloseable("plc4x.transactionId", Integer.toString(transactionId))) {
- try{
+ try{
logger.trace("Start execution of transaction {}", transactionId);
delegate.run();
logger.trace("Completed execution of transaction {}", transactionId);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
index ed8e9b4b7f..6ebac62822 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
@@ -56,6 +56,8 @@ public class PlcBOOL extends PlcIECValue<Boolean> {
return new PlcBOOL((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcBOOL((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcBOOL(((Number) value).intValue());
} else {
return new PlcBOOL((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
index c950f4cc76..0f5b0ddff0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
@@ -57,6 +57,8 @@ public class PlcBYTE extends PlcIECValue<Short> {
return new PlcBYTE((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcBYTE((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcBYTE(((Number) value).intValue());
} else {
return new PlcBYTE((String) value);
}
@@ -69,9 +71,9 @@ public class PlcBYTE extends PlcIECValue<Short> {
}
public PlcBYTE(Byte value) {
- if ((value < minValue) || (value > maxValue)) {
- throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
- }
+ //if ((value < minValue) || (value > maxValue)) {
+ // throw new PlcInvalidFieldException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
+ //}
this.value = value.shortValue();
this.isNullable = false;
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
index 54da8290b8..317633c8f5 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
@@ -58,6 +58,8 @@ public class PlcCHAR extends PlcIECValue<Short> {
return new PlcCHAR((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcCHAR((BigDecimal) value);
+ } else if (value instanceof Character) {
+ return new PlcCHAR((Character) value);
} else {
return new PlcCHAR((String) value);
}
@@ -72,92 +74,128 @@ public class PlcCHAR extends PlcIECValue<Short> {
public PlcCHAR(Character value) {
super();
Integer val = (int) value;
+ this.value = val.shortValue();
+ this.isNullable = false;
+ /*
if ((val >= minValue) && (val <= maxValue)) {
this.value = val.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Byte value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue)) {
this.value = value.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Short value) {
super();
+ this.value = value;
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue)) {
this.value = value;
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Integer value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue)) {
this.value = value.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Long value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue)) {
this.value = value.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Float value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue) && (value % 1 == 0)) {
this.value = value.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(Double value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue) && (value % 1 == 0)) {
this.value = value.shortValue();
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(BigInteger value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = true;
+ /*
if ((value.compareTo(BigInteger.valueOf(minValue)) >= 0) && (value.compareTo(BigInteger.valueOf(maxValue)) <= 0)) {
this.value = value.shortValue();
this.isNullable = true;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(BigDecimal value) {
super();
+ this.value = value.shortValue();
+ this.isNullable = true;
+ /*
if ((value.compareTo(BigDecimal.valueOf(minValue)) >= 0) && (value.compareTo(BigDecimal.valueOf(maxValue)) <= 0) && (value.scale() <= 0)) {
this.value = value.shortValue();
this.isNullable = true;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
public PlcCHAR(String value) {
@@ -169,12 +207,15 @@ public class PlcCHAR extends PlcIECValue<Short> {
s = " ";
}
short val = (short) s.charAt(0);
+ this.isNullable = false;
+ /*
if ((val >= minValue) && (val <= maxValue)) {
this.value = val;
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
} catch (Exception e) {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
@@ -183,12 +224,16 @@ public class PlcCHAR extends PlcIECValue<Short> {
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public PlcCHAR(@JsonProperty("value") short value) {
super();
+ this.value = value;
+ this.isNullable = false;
+ /*
if ((value >= minValue) && (value <= maxValue)) {
this.value = value;
this.isNullable = false;
} else {
throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName()));
}
+ */
}
@Override
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
index 03863dd3b0..3498ee73fe 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
@@ -30,6 +30,8 @@ import org.apache.plc4x.java.spi.generation.WriteBuffer;
import java.nio.charset.StandardCharsets;
import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
public class PlcDATE_AND_TIME extends PlcSimpleValue<LocalDateTime> {
@@ -41,6 +43,37 @@ public class PlcDATE_AND_TIME extends PlcSimpleValue<LocalDateTime> {
return new PlcDATE_AND_TIME(LocalDateTime.ofInstant(
Instant.ofEpochSecond((long) value), ZoneId.systemDefault()));
}
+ if (value instanceof Instant) {
+ return new PlcDATE_AND_TIME(((Instant) value).toEpochMilli());
+ }
+ if (value instanceof LocalDate) {
+ return new PlcDATE_AND_TIME(((LocalDate) value).atStartOfDay(ZoneId.of("UTC")).toLocalDateTime());
+ } else if (value instanceof String) {
+ String strValue = (String) value;
+ LocalDateTime date;
+ try {
+ date = LocalDateTime.parse(strValue);
+ } catch (DateTimeParseException e) {
+ try {
+ date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ } catch (DateTimeParseException e1) {
+ try {
+ date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));
+ } catch (DateTimeParseException e2) {
+ try {
+ date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ } catch (DateTimeParseException e3) {
+ try {
+ date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ } catch (DateTimeParseException e4) {
+ date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyyMMdd"));
+ }
+ }
+ }
+ }
+ }
+ return new PlcDATE_AND_TIME(date);
+ }
throw new PlcRuntimeException("Invalid value type");
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
index 5bedf773f1..8f689d9731 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
@@ -56,6 +56,8 @@ public class PlcDINT extends PlcIECValue<Integer> {
return new PlcDINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcDINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcDINT(((Number) value).intValue());
} else {
return new PlcDINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
index b3649f686c..94b973d37a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
@@ -57,6 +57,8 @@ public class PlcDWORD extends PlcIECValue<Long> {
return new PlcDWORD((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcDWORD((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcDWORD(((Number) value).longValue());
} else {
return new PlcDWORD((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
index eafd49ba48..1286f40c0d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
@@ -56,6 +56,8 @@ public class PlcINT extends PlcIECValue<Short> {
return new PlcINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcINT(((Number) value).intValue());
} else {
return new PlcINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
index dcdea8c6de..1f787b7fe8 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
@@ -56,6 +56,8 @@ public class PlcLINT extends PlcIECValue<Long> {
return new PlcLINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcLINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcLINT(((Number) value).intValue());
} else {
return new PlcLINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
index 23d6cc8f75..2938b02939 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
@@ -56,6 +56,8 @@ public class PlcLREAL extends PlcIECValue<Double> {
return new PlcLREAL((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcLREAL((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcLREAL(((Number) value).doubleValue());
} else {
return new PlcLREAL((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
index 60502992ce..2cecf53ac0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
@@ -28,9 +28,12 @@ import org.apache.plc4x.java.spi.codegen.WithOption;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
+import java.time.Period;
+import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -46,6 +49,19 @@ public class PlcLTIME extends PlcSimpleValue<Duration> {
} else if(value instanceof BigInteger) {
// TODO: Not 100% correct, we're loosing precision here
return new PlcLTIME(Duration.of(((BigInteger) value).longValue(), ChronoUnit.NANOS));
+ } else if (value instanceof Number) {
+ return new PlcLTIME(((Number) value).longValue());
+ } else if (value instanceof String) {
+ try {
+ return new PlcLTIME(Duration.parse((String) value));
+ } catch (DateTimeParseException e) {
+ try {
+ return new PlcLTIME(Period.parse((String) value).get(ChronoUnit.NANOS));
+ }catch (DateTimeParseException e1)
+ {
+ return new PlcLTIME(new BigDecimal((String) value).longValue());
+ }
+ }
}
throw new PlcRuntimeException("Invalid value type");
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
index e4959ec3c9..c5c941853a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
@@ -55,6 +55,8 @@ public class PlcLWORD extends PlcIECValue<BigInteger> {
return new PlcLWORD((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcLWORD((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcLWORD(((Number) value).longValue());
} else {
return new PlcLWORD((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
index 96c067d467..99842a9ae5 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
@@ -56,6 +56,8 @@ public class PlcSINT extends PlcIECValue<Byte> {
return new PlcSINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcSINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcSINT(((Number) value).longValue());
} else {
return new PlcSINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
index 23fb48004e..90482c3b9a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
@@ -28,8 +28,11 @@ import org.apache.plc4x.java.spi.codegen.WithOption;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
+import java.time.Period;
+import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -42,6 +45,19 @@ public class PlcTIME extends PlcSimpleValue<Duration> {
return new PlcTIME(Duration.of((long) value, ChronoUnit.MILLIS));
} else if (value instanceof Long) {
return new PlcTIME(Duration.of((long) value, ChronoUnit.MILLIS));
+ } else if (value instanceof Number) {
+ return new PlcTIME(((Number) value).longValue());
+ } else if (value instanceof String) {
+ try {
+ return new PlcTIME(Duration.parse((String) value));
+ } catch (DateTimeParseException e) {
+ try {
+ return new PlcTIME(Period.parse((String) value).get(ChronoUnit.MILLIS));
+ }catch (DateTimeParseException e1)
+ {
+ return new PlcTIME(new BigDecimal((String) value).longValue());
+ }
+ }
}
throw new PlcRuntimeException("Invalid value type");
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
index 17aae62d54..551d511b66 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
@@ -29,7 +29,9 @@ import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
import java.nio.charset.StandardCharsets;
+import java.time.Instant;
import java.time.LocalTime;
+import java.time.ZoneId;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
public class PlcTIME_OF_DAY extends PlcSimpleValue<LocalTime> {
@@ -39,6 +41,8 @@ public class PlcTIME_OF_DAY extends PlcSimpleValue<LocalTime> {
return new PlcTIME_OF_DAY((LocalTime) value);
} else if(value instanceof Long) {
return new PlcTIME_OF_DAY((Long) value);
+ } else if (value instanceof Number) {
+ return new PlcTIME_OF_DAY(((Number) value).longValue());
}
throw new PlcRuntimeException("Invalid value type");
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
index e93a1cc45f..2eb2ec45da 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
@@ -56,6 +56,8 @@ public class PlcUDINT extends PlcIECValue<Long> {
return new PlcUDINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcUDINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcUDINT(((Number) value).longValue());
} else {
return new PlcUDINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
index e1561e004f..6e43ca5732 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
@@ -56,6 +56,8 @@ public class PlcUINT extends PlcIECValue<Integer> {
return new PlcUINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcUINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcUINT(((Number) value).longValue());
} else {
return new PlcUINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
index 8a951fb774..f24daba875 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
@@ -54,6 +54,8 @@ public class PlcULINT extends PlcIECValue<BigInteger> {
return new PlcULINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcULINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcULINT(((Number) value).longValue());
} else {
return new PlcULINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
index 6a5a076e2a..ab4cf79e9d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
@@ -56,6 +56,8 @@ public class PlcUSINT extends PlcIECValue<Short> {
return new PlcUSINT((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcUSINT((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcUSINT(((Number) value).intValue());
} else {
return new PlcUSINT((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java
index d1691f051b..1d22cc4352 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java
@@ -18,17 +18,23 @@
*/
package org.apache.plc4x.java.spi.values;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException;
import org.apache.plc4x.java.api.model.PlcTag;
import org.apache.plc4x.java.api.value.PlcValue;
+import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
+import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValueHandler {
@@ -58,6 +64,15 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
public static PlcValue of(Object[] values) {
if (values.length != 1) {
+ Object vo = ((Object[]) values)[0];
+ if (vo instanceof PlcCHAR) {
+ String v = Arrays.stream(values).map(Objects::toString).collect(Collectors.joining());
+ return PlcSTRING.of(v);
+ }
+ if (vo instanceof PlcWCHAR) {
+ String v = Arrays.stream(values).map(Objects::toString).collect(Collectors.joining());
+ return PlcSTRING.of(v);
+ }
PlcList list = new PlcList();
for (Object value : values) {
list.add(of(new Object[]{value}));
@@ -83,6 +98,16 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
if (value instanceof Long) {
return PlcLINT.of(value);
}
+ if (value instanceof BigInteger) {
+ try {
+ return new PlcLINT((BigInteger) value);
+ }catch (PlcInvalidTagException e) {
+ return new PlcULINT((BigInteger) value);
+ }
+ }
+ if (value instanceof BigDecimal) {
+ return new PlcLINT((BigDecimal) value);
+ }
if (value instanceof Float) {
return PlcREAL.of(value);
}
@@ -116,13 +141,12 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
return of(tag, new Object[]{value});
}
-
public static PlcValue of(PlcTag tag, Object[] values) {
if (values.length == 1) {
Object value = values[0];
- if(tag.getPlcValueType() == null) {
+ if (tag.getPlcValueType() == null) {
// TODO: This is a hacky shortcut ..
- if(value instanceof PlcValue) {
+ if (value instanceof PlcValue) {
return (PlcValue) value;
}
return new PlcNull();
@@ -131,16 +155,14 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
case BOOL:
return PlcBOOL.of(value);
case BYTE:
- if(value instanceof Short) {
- return new PlcBYTE((short) value);
- } else if(value instanceof Integer) {
- return new PlcBYTE(((Integer) value).shortValue());
- } else if(value instanceof Long) {
- return new PlcBYTE(((Long) value).shortValue());
- } else if(value instanceof BigInteger) {
- return new PlcBYTE(((BigInteger) value).shortValue());
+ if (tag.getNumberOfElements() > 1) {
+ if (value instanceof byte[]) {
+ return of(tag, ArrayUtils.toObject((byte[]) value));
+ } else if (value instanceof String && ((String) value).contains(",")) {
+ return of(tag, stringToByteArray((String) value));
+ }
}
- throw new PlcRuntimeException("BYTE requires short");
+ return PlcBYTE.of(value);
case SINT:
return PlcSINT.of(value);
case USINT:
@@ -150,13 +172,13 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
case UINT:
return PlcUINT.of(value);
case WORD:
- if(value instanceof Short) {
+ if (value instanceof Short) {
return new PlcWORD((int) value);
- } else if(value instanceof Integer) {
+ } else if (value instanceof Integer) {
return new PlcWORD((int) value);
- } else if(value instanceof Long) {
+ } else if (value instanceof Long) {
return new PlcWORD(((Long) value).intValue());
- } else if(value instanceof BigInteger) {
+ } else if (value instanceof BigInteger) {
return new PlcWORD(((BigInteger) value).intValue());
}
throw new PlcRuntimeException("WORD requires int");
@@ -165,13 +187,13 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
case UDINT:
return PlcUDINT.of(value);
case DWORD:
- if(value instanceof Short) {
+ if (value instanceof Short) {
return new PlcDWORD((long) value);
- } else if(value instanceof Integer) {
+ } else if (value instanceof Integer) {
return new PlcDWORD((long) value);
- } else if(value instanceof Long) {
+ } else if (value instanceof Long) {
return new PlcDWORD((long) value);
- } else if(value instanceof BigInteger) {
+ } else if (value instanceof BigInteger) {
return new PlcDWORD(((BigInteger) value).longValue());
}
throw new PlcRuntimeException("DWORD requires long");
@@ -180,13 +202,13 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
case ULINT:
return PlcULINT.of(value);
case LWORD:
- if(value instanceof Short) {
+ if (value instanceof Short) {
return new PlcLWORD(BigInteger.valueOf((long) value));
- } else if(value instanceof Integer) {
+ } else if (value instanceof Integer) {
return new PlcLWORD(BigInteger.valueOf((long) value));
- } else if(value instanceof Long) {
+ } else if (value instanceof Long) {
return new PlcLWORD(BigInteger.valueOf((long) value));
- } else if(value instanceof BigInteger) {
+ } else if (value instanceof BigInteger) {
return new PlcLWORD((BigInteger) value);
}
throw new PlcRuntimeException("LWORD requires BigInteger");
@@ -225,4 +247,15 @@ public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValue
public static PlcValue customDataType(Object[] values) {
return of(values);
}
+
+ private static byte[] stringToByteArray(String stringBytes) {
+ String[] byteValues = stringBytes.substring(1, stringBytes.length() - 1).split(",");
+ byte[] bytes = new byte[byteValues.length];
+
+ for (int i = 0, len = bytes.length; i < len; i++) {
+ int intvalue = Integer.parseInt(byteValues[i].trim());
+ bytes[i] = (byte) (intvalue & 0xff);
+ }
+ return bytes;
+ }
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
index 927cc2b348..9bfabd9e90 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
@@ -58,6 +58,8 @@ public class PlcWCHAR extends PlcIECValue<Integer> {
return new PlcWCHAR((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcWCHAR((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcWCHAR(((Number) value).intValue());
} else {
return new PlcWCHAR((String) value);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
index dcebcb8e8d..b4ace8ebc0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
@@ -57,6 +57,8 @@ public class PlcWORD extends PlcIECValue<Integer> {
return new PlcWORD((BigInteger) value);
} else if (value instanceof BigDecimal) {
return new PlcWORD((BigDecimal) value);
+ } else if (value instanceof Number) {
+ return new PlcWORD(((Number) value).longValue());
} else {
return new PlcWORD((String) value);
}
diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java
index 3b360c3b91..4ac51ce8e9 100644
--- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java
+++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java
@@ -90,8 +90,8 @@ class Plc4xNettyWrapperTest {
Thread.sleep(750);
- verify(false, false, false);
- wrapper.decode(channelHandlerContext, new Date(), new ArrayList<>());
+ //verify(false, false, false);
+ //wrapper.decode(channelHandlerContext, new Date(), new ArrayList<>());
verify(true, false, false);
}
diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java
index 186b358ce0..a8aabcc76d 100644
--- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java
+++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class RequestTransactionManagerTest {
@@ -124,11 +124,10 @@ public class RequestTransactionManagerTest {
}
@Test
- @Disabled("This test is randomly failing on Jenkins")
+ //@Disabled("This test is randomly failing on Jenkins")
public void abortTransactionFromExternally() throws ExecutionException, InterruptedException {
CompletableFuture<Void> sendRequest = new CompletableFuture<>();
CompletableFuture<Void> receiveResponse = new CompletableFuture<>();
- CompletableFuture<Void> transactionIsFinished = new CompletableFuture<>();
RequestTransactionManager tm = new RequestTransactionManager();
RequestTransactionManager.RequestTransaction handle = tm.startRequest();
@@ -136,10 +135,16 @@ public class RequestTransactionManagerTest {
// ...
sendRequest.complete(null);
// Receive
- receiveResponse.thenAccept((n) -> {
- handle.endRequest();
- transactionIsFinished.complete(null);
+ receiveResponse.whenComplete((n,e) -> {
+ // never execute
+ fail();
});
+ //Wait that the fail is handled internally surely and then interrupt this block execute
+ try {
+ receiveResponse.get();
+ } catch (Exception e) {
+ assertInstanceOf(InterruptedException.class,e);
+ }
});
// Assert that there is a request going on
@@ -149,13 +154,14 @@ public class RequestTransactionManagerTest {
handle.failRequest(new RuntimeException());
// Wait that the fail is handled internally surely
- Thread.sleep(100);
+ //Thread.sleep(100);
// Assert that no requests are active
assertEquals(0, tm.getNumberOfActiveRequests());
// Assert that its cancelled
assertTrue(handle.getCompletionFuture().isCancelled());
+ assertFalse(receiveResponse.isDone());
}
private void sendRequest(RequestTransactionManager tm, CompletableFuture<Void> sendRequest, CompletableFuture<Void> endRequest, CompletableFuture<Void> requestIsEnded) {
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
index 650d976c85..ae30a14d4c 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.utils.cache;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.PlcConnectionManager;
+import org.apache.plc4x.java.api.PlcDriverManager;
import org.apache.plc4x.java.api.authentication.PlcAuthentication;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.slf4j.Logger;
@@ -58,17 +59,26 @@ public class CachedPlcConnectionManager implements PlcConnectionManager {
this.connectionContainers = new HashMap<>();
}
+ @Override
public PlcConnection getConnection(String url) throws PlcConnectionException {
+ return getConnection(url,null);
+ }
+
+ @Override
+ public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException {
ConnectionContainer connectionContainer;
synchronized (connectionContainers) {
connectionContainer = connectionContainers.get(url);
- if (connectionContainers.get(url) == null) {
+ if (connectionContainer == null) {
LOG.debug("Creating new connection");
// Establish the real connection to the plc
- PlcConnection connection = connectionManager.getConnection(url);
-
- // Crate a connection container to manage handling this connection
+ PlcConnection connection;
+ if(authentication!=null) {
+ connection = connectionManager.getConnection(url,authentication);
+ } else{
+ connection = connectionManager.getConnection(url);
+ }
connectionContainer = new ConnectionContainer(connection, maxLeaseTime);
connectionContainers.put(url, connectionContainer);
} else {
@@ -85,8 +95,9 @@ public class CachedPlcConnectionManager implements PlcConnectionManager {
}
}
- public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException {
- throw new PlcConnectionException("the cached driver manager currently doesn't support authentication");
+ @Override
+ public PlcDriverManager getDriverManager() {
+ return connectionManager.getDriverManager();
}
public static class Builder {
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java
index 662dd294c4..7dcbd42d64 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java
@@ -34,13 +34,13 @@ import java.util.concurrent.CompletableFuture;
public class LeasedPlcConnection implements PlcConnection {
- private final ConnectionContainer connectionContainer;
+ private ConnectionContainer connectionContainer;
private PlcConnection connection;
-
+ private Timer usageTimer;
public LeasedPlcConnection(ConnectionContainer connectionContainer, PlcConnection connection, Duration maxUseTime) {
this.connectionContainer = connectionContainer;
this.connection = connection;
- Timer usageTimer = new Timer();
+ usageTimer = new Timer();
usageTimer.schedule(new TimerTask() {
@Override
public void run() {
@@ -51,11 +51,18 @@ public class LeasedPlcConnection implements PlcConnection {
@Override
public synchronized void close() {
- // Make the connection unusable.
- connection = null;
-
+ if(usageTimer != null){
+ usageTimer.cancel();
+ usageTimer = null;
+ }
+ if(connectionContainer == null) {
+ return;
+ }
// Tell the connection container that the connection is free to be reused.
connectionContainer.returnConnection(this);
+ // Make the connection unusable.
+ connection = null;
+ connectionContainer = null;
}
@Override
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
index 6d856ea448..07c90775b6 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java
@@ -158,6 +158,24 @@ public class Plc4xValue {
String value = /*TODO: migrate me*/ /*TODO: migrate me*/
readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+ return new PlcSTRING(value);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString(
+ readBuffer, "UTF-8"));
+
+ return new PlcSTRING(value);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+
+ // Manual Field (value)
+ String value =
+ (String)
+ (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString(
+ readBuffer, "UTF-16"));
+
return new PlcSTRING(value);
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
@@ -325,6 +343,14 @@ public class Plc4xValue {
/*TODO: migrate me*/
/*TODO: migrate me*/ writeBuffer.writeString(
"", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+ // Manual Field (value)
+ org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString(
+ writeBuffer, _value, "UTF-8");
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+ // Manual Field (value)
+ org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString(
+ writeBuffer, _value, "UTF-16");
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
// Simple Field (milliseconds)
long milliseconds = (long) _value.getLong();
@@ -436,6 +462,12 @@ public class Plc4xValue {
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.WCHAR)) { // STRING
// Simple Field (value)
sizeInBits += 16;
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING
+ // Manual Field (value)
+ sizeInBits += (((STR_LEN(_value)) + (1))) * (8);
+ } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING
+ // Manual Field (value)
+ sizeInBits += (((STR_LEN(_value)) + (1))) * (16);
} else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME
// Simple Field (milliseconds)
sizeInBits += 32;
diff --git a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java
new file mode 100644
index 0000000000..6ef16fd01c
--- /dev/null
+++ b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.plc4x.readwrite.utils;
+
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.SerializationException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+
+import java.nio.charset.StandardCharsets;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class StaticHelper {
+
+ public static String parseString(ReadBuffer io, String encoding) {
+ try {
+ if ("UTF-8".equalsIgnoreCase(encoding)) {
+ // This is the maximum number of bytes a string can be long.
+ short stringLength = io.readUnsignedShort(8);
+ // This is the total length of the string on the PLC (Not necessarily the number of characters read)
+ final byte[] byteArray = new byte[stringLength];
+ for (int i = 0; (i < stringLength) && io.hasMore(8); i++) {
+ final byte curByte = io.readByte();
+ byteArray[i] = curByte;
+ }
+ return new String(byteArray, StandardCharsets.UTF_8);
+ } else if ("UTF-16".equalsIgnoreCase(encoding)) {
+ // This is the maximum number of bytes a string can be long.
+ int stringLength = io.readUnsignedInt(16);
+ final byte[] byteArray = new byte[stringLength * 2];
+ for (int i = 0; (i < stringLength) && io.hasMore(16); i++) {
+ final short curShort = io.readShort(16);
+ byteArray[i * 2] = (byte) (curShort >>> 8);
+ byteArray[(i * 2) + 1] = (byte) (curShort & 0xFF);
+ }
+ return new String(byteArray, StandardCharsets.UTF_16);
+ } else {
+ throw new PlcRuntimeException("Unsupported string encoding " + encoding);
+ }
+ } catch (ParseException e) {
+ throw new PlcRuntimeException("Error parsing string", e);
+ }
+ }
+ public static void serializeString(WriteBuffer io, PlcValue value, String encoding) {
+ String valueString = value.getString();
+ valueString = valueString == null ? "" : valueString;
+
+ if ("UTF-8".equalsIgnoreCase(encoding)) {
+ final byte[] raw = valueString.getBytes(StandardCharsets.UTF_8);
+ try {
+ io.writeByte((byte) raw.length);
+ for (byte b : raw) {
+ io.writeByte(b);
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else if ("UTF-16".equalsIgnoreCase(encoding)) {
+ final byte[] raw = valueString.getBytes(StandardCharsets.UTF_16);
+ try {
+ io.writeUnsignedInt(16, raw.length);
+ for (int i = 0; i < raw.length; i++) {
+ io.writeByte( raw[i]);
+ }
+ }
+ catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else {
+ throw new PlcRuntimeException("Unsupported string encoding " + encoding);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
index 7194b24ffc..f410a2f9c9 100644
--- a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
+++ b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
@@ -57,7 +57,8 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof Plc4xMessage) {
final Plc4xMessage plc4xMessage = (Plc4xMessage) msg;
- switch (plc4xMessage.getRequestType()) {
+ Plc4xRequestType plc4xRequestType = plc4xMessage.getRequestType();
+ switch (plc4xRequestType) {
case CONNECT_REQUEST: {
Plc4xConnectRequest request = (Plc4xConnectRequest) plc4xMessage;
try (final PlcConnection ignored = connectionManager.getConnection(request.getConnectionString())) {
@@ -169,6 +170,8 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
ctx.writeAndFlush(response);
}
break;
+ default:
+ logger.error("Error executing plc4xRequestType: {}", plc4xRequestType);
}
}
}
diff --git a/plc4j/transports/pom.xml b/plc4j/transports/pom.xml
index 04a8ddfb94..60fe78f266 100644
--- a/plc4j/transports/pom.xml
+++ b/plc4j/transports/pom.xml
@@ -45,5 +45,19 @@
<module>virtualcan</module>
<module>test</module>
</modules>
-
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <SPI-Provider>
+ *
+ </SPI-Provider>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
\ No newline at end of file
diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
index 1fc1bedf39..efb79bc962 100644
--- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
+++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
@@ -100,11 +100,11 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
// Prepare a response and send it back to the remote.
List<COTPParameter> parameters = new ArrayList<>();
- parameters.add(new COTPParameterCalledTsap(remoteTsapId, (short) 0));
- parameters.add(new COTPParameterCallingTsap(localTsapId, (short) 0));
- parameters.add(new COTPParameterTpduSize(tpduSize, (short) 0));
+ parameters.add(new COTPParameterCalledTsap(remoteTsapId));
+ parameters.add(new COTPParameterCallingTsap(localTsapId));
+ parameters.add(new COTPParameterTpduSize(tpduSize));
COTPPacketConnectionResponse response = new COTPPacketConnectionResponse(
- parameters, null, remoteReference, localReference, protocolClass, 0
+ parameters, null, remoteReference, localReference, protocolClass
);
ctx.writeAndFlush(new TPKTPacket(response));
@@ -143,7 +143,7 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
// TODO should send S7MessageResponseData
S7MessageResponseData s7MessageResponse = new S7MessageResponseData(
s7TpduReference, s7ParameterSetupCommunicationResponse, null, (short) 0, (short) 0);
- ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7MessageResponse, true, cotpTpduRef, 0)));
+ ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7MessageResponse, true, cotpTpduRef)));
state = State.S7_CONNECTED;
break;
@@ -204,11 +204,11 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
List<S7PayloadUserDataItem> responsePayloadItems = new ArrayList<>();
responsePayloadItems.add(readSzlResponsePayload);
S7PayloadUserData responsePayloadUserData =
- new S7PayloadUserData(responsePayloadItems, null);
+ new S7PayloadUserData(responsePayloadItems);
S7Message s7ResponseMessage = new S7MessageUserData(s7TpduReference,
responseParameterUserData, responsePayloadUserData);
- ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7ResponseMessage, true, cotpTpduRef, 0)));
+ ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7ResponseMessage, true, cotpTpduRef)));
} else {
LOGGER.error("Not able to respond to the given request Read SZL with SZL type class " +
szlId.getTypeClass().name() + " and SZL sublist " + szlId.getSublistList().name());
@@ -254,7 +254,7 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
final byte bitAddress = addressAny.getBitAddress();
switch (addressAny.getTransportSize()) {
case BOOL:
- payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1} , true));
+ payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1}));
break;
case INT:
case UINT: {
@@ -264,7 +264,7 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
byte[] data = new byte[2];
data[1] = (byte) (shortValue & 0xff);
data[0] = (byte) ((shortValue >> 8) & 0xff);
- payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data , true));
+ payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data));
break;
}
default: {
@@ -280,7 +280,7 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
addressAny.getNumberOfElements() : addressAny.getTransportSize().getSizeInBytes() * 8;
final BitSet bitSet = toBitSet(context.getDigitalInputs(), ioNumber, numElements);
final byte[] data = Arrays.copyOf(bitSet.toByteArray(), (numElements + 7) / 8);
- payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data , true));
+ payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data));
break;
}
}
@@ -288,10 +288,10 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
}
}
S7ParameterReadVarResponse readVarResponseParameter = new S7ParameterReadVarResponse((short) items.size());
- S7PayloadReadVarResponse readVarResponsePayload = new S7PayloadReadVarResponse(payloadItems, null);
+ S7PayloadReadVarResponse readVarResponsePayload = new S7PayloadReadVarResponse(payloadItems);
S7MessageResponseData response = new S7MessageResponseData(request.getTpduReference(),
readVarResponseParameter, readVarResponsePayload, (short) 0x00, (short) 0x00);
- ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, response, true, cotpTpduRef, 0)));
+ ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, response, true, cotpTpduRef)));
} else if (request.getParameter() instanceof S7ParameterWriteVarRequest) {
S7ParameterWriteVarRequest writeVarRequestParameter =
(S7ParameterWriteVarRequest) request.getParameter();
diff --git a/pom.xml b/pom.xml
index cb1e177863..55477ffa75 100644
--- a/pom.xml
+++ b/pom.xml
@@ -107,7 +107,7 @@
<awaitility.version>4.2.0</awaitility.version>
<!-- The currently available version is 2.0.5 and anything above 1.4.3 is no longer compatible with our code -->
<bit-io.version>1.4.3</bit-io.version>
- <bouncycastle.version>1.70</bouncycastle.version>
+ <bouncycastle.version>1.71</bouncycastle.version>
<byte-buddy.version>1.12.22</byte-buddy.version>
<!-- Be sure to keep this version set to the version of the cmake-maven-plugin -->
<cmake-version>3.22.1</cmake-version>
@@ -475,17 +475,17 @@
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcmail-jdk15on</artifactId>
+ <artifactId>bcmail-jdk18on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcpkix-jdk15on</artifactId>
+ <artifactId>bcpkix-jdk18on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15on</artifactId>
+ <artifactId>bcprov-jdk18on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
@@ -509,6 +509,16 @@
<groupId>org.eclipse.milo</groupId>
<artifactId>stack-core</artifactId>
<version>${milo.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk15on</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcpkix-jdk15on</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.milo</groupId>
diff --git a/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv b/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv
new file mode 100644
index 0000000000..c98a20b083
--- /dev/null
+++ b/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv
@@ -0,0 +1,1749 @@
+AccessLevelExType,15406,DataType
+AccessLevelType,15031,DataType
+AccessRestrictionType,95,DataType
+AcknowledgeableConditionType,2881,ObjectType
+ActivateSessionRequest,465,DataType
+ActivateSessionRequest_Encoding_DefaultBinary,467,Object
+ActivateSessionRequest_Encoding_DefaultJson,15145,Object
+ActivateSessionRequest_Encoding_DefaultXml,466,Object
+ActivateSessionResponse,468,DataType
+ActivateSessionResponse_Encoding_DefaultBinary,470,Object
+ActivateSessionResponse_Encoding_DefaultJson,15146,Object
+ActivateSessionResponse_Encoding_DefaultXml,469,Object
+AdditionalParametersType,16313,DataType
+AdditionalParametersType_Encoding_DefaultBinary,17537,Object
+AdditionalParametersType_Encoding_DefaultJson,17547,Object
+AdditionalParametersType_Encoding_DefaultXml,17541,Object
+AddNodesItem,376,DataType
+AddNodesItem_Encoding_DefaultBinary,378,Object
+AddNodesItem_Encoding_DefaultJson,15165,Object
+AddNodesItem_Encoding_DefaultXml,377,Object
+AddNodesRequest,486,DataType
+AddNodesRequest_Encoding_DefaultBinary,488,Object
+AddNodesRequest_Encoding_DefaultJson,15167,Object
+AddNodesRequest_Encoding_DefaultXml,487,Object
+AddNodesResponse,489,DataType
+AddNodesResponse_Encoding_DefaultBinary,491,Object
+AddNodesResponse_Encoding_DefaultJson,15168,Object
+AddNodesResponse_Encoding_DefaultXml,490,Object
+AddNodesResult,483,DataType
+AddNodesResult_Encoding_DefaultBinary,485,Object
+AddNodesResult_Encoding_DefaultJson,15166,Object
+AddNodesResult_Encoding_DefaultXml,484,Object
+AddReferencesItem,379,DataType
+AddReferencesItem_Encoding_DefaultBinary,381,Object
+AddReferencesItem_Encoding_DefaultJson,15169,Object
+AddReferencesItem_Encoding_DefaultXml,380,Object
+AddReferencesRequest,492,DataType
+AddReferencesRequest_Encoding_DefaultBinary,494,Object
+AddReferencesRequest_Encoding_DefaultJson,15170,Object
+AddReferencesRequest_Encoding_DefaultXml,493,Object
+AddReferencesResponse,495,DataType
+AddReferencesResponse_Encoding_DefaultBinary,497,Object
+AddReferencesResponse_Encoding_DefaultJson,15171,Object
+AddReferencesResponse_Encoding_DefaultXml,496,Object
+AddressSpaceFileType,11595,ObjectType
+AggregateConfiguration,948,DataType
+AggregateConfiguration_Encoding_DefaultBinary,950,Object
+AggregateConfiguration_Encoding_DefaultJson,15304,Object
+AggregateConfiguration_Encoding_DefaultXml,949,Object
+AggregateConfigurationType,11187,ObjectType
+AggregateFilter,728,DataType
+AggregateFilter_Encoding_DefaultBinary,730,Object
+AggregateFilter_Encoding_DefaultJson,15312,Object
+AggregateFilter_Encoding_DefaultXml,729,Object
+AggregateFilterResult,737,DataType
+AggregateFilterResult_Encoding_DefaultBinary,739,Object
+AggregateFilterResult_Encoding_DefaultJson,15315,Object
+AggregateFilterResult_Encoding_DefaultXml,738,Object
+AggregateFunction_AnnotationCount,2351,Object
+AggregateFunction_Average,2342,Object
+AggregateFunction_Count,2352,Object
+AggregateFunction_Delta,2359,Object
+AggregateFunction_DeltaBounds,11507,Object
+AggregateFunction_DurationBad,2361,Object
+AggregateFunction_DurationGood,2360,Object
+AggregateFunction_DurationInStateNonZero,11308,Object
+AggregateFunction_DurationInStateZero,11307,Object
+AggregateFunction_End,2358,Object
+AggregateFunction_EndBound,11506,Object
+AggregateFunction_Interpolative,2341,Object
+AggregateFunction_Maximum,2347,Object
+AggregateFunction_Maximum2,11287,Object
+AggregateFunction_MaximumActualTime,2349,Object
+AggregateFunction_MaximumActualTime2,11306,Object
+AggregateFunction_Minimum,2346,Object
+AggregateFunction_Minimum2,11286,Object
+AggregateFunction_MinimumActualTime,2348,Object
+AggregateFunction_MinimumActualTime2,11305,Object
+AggregateFunction_NumberOfTransitions,2355,Object
+AggregateFunction_PercentBad,2363,Object
+AggregateFunction_PercentGood,2362,Object
+AggregateFunction_Range,2350,Object
+AggregateFunction_Range2,11288,Object
+AggregateFunction_StandardDeviationPopulation,11427,Object
+AggregateFunction_StandardDeviationSample,11426,Object
+AggregateFunction_Start,2357,Object
+AggregateFunction_StartBound,11505,Object
+AggregateFunction_TimeAverage,2343,Object
+AggregateFunction_TimeAverage2,11285,Object
+AggregateFunction_Total,2344,Object
+AggregateFunction_Total2,11304,Object
+AggregateFunction_VariancePopulation,11429,Object
+AggregateFunction_VarianceSample,11428,Object
+AggregateFunction_WorstQuality,2364,Object
+AggregateFunction_WorstQuality2,11292,Object
+AggregateFunctionType,2340,ObjectType
+Aggregates,44,ReferenceType
+AlarmConditionType,2915,ObjectType
+AlarmGroupMember,16362,ReferenceType
+AlarmGroupType,16405,ObjectType
+AlarmMetricsType,17279,ObjectType
+AlarmRateVariableType,17277,VariableType
+Aliases,23470,Object
+AliasFor,23469,ReferenceType
+AliasNameCategoryType,23456,ObjectType
+AliasNameDataType,23468,DataType
+AliasNameDataType_Encoding_DefaultBinary,23499,Object
+AliasNameDataType_Encoding_DefaultJson,23511,Object
+AliasNameDataType_Encoding_DefaultXml,23505,Object
+AliasNameType,23455,ObjectType
+AllowNulls,3070,Variable
+AlwaysGeneratesEvent,3065,ReferenceType
+AnalogItemType,2368,VariableType
+AnalogUnitRangeType,17570,VariableType
+AnalogUnitType,17497,VariableType
+Annotation,891,DataType
+Annotation_Encoding_DefaultBinary,893,Object
+Annotation_Encoding_DefaultJson,15382,Object
+Annotation_Encoding_DefaultXml,892,Object
+Annotations,11214,Variable
+AnonymousIdentityToken,319,DataType
+AnonymousIdentityToken_Encoding_DefaultBinary,321,Object
+AnonymousIdentityToken_Encoding_DefaultJson,15141,Object
+AnonymousIdentityToken_Encoding_DefaultXml,320,Object
+ApplicationCertificateType,12557,ObjectType
+ApplicationDescription,308,DataType
+ApplicationDescription_Encoding_DefaultBinary,310,Object
+ApplicationDescription_Encoding_DefaultJson,15087,Object
+ApplicationDescription_Encoding_DefaultXml,309,Object
+ApplicationInstanceCertificate,311,DataType
+ApplicationType,307,DataType
+Argument,296,DataType
+Argument_Encoding_DefaultBinary,298,Object
+Argument_Encoding_DefaultJson,15081,Object
+Argument_Encoding_DefaultXml,297,Object
+ArrayItemType,12021,VariableType
+AttributeOperand,598,DataType
+AttributeOperand_Encoding_DefaultBinary,600,Object
+AttributeOperand_Encoding_DefaultJson,15209,Object
+AttributeOperand_Encoding_DefaultXml,599,Object
+AttributeWriteMask,347,DataType
+AudioDataType,16307,DataType
+AudioVariableType,17986,VariableType
+AuditActivateSessionEventType,2075,ObjectType
+AuditAddNodesEventType,2091,ObjectType
+AuditAddReferencesEventType,2095,ObjectType
+AuditCancelEventType,2078,ObjectType
+AuditCertificateDataMismatchEventType,2082,ObjectType
+AuditCertificateEventType,2080,ObjectType
+AuditCertificateExpiredEventType,2085,ObjectType
+AuditCertificateInvalidEventType,2086,ObjectType
+AuditCertificateMismatchEventType,2089,ObjectType
+AuditCertificateRevokedEventType,2088,ObjectType
+AuditCertificateUntrustedEventType,2087,ObjectType
+AuditChannelEventType,2059,ObjectType
+AuditConditionAcknowledgeEventType,8944,ObjectType
+AuditConditionCommentEventType,2829,ObjectType
+AuditConditionConfirmEventType,8961,ObjectType
+AuditConditionEnableEventType,2803,ObjectType
+AuditConditionEventType,2790,ObjectType
+AuditConditionOutOfServiceEventType,17259,ObjectType
+AuditConditionResetEventType,15013,ObjectType
+AuditConditionRespondEventType,8927,ObjectType
+AuditConditionShelvingEventType,11093,ObjectType
+AuditConditionSilenceEventType,17242,ObjectType
+AuditConditionSuppressionEventType,17225,ObjectType
+AuditCreateSessionEventType,2071,ObjectType
+AuditDeleteNodesEventType,2093,ObjectType
+AuditDeleteReferencesEventType,2097,ObjectType
+AuditEventType,2052,ObjectType
+AuditHistoryAnnotationUpdateEventType,19095,ObjectType
+AuditHistoryAtTimeDeleteEventType,3019,ObjectType
+AuditHistoryDeleteEventType,3012,ObjectType
+AuditHistoryEventDeleteEventType,3022,ObjectType
+AuditHistoryEventUpdateEventType,2999,ObjectType
+AuditHistoryRawModifyDeleteEventType,3014,ObjectType
+AuditHistoryUpdateEventType,2104,ObjectType
+AuditHistoryValueUpdateEventType,3006,ObjectType
+AuditNodeManagementEventType,2090,ObjectType
+AuditOpenSecureChannelEventType,2060,ObjectType
+AuditProgramTransitionEventType,11856,ObjectType
+AuditSecurityEventType,2058,ObjectType
+AuditSessionEventType,2069,ObjectType
+AuditUpdateEventType,2099,ObjectType
+AuditUpdateMethodEventType,2127,ObjectType
+AuditUpdateStateEventType,2315,ObjectType
+AuditUrlMismatchEventType,2748,ObjectType
+AuditWriteUpdateEventType,2100,ObjectType
+AuthorizationServiceConfigurationType,17852,ObjectType
+AuthorizationServices,17732,Object
+AuthorizationServicesConfigurationFolderType,23556,ObjectType
+AxisInformation,12079,DataType
+AxisInformation_Encoding_DefaultBinary,12089,Object
+AxisInformation_Encoding_DefaultJson,15379,Object
+AxisInformation_Encoding_DefaultXml,12081,Object
+AxisScaleEnumeration,12077,DataType
+BaseAnalogType,15318,VariableType
+BaseConditionClassType,11163,ObjectType
+BaseDataType,24,DataType
+BaseDataVariableType,63,VariableType
+BaseEventType,2041,ObjectType
+BaseInterfaceType,17602,ObjectType
+BaseModelChangeEventType,2132,ObjectType
+BaseObjectType,58,ObjectType
+BaseVariableType,62,VariableType
+BitFieldMaskDataType,11737,DataType
+Boolean,1,DataType
+BrokerConnectionTransportDataType,15007,DataType
+BrokerConnectionTransportDataType_Encoding_DefaultBinary,15479,Object
+BrokerConnectionTransportDataType_Encoding_DefaultJson,15726,Object
+BrokerConnectionTransportDataType_Encoding_DefaultXml,15579,Object
+BrokerConnectionTransportType,15155,ObjectType
+BrokerDataSetReaderTransportDataType,15670,DataType
+BrokerDataSetReaderTransportDataType_Encoding_DefaultBinary,15733,Object
+BrokerDataSetReaderTransportDataType_Encoding_DefaultJson,16526,Object
+BrokerDataSetReaderTransportDataType_Encoding_DefaultXml,16023,Object
+BrokerDataSetReaderTransportType,21142,ObjectType
+BrokerDataSetWriterTransportDataType,15669,DataType
+BrokerDataSetWriterTransportDataType_Encoding_DefaultBinary,15729,Object
+BrokerDataSetWriterTransportDataType_Encoding_DefaultJson,16525,Object
+BrokerDataSetWriterTransportDataType_Encoding_DefaultXml,16022,Object
+BrokerDataSetWriterTransportType,21138,ObjectType
+BrokerTransportQualityOfService,15008,DataType
+BrokerWriterGroupTransportDataType,15667,DataType
+BrokerWriterGroupTransportDataType_Encoding_DefaultBinary,15727,Object
+BrokerWriterGroupTransportDataType_Encoding_DefaultJson,16524,Object
+BrokerWriterGroupTransportDataType_Encoding_DefaultXml,16021,Object
+BrokerWriterGroupTransportType,21136,ObjectType
+BrowseDescription,514,DataType
+BrowseDescription_Encoding_DefaultBinary,516,Object
+BrowseDescription_Encoding_DefaultJson,15180,Object
+BrowseDescription_Encoding_DefaultXml,515,Object
+BrowseDirection,510,DataType
+BrowseNextRequest,531,DataType
+BrowseNextRequest_Encoding_DefaultBinary,533,Object
+BrowseNextRequest_Encoding_DefaultJson,15186,Object
+BrowseNextRequest_Encoding_DefaultXml,532,Object
+BrowseNextResponse,534,DataType
+BrowseNextResponse_Encoding_DefaultBinary,536,Object
+BrowseNextResponse_Encoding_DefaultJson,15187,Object
+BrowseNextResponse_Encoding_DefaultXml,535,Object
+BrowsePath,543,DataType
+BrowsePath_Encoding_DefaultBinary,545,Object
+BrowsePath_Encoding_DefaultJson,15190,Object
+BrowsePath_Encoding_DefaultXml,544,Object
+BrowsePathResult,549,DataType
+BrowsePathResult_Encoding_DefaultBinary,551,Object
+BrowsePathResult_Encoding_DefaultJson,15192,Object
+BrowsePathResult_Encoding_DefaultXml,550,Object
+BrowsePathTarget,546,DataType
+BrowsePathTarget_Encoding_DefaultBinary,548,Object
+BrowsePathTarget_Encoding_DefaultJson,15191,Object
+BrowsePathTarget_Encoding_DefaultXml,547,Object
+BrowseRequest,525,DataType
+BrowseRequest_Encoding_DefaultBinary,527,Object
+BrowseRequest_Encoding_DefaultJson,15184,Object
+BrowseRequest_Encoding_DefaultXml,526,Object
+BrowseResponse,528,DataType
+BrowseResponse_Encoding_DefaultBinary,530,Object
+BrowseResponse_Encoding_DefaultJson,15185,Object
+BrowseResponse_Encoding_DefaultXml,529,Object
+BrowseResult,522,DataType
+BrowseResult_Encoding_DefaultBinary,524,Object
+BrowseResult_Encoding_DefaultJson,15183,Object
+BrowseResult_Encoding_DefaultXml,523,Object
+BrowseResultMask,517,DataType
+BuildInfo,338,DataType
+BuildInfo_Encoding_DefaultBinary,340,Object
+BuildInfo_Encoding_DefaultJson,15361,Object
+BuildInfo_Encoding_DefaultXml,339,Object
+BuildInfoType,3051,VariableType
+Byte,3,DataType
+ByteString,15,DataType
+CallMethodRequest,704,DataType
+CallMethodRequest_Encoding_DefaultBinary,706,Object
+CallMethodRequest_Encoding_DefaultJson,15289,Object
+CallMethodRequest_Encoding_DefaultXml,705,Object
+CallMethodResult,707,DataType
+CallMethodResult_Encoding_DefaultBinary,709,Object
+CallMethodResult_Encoding_DefaultJson,15290,Object
+CallMethodResult_Encoding_DefaultXml,708,Object
+CallRequest,710,DataType
+CallRequest_Encoding_DefaultBinary,712,Object
+CallRequest_Encoding_DefaultJson,15291,Object
+CallRequest_Encoding_DefaultXml,711,Object
+CallResponse,713,DataType
+CallResponse_Encoding_DefaultBinary,715,Object
+CallResponse_Encoding_DefaultJson,15292,Object
+CallResponse_Encoding_DefaultXml,714,Object
+CancelRequest,477,DataType
+CancelRequest_Encoding_DefaultBinary,479,Object
+CancelRequest_Encoding_DefaultJson,15149,Object
+CancelRequest_Encoding_DefaultXml,478,Object
+CancelResponse,480,DataType
+CancelResponse_Encoding_DefaultBinary,482,Object
+CancelResponse_Encoding_DefaultJson,15150,Object
+CancelResponse_Encoding_DefaultXml,481,Object
+CartesianCoordinates,18809,DataType
+CartesianCoordinates_Encoding_DefaultBinary,18818,Object
+CartesianCoordinates_Encoding_DefaultJson,19067,Object
+CartesianCoordinates_Encoding_DefaultXml,18854,Object
+CartesianCoordinatesType,18772,VariableType
+CertificateExpirationAlarmType,13225,ObjectType
+CertificateGroupFolderType,13813,ObjectType
+CertificateGroupType,12555,ObjectType
+CertificateType,12556,ObjectType
+CertificateUpdatedAuditEventType,12620,ObjectType
+ChannelSecurityToken,441,DataType
+ChannelSecurityToken_Encoding_DefaultBinary,443,Object
+ChannelSecurityToken_Encoding_DefaultJson,15131,Object
+ChannelSecurityToken_Encoding_DefaultXml,442,Object
+ChoiceStateType,15109,ObjectType
+CloseSecureChannelRequest,450,DataType
+CloseSecureChannelRequest_Encoding_DefaultBinary,452,Object
+CloseSecureChannelRequest_Encoding_DefaultJson,15134,Object
+CloseSecureChannelRequest_Encoding_DefaultXml,451,Object
+CloseSecureChannelResponse,453,DataType
+CloseSecureChannelResponse_Encoding_DefaultBinary,455,Object
+CloseSecureChannelResponse_Encoding_DefaultJson,15135,Object
+CloseSecureChannelResponse_Encoding_DefaultXml,454,Object
+CloseSessionRequest,471,DataType
+CloseSessionRequest_Encoding_DefaultBinary,473,Object
+CloseSessionRequest_Encoding_DefaultJson,15147,Object
+CloseSessionRequest_Encoding_DefaultXml,472,Object
+CloseSessionResponse,474,DataType
+CloseSessionResponse_Encoding_DefaultBinary,476,Object
+CloseSessionResponse_Encoding_DefaultJson,15148,Object
+CloseSessionResponse_Encoding_DefaultXml,475,Object
+Communication,24227,Object
+ComplexNumberType,12171,DataType
+ComplexNumberType_Encoding_DefaultBinary,12181,Object
+ComplexNumberType_Encoding_DefaultJson,15377,Object
+ComplexNumberType_Encoding_DefaultXml,12173,Object
+ConditionType,2782,ObjectType
+ConditionVariableType,9002,VariableType
+ConfigurationVersionDataType,14593,DataType
+ConfigurationVersionDataType_Encoding_DefaultBinary,14847,Object
+ConfigurationVersionDataType_Encoding_DefaultJson,15049,Object
+ConfigurationVersionDataType_Encoding_DefaultXml,14803,Object
+ConnectionTransportDataType,15618,DataType
+ConnectionTransportDataType_Encoding_DefaultBinary,15695,Object
+ConnectionTransportDataType_Encoding_DefaultJson,16282,Object
+ConnectionTransportDataType_Encoding_DefaultXml,15993,Object
+ConnectionTransportType,17721,ObjectType
+ContentFilter,586,DataType
+ContentFilter_Encoding_DefaultBinary,588,Object
+ContentFilter_Encoding_DefaultJson,15205,Object
+ContentFilter_Encoding_DefaultXml,587,Object
+ContentFilterElement,583,DataType
+ContentFilterElement_Encoding_DefaultBinary,585,Object
+ContentFilterElement_Encoding_DefaultJson,15204,Object
+ContentFilterElement_Encoding_DefaultXml,584,Object
+ContentFilterElementResult,604,DataType
+ContentFilterElementResult_Encoding_DefaultBinary,606,Object
+ContentFilterElementResult_Encoding_DefaultJson,15211,Object
+ContentFilterElementResult_Encoding_DefaultXml,605,Object
+ContentFilterResult,607,DataType
+ContentFilterResult_Encoding_DefaultBinary,609,Object
+ContentFilterResult_Encoding_DefaultJson,15228,Object
+ContentFilterResult_Encoding_DefaultXml,608,Object
+ContinuationPoint,521,DataType
+Counter,289,DataType
+CreateMonitoredItemsRequest,749,DataType
+CreateMonitoredItemsRequest_Encoding_DefaultBinary,751,Object
+CreateMonitoredItemsRequest_Encoding_DefaultJson,15323,Object
+CreateMonitoredItemsRequest_Encoding_DefaultXml,750,Object
+CreateMonitoredItemsResponse,752,DataType
+CreateMonitoredItemsResponse_Encoding_DefaultBinary,754,Object
+CreateMonitoredItemsResponse_Encoding_DefaultJson,15324,Object
+CreateMonitoredItemsResponse_Encoding_DefaultXml,753,Object
+CreateSessionRequest,459,DataType
+CreateSessionRequest_Encoding_DefaultBinary,461,Object
+CreateSessionRequest_Encoding_DefaultJson,15138,Object
+CreateSessionRequest_Encoding_DefaultXml,460,Object
+CreateSessionResponse,462,DataType
+CreateSessionResponse_Encoding_DefaultBinary,464,Object
+CreateSessionResponse_Encoding_DefaultJson,15139,Object
+CreateSessionResponse_Encoding_DefaultXml,463,Object
+CreateSubscriptionRequest,785,DataType
+CreateSubscriptionRequest_Encoding_DefaultBinary,787,Object
+CreateSubscriptionRequest_Encoding_DefaultJson,15337,Object
+CreateSubscriptionRequest_Encoding_DefaultXml,786,Object
+CreateSubscriptionResponse,788,DataType
+CreateSubscriptionResponse_Encoding_DefaultBinary,790,Object
+CreateSubscriptionResponse_Encoding_DefaultJson,15338,Object
+CreateSubscriptionResponse_Encoding_DefaultXml,789,Object
+CubeItemType,12057,VariableType
+CurrencyUnit,23501,Variable
+CurrencyUnitType,23498,DataType
+CurrencyUnitType_Encoding_DefaultBinary,23507,Object
+CurrencyUnitType_Encoding_DefaultJson,23528,Object
+CurrencyUnitType_Encoding_DefaultXml,23520,Object
+DataChangeFilter,722,DataType
+DataChangeFilter_Encoding_DefaultBinary,724,Object
+DataChangeFilter_Encoding_DefaultJson,15294,Object
+DataChangeFilter_Encoding_DefaultXml,723,Object
+DataChangeNotification,809,DataType
+DataChangeNotification_Encoding_DefaultBinary,811,Object
+DataChangeNotification_Encoding_DefaultJson,15345,Object
+DataChangeNotification_Encoding_DefaultXml,810,Object
+DataChangeTrigger,717,DataType
+DatagramConnectionTransportDataType,17467,DataType
+DatagramConnectionTransportDataType_Encoding_DefaultBinary,17468,Object
+DatagramConnectionTransportDataType_Encoding_DefaultJson,17476,Object
+DatagramConnectionTransportDataType_Encoding_DefaultXml,17472,Object
+DatagramConnectionTransportType,15064,ObjectType
+DatagramWriterGroupTransportDataType,15532,DataType
+DatagramWriterGroupTransportDataType_Encoding_DefaultBinary,21155,Object
+DatagramWriterGroupTransportDataType_Encoding_DefaultJson,21203,Object
+DatagramWriterGroupTransportDataType_Encoding_DefaultXml,21179,Object
+DatagramWriterGroupTransportType,21133,ObjectType
+DataItemType,2365,VariableType
+DataSetFieldContentMask,15583,DataType
+DataSetFieldFlags,15904,DataType
+DataSetFolderType,14477,ObjectType
+DataSetMetaDataType,14523,DataType
+DataSetMetaDataType_Encoding_DefaultBinary,124,Object
+DataSetMetaDataType_Encoding_DefaultJson,15050,Object
+DataSetMetaDataType_Encoding_DefaultXml,14794,Object
+DataSetOrderingType,20408,DataType
+DataSetReaderDataType,15623,DataType
+DataSetReaderDataType_Encoding_DefaultBinary,15703,Object
+DataSetReaderDataType_Encoding_DefaultJson,16286,Object
+DataSetReaderDataType_Encoding_DefaultXml,16007,Object
+DataSetReaderMessageDataType,15629,DataType
+DataSetReaderMessageDataType_Encoding_DefaultBinary,15706,Object
+DataSetReaderMessageDataType_Encoding_DefaultJson,16288,Object
+DataSetReaderMessageDataType_Encoding_DefaultXml,16009,Object
+DataSetReaderMessageType,21104,ObjectType
+DataSetReaderTransportDataType,15628,DataType
+DataSetReaderTransportDataType_Encoding_DefaultBinary,15705,Object
+DataSetReaderTransportDataType_Encoding_DefaultJson,16287,Object
+DataSetReaderTransportDataType_Encoding_DefaultXml,16008,Object
+DataSetReaderTransportType,15319,ObjectType
+DataSetReaderType,15306,ObjectType
+DataSetToWriter,14936,ReferenceType
+DataSetWriterDataType,15597,DataType
+DataSetWriterDataType_Encoding_DefaultBinary,15682,Object
+DataSetWriterDataType_Encoding_DefaultJson,16156,Object
+DataSetWriterDataType_Encoding_DefaultXml,15955,Object
+DataSetWriterMessageDataType,15605,DataType
+DataSetWriterMessageDataType_Encoding_DefaultBinary,15688,Object
+DataSetWriterMessageDataType_Encoding_DefaultJson,16158,Object
+DataSetWriterMessageDataType_Encoding_DefaultXml,15987,Object
+DataSetWriterMessageType,21096,ObjectType
+DataSetWriterTransportDataType,15598,DataType
+DataSetWriterTransportDataType_Encoding_DefaultBinary,15683,Object
+DataSetWriterTransportDataType_Encoding_DefaultJson,16157,Object
+DataSetWriterTransportDataType_Encoding_DefaultXml,15956,Object
+DataSetWriterTransportType,15305,ObjectType
+DataSetWriterType,15298,ObjectType
+DataTypeAttributes,370,DataType
+DataTypeAttributes_Encoding_DefaultBinary,372,Object
+DataTypeAttributes_Encoding_DefaultJson,15161,Object
+DataTypeAttributes_Encoding_DefaultXml,371,Object
+DataTypeDefinition,97,DataType
+DataTypeDefinition_Encoding_DefaultBinary,121,Object
+DataTypeDefinition_Encoding_DefaultJson,15063,Object
+DataTypeDefinition_Encoding_DefaultXml,14797,Object
+DataTypeDescription,14525,DataType
+DataTypeDescription_Encoding_DefaultBinary,125,Object
+DataTypeDescription_Encoding_DefaultJson,15057,Object
+DataTypeDescription_Encoding_DefaultXml,14796,Object
+DataTypeDescriptionType,69,VariableType
+DataTypeDictionaryType,72,VariableType
+DataTypeEncodingType,76,ObjectType
+DataTypeNode,282,DataType
+DataTypeNode_Encoding_DefaultBinary,284,Object
+DataTypeNode_Encoding_DefaultJson,15079,Object
+DataTypeNode_Encoding_DefaultXml,283,Object
+DataTypeSchemaHeader,15534,DataType
+DataTypeSchemaHeader_Encoding_DefaultBinary,15676,Object
+DataTypeSchemaHeader_Encoding_DefaultJson,16151,Object
+DataTypeSchemaHeader_Encoding_DefaultXml,15950,Object
+DataTypesFolder,90,Object
+DataTypeSystemType,75,ObjectType
+DataValue,23,DataType
+Date,293,DataType
+DateString,12881,DataType
+DateTime,13,DataType
+DeadbandType,718,DataType
+Decimal,50,DataType
+DecimalDataType,17861,DataType
+DecimalDataType_Encoding_DefaultBinary,17863,Object
+DecimalDataType_Encoding_DefaultJson,15045,Object
+DecimalDataType_Encoding_DefaultXml,17862,Object
+DecimalString,12878,DataType
+DefaultBinary,3062,Object
+DefaultInstanceBrowseName,17605,Variable
+DefaultXml,3063,Object
+DeleteAtTimeDetails,689,DataType
+DeleteAtTimeDetails_Encoding_DefaultBinary,691,Object
+DeleteAtTimeDetails_Encoding_DefaultJson,15284,Object
+DeleteAtTimeDetails_Encoding_DefaultXml,690,Object
+DeleteEventDetails,692,DataType
+DeleteEventDetails_Encoding_DefaultBinary,694,Object
+DeleteEventDetails_Encoding_DefaultJson,15285,Object
+DeleteEventDetails_Encoding_DefaultXml,693,Object
+DeleteMonitoredItemsRequest,779,DataType
+DeleteMonitoredItemsRequest_Encoding_DefaultBinary,781,Object
+DeleteMonitoredItemsRequest_Encoding_DefaultJson,15335,Object
+DeleteMonitoredItemsRequest_Encoding_DefaultXml,780,Object
+DeleteMonitoredItemsResponse,782,DataType
+DeleteMonitoredItemsResponse_Encoding_DefaultBinary,784,Object
+DeleteMonitoredItemsResponse_Encoding_DefaultJson,15336,Object
+DeleteMonitoredItemsResponse_Encoding_DefaultXml,783,Object
+DeleteNodesItem,382,DataType
+DeleteNodesItem_Encoding_DefaultBinary,384,Object
+DeleteNodesItem_Encoding_DefaultJson,15172,Object
+DeleteNodesItem_Encoding_DefaultXml,383,Object
+DeleteNodesRequest,498,DataType
+DeleteNodesRequest_Encoding_DefaultBinary,500,Object
+DeleteNodesRequest_Encoding_DefaultJson,15173,Object
+DeleteNodesRequest_Encoding_DefaultXml,499,Object
+DeleteNodesResponse,501,DataType
+DeleteNodesResponse_Encoding_DefaultBinary,503,Object
+DeleteNodesResponse_Encoding_DefaultJson,15174,Object
+DeleteNodesResponse_Encoding_DefaultXml,502,Object
+DeleteRawModifiedDetails,686,DataType
+DeleteRawModifiedDetails_Encoding_DefaultBinary,688,Object
+DeleteRawModifiedDetails_Encoding_DefaultJson,15283,Object
+DeleteRawModifiedDetails_Encoding_DefaultXml,687,Object
+DeleteReferencesItem,385,DataType
+DeleteReferencesItem_Encoding_DefaultBinary,387,Object
+DeleteReferencesItem_Encoding_DefaultJson,15175,Object
+DeleteReferencesItem_Encoding_DefaultXml,386,Object
+DeleteReferencesRequest,504,DataType
+DeleteReferencesRequest_Encoding_DefaultBinary,506,Object
+DeleteReferencesRequest_Encoding_DefaultJson,15176,Object
+DeleteReferencesRequest_Encoding_DefaultXml,505,Object
+DeleteReferencesResponse,507,DataType
+DeleteReferencesResponse_Encoding_DefaultBinary,509,Object
+DeleteReferencesResponse_Encoding_DefaultJson,15177,Object
+DeleteReferencesResponse_Encoding_DefaultXml,508,Object
+DeleteSubscriptionsRequest,845,DataType
+DeleteSubscriptionsRequest_Encoding_DefaultBinary,847,Object
+DeleteSubscriptionsRequest_Encoding_DefaultJson,15359,Object
+DeleteSubscriptionsRequest_Encoding_DefaultXml,846,Object
+DeleteSubscriptionsResponse,848,DataType
+DeleteSubscriptionsResponse_Encoding_DefaultBinary,850,Object
+DeleteSubscriptionsResponse_Encoding_DefaultJson,15360,Object
+DeleteSubscriptionsResponse_Encoding_DefaultXml,849,Object
+DeviceFailureEventType,2131,ObjectType
+DiagnosticInfo,25,DataType
+DiagnosticsLevel,19723,DataType
+DialogConditionType,2830,ObjectType
+Dictionaries,17594,Object
+DictionaryEntryType,17589,ObjectType
+DictionaryFolderType,17591,ObjectType
+DiscoveryConfiguration,12890,DataType
+DiscoveryConfiguration_Encoding_DefaultBinary,12900,Object
+DiscoveryConfiguration_Encoding_DefaultJson,15105,Object
+DiscoveryConfiguration_Encoding_DefaultXml,12892,Object
+DiscrepancyAlarmType,17080,ObjectType
+DiscreteAlarmType,10523,ObjectType
+DiscreteItemType,2372,VariableType
+Double,11,DataType
+DoubleComplexNumberType,12172,DataType
+DoubleComplexNumberType_Encoding_DefaultBinary,12182,Object
+DoubleComplexNumberType_Encoding_DefaultJson,15378,Object
+DoubleComplexNumberType_Encoding_DefaultXml,12174,Object
+Duplex,24210,DataType
+Duration,290,DataType
+DurationString,12879,DataType
+EccApplicationCertificateType,23537,ObjectType
+EccBrainpoolP256r1ApplicationCertificateType,23540,ObjectType
+EccBrainpoolP384r1ApplicationCertificateType,23541,ObjectType
+EccCurve25519ApplicationCertificateType,23542,ObjectType
+EccCurve448ApplicationCertificateType,23543,ObjectType
+EccEncryptedSecret,17546,DataType
+EccNistP256ApplicationCertificateType,23538,ObjectType
+EccNistP384ApplicationCertificateType,23539,ObjectType
+ElementOperand,592,DataType
+ElementOperand_Encoding_DefaultBinary,594,Object
+ElementOperand_Encoding_DefaultJson,15207,Object
+ElementOperand_Encoding_DefaultXml,593,Object
+ElseGuardVariableType,15317,VariableType
+EndpointConfiguration,331,DataType
+EndpointConfiguration_Encoding_DefaultBinary,333,Object
+EndpointConfiguration_Encoding_DefaultJson,15199,Object
+EndpointConfiguration_Encoding_DefaultXml,332,Object
+EndpointDescription,312,DataType
+EndpointDescription_Encoding_DefaultBinary,314,Object
+EndpointDescription_Encoding_DefaultJson,15099,Object
+EndpointDescription_Encoding_DefaultXml,313,Object
+EndpointType,15528,DataType
+EndpointType_Encoding_DefaultBinary,15671,Object
+EndpointType_Encoding_DefaultJson,16150,Object
+EndpointType_Encoding_DefaultXml,15949,Object
+EndpointUrlListDataType,11943,DataType
+EndpointUrlListDataType_Encoding_DefaultBinary,11957,Object
+EndpointUrlListDataType_Encoding_DefaultJson,15363,Object
+EndpointUrlListDataType_Encoding_DefaultXml,11949,Object
+EngineeringUnits,11513,Variable
+EnumDefinition,100,DataType
+EnumDefinition_Encoding_DefaultBinary,123,Object
+EnumDefinition_Encoding_DefaultJson,15067,Object
+EnumDefinition_Encoding_DefaultXml,14799,Object
+EnumDescription,15488,DataType
+EnumDescription_Encoding_DefaultBinary,127,Object
+EnumDescription_Encoding_DefaultJson,15059,Object
+EnumDescription_Encoding_DefaultXml,15590,Object
+Enumeration,29,DataType
+EnumField,102,DataType
+EnumField_Encoding_DefaultBinary,14845,Object
+EnumField_Encoding_DefaultJson,15083,Object
+EnumField_Encoding_DefaultXml,14801,Object
+EnumStrings,11432,Variable
+EnumValues,3071,Variable
+EnumValueType,7594,DataType
+EnumValueType_Encoding_DefaultBinary,8251,Object
+EnumValueType_Encoding_DefaultJson,15082,Object
+EnumValueType_Encoding_DefaultXml,7616,Object
+EphemeralKeyType,17548,DataType
+EphemeralKeyType_Encoding_DefaultBinary,17549,Object
+EphemeralKeyType_Encoding_DefaultJson,17557,Object
+EphemeralKeyType_Encoding_DefaultXml,17553,Object
+EUInformation,887,DataType
+EUInformation_Encoding_DefaultBinary,889,Object
+EUInformation_Encoding_DefaultJson,15376,Object
+EUInformation_Encoding_DefaultXml,888,Object
+EventFieldList,917,DataType
+EventFieldList_Encoding_DefaultBinary,919,Object
+EventFieldList_Encoding_DefaultJson,15348,Object
+EventFieldList_Encoding_DefaultXml,918,Object
+EventFilter,725,DataType
+EventFilter_Encoding_DefaultBinary,727,Object
+EventFilter_Encoding_DefaultJson,15295,Object
+EventFilter_Encoding_DefaultXml,726,Object
+EventFilterResult,734,DataType
+EventFilterResult_Encoding_DefaultBinary,736,Object
+EventFilterResult_Encoding_DefaultJson,15314,Object
+EventFilterResult_Encoding_DefaultXml,735,Object
+EventNotificationList,914,DataType
+EventNotificationList_Encoding_DefaultBinary,916,Object
+EventNotificationList_Encoding_DefaultJson,15347,Object
+EventNotificationList_Encoding_DefaultXml,915,Object
+EventNotifierType,15033,DataType
+EventQueueOverflowEventType,3035,ObjectType
+EventTypesFolder,3048,Object
+ExceptionDeviationFormat,890,DataType
+ExclusiveDeviationAlarmType,9764,ObjectType
+ExclusiveLevelAlarmType,9482,ObjectType
+ExclusiveLimitAlarmType,9341,ObjectType
+ExclusiveLimitStateMachineType,9318,ObjectType
+ExclusiveRateOfChangeAlarmType,9623,ObjectType
+ExpandedNodeId,18,DataType
+ExpressionGuardVariableType,15128,VariableType
+ExtensionFieldsType,15489,ObjectType
+FieldMetaData,14524,DataType
+FieldMetaData_Encoding_DefaultBinary,14839,Object
+FieldMetaData_Encoding_DefaultJson,15051,Object
+FieldMetaData_Encoding_DefaultXml,14795,Object
+FieldTargetDataType,14744,DataType
+FieldTargetDataType_Encoding_DefaultBinary,14848,Object
+FieldTargetDataType_Encoding_DefaultJson,15061,Object
+FieldTargetDataType_Encoding_DefaultXml,14804,Object
+FileDirectoryType,13353,ObjectType
+FileSystem,16314,Object
+FileTransferStateMachineType,15803,ObjectType
+FileType,11575,ObjectType
+FilterOperand,589,DataType
+FilterOperand_Encoding_DefaultBinary,591,Object
+FilterOperand_Encoding_DefaultJson,15206,Object
+FilterOperand_Encoding_DefaultXml,590,Object
+FilterOperator,576,DataType
+FindServersOnNetworkRequest,12190,DataType
+FindServersOnNetworkRequest_Encoding_DefaultBinary,12208,Object
+FindServersOnNetworkRequest_Encoding_DefaultJson,15096,Object
+FindServersOnNetworkRequest_Encoding_DefaultXml,12196,Object
+FindServersOnNetworkResponse,12191,DataType
+FindServersOnNetworkResponse_Encoding_DefaultBinary,12209,Object
+FindServersOnNetworkResponse_Encoding_DefaultJson,15097,Object
+FindServersOnNetworkResponse_Encoding_DefaultXml,12197,Object
+FindServersRequest,420,DataType
+FindServersRequest_Encoding_DefaultBinary,422,Object
+FindServersRequest_Encoding_DefaultJson,15093,Object
+FindServersRequest_Encoding_DefaultXml,421,Object
+FindServersResponse,423,DataType
+FindServersResponse_Encoding_DefaultBinary,425,Object
+FindServersResponse_Encoding_DefaultJson,15094,Object
+FindServersResponse_Encoding_DefaultXml,424,Object
+FiniteStateMachineType,2771,ObjectType
+FiniteStateVariableType,2760,VariableType
+FiniteTransitionVariableType,2767,VariableType
+Float,10,DataType
+FolderType,61,ObjectType
+Frame,18813,DataType
+Frame_Encoding_DefaultBinary,18822,Object
+Frame_Encoding_DefaultJson,19071,Object
+Frame_Encoding_DefaultXml,18858,Object
+FrameType,18786,VariableType
+FromState,51,ReferenceType
+GeneralModelChangeEventType,2133,ObjectType
+GeneratesEvent,41,ReferenceType
+GenericAttributes,17607,DataType
+GenericAttributes_Encoding_DefaultBinary,17611,Object
+GenericAttributes_Encoding_DefaultJson,15164,Object
+GenericAttributes_Encoding_DefaultXml,17609,Object
+GenericAttributeValue,17606,DataType
+GenericAttributeValue_Encoding_DefaultBinary,17610,Object
+GenericAttributeValue_Encoding_DefaultJson,15163,Object
+GenericAttributeValue_Encoding_DefaultXml,17608,Object
+GetEndpointsRequest,426,DataType
+GetEndpointsRequest_Encoding_DefaultBinary,428,Object
+GetEndpointsRequest_Encoding_DefaultJson,15100,Object
+GetEndpointsRequest_Encoding_DefaultXml,427,Object
+GetEndpointsResponse,429,DataType
+GetEndpointsResponse_Encoding_DefaultBinary,431,Object
+GetEndpointsResponse_Encoding_DefaultJson,15101,Object
+GetEndpointsResponse_Encoding_DefaultXml,430,Object
+GuardVariableType,15113,VariableType
+Guid,14,DataType
+HAConfiguration,11202,Object
+HasAddIn,17604,ReferenceType
+HasAlarmSuppressionGroup,16361,ReferenceType
+HasArgumentDescription,129,ReferenceType
+HasCause,53,ReferenceType
+HasChild,34,ReferenceType
+HasComponent,47,ReferenceType
+HasCondition,9006,ReferenceType
+HasDataSetReader,15297,ReferenceType
+HasDataSetWriter,15296,ReferenceType
+HasDescription,39,ReferenceType
+HasDictionaryEntry,17597,ReferenceType
+HasEffect,54,ReferenceType
+HasEffectDisable,17276,ReferenceType
+HasEffectEnable,17983,ReferenceType
+HasEffectSuppressed,17984,ReferenceType
+HasEffectUnsuppressed,17985,ReferenceType
+HasEncoding,38,ReferenceType
+HasEventSource,36,ReferenceType
+HasFalseSubState,9005,ReferenceType
+HasGuard,15112,ReferenceType
+HasHistoricalConfiguration,56,ReferenceType
+HasInterface,17603,ReferenceType
+HasModellingRule,37,ReferenceType
+HasNotifier,48,ReferenceType
+HasOptionalInputArgumentDescription,131,ReferenceType
+HasOrderedComponent,49,ReferenceType
+HasProperty,46,ReferenceType
+HasPubSubConnection,14476,ReferenceType
+HasReaderGroup,18805,ReferenceType
+HasSubStateMachine,117,ReferenceType
+HasSubtype,45,ReferenceType
+HasTrueSubState,9004,ReferenceType
+HasTypeDefinition,40,ReferenceType
+HasWriterGroup,18804,ReferenceType
+HierarchicalReferences,33,ReferenceType
+HighlyManagedAlarmConditionClassType,17219,ObjectType
+HistoricalDataConfigurationType,2318,ObjectType
+HistoricalEventFilter,11215,Variable
+HistoryData,656,DataType
+HistoryData_Encoding_DefaultBinary,658,Object
+HistoryData_Encoding_DefaultJson,15270,Object
+HistoryData_Encoding_DefaultXml,657,Object
+HistoryEvent,659,DataType
+HistoryEvent_Encoding_DefaultBinary,661,Object
+HistoryEvent_Encoding_DefaultJson,15273,Object
+HistoryEvent_Encoding_DefaultXml,660,Object
+HistoryEventFieldList,920,DataType
+HistoryEventFieldList_Encoding_DefaultBinary,922,Object
+HistoryEventFieldList_Encoding_DefaultJson,15349,Object
+HistoryEventFieldList_Encoding_DefaultXml,921,Object
+HistoryModifiedData,11217,DataType
+HistoryModifiedData_Encoding_DefaultBinary,11227,Object
+HistoryModifiedData_Encoding_DefaultJson,15272,Object
+HistoryModifiedData_Encoding_DefaultXml,11219,Object
+HistoryReadDetails,641,DataType
+HistoryReadDetails_Encoding_DefaultBinary,643,Object
+HistoryReadDetails_Encoding_DefaultJson,15261,Object
+HistoryReadDetails_Encoding_DefaultXml,642,Object
+HistoryReadRequest,662,DataType
+HistoryReadRequest_Encoding_DefaultBinary,664,Object
+HistoryReadRequest_Encoding_DefaultJson,15274,Object
+HistoryReadRequest_Encoding_DefaultXml,663,Object
+HistoryReadResponse,665,DataType
+HistoryReadResponse_Encoding_DefaultBinary,667,Object
+HistoryReadResponse_Encoding_DefaultJson,15275,Object
+HistoryReadResponse_Encoding_DefaultXml,666,Object
+HistoryReadResult,638,DataType
+HistoryReadResult_Encoding_DefaultBinary,640,Object
+HistoryReadResult_Encoding_DefaultJson,15260,Object
+HistoryReadResult_Encoding_DefaultXml,639,Object
+HistoryReadValueId,635,DataType
+HistoryReadValueId_Encoding_DefaultBinary,637,Object
+HistoryReadValueId_Encoding_DefaultJson,15259,Object
+HistoryReadValueId_Encoding_DefaultXml,636,Object
+HistoryServerCapabilities,11192,Object
+HistoryServerCapabilitiesType,2330,ObjectType
+HistoryUpdateDetails,677,DataType
+HistoryUpdateDetails_Encoding_DefaultBinary,679,Object
+HistoryUpdateDetails_Encoding_DefaultJson,15279,Object
+HistoryUpdateDetails_Encoding_DefaultXml,678,Object
+HistoryUpdateRequest,698,DataType
+HistoryUpdateRequest_Encoding_DefaultBinary,700,Object
+HistoryUpdateRequest_Encoding_DefaultJson,15287,Object
+HistoryUpdateRequest_Encoding_DefaultXml,699,Object
+HistoryUpdateResponse,701,DataType
+HistoryUpdateResponse_Encoding_DefaultBinary,703,Object
+HistoryUpdateResponse_Encoding_DefaultJson,15288,Object
+HistoryUpdateResponse_Encoding_DefaultXml,702,Object
+HistoryUpdateResult,695,DataType
+HistoryUpdateResult_Encoding_DefaultBinary,697,Object
+HistoryUpdateResult_Encoding_DefaultJson,15286,Object
+HistoryUpdateResult_Encoding_DefaultXml,696,Object
+HistoryUpdateType,11234,DataType
+HttpsCertificateType,12558,ObjectType
+IBaseEthernetCapabilitiesType,24167,ObjectType
+Icon,3067,Variable
+IdentityCriteriaType,15632,DataType
+IdentityMappingRuleType,15634,DataType
+IdentityMappingRuleType_Encoding_DefaultBinary,15736,Object
+IdentityMappingRuleType_Encoding_DefaultJson,15042,Object
+IdentityMappingRuleType_Encoding_DefaultXml,15728,Object
+IdType,256,DataType
+IIeeeAutoNegotiationStatusType,24233,ObjectType
+IIeeeBaseEthernetPortType,24158,ObjectType
+IIeeeBaseTsnStatusStreamType,24183,ObjectType
+IIeeeBaseTsnStreamType,24173,ObjectType
+IIeeeBaseTsnTrafficSpecificationType,24179,ObjectType
+IIeeeTsnInterfaceConfigurationListenerType,24195,ObjectType
+IIeeeTsnInterfaceConfigurationTalkerType,24191,ObjectType
+IIeeeTsnInterfaceConfigurationType,24188,ObjectType
+IIeeeTsnMacAddressType,24199,ObjectType
+IIeeeTsnVlanTagType,24202,ObjectType
+IIetfBaseNetworkInterfaceType,24148,ObjectType
+Image,30,DataType
+ImageBMP,2000,DataType
+ImageGIF,2001,DataType
+ImageItemType,12047,VariableType
+ImageJPG,2002,DataType
+ImagePNG,2003,DataType
+Index,17588,DataType
+InitialStateType,2309,ObjectType
+InputArguments,3072,Variable
+InstanceNode,11879,DataType
+InstanceNode_Encoding_DefaultBinary,11889,Object
+InstanceNode_Encoding_DefaultJson,15069,Object
+InstanceNode_Encoding_DefaultXml,11887,Object
+InstrumentDiagnosticAlarmType,18347,ObjectType
+Int16,4,DataType
+Int32,6,DataType
+Int64,8,DataType
+Integer,27,DataType
+IntegerId,288,DataType
+InterfaceAdminStatus,24212,DataType
+InterfaceOperStatus,24214,DataType
+InterfaceTypes,17708,Object
+IOrderedObjectType,23513,ObjectType
+IPriorityMappingEntryType,24205,ObjectType
+IrdiDictionaryEntryType,17598,ObjectType
+ISrClassType,24169,ObjectType
+IssuedIdentityToken,938,DataType
+IssuedIdentityToken_Encoding_DefaultBinary,940,Object
+IssuedIdentityToken_Encoding_DefaultJson,15144,Object
+IssuedIdentityToken_Encoding_DefaultXml,939,Object
+JsonDataSetMessageContentMask,15658,DataType
+JsonDataSetReaderMessageDataType,15665,DataType
+JsonDataSetReaderMessageDataType_Encoding_DefaultBinary,15725,Object
+JsonDataSetReaderMessageDataType_Encoding_DefaultJson,16404,Object
+JsonDataSetReaderMessageDataType_Encoding_DefaultXml,16019,Object
+JsonDataSetReaderMessageType,21130,ObjectType
+JsonDataSetWriterMessageDataType,15664,DataType
+JsonDataSetWriterMessageDataType_Encoding_DefaultBinary,15724,Object
+JsonDataSetWriterMessageDataType_Encoding_DefaultJson,16394,Object
+JsonDataSetWriterMessageDataType_Encoding_DefaultXml,16018,Object
+JsonDataSetWriterMessageType,21128,ObjectType
+JsonNetworkMessageContentMask,15654,DataType
+JsonWriterGroupMessageDataType,15657,DataType
+JsonWriterGroupMessageDataType_Encoding_DefaultBinary,15719,Object
+JsonWriterGroupMessageDataType_Encoding_DefaultJson,16393,Object
+JsonWriterGroupMessageDataType_Encoding_DefaultXml,16017,Object
+JsonWriterGroupMessageType,21126,ObjectType
+KeyCredentialAuditEventType,18011,ObjectType
+KeyCredentialConfiguration,18155,Object
+KeyCredentialConfigurationFolderType,17496,ObjectType
+KeyCredentialConfigurationType,18001,ObjectType
+KeyCredentialDeletedAuditEventType,18047,ObjectType
+KeyCredentialUpdatedAuditEventType,18029,ObjectType
+KeyValuePair,14533,DataType
+KeyValuePair_Encoding_DefaultBinary,14846,Object
+KeyValuePair_Encoding_DefaultJson,15041,Object
+KeyValuePair_Encoding_DefaultXml,14802,Object
+LimitAlarmType,2955,ObjectType
+ListenerStreams,24232,Object
+LiteralOperand,595,DataType
+LiteralOperand_Encoding_DefaultBinary,597,Object
+LiteralOperand_Encoding_DefaultJson,15208,Object
+LiteralOperand_Encoding_DefaultXml,596,Object
+LocaleId,295,DataType
+LocalizedText,21,DataType
+LocalTime,3069,Variable
+MaintenanceConditionClassType,11165,ObjectType
+MappingTables,24228,Object
+MaxArrayLength,11512,Variable
+MaxByteStringLength,12908,Variable
+MaxCharacters,15002,Variable
+MaxStringLength,11498,Variable
+MdnsDiscoveryConfiguration,12891,DataType
+MdnsDiscoveryConfiguration_Encoding_DefaultBinary,12901,Object
+MdnsDiscoveryConfiguration_Encoding_DefaultJson,15106,Object
+MdnsDiscoveryConfiguration_Encoding_DefaultXml,12893,Object
+MessageSecurityMode,302,DataType
+MethodAttributes,358,DataType
+MethodAttributes_Encoding_DefaultBinary,360,Object
+MethodAttributes_Encoding_DefaultJson,15157,Object
+MethodAttributes_Encoding_DefaultXml,359,Object
+MethodNode,276,DataType
+MethodNode_Encoding_DefaultBinary,278,Object
+MethodNode_Encoding_DefaultJson,15077,Object
+MethodNode_Encoding_DefaultXml,277,Object
+ModelChangeStructureDataType,877,DataType
+ModelChangeStructureDataType_Encoding_DefaultBinary,879,Object
+ModelChangeStructureDataType_Encoding_DefaultJson,15373,Object
+ModelChangeStructureDataType_Encoding_DefaultXml,878,Object
+ModelChangeStructureVerbMask,11941,DataType
+ModellingRule_ExposesItsArray,83,Object
+ModellingRule_Mandatory,78,Object
+ModellingRule_MandatoryPlaceholder,11510,Object
+ModellingRule_Optional,80,Object
+ModellingRule_OptionalPlaceholder,11508,Object
+ModellingRuleType,77,ObjectType
+ModificationInfo,11216,DataType
+ModificationInfo_Encoding_DefaultBinary,11226,Object
+ModificationInfo_Encoding_DefaultJson,15271,Object
+ModificationInfo_Encoding_DefaultXml,11218,Object
+ModifyMonitoredItemsRequest,761,DataType
+ModifyMonitoredItemsRequest_Encoding_DefaultBinary,763,Object
+ModifyMonitoredItemsRequest_Encoding_DefaultJson,15327,Object
+ModifyMonitoredItemsRequest_Encoding_DefaultXml,762,Object
+ModifyMonitoredItemsResponse,764,DataType
+ModifyMonitoredItemsResponse_Encoding_DefaultBinary,766,Object
+ModifyMonitoredItemsResponse_Encoding_DefaultJson,15328,Object
+ModifyMonitoredItemsResponse_Encoding_DefaultXml,765,Object
+ModifySubscriptionRequest,791,DataType
+ModifySubscriptionRequest_Encoding_DefaultBinary,793,Object
+ModifySubscriptionRequest_Encoding_DefaultJson,15339,Object
+ModifySubscriptionRequest_Encoding_DefaultXml,792,Object
+ModifySubscriptionResponse,794,DataType
+ModifySubscriptionResponse_Encoding_DefaultBinary,796,Object
+ModifySubscriptionResponse_Encoding_DefaultJson,15340,Object
+ModifySubscriptionResponse_Encoding_DefaultXml,795,Object
+MonitoredItemCreateRequest,743,DataType
+MonitoredItemCreateRequest_Encoding_DefaultBinary,745,Object
+MonitoredItemCreateRequest_Encoding_DefaultJson,15321,Object
+MonitoredItemCreateRequest_Encoding_DefaultXml,744,Object
+MonitoredItemCreateResult,746,DataType
+MonitoredItemCreateResult_Encoding_DefaultBinary,748,Object
+MonitoredItemCreateResult_Encoding_DefaultJson,15322,Object
+MonitoredItemCreateResult_Encoding_DefaultXml,747,Object
+MonitoredItemModifyRequest,755,DataType
+MonitoredItemModifyRequest_Encoding_DefaultBinary,757,Object
+MonitoredItemModifyRequest_Encoding_DefaultJson,15325,Object
+MonitoredItemModifyRequest_Encoding_DefaultXml,756,Object
+MonitoredItemModifyResult,758,DataType
+MonitoredItemModifyResult_Encoding_DefaultBinary,760,Object
+MonitoredItemModifyResult_Encoding_DefaultJson,15326,Object
+MonitoredItemModifyResult_Encoding_DefaultXml,759,Object
+MonitoredItemNotification,806,DataType
+MonitoredItemNotification_Encoding_DefaultBinary,808,Object
+MonitoredItemNotification_Encoding_DefaultJson,15346,Object
+MonitoredItemNotification_Encoding_DefaultXml,807,Object
+MonitoringFilter,719,DataType
+MonitoringFilter_Encoding_DefaultBinary,721,Object
+MonitoringFilter_Encoding_DefaultJson,15293,Object
+MonitoringFilter_Encoding_DefaultXml,720,Object
+MonitoringFilterResult,731,DataType
+MonitoringFilterResult_Encoding_DefaultBinary,733,Object
+MonitoringFilterResult_Encoding_DefaultJson,15313,Object
+MonitoringFilterResult_Encoding_DefaultXml,732,Object
+MonitoringMode,716,DataType
+MonitoringParameters,740,DataType
+MonitoringParameters_Encoding_DefaultBinary,742,Object
+MonitoringParameters_Encoding_DefaultJson,15320,Object
+MonitoringParameters_Encoding_DefaultXml,741,Object
+MultiStateDictionaryEntryDiscreteBaseType,19077,VariableType
+MultiStateDictionaryEntryDiscreteType,19084,VariableType
+MultiStateDiscreteType,2376,VariableType
+MultiStateValueDiscreteType,11238,VariableType
+NamespaceMetadataType,11616,ObjectType
+NamespacesType,11645,ObjectType
+NamingRuleType,120,DataType
+NDimensionArrayItemType,12068,VariableType
+NegotiationStatus,24216,DataType
+NetworkAddressDataType,15502,DataType
+NetworkAddressDataType_Encoding_DefaultBinary,21151,Object
+NetworkAddressDataType_Encoding_DefaultJson,21199,Object
+NetworkAddressDataType_Encoding_DefaultXml,21175,Object
+NetworkAddressType,21145,ObjectType
+NetworkAddressUrlDataType,15510,DataType
+NetworkAddressUrlDataType_Encoding_DefaultBinary,21152,Object
+NetworkAddressUrlDataType_Encoding_DefaultJson,21200,Object
+NetworkAddressUrlDataType_Encoding_DefaultXml,21176,Object
+NetworkAddressUrlType,21147,ObjectType
+NetworkGroupDataType,11944,DataType
+NetworkGroupDataType_Encoding_DefaultBinary,11958,Object
+NetworkGroupDataType_Encoding_DefaultJson,15364,Object
+NetworkGroupDataType_Encoding_DefaultXml,11950,Object
+NetworkInterfaces,24229,Object
+Node,258,DataType
+Node_Encoding_DefaultBinary,260,Object
+Node_Encoding_DefaultJson,15068,Object
+Node_Encoding_DefaultXml,259,Object
+NodeAttributes,349,DataType
+NodeAttributes_Encoding_DefaultBinary,351,Object
+NodeAttributes_Encoding_DefaultJson,15151,Object
+NodeAttributes_Encoding_DefaultXml,350,Object
+NodeAttributesMask,348,DataType
+NodeClass,257,DataType
+NodeId,17,DataType
+NodeReference,580,DataType
+NodeReference_Encoding_DefaultBinary,582,Object
+NodeReference_Encoding_DefaultJson,15203,Object
+NodeReference_Encoding_DefaultXml,581,Object
+NodeTypeDescription,573,DataType
+NodeTypeDescription_Encoding_DefaultBinary,575,Object
+NodeTypeDescription_Encoding_DefaultJson,15201,Object
+NodeTypeDescription_Encoding_DefaultXml,574,Object
+NodeVersion,3068,Variable
+NonExclusiveDeviationAlarmType,10368,ObjectType
+NonExclusiveLevelAlarmType,10060,ObjectType
+NonExclusiveLimitAlarmType,9906,ObjectType
+NonExclusiveRateOfChangeAlarmType,10214,ObjectType
+NonHierarchicalReferences,32,ReferenceType
+NonTransparentNetworkRedundancyType,11945,ObjectType
+NonTransparentRedundancyType,2039,ObjectType
+NormalizedString,12877,DataType
+NotificationData,945,DataType
+NotificationData_Encoding_DefaultBinary,947,Object
+NotificationData_Encoding_DefaultJson,15344,Object
+NotificationData_Encoding_DefaultXml,946,Object
+NotificationMessage,803,DataType
+NotificationMessage_Encoding_DefaultBinary,805,Object
+NotificationMessage_Encoding_DefaultJson,15343,Object
+NotificationMessage_Encoding_DefaultXml,804,Object
+Number,26,DataType
+NumericRange,291,DataType
+ObjectAttributes,352,DataType
+ObjectAttributes_Encoding_DefaultBinary,354,Object
+ObjectAttributes_Encoding_DefaultJson,15152,Object
+ObjectAttributes_Encoding_DefaultXml,353,Object
+ObjectNode,261,DataType
+ObjectNode_Encoding_DefaultBinary,263,Object
+ObjectNode_Encoding_DefaultJson,15071,Object
+ObjectNode_Encoding_DefaultXml,262,Object
+ObjectsFolder,85,Object
+ObjectTypeAttributes,361,DataType
+ObjectTypeAttributes_Encoding_DefaultBinary,363,Object
+ObjectTypeAttributes_Encoding_DefaultJson,15158,Object
+ObjectTypeAttributes_Encoding_DefaultXml,362,Object
+ObjectTypeNode,264,DataType
+ObjectTypeNode_Encoding_DefaultBinary,266,Object
+ObjectTypeNode_Encoding_DefaultJson,15073,Object
+ObjectTypeNode_Encoding_DefaultXml,265,Object
+ObjectTypesFolder,88,Object
+OffNormalAlarmType,10637,ObjectType
+OPCBinarySchema_TypeSystem,93,Object
+OpcUa_BinarySchema,7617,Variable
+OpcUa_XmlSchema,8252,Variable
+OPCUANamespaceMetadata,15957,Object
+OpenFileMode,11939,DataType
+OpenSecureChannelRequest,444,DataType
+OpenSecureChannelRequest_Encoding_DefaultBinary,446,Object
+OpenSecureChannelRequest_Encoding_DefaultJson,15132,Object
+OpenSecureChannelRequest_Encoding_DefaultXml,445,Object
+OpenSecureChannelResponse,447,DataType
+OpenSecureChannelResponse_Encoding_DefaultBinary,449,Object
+OpenSecureChannelResponse_Encoding_DefaultJson,15133,Object
+OpenSecureChannelResponse_Encoding_DefaultXml,448,Object
+OperationLimitsType,11564,ObjectType
+OptionSet,12755,DataType
+OptionSet_Encoding_DefaultBinary,12765,Object
+OptionSet_Encoding_DefaultJson,15084,Object
+OptionSet_Encoding_DefaultXml,12757,Object
+OptionSetType,11487,VariableType
+OptionSetValues,12745,Variable
+OrderedListType,23518,ObjectType
+Organizes,35,ReferenceType
+Orientation,18811,DataType
+Orientation_Encoding_DefaultBinary,18820,Object
+Orientation_Encoding_DefaultJson,19069,Object
+Orientation_Encoding_DefaultXml,18856,Object
+OrientationType,18779,VariableType
+OutputArguments,3073,Variable
+OverrideValueHandling,15874,DataType
+ParsingResult,610,DataType
+ParsingResult_Encoding_DefaultBinary,612,Object
+ParsingResult_Encoding_DefaultJson,15236,Object
+ParsingResult_Encoding_DefaultXml,611,Object
+PerformUpdateType,11293,DataType
+PermissionType,94,DataType
+ProcessConditionClassType,11164,ObjectType
+ProgramDiagnostic2DataType,24033,DataType
+ProgramDiagnostic2DataType_Encoding_DefaultBinary,24034,Object
+ProgramDiagnostic2DataType_Encoding_DefaultJson,24042,Object
+ProgramDiagnostic2DataType_Encoding_DefaultXml,24038,Object
+ProgramDiagnostic2Type,15383,VariableType
+ProgramDiagnosticDataType,894,DataType
+ProgramDiagnosticDataType_Encoding_DefaultBinary,896,Object
+ProgramDiagnosticDataType_Encoding_DefaultJson,15381,Object
+ProgramDiagnosticDataType_Encoding_DefaultXml,895,Object
+ProgramDiagnosticType,2380,VariableType
+ProgramStateMachineType,2391,ObjectType
+ProgramTransitionAuditEventType,3806,ObjectType
+ProgramTransitionEventType,2378,ObjectType
+ProgressEventType,11436,ObjectType
+PropertyType,68,VariableType
+PublishedDataItemsDataType,15581,DataType
+PublishedDataItemsDataType_Encoding_DefaultBinary,15679,Object
+PublishedDataItemsDataType_Encoding_DefaultJson,16154,Object
+PublishedDataItemsDataType_Encoding_DefaultXml,15953,Object
+PublishedDataItemsType,14534,ObjectType
+PublishedDataSetDataType,15578,DataType
+PublishedDataSetDataType_Encoding_DefaultBinary,15677,Object
+PublishedDataSetDataType_Encoding_DefaultJson,16152,Object
+PublishedDataSetDataType_Encoding_DefaultXml,15951,Object
+PublishedDataSetSourceDataType,15580,DataType
+PublishedDataSetSourceDataType_Encoding_DefaultBinary,15678,Object
+PublishedDataSetSourceDataType_Encoding_DefaultJson,16153,Object
+PublishedDataSetSourceDataType_Encoding_DefaultXml,15952,Object
+PublishedDataSetType,14509,ObjectType
+PublishedEventsDataType,15582,DataType
+PublishedEventsDataType_Encoding_DefaultBinary,15681,Object
+PublishedEventsDataType_Encoding_DefaultJson,16155,Object
+PublishedEventsDataType_Encoding_DefaultXml,15954,Object
+PublishedEventsType,14572,ObjectType
+PublishedVariableDataType,14273,DataType
+PublishedVariableDataType_Encoding_DefaultBinary,14323,Object
+PublishedVariableDataType_Encoding_DefaultJson,15060,Object
+PublishedVariableDataType_Encoding_DefaultXml,14319,Object
+PublishRequest,824,DataType
+PublishRequest_Encoding_DefaultBinary,826,Object
+PublishRequest_Encoding_DefaultJson,15352,Object
+PublishRequest_Encoding_DefaultXml,825,Object
+PublishResponse,827,DataType
+PublishResponse_Encoding_DefaultBinary,829,Object
+PublishResponse_Encoding_DefaultJson,15353,Object
+PublishResponse_Encoding_DefaultXml,828,Object
+PublishSubscribe,14443,Object
+PublishSubscribeType,14416,ObjectType
+PubSubCommunicationFailureEventType,15563,ObjectType
+PubSubConfigurationDataType,15530,DataType
+PubSubConfigurationDataType_Encoding_DefaultBinary,21154,Object
+PubSubConfigurationDataType_Encoding_DefaultJson,21202,Object
+PubSubConfigurationDataType_Encoding_DefaultXml,21178,Object
+PubSubConnectionDataType,15617,DataType
+PubSubConnectionDataType_Encoding_DefaultBinary,15694,Object
+PubSubConnectionDataType_Encoding_DefaultJson,16281,Object
+PubSubConnectionDataType_Encoding_DefaultXml,15992,Object
+PubSubConnectionType,14209,ObjectType
+PubSubDiagnosticsConnectionType,19786,ObjectType
+PubSubDiagnosticsCounterClassification,19730,DataType
+PubSubDiagnosticsCounterType,19725,VariableType
+PubSubDiagnosticsDataSetReaderType,20027,ObjectType
+PubSubDiagnosticsDataSetWriterType,19968,ObjectType
+PubSubDiagnosticsReaderGroupType,19903,ObjectType
+PubSubDiagnosticsRootType,19732,ObjectType
+PubSubDiagnosticsType,19677,ObjectType
+PubSubDiagnosticsWriterGroupType,19834,ObjectType
+PubSubGroupDataType,15609,DataType
+PubSubGroupDataType_Encoding_DefaultBinary,15689,Object
+PubSubGroupDataType_Encoding_DefaultJson,16159,Object
+PubSubGroupDataType_Encoding_DefaultXml,15988,Object
+PubSubGroupType,14232,ObjectType
+PubSubKeyServiceType,15906,ObjectType
+PubSubState,14647,DataType
+PubSubStatusEventType,15535,ObjectType
+PubSubStatusType,14643,ObjectType
+PubSubTransportLimitsExceedEventType,15548,ObjectType
+QualifiedName,20,DataType
+QueryDataDescription,570,DataType
+QueryDataDescription_Encoding_DefaultBinary,572,Object
+QueryDataDescription_Encoding_DefaultJson,15200,Object
+QueryDataDescription_Encoding_DefaultXml,571,Object
+QueryDataSet,577,DataType
+QueryDataSet_Encoding_DefaultBinary,579,Object
+QueryDataSet_Encoding_DefaultJson,15202,Object
+QueryDataSet_Encoding_DefaultXml,578,Object
+QueryFirstRequest,613,DataType
+QueryFirstRequest_Encoding_DefaultBinary,615,Object
+QueryFirstRequest_Encoding_DefaultJson,15244,Object
+QueryFirstRequest_Encoding_DefaultXml,614,Object
+QueryFirstResponse,616,DataType
+QueryFirstResponse_Encoding_DefaultBinary,618,Object
+QueryFirstResponse_Encoding_DefaultJson,15252,Object
+QueryFirstResponse_Encoding_DefaultXml,617,Object
+QueryNextRequest,619,DataType
+QueryNextRequest_Encoding_DefaultBinary,621,Object
+QueryNextRequest_Encoding_DefaultJson,15254,Object
+QueryNextRequest_Encoding_DefaultXml,620,Object
+QueryNextResponse,622,DataType
+QueryNextResponse_Encoding_DefaultBinary,624,Object
+QueryNextResponse_Encoding_DefaultJson,15255,Object
+QueryNextResponse_Encoding_DefaultXml,623,Object
+Range,884,DataType
+Range_Encoding_DefaultBinary,886,Object
+Range_Encoding_DefaultJson,15375,Object
+Range_Encoding_DefaultXml,885,Object
+RationalNumber,18806,DataType
+RationalNumber_Encoding_DefaultBinary,18815,Object
+RationalNumber_Encoding_DefaultJson,19064,Object
+RationalNumber_Encoding_DefaultXml,18851,Object
+RationalNumberType,17709,VariableType
+ReadAnnotationDataDetails,23497,DataType
+ReadAnnotationDataDetails_Encoding_DefaultBinary,23500,Object
+ReadAnnotationDataDetails_Encoding_DefaultJson,23512,Object
+ReadAnnotationDataDetails_Encoding_DefaultXml,23506,Object
+ReadAtTimeDetails,653,DataType
+ReadAtTimeDetails_Encoding_DefaultBinary,655,Object
+ReadAtTimeDetails_Encoding_DefaultJson,15269,Object
+ReadAtTimeDetails_Encoding_DefaultXml,654,Object
+ReaderGroupDataType,15520,DataType
+ReaderGroupDataType_Encoding_DefaultBinary,21153,Object
+ReaderGroupDataType_Encoding_DefaultJson,21201,Object
+ReaderGroupDataType_Encoding_DefaultXml,21177,Object
+ReaderGroupMessageDataType,15622,DataType
+ReaderGroupMessageDataType_Encoding_DefaultBinary,15702,Object
+ReaderGroupMessageDataType_Encoding_DefaultJson,16285,Object
+ReaderGroupMessageDataType_Encoding_DefaultXml,15996,Object
+ReaderGroupMessageType,21091,ObjectType
+ReaderGroupTransportDataType,15621,DataType
+ReaderGroupTransportDataType_Encoding_DefaultBinary,15701,Object
+ReaderGroupTransportDataType_Encoding_DefaultJson,16284,Object
+ReaderGroupTransportDataType_Encoding_DefaultXml,15995,Object
+ReaderGroupTransportType,21090,ObjectType
+ReaderGroupType,17999,ObjectType
+ReadEventDetails,644,DataType
+ReadEventDetails_Encoding_DefaultBinary,646,Object
+ReadEventDetails_Encoding_DefaultJson,15262,Object
+ReadEventDetails_Encoding_DefaultXml,645,Object
+ReadProcessedDetails,650,DataType
+ReadProcessedDetails_Encoding_DefaultBinary,652,Object
+ReadProcessedDetails_Encoding_DefaultJson,15264,Object
+ReadProcessedDetails_Encoding_DefaultXml,651,Object
+ReadRawModifiedDetails,647,DataType
+ReadRawModifiedDetails_Encoding_DefaultBinary,649,Object
+ReadRawModifiedDetails_Encoding_DefaultJson,15263,Object
+ReadRawModifiedDetails_Encoding_DefaultXml,648,Object
+ReadRequest,629,DataType
+ReadRequest_Encoding_DefaultBinary,631,Object
+ReadRequest_Encoding_DefaultJson,15257,Object
+ReadRequest_Encoding_DefaultXml,630,Object
+ReadResponse,632,DataType
+ReadResponse_Encoding_DefaultBinary,634,Object
+ReadResponse_Encoding_DefaultJson,15258,Object
+ReadResponse_Encoding_DefaultXml,633,Object
+ReadValueId,626,DataType
+ReadValueId_Encoding_DefaultBinary,628,Object
+ReadValueId_Encoding_DefaultJson,15256,Object
+ReadValueId_Encoding_DefaultXml,627,Object
+RedundancySupport,851,DataType
+RedundantServerDataType,853,DataType
+RedundantServerDataType_Encoding_DefaultBinary,855,Object
+RedundantServerDataType_Encoding_DefaultJson,15362,Object
+RedundantServerDataType_Encoding_DefaultXml,854,Object
+ReferenceDescription,518,DataType
+ReferenceDescription_Encoding_DefaultBinary,520,Object
+ReferenceDescription_Encoding_DefaultJson,15182,Object
+ReferenceDescription_Encoding_DefaultXml,519,Object
+ReferenceNode,285,DataType
+ReferenceNode_Encoding_DefaultBinary,287,Object
+ReferenceNode_Encoding_DefaultJson,15080,Object
+ReferenceNode_Encoding_DefaultXml,286,Object
+References,31,ReferenceType
+ReferenceTypeAttributes,367,DataType
+ReferenceTypeAttributes_Encoding_DefaultBinary,369,Object
+ReferenceTypeAttributes_Encoding_DefaultJson,15160,Object
+ReferenceTypeAttributes_Encoding_DefaultXml,368,Object
+ReferenceTypeNode,273,DataType
+ReferenceTypeNode_Encoding_DefaultBinary,275,Object
+ReferenceTypeNode_Encoding_DefaultJson,15076,Object
+ReferenceTypeNode_Encoding_DefaultXml,274,Object
+ReferenceTypesFolder,91,Object
+RefreshEndEventType,2788,ObjectType
+RefreshRequiredEventType,2789,ObjectType
+RefreshStartEventType,2787,ObjectType
+RegisteredServer,432,DataType
+RegisteredServer_Encoding_DefaultBinary,434,Object
+RegisteredServer_Encoding_DefaultJson,15102,Object
+RegisteredServer_Encoding_DefaultXml,433,Object
+RegisterNodesRequest,558,DataType
+RegisterNodesRequest_Encoding_DefaultBinary,560,Object
+RegisterNodesRequest_Encoding_DefaultJson,15195,Object
+RegisterNodesRequest_Encoding_DefaultXml,559,Object
+RegisterNodesResponse,561,DataType
+RegisterNodesResponse_Encoding_DefaultBinary,563,Object
+RegisterNodesResponse_Encoding_DefaultJson,15196,Object
+RegisterNodesResponse_Encoding_DefaultXml,562,Object
+RegisterServer2Request,12193,DataType
+RegisterServer2Request_Encoding_DefaultBinary,12211,Object
+RegisterServer2Request_Encoding_DefaultJson,15107,Object
+RegisterServer2Request_Encoding_DefaultXml,12199,Object
+RegisterServer2Response,12194,DataType
+RegisterServer2Response_Encoding_DefaultBinary,12212,Object
+RegisterServer2Response_Encoding_DefaultJson,15130,Object
+RegisterServer2Response_Encoding_DefaultXml,12200,Object
+RegisterServerRequest,435,DataType
+RegisterServerRequest_Encoding_DefaultBinary,437,Object
+RegisterServerRequest_Encoding_DefaultJson,15103,Object
+RegisterServerRequest_Encoding_DefaultXml,436,Object
+RegisterServerResponse,438,DataType
+RegisterServerResponse_Encoding_DefaultBinary,440,Object
+RegisterServerResponse_Encoding_DefaultJson,15104,Object
+RegisterServerResponse_Encoding_DefaultXml,439,Object
+RelativePath,540,DataType
+RelativePath_Encoding_DefaultBinary,542,Object
+RelativePath_Encoding_DefaultJson,15189,Object
+RelativePath_Encoding_DefaultXml,541,Object
+RelativePathElement,537,DataType
+RelativePathElement_Encoding_DefaultBinary,539,Object
+RelativePathElement_Encoding_DefaultJson,15188,Object
+RelativePathElement_Encoding_DefaultXml,538,Object
+RepublishRequest,830,DataType
+RepublishRequest_Encoding_DefaultBinary,832,Object
+RepublishRequest_Encoding_DefaultJson,15354,Object
+RepublishRequest_Encoding_DefaultXml,831,Object
+RepublishResponse,833,DataType
+RepublishResponse_Encoding_DefaultBinary,835,Object
+RepublishResponse_Encoding_DefaultJson,15355,Object
+RepublishResponse_Encoding_DefaultXml,834,Object
+RequestHeader,389,DataType
+RequestHeader_Encoding_DefaultBinary,391,Object
+RequestHeader_Encoding_DefaultJson,15088,Object
+RequestHeader_Encoding_DefaultXml,390,Object
+Resources,24226,Object
+ResponseHeader,392,DataType
+ResponseHeader_Encoding_DefaultBinary,394,Object
+ResponseHeader_Encoding_DefaultJson,15089,Object
+ResponseHeader_Encoding_DefaultXml,393,Object
+RoleMappingRuleChangedAuditEventType,17641,ObjectType
+RolePermissionType,96,DataType
+RolePermissionType_Encoding_DefaultBinary,128,Object
+RolePermissionType_Encoding_DefaultJson,15062,Object
+RolePermissionType_Encoding_DefaultXml,16126,Object
+RoleSetType,15607,ObjectType
+RoleType,15620,ObjectType
+RootFolder,84,Object
+RsaEncryptedSecret,17545,DataType
+RsaMinApplicationCertificateType,12559,ObjectType
+RsaSha256ApplicationCertificateType,12560,ObjectType
+SafetyConditionClassType,17218,ObjectType
+SamplingIntervalDiagnosticsArrayType,2164,VariableType
+SamplingIntervalDiagnosticsDataType,856,DataType
+SamplingIntervalDiagnosticsDataType_Encoding_DefaultBinary,858,Object
+SamplingIntervalDiagnosticsDataType_Encoding_DefaultJson,15365,Object
+SamplingIntervalDiagnosticsDataType_Encoding_DefaultXml,857,Object
+SamplingIntervalDiagnosticsType,2165,VariableType
+SByte,2,DataType
+SecurityGroupFolderType,15452,ObjectType
+SecurityGroupType,15471,ObjectType
+SecurityTokenRequestType,315,DataType
+SelectionListType,16309,VariableType
+SemanticChangeEventType,2738,ObjectType
+SemanticChangeStructureDataType,897,DataType
+SemanticChangeStructureDataType_Encoding_DefaultBinary,899,Object
+SemanticChangeStructureDataType_Encoding_DefaultJson,15374,Object
+SemanticChangeStructureDataType_Encoding_DefaultXml,898,Object
+Server,2253,Object
+Server_ServerRedundancy_CurrentServerId,11312,Variable
+Server_ServerRedundancy_RedundantServerArray,11313,Variable
+Server_ServerRedundancy_ServerNetworkGroups,14415,Variable
+Server_ServerRedundancy_ServerUriArray,11314,Variable
+ServerCapabilitiesType,2013,ObjectType
+ServerConfiguration,12637,Object
+ServerConfigurationType,12581,ObjectType
+ServerDiagnosticsSummaryDataType,859,DataType
+ServerDiagnosticsSummaryDataType_Encoding_DefaultBinary,861,Object
+ServerDiagnosticsSummaryDataType_Encoding_DefaultJson,15366,Object
+ServerDiagnosticsSummaryDataType_Encoding_DefaultXml,860,Object
+ServerDiagnosticsSummaryType,2150,VariableType
+ServerDiagnosticsType,2020,ObjectType
+ServerOnNetwork,12189,DataType
+ServerOnNetwork_Encoding_DefaultBinary,12207,Object
+ServerOnNetwork_Encoding_DefaultJson,15095,Object
+ServerOnNetwork_Encoding_DefaultXml,12195,Object
+ServerRedundancyType,2034,ObjectType
+ServerState,852,DataType
+ServerStatusDataType,862,DataType
+ServerStatusDataType_Encoding_DefaultBinary,864,Object
+ServerStatusDataType_Encoding_DefaultJson,15367,Object
+ServerStatusDataType_Encoding_DefaultXml,863,Object
+ServerStatusType,2138,VariableType
+ServerType,2004,ObjectType
+ServerVendorCapabilityType,2137,VariableType
+ServiceCounterDataType,871,DataType
+ServiceCounterDataType_Encoding_DefaultBinary,873,Object
+ServiceCounterDataType_Encoding_DefaultJson,15370,Object
+ServiceCounterDataType_Encoding_DefaultXml,872,Object
+ServiceFault,395,DataType
+ServiceFault_Encoding_DefaultBinary,397,Object
+ServiceFault_Encoding_DefaultJson,15090,Object
+ServiceFault_Encoding_DefaultXml,396,Object
+SessionAuthenticationToken,388,DataType
+SessionDiagnosticsArrayType,2196,VariableType
+SessionDiagnosticsDataType,865,DataType
+SessionDiagnosticsDataType_Encoding_DefaultBinary,867,Object
+SessionDiagnosticsDataType_Encoding_DefaultJson,15368,Object
+SessionDiagnosticsDataType_Encoding_DefaultXml,866,Object
+SessionDiagnosticsObjectType,2029,ObjectType
+SessionDiagnosticsVariableType,2197,VariableType
+SessionlessInvokeRequestType,15901,DataType
+SessionlessInvokeRequestType_Encoding_DefaultBinary,15903,Object
+SessionlessInvokeRequestType_Encoding_DefaultJson,15091,Object
+SessionlessInvokeRequestType_Encoding_DefaultXml,15902,Object
+SessionlessInvokeResponseType,20999,DataType
+SessionlessInvokeResponseType_Encoding_DefaultBinary,21001,Object
+SessionlessInvokeResponseType_Encoding_DefaultJson,15092,Object
+SessionlessInvokeResponseType_Encoding_DefaultXml,21000,Object
+SessionsDiagnosticsSummaryType,2026,ObjectType
+SessionSecurityDiagnosticsArrayType,2243,VariableType
+SessionSecurityDiagnosticsDataType,868,DataType
+SessionSecurityDiagnosticsDataType_Encoding_DefaultBinary,870,Object
+SessionSecurityDiagnosticsDataType_Encoding_DefaultJson,15369,Object
+SessionSecurityDiagnosticsDataType_Encoding_DefaultXml,869,Object
+SessionSecurityDiagnosticsType,2244,VariableType
+SetMonitoringModeRequest,767,DataType
+SetMonitoringModeRequest_Encoding_DefaultBinary,769,Object
+SetMonitoringModeRequest_Encoding_DefaultJson,15329,Object
+SetMonitoringModeRequest_Encoding_DefaultXml,768,Object
+SetMonitoringModeResponse,770,DataType
+SetMonitoringModeResponse_Encoding_DefaultBinary,772,Object
+SetMonitoringModeResponse_Encoding_DefaultJson,15331,Object
+SetMonitoringModeResponse_Encoding_DefaultXml,771,Object
+SetPublishingModeRequest,797,DataType
+SetPublishingModeRequest_Encoding_DefaultBinary,799,Object
+SetPublishingModeRequest_Encoding_DefaultJson,15341,Object
+SetPublishingModeRequest_Encoding_DefaultXml,798,Object
+SetPublishingModeResponse,800,DataType
+SetPublishingModeResponse_Encoding_DefaultBinary,802,Object
+SetPublishingModeResponse_Encoding_DefaultJson,15342,Object
+SetPublishingModeResponse_Encoding_DefaultXml,801,Object
+SetTriggeringRequest,773,DataType
+SetTriggeringRequest_Encoding_DefaultBinary,775,Object
+SetTriggeringRequest_Encoding_DefaultJson,15332,Object
+SetTriggeringRequest_Encoding_DefaultXml,774,Object
+SetTriggeringResponse,776,DataType
+SetTriggeringResponse_Encoding_DefaultBinary,778,Object
+SetTriggeringResponse_Encoding_DefaultJson,15333,Object
+SetTriggeringResponse_Encoding_DefaultXml,777,Object
+ShelvedStateMachineType,2929,ObjectType
+SignatureData,456,DataType
+SignatureData_Encoding_DefaultBinary,458,Object
+SignatureData_Encoding_DefaultJson,15137,Object
+SignatureData_Encoding_DefaultXml,457,Object
+SignedSoftwareCertificate,344,DataType
+SignedSoftwareCertificate_Encoding_DefaultBinary,346,Object
+SignedSoftwareCertificate_Encoding_DefaultJson,15136,Object
+SignedSoftwareCertificate_Encoding_DefaultXml,345,Object
+SimpleAttributeOperand,601,DataType
+SimpleAttributeOperand_Encoding_DefaultBinary,603,Object
+SimpleAttributeOperand_Encoding_DefaultJson,15210,Object
+SimpleAttributeOperand_Encoding_DefaultXml,602,Object
+SimpleTypeDescription,15005,DataType
+SimpleTypeDescription_Encoding_DefaultBinary,15421,Object
+SimpleTypeDescription_Encoding_DefaultJson,15700,Object
+SimpleTypeDescription_Encoding_DefaultXml,15529,Object
+StateMachineType,2299,ObjectType
+StateType,2307,ObjectType
+StateVariableType,2755,VariableType
+StatisticalConditionClassType,18665,ObjectType
+StatusChangeNotification,818,DataType
+StatusChangeNotification_Encoding_DefaultBinary,820,Object
+StatusChangeNotification_Encoding_DefaultJson,15350,Object
+StatusChangeNotification_Encoding_DefaultXml,819,Object
+StatusCode,19,DataType
+StatusResult,299,DataType
+StatusResult_Encoding_DefaultBinary,301,Object
+StatusResult_Encoding_DefaultJson,15371,Object
+StatusResult_Encoding_DefaultXml,300,Object
+Streams,24230,Object
+String,12,DataType
+Structure,22,DataType
+StructureDefinition,99,DataType
+StructureDefinition_Encoding_DefaultBinary,122,Object
+StructureDefinition_Encoding_DefaultJson,15066,Object
+StructureDefinition_Encoding_DefaultXml,14798,Object
+StructureDescription,15487,DataType
+StructureDescription_Encoding_DefaultBinary,126,Object
+StructureDescription_Encoding_DefaultJson,15058,Object
+StructureDescription_Encoding_DefaultXml,15589,Object
+StructureField,101,DataType
+StructureField_Encoding_DefaultBinary,14844,Object
+StructureField_Encoding_DefaultJson,15065,Object
+StructureField_Encoding_DefaultXml,14800,Object
+StructureType,98,DataType
+SubscribedDataSetDataType,15630,DataType
+SubscribedDataSetDataType_Encoding_DefaultBinary,15707,Object
+SubscribedDataSetDataType_Encoding_DefaultJson,16308,Object
+SubscribedDataSetDataType_Encoding_DefaultXml,16010,Object
+SubscribedDataSetMirrorDataType,15635,DataType
+SubscribedDataSetMirrorDataType_Encoding_DefaultBinary,15713,Object
+SubscribedDataSetMirrorDataType_Encoding_DefaultJson,16311,Object
+SubscribedDataSetMirrorDataType_Encoding_DefaultXml,16012,Object
+SubscribedDataSetMirrorType,15127,ObjectType
+SubscribedDataSetType,15108,ObjectType
+SubscriptionAcknowledgement,821,DataType
+SubscriptionAcknowledgement_Encoding_DefaultBinary,823,Object
+SubscriptionAcknowledgement_Encoding_DefaultJson,15351,Object
+SubscriptionAcknowledgement_Encoding_DefaultXml,822,Object
+SubscriptionDiagnosticsArrayType,2171,VariableType
+SubscriptionDiagnosticsDataType,874,DataType
+SubscriptionDiagnosticsDataType_Encoding_DefaultBinary,876,Object
+SubscriptionDiagnosticsDataType_Encoding_DefaultJson,15372,Object
+SubscriptionDiagnosticsDataType_Encoding_DefaultXml,875,Object
+SubscriptionDiagnosticsType,2172,VariableType
+SystemConditionClassType,11166,ObjectType
+SystemDiagnosticAlarmType,18496,ObjectType
+SystemEventType,2130,ObjectType
+SystemOffNormalAlarmType,11753,ObjectType
+SystemStatusChangeEventType,11446,ObjectType
+TagVariables,23479,Object
+TalkerStreams,24231,Object
+TargetVariablesDataType,15631,DataType
+TargetVariablesDataType_Encoding_DefaultBinary,15712,Object
+TargetVariablesDataType_Encoding_DefaultJson,16310,Object
+TargetVariablesDataType_Encoding_DefaultXml,16011,Object
+TargetVariablesType,15111,ObjectType
+TemporaryFileTransferType,15744,ObjectType
+TestingConditionSubClassType,17221,ObjectType
+ThreeDCartesianCoordinates,18810,DataType
+ThreeDCartesianCoordinates_Encoding_DefaultBinary,18819,Object
+ThreeDCartesianCoordinates_Encoding_DefaultJson,19068,Object
+ThreeDCartesianCoordinates_Encoding_DefaultXml,18855,Object
+ThreeDCartesianCoordinatesType,18774,VariableType
+ThreeDFrame,18814,DataType
+ThreeDFrame_Encoding_DefaultBinary,18823,Object
+ThreeDFrame_Encoding_DefaultJson,19072,Object
+ThreeDFrame_Encoding_DefaultXml,18859,Object
+ThreeDFrameType,18791,VariableType
+ThreeDOrientation,18812,DataType
+ThreeDOrientation_Encoding_DefaultBinary,18821,Object
+ThreeDOrientation_Encoding_DefaultJson,19070,Object
+ThreeDOrientation_Encoding_DefaultXml,18857,Object
+ThreeDOrientationType,18781,VariableType
+ThreeDVector,18808,DataType
+ThreeDVector_Encoding_DefaultBinary,18817,Object
+ThreeDVector_Encoding_DefaultJson,19066,Object
+ThreeDVector_Encoding_DefaultXml,18853,Object
+ThreeDVectorType,17716,VariableType
+Time,292,DataType
+TimestampsToReturn,625,DataType
+TimeString,12880,DataType
+TimeZoneDataType,8912,DataType
+TimeZoneDataType_Encoding_DefaultBinary,8917,Object
+TimeZoneDataType_Encoding_DefaultJson,15086,Object
+TimeZoneDataType_Encoding_DefaultXml,8913,Object
+Topics,23488,Object
+ToState,52,ReferenceType
+TrainingConditionClassType,17220,ObjectType
+TransferResult,836,DataType
+TransferResult_Encoding_DefaultBinary,838,Object
+TransferResult_Encoding_DefaultJson,15356,Object
+TransferResult_Encoding_DefaultXml,837,Object
+TransferSubscriptionsRequest,839,DataType
+TransferSubscriptionsRequest_Encoding_DefaultBinary,841,Object
+TransferSubscriptionsRequest_Encoding_DefaultJson,15357,Object
+TransferSubscriptionsRequest_Encoding_DefaultXml,840,Object
+TransferSubscriptionsResponse,842,DataType
+TransferSubscriptionsResponse_Encoding_DefaultBinary,844,Object
+TransferSubscriptionsResponse_Encoding_DefaultJson,15358,Object
+TransferSubscriptionsResponse_Encoding_DefaultXml,843,Object
+TransitionEventType,2311,ObjectType
+TransitionType,2310,ObjectType
+TransitionVariableType,2762,VariableType
+TranslateBrowsePathsToNodeIdsRequest,552,DataType
+TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary,554,Object
+TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultJson,15193,Object
+TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml,553,Object
+TranslateBrowsePathsToNodeIdsResponse,555,DataType
+TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary,557,Object
+TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultJson,15194,Object
+TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml,556,Object
+TransparentRedundancyType,2036,ObjectType
+TripAlarmType,10751,ObjectType
+TrustListDataType,12554,DataType
+TrustListDataType_Encoding_DefaultBinary,12680,Object
+TrustListDataType_Encoding_DefaultJson,15044,Object
+TrustListDataType_Encoding_DefaultXml,12676,Object
+TrustListMasks,12552,DataType
+TrustListOutOfDateAlarmType,19297,ObjectType
+TrustListType,12522,ObjectType
+TrustListUpdatedAuditEventType,12561,ObjectType
+TsnFailureCode,24218,DataType
+TsnListenerStatus,24224,DataType
+TsnStreamState,24220,DataType
+TsnTalkerStatus,24222,DataType
+TwoStateDiscreteType,2373,VariableType
+TwoStateVariableType,8995,VariableType
+TypeNode,11880,DataType
+TypeNode_Encoding_DefaultBinary,11890,Object
+TypeNode_Encoding_DefaultJson,15070,Object
+TypeNode_Encoding_DefaultXml,11888,Object
+TypesFolder,86,Object
+UABinaryFileDataType,15006,DataType
+UABinaryFileDataType_Encoding_DefaultBinary,15422,Object
+UABinaryFileDataType_Encoding_DefaultJson,15714,Object
+UABinaryFileDataType_Encoding_DefaultXml,15531,Object
+UadpDataSetMessageContentMask,15646,DataType
+UadpDataSetReaderMessageDataType,15653,DataType
+UadpDataSetReaderMessageDataType_Encoding_DefaultBinary,15718,Object
+UadpDataSetReaderMessageDataType_Encoding_DefaultJson,16392,Object
+UadpDataSetReaderMessageDataType_Encoding_DefaultXml,16016,Object
+UadpDataSetReaderMessageType,21116,ObjectType
+UadpDataSetWriterMessageDataType,15652,DataType
+UadpDataSetWriterMessageDataType_Encoding_DefaultBinary,15717,Object
+UadpDataSetWriterMessageDataType_Encoding_DefaultJson,16391,Object
+UadpDataSetWriterMessageDataType_Encoding_DefaultXml,16015,Object
+UadpDataSetWriterMessageType,21111,ObjectType
+UadpNetworkMessageContentMask,15642,DataType
+UadpWriterGroupMessageDataType,15645,DataType
+UadpWriterGroupMessageDataType_Encoding_DefaultBinary,15715,Object
+UadpWriterGroupMessageDataType_Encoding_DefaultJson,16323,Object
+UadpWriterGroupMessageDataType_Encoding_DefaultXml,16014,Object
+UadpWriterGroupMessageType,21105,ObjectType
+UInt16,5,DataType
+UInt32,7,DataType
+UInt64,9,DataType
+UInteger,28,DataType
+Union,12756,DataType
+Union_Encoding_DefaultBinary,12766,Object
+Union_Encoding_DefaultJson,15085,Object
+Union_Encoding_DefaultXml,12758,Object
+UnregisterNodesRequest,564,DataType
+UnregisterNodesRequest_Encoding_DefaultBinary,566,Object
+UnregisterNodesRequest_Encoding_DefaultJson,15197,Object
+UnregisterNodesRequest_Encoding_DefaultXml,565,Object
+UnregisterNodesResponse,567,DataType
+UnregisterNodesResponse_Encoding_DefaultBinary,569,Object
+UnregisterNodesResponse_Encoding_DefaultJson,15198,Object
+UnregisterNodesResponse_Encoding_DefaultXml,568,Object
+UnsignedRationalNumber,24107,DataType
+UnsignedRationalNumber_Encoding_DefaultBinary,24110,Object
+UnsignedRationalNumber_Encoding_DefaultJson,24134,Object
+UnsignedRationalNumber_Encoding_DefaultXml,24122,Object
+UpdateDataDetails,680,DataType
+UpdateDataDetails_Encoding_DefaultBinary,682,Object
+UpdateDataDetails_Encoding_DefaultJson,15280,Object
+UpdateDataDetails_Encoding_DefaultXml,681,Object
+UpdateEventDetails,683,DataType
+UpdateEventDetails_Encoding_DefaultBinary,685,Object
+UpdateEventDetails_Encoding_DefaultJson,15282,Object
+UpdateEventDetails_Encoding_DefaultXml,684,Object
+UpdateStructureDataDetails,11295,DataType
+UpdateStructureDataDetails_Encoding_DefaultBinary,11300,Object
+UpdateStructureDataDetails_Encoding_DefaultJson,15281,Object
+UpdateStructureDataDetails_Encoding_DefaultXml,11296,Object
+UriDictionaryEntryType,17600,ObjectType
+UserCredentialCertificateType,15181,ObjectType
+UserIdentityToken,316,DataType
+UserIdentityToken_Encoding_DefaultBinary,318,Object
+UserIdentityToken_Encoding_DefaultJson,15140,Object
+UserIdentityToken_Encoding_DefaultXml,317,Object
+UserNameIdentityToken,322,DataType
+UserNameIdentityToken_Encoding_DefaultBinary,324,Object
+UserNameIdentityToken_Encoding_DefaultJson,15142,Object
+UserNameIdentityToken_Encoding_DefaultXml,323,Object
+UserTokenPolicy,304,DataType
+UserTokenPolicy_Encoding_DefaultBinary,306,Object
+UserTokenPolicy_Encoding_DefaultJson,15098,Object
+UserTokenPolicy_Encoding_DefaultXml,305,Object
+UserTokenType,303,DataType
+UtcTime,294,DataType
+ValueAsText,11433,Variable
+VariableAttributes,355,DataType
+VariableAttributes_Encoding_DefaultBinary,357,Object
+VariableAttributes_Encoding_DefaultJson,15153,Object
+VariableAttributes_Encoding_DefaultXml,356,Object
+VariableNode,267,DataType
+VariableNode_Encoding_DefaultBinary,269,Object
+VariableNode_Encoding_DefaultJson,15074,Object
+VariableNode_Encoding_DefaultXml,268,Object
+VariableTypeAttributes,364,DataType
+VariableTypeAttributes_Encoding_DefaultBinary,366,Object
+VariableTypeAttributes_Encoding_DefaultJson,15159,Object
+VariableTypeAttributes_Encoding_DefaultXml,365,Object
+VariableTypeNode,270,DataType
+VariableTypeNode_Encoding_DefaultBinary,272,Object
+VariableTypeNode_Encoding_DefaultJson,15075,Object
+VariableTypeNode_Encoding_DefaultXml,271,Object
+VariableTypesFolder,89,Object
+Vector,18807,DataType
+Vector_Encoding_DefaultBinary,18816,Object
+Vector_Encoding_DefaultJson,19065,Object
+Vector_Encoding_DefaultXml,18852,Object
+VectorType,17714,VariableType
+VendorServerInfoType,2033,ObjectType
+VersionTime,20998,DataType
+ViewAttributes,373,DataType
+ViewAttributes_Encoding_DefaultBinary,375,Object
+ViewAttributes_Encoding_DefaultJson,15162,Object
+ViewAttributes_Encoding_DefaultXml,374,Object
+ViewDescription,511,DataType
+ViewDescription_Encoding_DefaultBinary,513,Object
+ViewDescription_Encoding_DefaultJson,15179,Object
+ViewDescription_Encoding_DefaultXml,512,Object
+ViewNode,279,DataType
+ViewNode_Encoding_DefaultBinary,281,Object
+ViewNode_Encoding_DefaultJson,15078,Object
+ViewNode_Encoding_DefaultXml,280,Object
+ViewsFolder,87,Object
+ViewVersion,12170,Variable
+WellKnownRole_Anonymous,15644,Object
+WellKnownRole_AuthenticatedUser,15656,Object
+WellKnownRole_ConfigureAdmin,15716,Object
+WellKnownRole_Engineer,16036,Object
+WellKnownRole_Observer,15668,Object
+WellKnownRole_Operator,15680,Object
+WellKnownRole_SecurityAdmin,15704,Object
+WellKnownRole_Supervisor,15692,Object
+WriteRequest,671,DataType
+WriteRequest_Encoding_DefaultBinary,673,Object
+WriteRequest_Encoding_DefaultJson,15277,Object
+WriteRequest_Encoding_DefaultXml,672,Object
+WriteResponse,674,DataType
+WriteResponse_Encoding_DefaultBinary,676,Object
+WriteResponse_Encoding_DefaultJson,15278,Object
+WriteResponse_Encoding_DefaultXml,675,Object
+WriterGroupDataType,15480,DataType
+WriterGroupDataType_Encoding_DefaultBinary,21150,Object
+WriterGroupDataType_Encoding_DefaultJson,21198,Object
+WriterGroupDataType_Encoding_DefaultXml,21174,Object
+WriterGroupMessageDataType,15616,DataType
+WriterGroupMessageDataType_Encoding_DefaultBinary,15693,Object
+WriterGroupMessageDataType_Encoding_DefaultJson,16280,Object
+WriterGroupMessageDataType_Encoding_DefaultXml,15991,Object
+WriterGroupMessageType,17998,ObjectType
+WriterGroupTransportDataType,15611,DataType
+WriterGroupTransportDataType_Encoding_DefaultBinary,15691,Object
+WriterGroupTransportDataType_Encoding_DefaultJson,16161,Object
+WriterGroupTransportDataType_Encoding_DefaultXml,15990,Object
+WriterGroupTransportType,17997,ObjectType
+WriterGroupType,17725,ObjectType
+WriteValue,668,DataType
+WriteValue_Encoding_DefaultBinary,670,Object
+WriteValue_Encoding_DefaultJson,15276,Object
+WriteValue_Encoding_DefaultXml,669,Object
+X509IdentityToken,325,DataType
+X509IdentityToken_Encoding_DefaultBinary,327,Object
+X509IdentityToken_Encoding_DefaultJson,15143,Object
+X509IdentityToken_Encoding_DefaultXml,326,Object
+XmlElement,16,DataType
+XmlSchema_TypeSystem,92,Object
+XVType,12080,DataType
+XVType_Encoding_DefaultBinary,12090,Object
+XVType_Encoding_DefaultJson,15380,Object
+XVType_Encoding_DefaultXml,12082,Object
+XYArrayItemType,12038,VariableType
+YArrayItemType,12029,VariableType
diff --git a/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml b/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml
new file mode 100644
index 0000000000..d37964bb2f
--- /dev/null
+++ b/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml
@@ -0,0 +1,63477 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
+ *
+ * OPC Foundation MIT License 1.00
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * The complete license agreement can be found here:
+ * http://opcfoundation.org/License/MIT/1.00/
+-->
+
+<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" LastModified="2021-09-15T00:00:00Z" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
+ <Models>
+ <Model ModelUri="http://opcfoundation.org/UA/" Version="1.04.10" PublicationDate="2021-09-15T00:00:00Z" />
+ </Models>
+ <Aliases>
+ <Alias Alias="Boolean">i=1</Alias>
+ <Alias Alias="SByte">i=2</Alias>
+ <Alias Alias="Byte">i=3</Alias>
+ <Alias Alias="Int16">i=4</Alias>
+ <Alias Alias="UInt16">i=5</Alias>
+ <Alias Alias="Int32">i=6</Alias>
+ <Alias Alias="UInt32">i=7</Alias>
+ <Alias Alias="Int64">i=8</Alias>
+ <Alias Alias="UInt64">i=9</Alias>
+ <Alias Alias="Float">i=10</Alias>
+ <Alias Alias="Double">i=11</Alias>
+ <Alias Alias="DateTime">i=13</Alias>
+ <Alias Alias="String">i=12</Alias>
+ <Alias Alias="ByteString">i=15</Alias>
+ <Alias Alias="Guid">i=14</Alias>
+ <Alias Alias="XmlElement">i=16</Alias>
+ <Alias Alias="NodeId">i=17</Alias>
+ <Alias Alias="ExpandedNodeId">i=18</Alias>
+ <Alias Alias="QualifiedName">i=20</Alias>
+ <Alias Alias="LocalizedText">i=21</Alias>
+ <Alias Alias="StatusCode">i=19</Alias>
+ <Alias Alias="Structure">i=22</Alias>
+ <Alias Alias="Number">i=26</Alias>
+ <Alias Alias="Integer">i=27</Alias>
+ <Alias Alias="UInteger">i=28</Alias>
+ <Alias Alias="HasComponent">i=47</Alias>
+ <Alias Alias="HasProperty">i=46</Alias>
+ <Alias Alias="Organizes">i=35</Alias>
+ <Alias Alias="HasEventSource">i=36</Alias>
+ <Alias Alias="HasNotifier">i=48</Alias>
+ <Alias Alias="HasSubtype">i=45</Alias>
+ <Alias Alias="HasTypeDefinition">i=40</Alias>
+ <Alias Alias="HasModellingRule">i=37</Alias>
+ <Alias Alias="HasEncoding">i=38</Alias>
+ <Alias Alias="HasDescription">i=39</Alias>
+ <Alias Alias="HasCause">i=53</Alias>
+ <Alias Alias="ToState">i=52</Alias>
+ <Alias Alias="FromState">i=51</Alias>
+ <Alias Alias="HasEffect">i=54</Alias>
+ <Alias Alias="HasTrueSubState">i=9004</Alias>
+ <Alias Alias="HasFalseSubState">i=9005</Alias>
+ <Alias Alias="HasDictionaryEntry">i=17597</Alias>
+ <Alias Alias="HasCondition">i=9006</Alias>
+ <Alias Alias="HasGuard">i=15112</Alias>
+ <Alias Alias="HasAddIn">i=17604</Alias>
+ <Alias Alias="HasInterface">i=17603</Alias>
+ </Aliases>
+ <UAObject NodeId="i=3062" BrowseName="Default Binary" SymbolicName="DefaultBinary">
+ <DisplayName>Default Binary</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=3063" BrowseName="Default XML" SymbolicName="DefaultXml">
+ <DisplayName>Default XML</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
+ </References>
+ </UAObject>
+ <UADataType NodeId="i=24" BrowseName="BaseDataType" IsAbstract="true">
+ <DisplayName>BaseDataType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References />
+ </UADataType>
+ <UADataType NodeId="i=26" BrowseName="Number" IsAbstract="true">
+ <DisplayName>Number</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=27" BrowseName="Integer" IsAbstract="true">
+ <DisplayName>Integer</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=28" BrowseName="UInteger" IsAbstract="true">
+ <DisplayName>UInteger</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=29" BrowseName="Enumeration" IsAbstract="true">
+ <DisplayName>Enumeration</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Part22/docs/5.3.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ <Definition Name="Enumeration" />
+ </UADataType>
+ <UADataType NodeId="i=1" BrowseName="Boolean">
+ <DisplayName>Boolean</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.8</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=2" BrowseName="SByte">
+ <DisplayName>SByte</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.17</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=3" BrowseName="Byte">
+ <DisplayName>Byte</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.9</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=4" BrowseName="Int16">
+ <DisplayName>Int16</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.25</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=5" BrowseName="UInt16">
+ <DisplayName>UInt16</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.35</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=6" BrowseName="Int32">
+ <DisplayName>Int32</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.26</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=7" BrowseName="UInt32">
+ <DisplayName>UInt32</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.36</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=8" BrowseName="Int64">
+ <DisplayName>Int64</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.27</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=9" BrowseName="UInt64">
+ <DisplayName>UInt64</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=10" BrowseName="Float">
+ <DisplayName>Float</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.15</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=11" BrowseName="Double">
+ <DisplayName>Double</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=12" BrowseName="String">
+ <DisplayName>String</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=13" BrowseName="DateTime">
+ <DisplayName>DateTime</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=14" BrowseName="Guid">
+ <DisplayName>Guid</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.16</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=15" BrowseName="ByteString">
+ <DisplayName>ByteString</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=16" BrowseName="XmlElement">
+ <DisplayName>XmlElement</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.39</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=17" BrowseName="NodeId">
+ <DisplayName>NodeId</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/5.2.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=18" BrowseName="ExpandedNodeId">
+ <DisplayName>ExpandedNodeId</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part4/7.11</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=19" BrowseName="StatusCode">
+ <DisplayName>StatusCode</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part4/7.34.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=20" BrowseName="QualifiedName">
+ <DisplayName>QualifiedName</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=21" BrowseName="LocalizedText">
+ <DisplayName>LocalizedText</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.5</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=22" BrowseName="Structure" IsAbstract="true">
+ <DisplayName>Structure</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Part22/docs/5.3.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=23" BrowseName="DataValue">
+ <DisplayName>DataValue</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part4/7.7.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=25" BrowseName="DiagnosticInfo">
+ <DisplayName>DiagnosticInfo</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part4/7.8</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=30" BrowseName="Image" IsAbstract="true">
+ <DisplayName>Image</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=15</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=50" BrowseName="Decimal">
+ <DisplayName>Decimal</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.54</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
+ </References>
+ </UADataType>
+ <UAReferenceType NodeId="i=31" BrowseName="References" IsAbstract="true" Symmetric="true">
+ <DisplayName>References</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.1</Documentation>
+ <References />
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=32" BrowseName="NonHierarchicalReferences" IsAbstract="true" Symmetric="true">
+ <DisplayName>NonHierarchicalReferences</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=31</Reference>
+ </References>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=33" BrowseName="HierarchicalReferences" IsAbstract="true">
+ <DisplayName>HierarchicalReferences</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=31</Reference>
+ </References>
+ <InverseName>HierarchicalReferences</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=34" BrowseName="HasChild" IsAbstract="true">
+ <DisplayName>HasChild</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.4</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
+ </References>
+ <InverseName>ChildOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=35" BrowseName="Organizes">
+ <DisplayName>Organizes</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.6</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
+ </References>
+ <InverseName>OrganizedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=36" BrowseName="HasEventSource">
+ <DisplayName>HasEventSource</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.14</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
+ </References>
+ <InverseName>EventSourceOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=37" BrowseName="HasModellingRule">
+ <DisplayName>HasModellingRule</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.11</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>ModellingRuleOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=38" BrowseName="HasEncoding">
+ <DisplayName>HasEncoding</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.13</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>EncodingOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=39" BrowseName="HasDescription">
+ <DisplayName>HasDescription</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>DescriptionOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=40" BrowseName="HasTypeDefinition">
+ <DisplayName>HasTypeDefinition</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.12</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>TypeDefinitionOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=41" BrowseName="GeneratesEvent">
+ <DisplayName>GeneratesEvent</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.16</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>GeneratedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=3065" BrowseName="AlwaysGeneratesEvent">
+ <DisplayName>AlwaysGeneratesEvent</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.17</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=41</Reference>
+ </References>
+ <InverseName>AlwaysGeneratedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=44" BrowseName="Aggregates" IsAbstract="true">
+ <DisplayName>Aggregates</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.5</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=34</Reference>
+ </References>
+ <InverseName>AggregatedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=45" BrowseName="HasSubtype">
+ <DisplayName>HasSubtype</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.10</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=34</Reference>
+ </References>
+ <InverseName>SubtypeOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=46" BrowseName="HasProperty">
+ <DisplayName>HasProperty</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.9</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
+ </References>
+ <InverseName>PropertyOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=47" BrowseName="HasComponent">
+ <DisplayName>HasComponent</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.7</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
+ </References>
+ <InverseName>ComponentOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=48" BrowseName="HasNotifier">
+ <DisplayName>HasNotifier</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.15</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=36</Reference>
+ </References>
+ <InverseName>NotifierOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=49" BrowseName="HasOrderedComponent">
+ <DisplayName>HasOrderedComponent</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/11.8</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=47</Reference>
+ </References>
+ <InverseName>OrderedComponentOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=51" BrowseName="FromState">
+ <DisplayName>FromState</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.11</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>ToTransition</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=52" BrowseName="ToState">
+ <DisplayName>ToState</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.12</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>FromTransition</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=53" BrowseName="HasCause">
+ <DisplayName>HasCause</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.13</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>MayBeCausedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=54" BrowseName="HasEffect">
+ <DisplayName>HasEffect</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.14</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>MayBeEffectedBy</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=117" BrowseName="HasSubStateMachine">
+ <DisplayName>HasSubStateMachine</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.15</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
+ </References>
+ <InverseName>SubStateMachineOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=56" BrowseName="HasHistoricalConfiguration">
+ <DisplayName>HasHistoricalConfiguration</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part11/5.2.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
+ </References>
+ <InverseName>HistoricalConfigurationOf</InverseName>
+ </UAReferenceType>
+ <UAObjectType NodeId="i=58" BrowseName="BaseObjectType">
+ <DisplayName>BaseObjectType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/6.2</Documentation>
+ <References />
+ </UAObjectType>
+ <UAObjectType NodeId="i=61" BrowseName="FolderType">
+ <DisplayName>FolderType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/6.6</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
+ </References>
+ </UAObjectType>
+ <UAVariableType NodeId="i=62" BrowseName="BaseVariableType" IsAbstract="true" ValueRank="-2">
+ <DisplayName>BaseVariableType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/7.2</Documentation>
+ <References />
+ </UAVariableType>
+ <UAVariableType NodeId="i=63" BrowseName="BaseDataVariableType" ValueRank="-2">
+ <DisplayName>BaseDataVariableType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/7.4</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=62</Reference>
+ </References>
+ </UAVariableType>
+ <UAVariableType NodeId="i=68" BrowseName="PropertyType" ValueRank="-2">
+ <DisplayName>PropertyType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/7.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=62</Reference>
+ </References>
+ </UAVariableType>
+ <UAVariableType NodeId="i=69" BrowseName="DataTypeDescriptionType" ReleaseStatus="Deprecated" DataType="String">
+ <DisplayName>DataTypeDescriptionType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=104</Reference>
+ <Reference ReferenceType="HasProperty">i=105</Reference>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
+ </References>
+ </UAVariableType>
+ <UAVariable NodeId="i=104" BrowseName="DataTypeVersion" ReleaseStatus="Deprecated" ParentNodeId="i=69" DataType="String">
+ <DisplayName>DataTypeVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=69</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=105" BrowseName="DictionaryFragment" ReleaseStatus="Deprecated" ParentNodeId="i=69" DataType="ByteString">
+ <DisplayName>DictionaryFragment</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=69</Reference>
+ </References>
+ </UAVariable>
+ <UAVariableType NodeId="i=72" BrowseName="DataTypeDictionaryType" ReleaseStatus="Deprecated" DataType="ByteString">
+ <DisplayName>DataTypeDictionaryType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=106</Reference>
+ <Reference ReferenceType="HasProperty">i=107</Reference>
+ <Reference ReferenceType="HasProperty">i=15001</Reference>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
+ </References>
+ </UAVariableType>
+ <UAVariable NodeId="i=106" BrowseName="DataTypeVersion" ReleaseStatus="Deprecated" ParentNodeId="i=72" DataType="String">
+ <DisplayName>DataTypeVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=72</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=107" BrowseName="NamespaceUri" ReleaseStatus="Deprecated" ParentNodeId="i=72" DataType="String">
+ <DisplayName>NamespaceUri</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=72</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=15001" BrowseName="Deprecated" ReleaseStatus="Deprecated" ParentNodeId="i=72" DataType="Boolean">
+ <DisplayName>Deprecated</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=72</Reference>
+ </References>
+ </UAVariable>
+ <UAObjectType NodeId="i=75" BrowseName="DataTypeSystemType" ReleaseStatus="Deprecated">
+ <DisplayName>DataTypeSystemType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.4</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
+ </References>
+ </UAObjectType>
+ <UAObjectType NodeId="i=76" BrowseName="DataTypeEncodingType">
+ <DisplayName>DataTypeEncodingType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/6.7</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
+ </References>
+ </UAObjectType>
+ <UADataType NodeId="i=120" BrowseName="NamingRuleType">
+ <DisplayName>NamingRuleType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.29</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=12169</Reference>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
+ </References>
+ <Definition Name="NamingRuleType">
+ <Field Name="Mandatory" Value="1">
+ <Description>The BrowseName must appear in all instances of the type.</Description>
+ </Field>
+ <Field Name="Optional" Value="2">
+ <Description>The BrowseName may appear in an instance of the type.</Description>
+ </Field>
+ <Field Name="Constraint" Value="3">
+ <Description>The modelling rule defines a constraint and the BrowseName is not used in an instance of the type.</Description>
+ </Field>
+ </Definition>
+ </UADataType>
+ <UAVariable NodeId="i=12169" BrowseName="EnumValues" ParentNodeId="i=120" DataType="i=7594" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>EnumValues</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=120</Reference>
+ </References>
+ <Value>
+ <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=7616</Identifier>
+ </TypeId>
+ <Body>
+ <EnumValueType>
+ <Value>1</Value>
+ <DisplayName>
+ <Text>Mandatory</Text>
+ </DisplayName>
+ <Description>
+ <Text>The BrowseName must appear in all instances of the type.</Text>
+ </Description>
+ </EnumValueType>
+ </Body>
+ </ExtensionObject>
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=7616</Identifier>
+ </TypeId>
+ <Body>
+ <EnumValueType>
+ <Value>2</Value>
+ <DisplayName>
+ <Text>Optional</Text>
+ </DisplayName>
+ <Description>
+ <Text>The BrowseName may appear in an instance of the type.</Text>
+ </Description>
+ </EnumValueType>
+ </Body>
+ </ExtensionObject>
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=7616</Identifier>
+ </TypeId>
+ <Body>
+ <EnumValueType>
+ <Value>3</Value>
+ <DisplayName>
+ <Text>Constraint</Text>
+ </DisplayName>
+ <Description>
+ <Text>The modelling rule defines a constraint and the BrowseName is not used in an instance of the type.</Text>
+ </Description>
+ </EnumValueType>
+ </Body>
+ </ExtensionObject>
+ </ListOfExtensionObject>
+ </Value>
+ </UAVariable>
+ <UAObjectType NodeId="i=77" BrowseName="ModellingRuleType">
+ <DisplayName>ModellingRuleType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/6.5</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=111</Reference>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
+ </References>
+ </UAObjectType>
+ <UAVariable NodeId="i=111" BrowseName="NamingRule" ParentNodeId="i=77" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=77</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=78" BrowseName="Mandatory" SymbolicName="ModellingRule_Mandatory">
+ <DisplayName>Mandatory</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=112</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=112" BrowseName="NamingRule" ParentNodeId="i=78" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=78</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=80" BrowseName="Optional" SymbolicName="ModellingRule_Optional">
+ <DisplayName>Optional</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.3</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=113</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=113" BrowseName="NamingRule" ParentNodeId="i=80" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=80</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">2</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=83" BrowseName="ExposesItsArray" SymbolicName="ModellingRule_ExposesItsArray">
+ <DisplayName>ExposesItsArray</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=114</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=114" BrowseName="NamingRule" ParentNodeId="i=83" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=83</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">3</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=11508" BrowseName="OptionalPlaceholder" SymbolicName="ModellingRule_OptionalPlaceholder">
+ <DisplayName>OptionalPlaceholder</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.4</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=11509</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=11509" BrowseName="NamingRule" ParentNodeId="i=11508" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=11508</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">2</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=11510" BrowseName="MandatoryPlaceholder" SymbolicName="ModellingRule_MandatoryPlaceholder">
+ <DisplayName>MandatoryPlaceholder</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.5</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=11511</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=11511" BrowseName="NamingRule" ParentNodeId="i=11510" DataType="i=120">
+ <DisplayName>NamingRule</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=11510</Reference>
+ </References>
+ <Value>
+ <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1</Int32>
+ </Value>
+ </UAVariable>
+ <UAObject NodeId="i=84" BrowseName="Root" SymbolicName="RootFolder">
+ <DisplayName>Root</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.2</Documentation>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=85" BrowseName="Objects" SymbolicName="ObjectsFolder">
+ <DisplayName>Objects</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.4</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=86" BrowseName="Types" SymbolicName="TypesFolder">
+ <DisplayName>Types</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.5</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=87" BrowseName="Views" SymbolicName="ViewsFolder">
+ <DisplayName>Views</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.3</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=88" BrowseName="ObjectTypes" SymbolicName="ObjectTypesFolder">
+ <DisplayName>ObjectTypes</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.6</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
+ <Reference ReferenceType="Organizes">i=58</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=89" BrowseName="VariableTypes" SymbolicName="VariableTypesFolder">
+ <DisplayName>VariableTypes</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.7</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
+ <Reference ReferenceType="Organizes">i=62</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=90" BrowseName="DataTypes" SymbolicName="DataTypesFolder">
+ <DisplayName>DataTypes</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.9</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
+ <Reference ReferenceType="Organizes">i=24</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=91" BrowseName="ReferenceTypes" SymbolicName="ReferenceTypesFolder">
+ <DisplayName>ReferenceTypes</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.8</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
+ <Reference ReferenceType="Organizes">i=31</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=92" BrowseName="XML Schema" SymbolicName="XmlSchema_TypeSystem" ReleaseStatus="Deprecated">
+ <DisplayName>XML Schema</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.6</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=90</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=75</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=93" BrowseName="OPC Binary" SymbolicName="OPCBinarySchema_TypeSystem" ReleaseStatus="Deprecated">
+ <DisplayName>OPC Binary</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.5</Documentation>
+ <References>
+ <Reference ReferenceType="Organizes" IsForward="false">i=90</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=75</Reference>
+ </References>
+ </UAObject>
+ <UAReferenceType NodeId="i=129" BrowseName="HasArgumentDescription">
+ <DisplayName>HasArgumentDescription</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Amendment3/11.18</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=47</Reference>
+ </References>
+ <InverseName>ArgumentDescriptionOf</InverseName>
+ </UAReferenceType>
+ <UAReferenceType NodeId="i=131" BrowseName="HasOptionalInputArgumentDescription">
+ <DisplayName>HasOptionalInputArgumentDescription</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Amendment3/11.19</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=129</Reference>
+ </References>
+ <InverseName>OptionalInputArgumentDescriptionOf</InverseName>
+ </UAReferenceType>
+ <UAObject NodeId="i=15957" BrowseName="0:http://opcfoundation.org/UA/" SymbolicName="OPCUANamespaceMetadata">
+ <DisplayName>http://opcfoundation.org/UA/</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=15958</Reference>
+ <Reference ReferenceType="HasProperty">i=15959</Reference>
+ <Reference ReferenceType="HasProperty">i=15960</Reference>
+ <Reference ReferenceType="HasProperty">i=15961</Reference>
+ <Reference ReferenceType="HasProperty">i=15962</Reference>
+ <Reference ReferenceType="HasProperty">i=15963</Reference>
+ <Reference ReferenceType="HasProperty">i=15964</Reference>
+ <Reference ReferenceType="HasProperty">i=16134</Reference>
+ <Reference ReferenceType="HasProperty">i=16135</Reference>
+ <Reference ReferenceType="HasProperty">i=16136</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=11715</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=11616</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=15958" BrowseName="NamespaceUri" ParentNodeId="i=15957" DataType="String">
+ <DisplayName>NamespaceUri</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">http://opcfoundation.org/UA/</String>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15959" BrowseName="NamespaceVersion" ParentNodeId="i=15957" DataType="String">
+ <DisplayName>NamespaceVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1.04.10</String>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15960" BrowseName="NamespacePublicationDate" ParentNodeId="i=15957" DataType="DateTime">
+ <DisplayName>NamespacePublicationDate</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <DateTime xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">2021-09-15T00:00:00Z</DateTime>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15961" BrowseName="IsNamespaceSubset" ParentNodeId="i=15957" DataType="Boolean">
+ <DisplayName>IsNamespaceSubset</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <Boolean xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">false</Boolean>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15962" BrowseName="StaticNodeIdTypes" ParentNodeId="i=15957" DataType="i=256" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>StaticNodeIdTypes</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <ListOfInt32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <Int32>0</Int32>
+ </ListOfInt32>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15963" BrowseName="StaticNumericNodeIdRange" ParentNodeId="i=15957" DataType="i=291" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>StaticNumericNodeIdRange</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <ListOfString xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <String>1:2252</String>
+ <String>2270</String>
+ <String>2273</String>
+ <String>2280</String>
+ <String>2283</String>
+ <String>2291:2293</String>
+ <String>2297:2734</String>
+ <String>2738:2991</String>
+ <String>2995</String>
+ <String>2998:3703</String>
+ <String>3710:11191</String>
+ <String>11194:11195</String>
+ <String>11202:11241</String>
+ <String>11243:11272</String>
+ <String>11276:11280</String>
+ <String>11284:11311</String>
+ <String>11315:11491</String>
+ <String>11495:11501</String>
+ <String>11503:11701</String>
+ <String>11706</String>
+ <String>11708</String>
+ <String>11716:12164</String>
+ <String>12169:12748</String>
+ <String>12752:12872</String>
+ <String>12875:12884</String>
+ <String>12888:12910</String>
+ <String>12912:14414</String>
+ <String>14416:15003</String>
+ <String>15005:15605</String>
+ <String>15607:16300</String>
+ <String>16306:17633</String>
+ <String>17635:19090</String>
+ <String>19092:2147483647</String>
+ </ListOfString>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=15964" BrowseName="StaticStringNodeIdPattern" ParentNodeId="i=15957" DataType="String">
+ <DisplayName>StaticStringNodeIdPattern</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ <Value>
+ <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd" />
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=16134" BrowseName="DefaultRolePermissions" ParentNodeId="i=15957" DataType="i=96" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>DefaultRolePermissions</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=16135" BrowseName="DefaultUserRolePermissions" ParentNodeId="i=15957" DataType="i=96" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>DefaultUserRolePermissions</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=16136" BrowseName="DefaultAccessRestrictions" ParentNodeId="i=15957" DataType="i=95">
+ <DisplayName>DefaultAccessRestrictions</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=15957</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3068" BrowseName="NodeVersion" DataType="String">
+ <DisplayName>NodeVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=12170" BrowseName="ViewVersion" DataType="UInt32">
+ <DisplayName>ViewVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3067" BrowseName="Icon" DataType="i=30">
+ <DisplayName>Icon</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3069" BrowseName="LocalTime" DataType="i=8912">
+ <DisplayName>LocalTime</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3070" BrowseName="AllowNulls" DataType="Boolean">
+ <DisplayName>AllowNulls</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=11433" BrowseName="ValueAsText" DataType="LocalizedText">
+ <DisplayName>ValueAsText</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=11498" BrowseName="MaxStringLength" DataType="UInt32">
+ <DisplayName>MaxStringLength</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=15002" BrowseName="MaxCharacters" DataType="UInt32">
+ <DisplayName>MaxCharacters</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=12908" BrowseName="MaxByteStringLength" DataType="UInt32">
+ <DisplayName>MaxByteStringLength</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=11512" BrowseName="MaxArrayLength" DataType="UInt32">
+ <DisplayName>MaxArrayLength</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=11513" BrowseName="EngineeringUnits" DataType="i=887">
+ <DisplayName>EngineeringUnits</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=11432" BrowseName="EnumStrings" DataType="LocalizedText" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>EnumStrings</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3071" BrowseName="EnumValues" DataType="i=7594" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>EnumValues</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=12745" BrowseName="OptionSetValues" DataType="LocalizedText" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>OptionSetValues</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3072" BrowseName="InputArguments" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>InputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3073" BrowseName="OutputArguments" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>OutputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=17605" BrowseName="DefaultInstanceBrowseName" DataType="QualifiedName">
+ <DisplayName>DefaultInstanceBrowseName</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ </References>
+ </UAVariable>
+ <UADataType NodeId="i=2000" BrowseName="ImageBMP">
+ <DisplayName>ImageBMP</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.20</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=30</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=2001" BrowseName="ImageGIF">
+ <DisplayName>ImageGIF</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.21</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=30</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=2002" BrowseName="ImageJPG">
+ <DisplayName>ImageJPG</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.22</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=30</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=2003" BrowseName="ImagePNG">
+ <DisplayName>ImagePNG</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.23</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=30</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=16307" BrowseName="AudioDataType">
+ <DisplayName>AudioDataType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.53</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=15</Reference>
+ </References>
+ </UADataType>
+ <UADataType NodeId="i=12756" BrowseName="Union" IsAbstract="true">
+ <DisplayName>Union</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part3/8.42</Documentation>
+ <References>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
+ </References>
+ <Definition Name="Union" />
+ </UADataType>
+ <UAObjectType NodeId="i=2004" BrowseName="ServerType">
+ <DisplayName>ServerType</DisplayName>
+ <Documentation>https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.1</Documentation>
+ <References>
+ <Reference ReferenceType="HasProperty">i=2005</Reference>
+ <Reference ReferenceType="HasProperty">i=2006</Reference>
+ <Reference ReferenceType="HasProperty">i=15003</Reference>
+ <Reference ReferenceType="HasComponent">i=2007</Reference>
+ <Reference ReferenceType="HasProperty">i=2008</Reference>
+ <Reference ReferenceType="HasProperty">i=2742</Reference>
+ <Reference ReferenceType="HasProperty">i=12882</Reference>
+ <Reference ReferenceType="HasProperty">i=17612</Reference>
+ <Reference ReferenceType="HasComponent">i=2009</Reference>
+ <Reference ReferenceType="HasComponent">i=2010</Reference>
+ <Reference ReferenceType="HasComponent">i=2011</Reference>
+ <Reference ReferenceType="HasComponent">i=2012</Reference>
+ <Reference ReferenceType="HasComponent">i=11527</Reference>
+ <Reference ReferenceType="HasComponent">i=11489</Reference>
+ <Reference ReferenceType="HasComponent">i=12871</Reference>
+ <Reference ReferenceType="HasComponent">i=12746</Reference>
+ <Reference ReferenceType="HasComponent">i=12883</Reference>
+ <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
+ </References>
+ </UAObjectType>
+ <UAVariable NodeId="i=2005" BrowseName="ServerArray" ParentNodeId="i=2004" DataType="String" ValueRank="1" ArrayDimensions="0" MinimumSamplingInterval="1000">
+ <DisplayName>ServerArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=2006" BrowseName="NamespaceArray" ParentNodeId="i=2004" DataType="String" ValueRank="1" ArrayDimensions="0" MinimumSamplingInterval="1000">
+ <DisplayName>NamespaceArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=15003" BrowseName="UrisVersion" ParentNodeId="i=2004" DataType="i=20998" MinimumSamplingInterval="1000">
+ <DisplayName>UrisVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=2007" BrowseName="ServerStatus" ParentNodeId="i=2004" DataType="i=862" MinimumSamplingInterval="1000">
+ <DisplayName>ServerStatus</DisplayName>
+ <References>
+ <Reference ReferenceType="HasComponent">i=3074</Reference>
+ <Reference ReferenceType="HasComponent">i=3075</Reference>
+ <Reference ReferenceType="HasComponent">i=3076</Reference>
+ <Reference ReferenceType="HasComponent">i=3077</Reference>
+ <Reference ReferenceType="HasComponent">i=3084</Reference>
+ <Reference ReferenceType="HasComponent">i=3085</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2138</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3074" BrowseName="StartTime" ParentNodeId="i=2007" DataType="i=294">
+ <DisplayName>StartTime</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3075" BrowseName="CurrentTime" ParentNodeId="i=2007" DataType="i=294">
+ <DisplayName>CurrentTime</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3076" BrowseName="State" ParentNodeId="i=2007" DataType="i=852">
+ <DisplayName>State</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3077" BrowseName="BuildInfo" ParentNodeId="i=2007" DataType="i=338">
+ <DisplayName>BuildInfo</DisplayName>
+ <References>
+ <Reference ReferenceType="HasComponent">i=3078</Reference>
+ <Reference ReferenceType="HasComponent">i=3079</Reference>
+ <Reference ReferenceType="HasComponent">i=3080</Reference>
+ <Reference ReferenceType="HasComponent">i=3081</Reference>
+ <Reference ReferenceType="HasComponent">i=3082</Reference>
+ <Reference ReferenceType="HasComponent">i=3083</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=3051</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3078" BrowseName="ProductUri" ParentNodeId="i=3077" DataType="String" MinimumSamplingInterval="1000">
+ <DisplayName>ProductUri</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3079" BrowseName="ManufacturerName" ParentNodeId="i=3077" DataType="String" MinimumSamplingInterval="1000">
+ <DisplayName>ManufacturerName</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3080" BrowseName="ProductName" ParentNodeId="i=3077" DataType="String" MinimumSamplingInterval="1000">
+ <DisplayName>ProductName</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3081" BrowseName="SoftwareVersion" ParentNodeId="i=3077" DataType="String" MinimumSamplingInterval="1000">
+ <DisplayName>SoftwareVersion</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3082" BrowseName="BuildNumber" ParentNodeId="i=3077" DataType="String" MinimumSamplingInterval="1000">
+ <DisplayName>BuildNumber</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3083" BrowseName="BuildDate" ParentNodeId="i=3077" DataType="i=294" MinimumSamplingInterval="1000">
+ <DisplayName>BuildDate</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3077</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3084" BrowseName="SecondsTillShutdown" ParentNodeId="i=2007" DataType="UInt32">
+ <DisplayName>SecondsTillShutdown</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3085" BrowseName="ShutdownReason" ParentNodeId="i=2007" DataType="LocalizedText">
+ <DisplayName>ShutdownReason</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2007</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=2008" BrowseName="ServiceLevel" ParentNodeId="i=2004" DataType="Byte" MinimumSamplingInterval="1000">
+ <DisplayName>ServiceLevel</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=2742" BrowseName="Auditing" ParentNodeId="i=2004" DataType="Boolean" MinimumSamplingInterval="1000">
+ <DisplayName>Auditing</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=12882" BrowseName="EstimatedReturnTime" ParentNodeId="i=2004" DataType="DateTime" MinimumSamplingInterval="1000">
+ <DisplayName>EstimatedReturnTime</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=17612" BrowseName="LocalTime" ParentNodeId="i=2004" DataType="i=8912" MinimumSamplingInterval="1000">
+ <DisplayName>LocalTime</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2004</Reference>
+ </References>
+ </UAVariable>
+ <UAObject NodeId="i=2009" BrowseName="ServerCapabilities" ParentNodeId="i=2004">
+ <DisplayName>ServerCapabilities</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=3086</Reference>
+ <Reference ReferenceType="HasProperty">i=3087</Reference>
+ <Reference ReferenceType="HasProperty">i=3088</Reference>
+ <Reference ReferenceType="HasProperty">i=3089</Reference>
+ <Reference ReferenceType="HasProperty">i=3090</Reference>
+ <Reference ReferenceType="HasProperty">i=3091</Reference>
+ <Reference ReferenceType="HasProperty">i=3092</Reference>
+ <Reference ReferenceType="HasComponent">i=3093</Reference>
+ <Reference ReferenceType="HasComponent">i=3094</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2013</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=3086" BrowseName="ServerProfileArray" ParentNodeId="i=2009" DataType="String" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>ServerProfileArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3087" BrowseName="LocaleIdArray" ParentNodeId="i=2009" DataType="i=295" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>LocaleIdArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3088" BrowseName="MinSupportedSampleRate" ParentNodeId="i=2009" DataType="i=290">
+ <DisplayName>MinSupportedSampleRate</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3089" BrowseName="MaxBrowseContinuationPoints" ParentNodeId="i=2009" DataType="UInt16">
+ <DisplayName>MaxBrowseContinuationPoints</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3090" BrowseName="MaxQueryContinuationPoints" ParentNodeId="i=2009" DataType="UInt16">
+ <DisplayName>MaxQueryContinuationPoints</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3091" BrowseName="MaxHistoryContinuationPoints" ParentNodeId="i=2009" DataType="UInt16">
+ <DisplayName>MaxHistoryContinuationPoints</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3092" BrowseName="SoftwareCertificates" ParentNodeId="i=2009" DataType="i=344" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>SoftwareCertificates</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2009</Reference>
+ </References>
+ </UAVariable>
+ <UAObject NodeId="i=3093" BrowseName="ModellingRules" ParentNodeId="i=2009">
+ <DisplayName>ModellingRules</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2009</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=3094" BrowseName="AggregateFunctions" ParentNodeId="i=2009">
+ <DisplayName>AggregateFunctions</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2009</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=2010" BrowseName="ServerDiagnostics" ParentNodeId="i=2004">
+ <DisplayName>ServerDiagnostics</DisplayName>
+ <References>
+ <Reference ReferenceType="HasComponent">i=3095</Reference>
+ <Reference ReferenceType="HasComponent">i=3110</Reference>
+ <Reference ReferenceType="HasComponent">i=3111</Reference>
+ <Reference ReferenceType="HasProperty">i=3114</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2020</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=3095" BrowseName="ServerDiagnosticsSummary" ParentNodeId="i=2010" DataType="i=859">
+ <DisplayName>ServerDiagnosticsSummary</DisplayName>
+ <References>
+ <Reference ReferenceType="HasComponent">i=3096</Reference>
+ <Reference ReferenceType="HasComponent">i=3097</Reference>
+ <Reference ReferenceType="HasComponent">i=3098</Reference>
+ <Reference ReferenceType="HasComponent">i=3099</Reference>
+ <Reference ReferenceType="HasComponent">i=3100</Reference>
+ <Reference ReferenceType="HasComponent">i=3101</Reference>
+ <Reference ReferenceType="HasComponent">i=3102</Reference>
+ <Reference ReferenceType="HasComponent">i=3104</Reference>
+ <Reference ReferenceType="HasComponent">i=3105</Reference>
+ <Reference ReferenceType="HasComponent">i=3106</Reference>
+ <Reference ReferenceType="HasComponent">i=3107</Reference>
+ <Reference ReferenceType="HasComponent">i=3108</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2150</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2010</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3096" BrowseName="ServerViewCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>ServerViewCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3097" BrowseName="CurrentSessionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>CurrentSessionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3098" BrowseName="CumulatedSessionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>CumulatedSessionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3099" BrowseName="SecurityRejectedSessionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>SecurityRejectedSessionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3100" BrowseName="RejectedSessionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>RejectedSessionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3101" BrowseName="SessionTimeoutCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>SessionTimeoutCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3102" BrowseName="SessionAbortCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>SessionAbortCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3104" BrowseName="PublishingIntervalCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>PublishingIntervalCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3105" BrowseName="CurrentSubscriptionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>CurrentSubscriptionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3106" BrowseName="CumulatedSubscriptionCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>CumulatedSubscriptionCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3107" BrowseName="SecurityRejectedRequestsCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>SecurityRejectedRequestsCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3108" BrowseName="RejectedRequestsCount" ParentNodeId="i=3095" DataType="UInt32">
+ <DisplayName>RejectedRequestsCount</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3095</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3110" BrowseName="SubscriptionDiagnosticsArray" ParentNodeId="i=2010" DataType="i=874" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>SubscriptionDiagnosticsArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=2171</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2010</Reference>
+ </References>
+ </UAVariable>
+ <UAObject NodeId="i=3111" BrowseName="SessionsDiagnosticsSummary" ParentNodeId="i=2010">
+ <DisplayName>SessionsDiagnosticsSummary</DisplayName>
+ <References>
+ <Reference ReferenceType="HasComponent">i=3112</Reference>
+ <Reference ReferenceType="HasComponent">i=3113</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2026</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2010</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=3112" BrowseName="SessionDiagnosticsArray" ParentNodeId="i=3111" DataType="i=865" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>SessionDiagnosticsArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=2196</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3111</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3113" BrowseName="SessionSecurityDiagnosticsArray" ParentNodeId="i=3111" DataType="i=868" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>SessionSecurityDiagnosticsArray</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=2243</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=3111</Reference>
+ </References>
+ </UAVariable>
+ <UAVariable NodeId="i=3114" BrowseName="EnabledFlag" ParentNodeId="i=2010" DataType="Boolean" AccessLevel="3">
+ <DisplayName>EnabledFlag</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2010</Reference>
+ </References>
+ </UAVariable>
+ <UAObject NodeId="i=2011" BrowseName="VendorServerInfo" ParentNodeId="i=2004">
+ <DisplayName>VendorServerInfo</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=2033</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAObject>
+ <UAObject NodeId="i=2012" BrowseName="ServerRedundancy" ParentNodeId="i=2004">
+ <DisplayName>ServerRedundancy</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=3115</Reference>
+ <Reference ReferenceType="HasTypeDefinition">i=2034</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAObject>
+ <UAVariable NodeId="i=3115" BrowseName="RedundancySupport" ParentNodeId="i=2012" DataType="i=851">
+ <DisplayName>RedundancySupport</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=2012</Reference>
+ </References>
+ </UAVariable>
+ <UAObject NodeId="i=11527" BrowseName="Namespaces" ParentNodeId="i=2004">
+ <DisplayName>Namespaces</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=11645</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAObject>
+ <UAMethod NodeId="i=11489" BrowseName="GetMonitoredItems" ParentNodeId="i=2004">
+ <DisplayName>GetMonitoredItems</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=11490</Reference>
+ <Reference ReferenceType="HasProperty">i=11491</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAMethod>
+ <UAVariable NodeId="i=11490" BrowseName="InputArguments" ParentNodeId="i=11489" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>InputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=11489</Reference>
+ </References>
+ <Value>
+ <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>SubscriptionId</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>-1</ValueRank>
+ <ArrayDimensions />
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ </ListOfExtensionObject>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=11491" BrowseName="OutputArguments" ParentNodeId="i=11489" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>OutputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=11489</Reference>
+ </References>
+ <Value>
+ <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>ServerHandles</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>1</ValueRank>
+ <ArrayDimensions>
+ <UInt32>0</UInt32>
+ </ArrayDimensions>
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>ClientHandles</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>1</ValueRank>
+ <ArrayDimensions>
+ <UInt32>0</UInt32>
+ </ArrayDimensions>
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ </ListOfExtensionObject>
+ </Value>
+ </UAVariable>
+ <UAMethod NodeId="i=12871" BrowseName="ResendData" ParentNodeId="i=2004">
+ <DisplayName>ResendData</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=12872</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAMethod>
+ <UAVariable NodeId="i=12872" BrowseName="InputArguments" ParentNodeId="i=12871" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>InputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=12871</Reference>
+ </References>
+ <Value>
+ <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>SubscriptionId</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>-1</ValueRank>
+ <ArrayDimensions />
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ </ListOfExtensionObject>
+ </Value>
+ </UAVariable>
+ <UAMethod NodeId="i=12746" BrowseName="SetSubscriptionDurable" ParentNodeId="i=2004">
+ <DisplayName>SetSubscriptionDurable</DisplayName>
+ <References>
+ <Reference ReferenceType="HasProperty">i=12747</Reference>
+ <Reference ReferenceType="HasProperty">i=12748</Reference>
+ <Reference ReferenceType="HasModellingRule">i=80</Reference>
+ <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
+ </References>
+ </UAMethod>
+ <UAVariable NodeId="i=12747" BrowseName="InputArguments" ParentNodeId="i=12746" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>InputArguments</DisplayName>
+ <References>
+ <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
+ <Reference ReferenceType="HasModellingRule">i=78</Reference>
+ <Reference ReferenceType="HasProperty" IsForward="false">i=12746</Reference>
+ </References>
+ <Value>
+ <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>SubscriptionId</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>-1</ValueRank>
+ <ArrayDimensions />
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ <ExtensionObject>
+ <TypeId>
+ <Identifier>i=297</Identifier>
+ </TypeId>
+ <Body>
+ <Argument>
+ <Name>LifetimeInHours</Name>
+ <DataType>
+ <Identifier>i=7</Identifier>
+ </DataType>
+ <ValueRank>-1</ValueRank>
+ <ArrayDimensions />
+ </Argument>
+ </Body>
+ </ExtensionObject>
+ </ListOfExtensionObject>
+ </Value>
+ </UAVariable>
+ <UAVariable NodeId="i=12748" BrowseName="OutputArguments" ParentNodeId="i=12746" DataType="i=296" ValueRank="1" ArrayDimensions="0">
+ <DisplayName>OutputArguments</DisplayName>
+ <References>
... 65304 lines suppressed ...