将 WinCC 刻度转换为 C# 日期时间,反之亦然

问题描述 投票:0回答:1

当您将西门子 WinCC Flex 的日志文件保存为文本文件时,您将有一个字段为“日期和时间”,另一个字段为“刻度”:

时间字符串 时间_毫秒
“2024-03-16 00:38:20” 45367026614.6759
“2024-10-30 17:17:54” 45595720764.7685

由于日期和时间字段不显示毫秒,因此我需要使用其他字段来获取值。

经过一番挑战,我发现西门子使用 1899 年 12 月 30 日作为开始日期。我不知道他们是怎么想出这个日期的。

我终于能够将刻度转换为日期和时间。

现在我的问题是关于将日期和时间转换为这种刻度。 有谁知道解决办法吗

据我所知,我的问题出在“DateTimeToSiemensTime”函数中。

这就是我所做的:

double mainTick = 45590722754.8727;
DateTime dt = SiemensTimeToDateTime(mainTick);
double calcTick = DateTimeToSiemensTime(dt);
double diff = calcTick - mainTick;
DateTime SiemensTimeToDateTime(double Time_ms)
{
    // Julian Date (JD): Jan 1st, 1900
    // Dublin Julian Date (DJD): Dec 31st, 1899
    // Siemens: Dec 30rd, 1899 --- WHY??!!!!!

    // Start with new date object as Dec 30th, 1899.
    // Divide Time_ms by 1000000 to get the number of Days.

    DateTime StartDateTime = new DateTime(1899, 12, 30, 0, 0, 0);
    return StartDateTime.AddDays(Time_ms / 1_000_000);
}
double DateTimeToSiemensTime(DateTime DateTime)
{
    DateTime StartDateTime = new DateTime(1899, 12, 30, 0, 0, 0);
    TimeSpan ts = DateTime.Subtract(StartDateTime);
    return (double)(ts.Ticks) / 1_000_000;
}
c# datetime timespan wincc
1个回答
0
投票

通过将两个数字相减,我们可以算出差值是

228694150,09259796   Time_ms intervals
228.16:39:34         Days

这告诉我们,西门子时间似乎每天使用 1'000'000 个间隔。所以你的方法

SiemensTimeToDateTime()
似乎已经正确了。

但是,反函数也需要基于天数,而不是刻度,所以:

double DateTimeToSiemensTime(DateTime DateTime)
{
    DateTime StartDateTime = new DateTime(1899, 12, 30, 0, 0, 0);
    TimeSpan ts = DateTime.Subtract(StartDateTime);
    return (double)(ts.TotalDays) * 1_000_000;
}
© www.soinside.com 2019 - 2024. All rights reserved.