/// <summary> /// Converts a S7 DWord to float /// </summary> public static float FromDWord(UInt32 value) { byte[] b = DWord.ToByteArray(value); float d = FromByteArray(b); return(d); }
private static System.DateTime FromByteArrayImpl(byte[] bytes) { if (bytes.Length != TypeLengthInBytes) { throw new ArgumentOutOfRangeException(nameof(bytes), bytes.Length, $"Parsing a DateTimeLong requires exactly 12 bytes of input data, input data is {bytes.Length} bytes long."); } var year = AssertRangeInclusive(Word.FromBytes(bytes[1], bytes[0]), 1970, 2262, "year"); var month = AssertRangeInclusive(bytes[2], 1, 12, "month"); var day = AssertRangeInclusive(bytes[3], 1, 31, "day of month"); var dayOfWeek = AssertRangeInclusive(bytes[4], 1, 7, "day of week"); var hour = AssertRangeInclusive(bytes[5], 0, 23, "hour"); var minute = AssertRangeInclusive(bytes[6], 0, 59, "minute"); var second = AssertRangeInclusive(bytes[7], 0, 59, "second"); ; var nanoseconds = AssertRangeInclusive <uint>(DWord.FromBytes(bytes[11], bytes[10], bytes[9], bytes[8]), 0, 999999999, "nanoseconds"); var time = new System.DateTime(year, month, day, hour, minute, second); return(time.AddTicks(nanoseconds / 100)); }
/// <summary> /// Converts a S7 DWord to double /// </summary> public static double FromDWord(UInt32 value) { byte[] b = DWord.ToByteArray(value); double d = FromByteArray(b); return(d); }
/// <summary> /// Converts a <see cref="T:System.DateTime" /> value to a byte array. /// </summary> /// <param name="dateTime">The DateTime value to convert.</param> /// <returns>A byte array containing the S7 DateTimeLong representation of <paramref name="dateTime" />.</returns> /// <exception cref="ArgumentOutOfRangeException"> /// Thrown when the value of /// <paramref name="dateTime" /> is before <see cref="P:SpecMinimumDateTime" /> /// or after <see cref="P:SpecMaximumDateTime" />. /// </exception> public static byte[] ToByteArray(System.DateTime dateTime) { if (dateTime < SpecMinimumDateTime) { throw new ArgumentOutOfRangeException(nameof(dateTime), dateTime, $"Date time '{dateTime}' is before the minimum '{SpecMinimumDateTime}' supported in S7 DateTimeLong representation."); } if (dateTime > SpecMaximumDateTime) { throw new ArgumentOutOfRangeException(nameof(dateTime), dateTime, $"Date time '{dateTime}' is after the maximum '{SpecMaximumDateTime}' supported in S7 DateTimeLong representation."); } var stream = new MemoryStream(TypeLengthInBytes); // Convert Year stream.Write(Word.ToByteArray(Convert.ToUInt16(dateTime.Year)), 0, 2); // Convert Month stream.WriteByte(Convert.ToByte(dateTime.Month)); // Convert Day stream.WriteByte(Convert.ToByte(dateTime.Day)); // Convert WeekDay. NET DateTime starts with Sunday = 0, while S7DT has Sunday = 1. stream.WriteByte(Convert.ToByte(dateTime.DayOfWeek + 1)); // Convert Hour stream.WriteByte(Convert.ToByte(dateTime.Hour)); // Convert Minutes stream.WriteByte(Convert.ToByte(dateTime.Minute)); // Convert Seconds stream.WriteByte(Convert.ToByte(dateTime.Second)); // Convert Nanoseconds. Net DateTime has a representation of 1 Tick = 100ns. // Thus First take the ticks Mod 1 Second (1s = 10'000'000 ticks), and then Convert to nanoseconds. stream.Write(DWord.ToByteArray(Convert.ToUInt32(dateTime.Ticks % 10000000 * 100)), 0, 4); return(stream.ToArray()); }