Skip to content

Commit

Permalink
feat: Cleanup of S7 STRING/WSTRING/(various temporal types)
Browse files Browse the repository at this point in the history
* Support for reading and writing to STRING/STRING without providing a length attribute

* Fixed issues with reading dates and time values with S7 in time-zones behind UTC (here we had day-offsets)

---------

Co-authored-by: Cesar Garcia <[email protected]>
  • Loading branch information
chrisdutz and ceos01 authored Dec 7, 2023
1 parent 02e7ff7 commit d90c3dd
Show file tree
Hide file tree
Showing 1,125 changed files with 4,641 additions and 4,084 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -445,31 +445,31 @@ public String getWriteBufferWriteMethodCall(String logicalName, SimpleTypeRefere
case UINT:
IntegerTypeReference unsignedIntegerTypeReference = (IntegerTypeReference) simpleTypeReference;
if (unsignedIntegerTypeReference.getSizeInBits() <= 8) {
return "writeBuffer.WriteUint8(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteUint8(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", uint8(" + fieldName + ")" + writerArgsString + ")";
}
if (unsignedIntegerTypeReference.getSizeInBits() <= 16) {
return "writeBuffer.WriteUint16(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteUint16(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", uint16(" + fieldName + ")" + writerArgsString + ")";
}
if (unsignedIntegerTypeReference.getSizeInBits() <= 32) {
return "writeBuffer.WriteUint32(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteUint32(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", uint32(" + fieldName + ")" + writerArgsString + ")";
}
if (unsignedIntegerTypeReference.getSizeInBits() <= 64) {
return "writeBuffer.WriteUint64(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteUint64(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", uint64(" + fieldName + ")" + writerArgsString + ")";
}
return "writeBuffer.WriteBigInt(\"" + logicalName + "\", " + unsignedIntegerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
case INT:
IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
if (integerTypeReference.getSizeInBits() <= 8) {
return "writeBuffer.WriteInt8(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteInt8(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", int8(" + fieldName + ")" + writerArgsString + ")";
}
if (integerTypeReference.getSizeInBits() <= 16) {
return "writeBuffer.WriteInt16(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteInt16(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", int16(" + fieldName + ")" + writerArgsString + ")";
}
if (integerTypeReference.getSizeInBits() <= 32) {
return "writeBuffer.WriteInt32(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteInt32(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", int32(" + fieldName + ")" + writerArgsString + ")";
}
if (integerTypeReference.getSizeInBits() <= 64) {
return "writeBuffer.WriteInt64(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
return "writeBuffer.WriteInt64(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", int64(" + fieldName + ")" + writerArgsString + ")";
}
return "writeBuffer.WriteBigInt(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", " + fieldName + writerArgsString + ")";
case FLOAT:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ func ${type.name}ParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
<#case "TIME">
readBuffer.CloseContext("${type.name}")
<#if helper.hasFieldsWithNames(case.fields, "milliseconds")>
return values.NewPlcTIMEFromMilliseconds(milliseconds), nil
return values.NewPlcTIMEFromMilliseconds(int64(milliseconds)), nil
</#if>
<#break>
<#case "LTIME">
Expand Down
1 change: 1 addition & 0 deletions plc4c/generated-sources/s7/include/transport_size.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ enum plc4c_s7_read_write_transport_size {
plc4c_s7_read_write_transport_size_STRING = 0x12,
plc4c_s7_read_write_transport_size_WSTRING = 0x13,
plc4c_s7_read_write_transport_size_TIME = 0x14,
plc4c_s7_read_write_transport_size_S5TIME = 0x15,
plc4c_s7_read_write_transport_size_LTIME = 0x16,
plc4c_s7_read_write_transport_size_DATE = 0x17,
plc4c_s7_read_write_transport_size_TIME_OF_DAY = 0x18,
Expand Down
44 changes: 22 additions & 22 deletions plc4c/generated-sources/s7/src/data_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,13 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4x_spi_context ctx, plc

*data_item = plc4c_data_create_time_data(milliseconds);

} else if(strcmp(dataProtocolId, "S7_S5TIME") == 0) { /* TIME */

// Manual Field (milliseconds)
uint32_t milliseconds = (uint32_t) (plc4c_s7_read_write_parse_s5_time(readBuffer));

*data_item = plc4c_data_create_time_data(milliseconds);

} else if(strcmp(dataProtocolId, "IEC61131_LTIME") == 0) { /* LTIME */

// Simple Field (nanoseconds)
Expand All @@ -273,14 +280,10 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4x_spi_context ctx, plc

} else if(strcmp(dataProtocolId, "IEC61131_DATE") == 0) { /* DATE */

// Simple Field (daysSinceSiemensEpoch)
uint16_t daysSinceSiemensEpoch = 0;
_res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &daysSinceSiemensEpoch);
if(_res != OK) {
return _res;
}
// Manual Field (daysSinceEpoch)
uint16_t daysSinceEpoch = (uint16_t) (plc4c_s7_read_write_parse_tia_date(readBuffer));

