当您将西门子 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;
}
通过将两个数字相减,我们可以算出差值是
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;
}