You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TwinCAT 3获取GMT+2时区当前小时数,求更优雅实现方案

在TwinCAT 3中优雅获取GMT+2时区当前小时数的方案

你的现有代码Hour:= (Date_to_Dint(time())+1)/3600000依赖本地系统时区设置,且加1的处理属于冗余容错(正常情况下Date_to_Dint(time())不会为0,只要系统时间配置正常)。以下是更优雅、可靠的实现方式:

方案一:基于UTC时间直接计算(推荐)

TwinCAT 3提供了直接获取UTC时间的系统函数,无需依赖本地时区设置,通过时区偏移直接计算GMT+2时间,逻辑清晰且可靠:

VAR
    utcDateTime : DT;
    gmtPlus2DateTime : DT;
    targetHour : BYTE;
END_VAR

// 获取当前UTC时间
utcDateTime := SYSTEMTIME_TO_DT(SYSTEMTIME_UTC());
// 加上GMT+2的时区偏移(2小时)
gmtPlus2DateTime := utcDateTime + DT#2H;
// 提取GMT+2时间的小时数
targetHour := DT_TO_TOD(gmtPlus2DateTime).hour;

这个方案完全脱离本地系统时区限制,无论PLC所在系统时区如何设置,都能准确得到GMT+2的当前小时数。

方案二:优化现有代码的时区适配

如果偏好沿用原代码的毫秒数计算思路,可直接对UTC时间的毫秒值做偏移计算,同时去掉冗余的+1处理:

VAR
    utcMs : DINT;
    gmtPlus2Ms : DINT;
    targetHour : DINT;
END_VAR

// 获取UTC时间的毫秒数(从1970-01-01 00:00:00 UTC开始)
utcMs := DATE_TO_DINT(SYSTEMTIME_TO_DT(SYSTEMTIME_UTC()));
// 加上GMT+2的偏移(2小时 = 7200000毫秒)
gmtPlus2Ms := utcMs + 7200000;
// 计算小时数
targetHour := gmtPlus2Ms / 3600000;

此方案同样不依赖本地时区,且去掉了不必要的+1容错(UTC时间的毫秒数永远不会为0)。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:20:07