*data_item = plc4c_data_create_date_data(daysSinceSiemensEpoch);
*data_item = plc4c_data_create_date_data(daysSinceEpoch);

} else if(strcmp(dataProtocolId, "IEC61131_TIME_OF_DAY") == 0) { /* TIME_OF_DAY */

Expand Down Expand Up @@ -526,6 +529,9 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4x_spi_context ctx,
if(_res != OK) {
return _res;
}
} else if(strcmp(dataProtocolId, "S7_S5TIME") == 0) { /* TIME */

// Manual Field (milliseconds)
} else if(strcmp(dataProtocolId, "IEC61131_LTIME") == 0) { /* LTIME */

// Simple field (nanoseconds)
Expand All @@ -535,11 +541,7 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4x_spi_context ctx,
}
} else if(strcmp(dataProtocolId, "IEC61131_DATE") == 0) { /* DATE */

// Simple field (daysSinceSiemensEpoch)
_res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (*data_item)->data.date_value);
if(_res != OK) {
return _res;
}
// Manual Field (daysSinceEpoch)
} else if(strcmp(dataProtocolId, "IEC61131_TIME_OF_DAY") == 0) { /* TIME_OF_DAY */

// Simple field (millisecondsSinceMidnight)
Expand Down Expand Up @@ -687,29 +689,27 @@ uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4x_spi_context ctx, plc
} 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) * (8))) + (16);
} 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) * (16))) + (32);
} else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */

