Skip to content

Commit

Permalink
refactor: Finished support for the last missing data types for S7 150…
Browse files Browse the repository at this point in the history
…0 models.
  • Loading branch information
chrisdutz committed Feb 2, 2024
1 parent 881f237 commit c4115fd
Show file tree
Hide file tree
Showing 21 changed files with 641 additions and 182 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -649,8 +649,14 @@ public String getDataIoPropertyValue(PropertyField propertyField) {
} else {
return "BigInteger.valueOf(_value.getTime().getLong(ChronoField.NANO_OF_DAY))";
}
case "nannosecondsOfSecond":
if(simpleTypeReference.getSizeInBits() <= 63) {
return "_value.getTime().getLong(ChronoField.NANO_OF_SECOND)";
} else {
return "BigInteger.valueOf(_value.getTime().getLong(ChronoField.NANO_OF_SECOND))";
}
case "nanosecondsSinceEpoch":
return "BigInteger.valueOf(_value.getDateTime().toEpochSecond(ZoneOffset.of(ZoneId.systemDefault().getId()))).multiply(BigInteger.valueOf(1000000000)).add(BigInteger.valueOf(_value.getDateTime().getNano()))";
return "BigInteger.valueOf(_value.getDateTime().toEpochSecond(OffsetDateTime.now().getOffset())).multiply(BigInteger.valueOf(1000000000)).add(BigInteger.valueOf(_value.getDateTime().getNano()))";
}
if("value".equals(propertyField.getName())) {
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,13 @@ public class ${type.name} {
return PlcDATE_AND_TIME.ofSecondsSinceEpoch(secondsSinceEpoch);
</#if>
<#break>
<#case "DATE_AND_LTIME">
<#if helper.hasFieldsWithNames(case.fields, "nanosecondsSinceEpoch")>
return PlcDATE_AND_LTIME.ofNanosecondsSinceEpoch(nanosecondsSinceEpoch);
<#elseif helper.hasFieldsWithNames(case.fields, "year", "month", "day", "hour", "minutes", "seconds", "nannosecondsOfSecond")>
return PlcDATE_AND_LTIME.ofSegments(year, (month == 0) ? 1 : month, (day == 0) ? 1 : day, hour, minutes, seconds, nannosecondsOfSecond);
</#if>
<#break>
<#case "LDATE_AND_TIME">
<#if helper.hasFieldsWithNames(case.fields, "nanosecondsSinceEpoch")>
return PlcLDATE_AND_TIME.ofNanosecondsSinceEpoch(nanosecondsSinceEpoch);
Expand Down
4 changes: 4 additions & 0 deletions plc4c/api/include/plc4c/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ plc4c_data *plc4c_data_create_date_and_time_array(uint32_t *tad, int nItems);
plc4c_data *plc4c_data_create_ldate_and_time_data(uint64_t nanosecondsSinceEpoch);
plc4c_data *plc4c_data_create_ldate_and_time_array(uint64_t *nanosecondsSinceEpoch, int nItems);

plc4c_data *plc4c_data_create_date_and_ltime_data(uint64_t nanosecondsSinceEpoch);
plc4c_data *plc4c_data_create_date_and_ltime_array(uint64_t *nanosecondsSinceEpoch, int nItems);


/**
* Creates a plc4c_data with char*
* @param size the size of the string
Expand Down
3 changes: 1 addition & 2 deletions plc4c/generated-sources/s7/include/transport_size.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,8 @@ enum plc4c_s7_read_write_transport_size {
plc4c_s7_read_write_transport_size_LTOD = 0x1B,
plc4c_s7_read_write_transport_size_DATE_AND_TIME = 0x1C,
plc4c_s7_read_write_transport_size_DT = 0x1D,
plc4c_s7_read_write_transport_size_LDATE_AND_TIME = 0x1E,
plc4c_s7_read_write_transport_size_DATE_AND_LTIME = 0x1E,
plc4c_s7_read_write_transport_size_LDT = 0x1F,
plc4c_s7_read_write_transport_size_DATE_AND_LTIME = 0x20,
plc4c_s7_read_write_transport_size_DTL = 0x21
};
typedef enum plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size;
Expand Down
177 changes: 177 additions & 0 deletions plc4c/generated-sources/s7/src/data_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,98 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4x_spi_context ctx, plc

*data_item = plc4c_data_create_date_and_time_data(dayOfWeek);

} else if(strcmp(dataProtocolId, "IEC61131_DATE_AND_LTIME") == 0) { /* DATE_AND_LTIME */

// Simple Field (nanosecondsSinceEpoch)
uint64_t nanosecondsSinceEpoch = 0;
_res = plc4c_spi_read_unsigned_long(readBuffer, 64, (uint64_t*) &nanosecondsSinceEpoch);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(nanosecondsSinceEpoch);

} else if(strcmp(dataProtocolId, "IEC61131_DTL") == 0) { /* DATE_AND_LTIME */

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

*data_item = plc4c_data_create_date_and_ltime_data(year);


// Simple Field (month)
uint8_t month = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &month);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(month);


// Simple Field (day)
uint8_t day = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &day);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(day);


