日期和时间
时间逻辑
掌握 PLC 的时钟。从精确的事件时间戳到复杂的时间计算和格式转换,控制每一毫秒。
为什么在 PLC 中管理时间?
时间管理对于工业自动化至关重要。它可以实现生产事件的精确记录、触发预定的维护任务、计算机器循环时间以及通过 NTP 协议同步分布式系统。
现代 Siemens PLC 提供了像 DTL (Date and Time Long) 这样的高级数据类型,它可以直接访问单个组件(年、月、日、小时),而无需进行复杂的位操作,与传统的 DT 格式相比,极大地简化了编程。
读取时间
访问系统和本地时钟
T_CONV — 系统时间提取
T_CONV功能说明
从日期/时间值中提取特定组件或在格式之间进行转换。这对于从原始时间戳中获取可读的小时/分钟至关重要。
何时使用
当你需要从完整的 Date_And_Time 变量中仅在 HMI 上显示时间时。
专家技巧
使用 T_CONV 将 TOD (Time_Of_Day) 转换为 String 以便于记录。
确保输入和输出类型兼容,以避免溢出错误。
在 SCL 中,此指令通常由简单的赋值隐式处理。
RD_SYS_T — 读取系统时间
RD_SYS_T功能说明
读取 CPU 的当前系统时间 (UTC)。与 RD_LOC_T 不同,它不包括夏令时或时区偏移。
何时使用
适用于需要连续、非跳变时间参考的内部日志记录(避免夏令时 DST 更改期间的问题)。
专家技巧
始终将 UTC 用于数据库存储,以确保全球一致性。
RET_VAL 输出提供状态信息(例如,时钟是否同步)。
如果你需要同时显示“技术”时间和“人类”时间,请将其与 RD_LOC_T 结合使用。
算术运算
持续时间和时间戳的计算
T_ADD — 时间相加
T_ADD功能说明
将持续时间 (Time 或 LTime) 添加到特定的日期/时间点。它能正确处理分钟、小时和天数的溢出。
何时使用
计算过期时间或预定的重启点(例如:当前时间 + 24 小时)。
专家技巧
对于实现具有动态持续时间的自定义看门狗非常有用。
在 S7-1500 CPU 上使用 LTime 类型以获得纳秒级精度。
如果结果超过最大日期(2262 年),CPU 将设置错误状态。
T_DIFF — 时间差
T_DIFF功能说明
计算两个时间戳之间的差异,并将结果作为持续时间 (Time 或 LTime) 返回。
何时使用
测量过程步骤的确切持续时间或计算机器的运行时间。
专家技巧
非常适合 OEE (设备综合效率) 计算。
从较小的日期中减去较大的日期会返回负的 Time 值。
在 S7-1200/1500 上,使用 DTL 变量可以更轻松地访问差异组件。
转换
格式更改和 String 处理
T_CONV — DT 到 DTL 的转换
T_CONV功能说明
将传统的 DATE_AND_TIME (8 字节) 转换为现代的 DTL 格式,反之亦然。
何时使用
当将传统代码或通信块与新的 S7-1500 优化逻辑连接时。
专家技巧
对于所有新项目,首选 DTL 以避免 BCD (Binary Coded Decimal) 的复杂性。
转换为 DTL 允许你在代码中直接编写 'MyTag.MONTH'。
注意毫秒精度,在某些格式中可能会被截断。
DT_TO_STRING — 序列化时间
DT_TO_STR功能说明
将日期/时间值转换为可读的 String 格式。STRING_TO_DT 执行相反操作。
何时使用
将时间戳发送到存储卡上的 CSV 文件或与 Web API 通信。
专家技巧
输出字符串遵循 ISO 8601 格式 (YYYY-MM-DD-HH:MM:SS.ms)。
使用 STRING_TO_DT 解析从外部 SQL 数据库接收的日期。
请注意,String 操作对 CPU 的占用更高;在快速循环中应谨慎使用。
DATE_AND_TIME 与 DTL
选择正确的时间结构
| 特性 | DATE_AND_TIME (传统) | DTL (现代) |
|---|---|---|
| 大小 | 8 字节 | 12 字节 |
| 编码 | BCD (难以读取) | 整数 (直接可读) |
| 组件访问 | 需要位掩码 | 结构化 (Tag.Month) |
| 范围 | 1990 到 2089 | 1970 到 2262 |
| S7-1200/1500 支持 | 仅限兼容性 | 原生且推荐 |
| 精度 | 10 毫秒 | 1 纳秒 |
常见问题
系统时间 (System Time) 和本地时间 (Local Time) 有什么区别?
系统时间 (RD_SYS_T) 始终是 UTC,提供稳定的参考。本地时间 (RD_LOC_T) 会根据 CPU 属性中配置的特定时区和夏令时 (DST) 规则进行调整。
如何将 PLC 时钟与服务器同步?
在 CPU 硬件配置中启用 NTP (Network Time Protocol)。提供时间服务器的 IP,PLC 将自动调整其内部时钟。
为什么我的 DATE_AND_TIME 在十六进制中显示奇怪的值?
传统的 DT 使用 BCD 编码。十进制中的 25 存储为 BCD 中的 16#25。始终使用转换指令或 DTL 来正确读取值。
我可以直接计算两个 DTL 变量之间的差异吗?
在 SCL 中,你可以简单地在两个 DTL 变量之间使用 '-' 运算符。TIA Portal 会自动为你调用 T_DIFF 指令。