// Simple field (milliseconds)
lengthInBits += 32;
} else if(strcmp(dataProtocolId, "S7_S5TIME") == 0) { /* TIME */

// Manual Field (milliseconds)
lengthInBits += 2;
} else if(strcmp(dataProtocolId, "IEC61131_LTIME") == 0) { /* LTIME */

// Simple field (nanoseconds)
lengthInBits += 64;
} else if(strcmp(dataProtocolId, "IEC61131_DATE") == 0) { /* DATE */

// Simple field (daysSinceSiemensEpoch)
lengthInBits += 16;
// Manual Field (daysSinceEpoch)
lengthInBits += 2;
} else if(strcmp(dataProtocolId, "IEC61131_TIME_OF_DAY") == 0) { /* TIME_OF_DAY */

// Simple field (millisecondsSinceMidnight)
Expand Down
67 changes: 56 additions & 11 deletions plc4c/generated-sources/s7/src/transport_size.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_of(c
if(strcmp(value_string, "TIME") == 0) {
return plc4c_s7_read_write_transport_size_TIME;
}
if(strcmp(value_string, "S5TIME") == 0) {
return plc4c_s7_read_write_transport_size_S5TIME;
}
if(strcmp(value_string, "LTIME") == 0) {
return plc4c_s7_read_write_transport_size_LTIME;
}
Expand All @@ -144,7 +147,7 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_of(c
}

int plc4c_s7_read_write_transport_size_num_values() {
return 26;
return 27;
}

plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_for_index(int index) {
Expand Down Expand Up @@ -210,21 +213,24 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_for_
return plc4c_s7_read_write_transport_size_TIME;
}
case 20: {
return plc4c_s7_read_write_transport_size_LTIME;
return plc4c_s7_read_write_transport_size_S5TIME;
}
case 21: {
return plc4c_s7_read_write_transport_size_DATE;
return plc4c_s7_read_write_transport_size_LTIME;
}
case 22: {
return plc4c_s7_read_write_transport_size_TIME_OF_DAY;
return plc4c_s7_read_write_transport_size_DATE;
}
case 23: {
return plc4c_s7_read_write_transport_size_TOD;
return plc4c_s7_read_write_transport_size_TIME_OF_DAY;
}
case 24: {
return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
return plc4c_s7_read_write_transport_size_TOD;
}
case 25: {
return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
}
case 26: {
return plc4c_s7_read_write_transport_size_DT;
}
default: {
Expand Down Expand Up @@ -295,6 +301,9 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_300(plc4c_s7_read_writ
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return true;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return true;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return false;
}
Expand Down Expand Up @@ -389,6 +398,9 @@ bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return true;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return true;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return false;
}
Expand Down Expand Up @@ -483,6 +495,9 @@ uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transpor
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return 11;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return 4;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return 0;
}
Expand Down Expand Up @@ -619,6 +634,9 @@ uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return 4;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return 2;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return 8;
}
Expand Down Expand Up @@ -731,6 +749,9 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_writ
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return true;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return true;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return false;
}
Expand Down Expand Up @@ -825,6 +846,9 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_wri
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return true;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return true;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return false;
}
Expand Down Expand Up @@ -919,6 +943,9 @@ uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_tr
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return 'X';
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return 'X';
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return 'X';
}
Expand Down Expand Up @@ -1025,6 +1052,9 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_wri
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return true;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return true;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return true;
}
Expand Down Expand Up @@ -1105,19 +1135,22 @@ plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_d
return -1;
}
case plc4c_s7_read_write_transport_size_CHAR: { /* '0x10' */
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
return plc4c_s7_read_write_data_transport_size_OCTET_STRING;
}
case plc4c_s7_read_write_transport_size_WCHAR: { /* '0x11' */
return -1;
return plc4c_s7_read_write_data_transport_size_OCTET_STRING;
}
case plc4c_s7_read_write_transport_size_STRING: { /* '0x12' */
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
return plc4c_s7_read_write_data_transport_size_OCTET_STRING;
}
case plc4c_s7_read_write_transport_size_WSTRING: { /* '0x13' */
return -1;
return plc4c_s7_read_write_data_transport_size_OCTET_STRING;
}
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return -1;
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return -1;
Expand Down Expand Up @@ -1154,6 +1187,9 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_
case plc4c_s7_read_write_transport_size_INT: /* '0x06' */{
return plc4c_s7_read_write_transport_size_INT;
}
case plc4c_s7_read_write_transport_size_CHAR: /* '0x10' */{
return plc4c_s7_read_write_transport_size_CHAR;
}
case plc4c_s7_read_write_transport_size_REAL: /* '0x0E' */{
return plc4c_s7_read_write_transport_size_REAL;
}
Expand Down Expand Up @@ -1228,6 +1264,9 @@ char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_writ
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return "IEC61131_TIME";
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return "S7_S5TIME";
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return "IEC61131_LTIME";
}
Expand Down Expand Up @@ -1325,6 +1364,9 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_
if (strcmp(value, "IEC61131_WSTRING") == 0) {
return plc4c_s7_read_write_transport_size_WSTRING;
}
if (strcmp(value, "S7_S5TIME") == 0) {
return plc4c_s7_read_write_transport_size_S5TIME;
}
}

plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_type(plc4c_s7_read_write_transport_size value) {
Expand Down Expand Up @@ -1389,6 +1431,9 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_t
case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */
return -1;
}
case plc4c_s7_read_write_transport_size_S5TIME: { /* '0x15' */
return -1;
}
case plc4c_s7_read_write_transport_size_LTIME: { /* '0x16' */
return plc4c_s7_read_write_transport_size_TIME;
}
Expand Down
Loading

0 comments on commit d90c3dd

Please sign in to comment.