// Simple Field (dayOfWeek)
uint8_t dayOfWeek = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &dayOfWeek);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(dayOfWeek);


// Simple Field (hour)
uint8_t hour = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &hour);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(hour);


// Simple Field (minutes)
uint8_t minutes = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &minutes);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(minutes);


// Simple Field (seconds)
uint8_t seconds = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &seconds);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(seconds);


// Simple Field (nannosecondsOfSecond)
uint32_t nannosecondsOfSecond = 0;
_res = plc4c_spi_read_unsigned_int(readBuffer, 32, (uint32_t*) &nannosecondsOfSecond);
if(_res != OK) {
return _res;
}

*data_item = plc4c_data_create_date_and_ltime_data(nannosecondsOfSecond);

}

return OK;
Expand Down Expand Up @@ -597,6 +689,62 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4x_spi_context ctx,
if(_res != OK) {
return _res;
}
} else if(strcmp(dataProtocolId, "IEC61131_DATE_AND_LTIME") == 0) { /* DATE_AND_LTIME */

// Simple field (nanosecondsSinceEpoch)
_res = plc4c_spi_write_unsigned_long(writeBuffer, 64, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}
} else if(strcmp(dataProtocolId, "IEC61131_DTL") == 0) { /* DATE_AND_LTIME */

// Simple field (year)
_res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (month)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (day)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (dayOfWeek)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (hour)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (minutes)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (seconds)
_res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}

// Simple field (nannosecondsOfSecond)
_res = plc4c_spi_write_unsigned_int(writeBuffer, 32, (*data_item)->data.date_and_ltime_value);
if(_res != OK) {
return _res;
}
}
return OK;
}
Expand Down Expand Up @@ -735,6 +883,35 @@ uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4x_spi_context ctx, plc

// Simple field (dayOfWeek)
lengthInBits += 4;
} else if(strcmp(dataProtocolId, "IEC61131_DATE_AND_LTIME") == 0) { /* DATE_AND_LTIME */

// Simple field (nanosecondsSinceEpoch)
lengthInBits += 64;
} else if(strcmp(dataProtocolId, "IEC61131_DTL") == 0) { /* DATE_AND_LTIME */

// Simple field (year)
lengthInBits += 16;

// Simple field (month)
lengthInBits += 8;

// Simple field (day)
lengthInBits += 8;

// Simple field (dayOfWeek)
lengthInBits += 8;

// Simple field (hour)
lengthInBits += 8;

// Simple field (minutes)
lengthInBits += 8;

// Simple field (seconds)
lengthInBits += 8;

// Simple field (nannosecondsOfSecond)
lengthInBits += 32;
}
return lengthInBits;
}
Expand Down
Loading

0 comments on commit c4115fd

Please sign in to comment.