You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cg...@apache.org on 2024/01/29 02:29:43 UTC
(plc4x) branch fix/DATE_AND_TIME created (now 4177949559)
This is an automated email from the ASF dual-hosted git repository.
cgarcia pushed a change to branch fix/DATE_AND_TIME
in repository https://gitbox.apache.org/repos/asf/plc4x.git
at 4177949559 Fix reading/writing of DATE_AND_TIME type
This branch includes the following new commits:
new 4177949559 Fix reading/writing of DATE_AND_TIME type
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(plc4x) 01/01: Fix reading/writing of DATE_AND_TIME type
Posted by cg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
cgarcia pushed a commit to branch fix/DATE_AND_TIME
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 4177949559da110ec31280a321ccf12f9072223b
Author: Cesar Garcia <ce...@ceos.com.ve>
AuthorDate: Sun Jan 28 22:19:25 2024 -0400
Fix reading/writing of DATE_AND_TIME type
---
.../templates/java/data-io-template.java.ftlh | 3 +-
.../java/bacnetip/readwrite/BACnetVendorId.java | 6 -
.../java/knxnetip/readwrite/KnxDatapoint.java | 8 +-
.../apache/plc4x/java/s7/readwrite/DataItem.java | 146 +++++++++++----------
.../plc4x/java/s7/readwrite/TransportSize.java | 10 +-
.../java/s7/readwrite/utils/StaticHelper.java | 94 ++++++++++++-
.../protocols/bacnetip/bacnet-vendorids.mspec | 6 -
.../s7/src/main/resources/protocols/s7/s7.mspec | 29 ++--
8 files changed, 195 insertions(+), 107 deletions(-)
diff --git a/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
index fa472a86d6..6f39fa8255 100644
--- a/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
@@ -221,6 +221,7 @@ public class ${type.name} {
<#if case.name == "Struct" ||
((case.name == "DATE_AND_TIME") && ((simpleField.name == "year") || (simpleField.name == "month") || (simpleField.name == "day") || (simpleField.name == "hour") || (simpleField.name == "minutes") || (simpleField.name == "seconds"))) ||
((case.name == "DATE_AND_TIME") && (simpleField.name == "secondsSinceEpoch")) ||
+ ((case.name == "DATE_AND_TIME") && (simpleField.name == "nanosecondsSinceEpoch)")) ||
((case.name == "DATE") && ((simpleField.name == "year") || (simpleField.name == "month") || (simpleField.name == "day"))) ||
((case.name == "TIME_OF_DAY") && ((simpleField.name == "hour") || (simpleField.name == "minutes") || (simpleField.name == "seconds"))) ||
simpleField.name == "value">
@@ -322,7 +323,7 @@ public class ${type.name} {
<#break>
<#case "DATE_AND_TIME">
<#if helper.hasFieldsWithNames(case.fields, "year", "month", "day", "hour", "minutes", "seconds", "nanoseconds")>
- return PlcDATE_AND_TIME.ofSegments(year.intValue(), (month == 0) ? 1 : month.intValue(), (day == 0) ? 1 : day.intValue(), hour.intValue(), minutes.intValue(), seconds.intValue(), nanoseconds.intValue());
+ return PlcDATE_AND_TIME.ofSegments(year.intValue(), (month.intValue() == 0) ? 1 : month.intValue(), (day.intValue() == 0) ? 1 : day.intValue(), hour.intValue(), minutes.intValue(), seconds.intValue(), nanoseconds.intValue());
<#elseif helper.hasFieldsWithNames(case.fields, "secondsSinceEpoch")>
return PlcDATE_AND_TIME.ofSecondsSinceEpoch(secondsSinceEpoch);
</#if>
diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
index 8702da2184..2c30a51b67 100644
--- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
+++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
@@ -1670,12 +1670,6 @@ public enum BACnetVendorId {
GRID_CONNECT_INC((int) 1454, (int) 1454, (String) "Grid Connect Inc."),
ZIEGLER_INSTRUMENTATIONUK_LTD((int) 1455, (int) 1455, (String) "Ziegler Instrumentation UK Ltd"),
CONTROL_TECLLC((int) 1456, (int) 1456, (String) "ControlTec, LLC"),
- AETERLINK_CORPORATION((int) 1457, (int) 1457, (String) "Aeterlink Corporation"),
- ALPHA_EPSILON_AUTOMATION((int) 1458, (int) 1458, (String) "Alpha Epsilon Automation"),
- ASTRALITE_INC((int) 1459, (int) 1459, (String) "Astralite Inc."),
- DELTA_FIRE_LTDA((int) 1460, (int) 1460, (String) "Delta Fire Ltda."),
- BOCK_WATER_HEATERS_INC((int) 1461, (int) 1461, (String) "Bock Water Heaters, Inc."),
- CLEAVER_BROOKS((int) 1462, (int) 1462, (String) "Cleaver-Brooks"),
UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown");
private static final Map<Integer, BACnetVendorId> map;
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java
index dfe02653e1..76342dff58 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java
+++ b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java
@@ -446,8 +446,8 @@ public class KnxDatapoint {
return PlcDATE_AND_TIME.ofSegments(
year.intValue(),
- (month == 0) ? 1 : month.intValue(),
- (day == 0) ? 1 : day.intValue(),
+ (month.intValue() == 0) ? 1 : month.intValue(),
+ (day.intValue() == 0) ? 1 : day.intValue(),
hour.intValue(),
minutes.intValue(),
seconds.intValue(),
@@ -492,8 +492,8 @@ public class KnxDatapoint {
return PlcDATE_AND_TIME.ofSegments(
year.intValue(),
- (month == 0) ? 1 : month.intValue(),
- (day == 0) ? 1 : day.intValue(),
+ (month.intValue() == 0) ? 1 : month.intValue(),
+ (day.intValue() == 0) ? 1 : day.intValue(),
hour.intValue(),
minutes.intValue(),
seconds.intValue(),
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 0128b57c8a..4871dced66 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
@@ -221,36 +221,50 @@ public class DataItem {
return PlcLTIME_OF_DAY.ofNanosecondsSinceMidnight(nanosecondsSinceMidnight);
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
- // Simple Field (year)
- Integer year = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16);
-
- // Simple Field (month)
- Short month = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (day)
- Short day = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (dayOfWeek)
- Short dayOfWeek = /*TODO: migrate me*/ /*TODO: migrate me*/
- readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (hour)
- Short hour = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (minutes)
- Short minutes = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (seconds)
- Short seconds = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
-
- // Simple Field (nanoseconds)
- Long nanoseconds = /*TODO: migrate me*/ /*TODO: migrate me*/
- readBuffer.readUnsignedLong("", 32);
+ // Manual Field (year)
+ BigInteger year =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (month)
+ BigInteger month =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (day)
+ BigInteger day =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (hour)
+ BigInteger hour =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (minutes)
+ BigInteger minutes =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (seconds)
+ BigInteger seconds =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseBcdToByte(readBuffer));
+
+ // Manual Field (nanoseconds)
+ BigInteger nanoseconds =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7MsecToNsec(readBuffer));
+
+ // Manual Field (dayOfWeek)
+ BigInteger dayOfWeek =
+ (BigInteger)
+ (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7DayOfWeek(readBuffer));
return PlcDATE_AND_TIME.ofSegments(
year.intValue(),
- (month == 0) ? 1 : month.intValue(),
- (day == 0) ? 1 : day.intValue(),
+ (month.intValue() == 0) ? 1 : month.intValue(),
+ (day.intValue() == 0) ? 1 : day.intValue(),
hour.intValue(),
minutes.intValue(),
seconds.intValue(),
@@ -400,40 +414,30 @@ public class DataItem {
/*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger(
"", 64, (BigInteger) (nanosecondsSinceMidnight));
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
- // Simple Field (year)
- int year = (int) _value.getInt();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (year)).intValue());
- // Simple Field (month)
- short month = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (month)).shortValue());
- // Simple Field (day)
- short day = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (day)).shortValue());
- // Simple Field (dayOfWeek)
- short dayOfWeek = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort(
- "", 8, ((Number) (dayOfWeek)).shortValue());
- // Simple Field (hour)
- short hour = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (hour)).shortValue());
- // Simple Field (minutes)
- short minutes = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (minutes)).shortValue());
- // Simple Field (seconds)
- short seconds = (short) _value.getShort();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (seconds)).shortValue());
- // Simple Field (nanoseconds)
- long nanoseconds = (long) _value.getLong();
- /*TODO: migrate me*/
- /*TODO: migrate me*/ writeBuffer.writeUnsignedLong(
- "", 32, ((Number) (nanoseconds)).longValue());
+ // Manual Field (year)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getYear());
+ // Manual Field (month)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getMonthValue());
+ // Manual Field (day)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getDayOfMonth());
+ // Manual Field (hour)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getHour());
+ // Manual Field (minutes)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getMinute());
+ // Manual Field (seconds)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(
+ writeBuffer, _value.getDateTime().getSecond());
+ // Manual Field (nanoseconds)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeNsecToS7Msec(
+ writeBuffer, _value.getDateTime().getNano());
+ // Manual Field (dayOfWeek)
+ org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7DayOfWeek(
+ writeBuffer, _value.getDateTime().getDayOfWeek().getValue());
}
}
@@ -521,22 +525,22 @@ public class DataItem {
// Simple Field (nanosecondsSinceMidnight)
sizeInBits += 64;
} else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
- // Simple Field (year)
- sizeInBits += 16;
- // Simple Field (month)
+ // Manual Field (year)
sizeInBits += 8;
- // Simple Field (day)
+ // Manual Field (month)
sizeInBits += 8;
- // Simple Field (dayOfWeek)
+ // Manual Field (day)
sizeInBits += 8;
- // Simple Field (hour)
+ // Manual Field (hour)
sizeInBits += 8;
- // Simple Field (minutes)
+ // Manual Field (minutes)
sizeInBits += 8;
- // Simple Field (seconds)
+ // Manual Field (seconds)
+ sizeInBits += 8;
+ // Manual Field (nanoseconds)
+ sizeInBits += 8;
+ // Manual Field (dayOfWeek)
sizeInBits += 8;
- // Simple Field (nanoseconds)
- sizeInBits += 32;
}
return sizeInBits;
}
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 7d9b946c42..9e14873e2e 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
@@ -356,12 +356,12 @@ public enum TransportSize {
(boolean) true,
(boolean) false,
(short) 0x0F,
- (short) 12,
+ (short) 8,
(boolean) true,
(boolean) false,
(short) 'X',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_DATE_AND_TIME",
null),
DT(
@@ -369,12 +369,12 @@ public enum TransportSize {
(boolean) true,
(boolean) false,
(short) 0x0F,
- (short) 12,
+ (short) 8,
(boolean) true,
(boolean) false,
- (short) 'X',
+ (short) 'B',
(boolean) true,
- null,
+ DataTransportSize.BYTE_WORD_DWORD,
(String) "IEC61131_DATE_AND_TIME",
null);
private static final Map<Short, TransportSize> map;
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 3bd70e694e..fe4911fbe1 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
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.s7.readwrite.utils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
+import java.math.BigInteger;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -53,6 +54,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.plc4x.java.s7.readwrite.DateAndTime;
import org.apache.plc4x.java.spi.values.PlcDATE;
import org.apache.plc4x.java.spi.values.PlcTIME;
@@ -2097,10 +2099,19 @@ public class StaticHelper {
byte dec = (byte) ((incomingByte / 10) % 10);
return (byte) ((dec << 4) | (incomingByte % 10));
}
+
+ public static void ByteToBcd(final WriteBuffer buffer, PlcValue _value) throws SerializationException {
+
+ }
private static int BcdToInt(byte bcd) {
return (bcd >> 4) * 10 + (bcd & 0x0f);
}
+
+ public static int BcdToInt(final ReadBuffer buffer) throws ParseException {
+ byte bcd = buffer.readByte();
+ return (bcd >> 4) * 10 + (bcd & 0x0f);
+ }
public static void ByteToBcd(final WriteBuffer buffer, short _value) throws SerializationException {
short incomingByte = _value;
@@ -2109,11 +2120,21 @@ public class StaticHelper {
outputByte = (byte) ((dec << 4) | (incomingByte % 10));
buffer.writeByte(outputByte);
}
-
- public static int BcdToInt(final ReadBuffer buffer) throws ParseException {
+
+ public static void ByteToBcd(final WriteBuffer buffer, int _value) throws SerializationException {
+ ByteToBcd(buffer, (short) _value);
+ }
+
+ public static BigInteger parseBcdToByte(final ReadBuffer buffer) throws ParseException {
byte bcd = buffer.readByte();
- return (bcd >> 4) * 10 + (bcd & 0x0f);
- }
+ return BigInteger.valueOf((short) ((bcd >> 4) * 10 + (bcd & 0x0f)));
+ }
+
+ public static void serializeByteToBcd(final WriteBuffer buffer, PlcValue _value) throws SerializationException {
+ byte outputByte = 0;
+ //System.out.println("Clase: " + _value.getDateTime().getN);
+ }
+
public static int S7msecToInt(final ReadBuffer buffer) throws ParseException {
int centenas = BcdToInt(buffer.readUnsignedByte(4));
@@ -2138,6 +2159,10 @@ public class StaticHelper {
buffer.writeUnsignedByte(4, (byte) unidad);
}
+ public static void IntToS7msec(final WriteBuffer buffer, PlcValue _value) throws SerializationException {
+
+ }
+
public static void LeftShift3(final WriteBuffer buffer, int _value) throws SerializationException {
int valor = _value << 3;
buffer.writeUnsignedInt(16, valor);
@@ -2663,6 +2688,67 @@ public class StaticHelper {
return;
}
}
+
+ public static LocalDateTime xparseS7DateTime(ReadBuffer io) {
+ try {
+ int year = io.readByte() + 2000;
+ int month = io.readByte();
+ int day = io.readByte();
+ int hour = io.readByte();
+ int minute = io.readByte();
+ int second = io.readByte();
+ int ms = io.readUnsignedInt(12);
+ // Skip day-of-week
+ int dow = io.readUnsignedInt(4);
+
+ return LocalDateTime.of(year, month, day, hour, minute, second, ms * 1000000);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+// public static LocalDateTime parseS7DateTime(ReadBuffer io) {
+// return null;
+//
+// }
+
+ /*
+ * This is a specific solution for the DATE_AND_TIME data type.
+ * The 12 bits they represent are capped at up to 999 in BCD.
+ */
+ public static BigInteger parseS7MsecToNsec(ReadBuffer io) {
+ BigInteger bint = BigInteger.ZERO;
+ try {
+ return bint.add(BigInteger.valueOf(S7msecToInt(io) * 1_000_000L));
+ } catch (ParseException ex) {
+
+ }
+ return bint;
+ }
+
+ public static void serializeNsecToS7Msec(WriteBuffer io, int value) {
+ long ms = (long) (value / 1_000_000);
+ byte bhl6 = (byte) ((int) (((ms / 100) << 4) | ((ms / 10) % 10)));
+ byte bh_7 = (byte) ((ms % 10) << 4);
+ try {
+ io.writeByte(bhl6);
+ io.writeShort(4, bh_7);
+ } catch (SerializationException ex) {
+ Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public static BigInteger parseS7DayOfWeek(ReadBuffer io) throws ParseException {
+ BigInteger bint = io.readUnsignedBigInteger(4);
+ return bint;
+ }
+
+ public static void serializeS7DayOfWeek(WriteBuffer io, int value) throws SerializationException {
+ short dayofweek = (short) ((value < 7) ? value + 1 : 1);
+ io.writeShort(4, dayofweek);
+ }
+
//TODO: Call BCD converter
public static LocalDateTime parseTiaDateTime(ReadBuffer io) {
diff --git a/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec b/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec
index b49f4330af..60c5013226 100644
--- a/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec
+++ b/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec
@@ -1469,12 +1469,6 @@
['1454' GRID_CONNECT_INC ['1454', '"Grid Connect Inc."']]
['1455' ZIEGLER_INSTRUMENTATIONUK_LTD ['1455', '"Ziegler Instrumentation UK Ltd"']]
['1456' CONTROL_TECLLC ['1456', '"ControlTec, LLC"']]
- ['1457' AETERLINK_CORPORATION ['1457', '"Aeterlink Corporation"']]
- ['1458' ALPHA_EPSILON_AUTOMATION ['1458', '"Alpha Epsilon Automation"']]
- ['1459' ASTRALITE_INC ['1459', '"Astralite Inc."']]
- ['1460' DELTA_FIRE_LTDA ['1460', '"Delta Fire Ltda."']]
- ['1461' BOCK_WATER_HEATERS_INC ['1461', '"Bock Water Heaters, Inc."']]
- ['1462' CLEAVER_BROOKS ['1462', '"Cleaver-Brooks"']]
['0xFFFF' UNKNOWN_VENDOR ['0xFFFF', '"Unknown"']]
]
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 89c4fbaafe..e7a608e3d1 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -801,17 +801,26 @@
['"IEC61131_LTIME_OF_DAY"' LTIME_OF_DAY
[simple uint 64 nanosecondsSinceMidnight]
]
+
// - Date & Time: interpreted as individual components.
+ //Note:
+ //1. Bit size 64 is used to generate the BigInteger type object.
+ // Any other size generates the variable of the primitive type,
+ // which prevents the call to create the instance of the object
+ // in the DataItem class from being generated.
+ //2. The "dayOfWeek" field is taken from the PLC, but is unused
+ // since it is generated internally in the LocalDateTime instances.
['"IEC61131_DATE_AND_TIME"' DATE_AND_TIME
- [simple uint 16 year]
- [simple uint 8 month]
- [simple uint 8 day]
- [simple uint 8 dayOfWeek]
- [simple uint 8 hour]
- [simple uint 8 minutes]
- [simple uint 8 seconds]
- [simple uint 32 nanoseconds]
+ [manual uint 64 year 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().Year())' '8']
+ [manual uint 64 month 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().MonthValue())' '8']
+ [manual uint 64 day 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().DayOfMonth())' '8']
+ [manual uint 64 hour 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().Hour())' '8']
+ [manual uint 64 minutes 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().Minute())' '8']
+ [manual uint 64 seconds 'STATIC_CALL("parseBcdToByte", readBuffer)' 'STATIC_CALL("ByteToBcd", writeBuffer, _value.DateTime().Second())' '8']
+ [manual uint 64 nanoseconds 'STATIC_CALL("parseS7MsecToNsec", readBuffer)' 'STATIC_CALL("serializeNsecToS7Msec", writeBuffer, _value.DateTime().Nano())' '8'] //(01)
+ [manual uint 64 dayOfWeek 'STATIC_CALL("parseS7DayOfWeek", readBuffer)' 'STATIC_CALL("serializeS7DayOfWeek", writeBuffer, _value.DateTime().DayOfWeek().Value())' '8']
]
+
// - Date & Time: Interpreted as "number of nanoseconds since 1990-01-01"
//['"IEC61131_LDATE_AND_TIME"' LDATE_AND_TIME
// [implicit uint 16 nanosecondsSinceSiemensEpoch 'nanosecondsSinceEpoch ...']
@@ -891,8 +900,8 @@
['0x17' DATE ['0x09' , 'X' , '2' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_DATE' , 'true' , 'true' , 'true' , 'true' , 'true' ]]
['0x18' TIME_OF_DAY ['0x06' , 'X' , '4' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_TIME_OF_DAY' , 'true' , 'true' , 'true' , 'true' , 'true' ]]
['0x19' TOD ['0x06' , 'X' , '4' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_TIME_OF_DAY' , 'true' , 'true' , 'true' , 'true' , 'true' ]]
- ['0x1A' DATE_AND_TIME ['0x0F' , 'X' , '12' , 'null' , 'null' , 'IEC61131_DATE_AND_TIME', 'true' , 'true' , 'false' , 'true' , 'false' ]]
- ['0x1B' DT ['0x0F' , 'X' , '12' , 'null' , 'null' , 'IEC61131_DATE_AND_TIME', 'true' , 'true' , 'false' , 'true' , 'false' ]]
+ ['0x1A' DATE_AND_TIME ['0x0F' , 'X' , '8' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_DATE_AND_TIME', 'true' , 'true' , 'false' , 'true' , 'false' ]]
+ ['0x1B' DT ['0x0F' , 'B' , '8' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_DATE_AND_TIME', 'true' , 'true' , 'false' , 'true' , 'false' ]]
]
[enum uint 8 MemoryArea(string 24 shortName)