☰
TIA博途区域指针实现触摸屏与PLC日期时间同步
2026/10/21 9:05:59 网站建设 项目流程

简介:这份资源面向工业自动化工程师、TIA博途初学者及需要处理HMI与PLC时间同步的现场调试人员,聚焦于通过区域指针实现触摸屏与PLC日期时间同步这一具体问题。内容围绕全局DB中DTL变量与Int返回值的定义、RD_LOC_T时钟指令的调用、OB1周期刷新、HMI全局区域指针连接以及日期/时间IO域显示等关键环节展开,并涉及PLC本地时间东八区设置与在线同步方法。资源包共1个文件,为docx文档,大小约723KB,以图文步骤形式呈现完整配置流程。目前已有1030人学习下载,适合希望快速掌握时间同步配置、减少报警与生产数据记录时间偏差的读者参考,也可作为项目现场排错与参数核对的实用资料。

1. 触摸屏时间总跑偏?先搞懂区域指针这条链路

产线上刚换完一批配方,操作工跑过来问:HMI 上报警记录的时间怎么比实际慢了七分钟?你打开画面一看,日期是对的,时间却对不上,重启 HMI 也没用。这种场景在工控现场太常见了——PLC 和触摸屏各自维护一套时钟,谁也没把谁当回事。TIA 博途里解决这个问题的标准做法,就是通过区域指针把 PLC 的日期时间变量映射到 HMI 的全局区域,让触摸屏直接读 PLC 的时间,而不是自己走自己的晶振。

这份资源是一份具体的操作示例文档,围绕“区域指针实现触摸屏与 PLC 日期时间同步”展开,从建 DB、写 FC、调 OB1,到 HMI 连接配置、IO 域绑定、时区设置,整条链路都覆盖了。适合正在用 TIA 博途做 HMI 组态、被时间不一致问题折腾过的电气工程师和调试人员。如果你手上正好有西门子精智或精简系列面板,配合 S7-1200/1500 使用,这篇的步骤可以直接照着复现。

2. 从 DTL 变量到 RD_LOC_T:PLC 侧时间源怎么搭

2.1 为什么选 DTL 而不是 DATE_AND_TIME

在 TIA 博途里存日期时间,常见的数据类型有两个:DTL 和 DATE_AND_TIME。DTL 是结构化类型,包含 YEAR、MONTH、DAY、WEEKDAY、HOUR、MINUTE、SECOND、NANOSECOND 八个成员,每个成员单独可访问,HMI 组态时可以直接绑定到日期/时间 IO 域的对应属性上。DATE_AND_TIME 是 8 字节的紧凑格式,虽然省空间,但 HMI 侧解析起来没那么直观。

我一般会选 DTL,原因很简单:区域指针映射到 HMI 后,日期 IO 域和时间 IO 域需要分别取不同的成员,DTL 的结构化特性让这件事变得很自然。如果你用 DATE_AND_TIME,HMI 那边还得做转换,多一道手续就多一个翻车点。

2.2 建 DB 块和 FC 的完整步骤

先在项目树里添加一个全局 DB,命名为“DB_TimeSync”之类的名字,在 DB 里建两个变量:

变量名数据类型用途
DateAndTimeDTL存储 PLC 读取到的本地日期时间
RetValIntRD_LOC_T 指令的返回值,用于判断读取是否成功

建完 DB 后,添加一个 FC,在扩展指令的时钟功能里找到 RD_LOC_T。这个指令的作用是读取 PLC 的本地时间,输出到 DTL 类型的变量中。在 FC 里这样写:

// FC_ReadLocalTime 梯形图逻辑 // 调用 RD_LOC_T 指令 RD_LOC_T( OUT => "DB_TimeSync".DateAndTime, // 输出到 DTL 变量 RET_VAL => "DB_TimeSync".RetVal // 返回值存入 Int 变量 );

逻辑说明:RD_LOC_T 每个扫描周期执行一次,把 PLC 当前的本地时间写入 DateAndTime。RetVal 如果返回 0 表示读取成功,非 0 可以查手册看具体错误码。参数上没有什么需要特别调的,OUT 必须接 DTL 类型,RET_VAL 接 Int 就行。

然后在 OB1 里调用这个 FC。注意调用位置放在主程序靠前的地方,确保每个扫描周期都刷新一次时间。采集周期后面在 HMI 侧设 1s,所以 PLC 这边每个周期都读也没问题,不会造成额外负担。

2.3 时区设置:东八区这件事别漏

PLC 的设备组态里,本地时间要设成北京时间东 8 区。这个设置在 CPU 属性的“时间”选项卡里,选“本地时间”然后时区选 UTC+08:00。如果你不设,PLC 默认可能是 UTC 或者别的时区,HMI 读过去的时间就会差几个小时。

有个细节:RD_LOC_T 读的是 PLC 的本地时间,也就是经过时区偏移后的时间。如果你在组态里设了东八区,读出来的就是北京时间。如果设错了,后面 HMI 显示再对也没用,源头就偏了。

3. HMI 侧区域指针配置:把日期时间 PLC 连起来

3.1 区域指针到底在传什么

区域指针是 HMI 和 PLC 之间的一种通信机制,它把 HMI 的某个功能区域直接映射到 PLC 的变量地址上。对于日期时间同步来说,HMI 的“日期时间 PLC”区域指针指向 PLC 里那个 DTL 变量,HMI 就会周期性地从 PLC 读这个变量,然后更新画面上绑定了系统时间的 IO 域。

这个过程是单向的:PLC 是时间源,HMI 是消费者。HMI 自己不产生时间,它只是把 PLC 的时间显示出来。所以只要 PLC 的时间是对的,HMI 显示就一定对。

3.2 连接配置的实操步骤

打开项目树里的 HMI 文件夹,找到“连接”,双击进入连接配置界面。在“区域指针”选项卡下,找到“HMI 设备的全局区域指针”这一栏,里面有一行叫“日期时间 PLC”。点击这一行前面的“连接”列,下拉选择你实际的连接名称,比如“HMI_连接_1”。

然后在“PLC 变量”这一列,点开变量选择器,找到之前建的 DB 块里的 DateAndTime 变量,选中它。采集周期设置为 1s。这个周期决定了 HMI 多久从 PLC 读一次时间,设 1s 足够用了,再短也没必要,反而增加通信负载。

注意:采集周期不要设得太长,比如 10s,那样 HMI 上的秒数会跳着走,看起来很不自然。1s 是常规做法。

3.3 画面上添加日期和时间 IO 域

在 HMI 的画面或模板里,从工具箱拖两个“日期/时间” IO 域出来。第一个 IO 域用来显示日期,在属性里勾选“系统时间”下的“显示日期”;第二个 IO 域勾选“显示时间”。这两个 IO 域不需要你手动绑定变量,它们会自动从区域指针配置的日期时间 PLC 里取数据。

如果你想让日期和时间显示在一个域里,也可以只放一个 IO 域,同时勾选显示日期和显示时间,格式自己调。但分开两个域更灵活,比如日期用大字号、时间用小字号,排版上好看一些。

配置完之后编译下载,HMI 重启后应该就能看到日期和时间跟 PLC 一致了。如果 PLC 的时间本身是准的,那 HMI 显示就是准的。

4. 避坑排查:时间同步翻车的五个典型场景

4.1 HMI 显示的时间比 PLC 慢几秒

现象:HMI 上的秒数总是比 PLC 在线诊断里看到的时间慢 2~3 秒,而且一直追不上。

原因:采集周期设得太长,或者 HMI 通信负载高导致刷新延迟。区域指针的采集周期是 1s,但实际刷新还受通信周期影响。

解决:把采集周期改成 500ms 试试,同时检查 HMI 连接是不是走了太多变量,导致通信资源被挤占。如果还不行,看看 HMI 和 PLC 之间的物理链路有没有丢包。

4.2 日期对但时间差 8 小时

现象:HMI 上显示的日期是对的,但小时数差了 8 小时,比如 PLC 是 14:00,HMI 显示 06:00。

原因:PLC 的时区没设成东八区,或者设成了 UTC。RD_LOC_T 读的是本地时间,时区错了读出来的就是错的时间。

解决:进 PLC 设备组态,CPU 属性里的时间设置,确认时区是 UTC+08:00。改完重新下载硬件组态。

4.3 区域指针里找不到“日期时间 PLC”这一行

现象:打开 HMI 连接配置的区域指针选项卡,发现没有“日期时间 PLC”这个选项。

原因:HMI 的类型不支持,或者固件版本太低。精简系列面板早期固件可能没有这个区域指针。

解决:查一下 HMI 的订货号和固件版本,升级到支持该功能的版本。如果硬件本身不支持,那就只能用脚本或别的变通方案了。

4.4 PLC 在线后时间还是不对

现象:PLC 转在线了,但 HMI 显示的时间还是旧的,跟电脑时间不一致。

原因:PLC 的实时时钟没有跟电脑同步,或者电池没电导致时钟复位。

解决:在线和诊断里,设置时间,勾选“从 PG/PC 获取”,点应用。这样 PLC 会拿电脑的时间作为基准。如果 PLC 电池电压低,换电池,否则断电后时间又会丢。

4.5 HMI 重启后时间显示为 1970 年

现象:HMI 重新上电后,日期时间显示成 1970-01-01 或者一堆星号。

原因:区域指针还没建立通信,HMI 拿不到 PLC 的时间,就显示默认值或无效值。

解决:等几秒让通信建立起来。如果一直不恢复,检查 HMI 和 PLC 的连接是否正常,区域指针的变量是否编译下载到位。可以在 HMI 画面上加一个“通信状态”指示灯,方便判断。

5. 进阶技巧:用脚本做时间补偿与格式校验

区域指针同步的是 PLC 的本地时间,但有些场景下你需要对时间做二次处理。比如 PLC 的时间跟上位机有固定偏差,或者你想在 HMI 上显示“距上次报警已过 XX 分钟”这种相对时间。这时候可以在 HMI 的脚本里做文章。

TIA 博途的 HMI 支持 VBScript 脚本,你可以在画面加载事件里写一段脚本,读取区域指针映射过来的时间,然后做偏移计算。比如:

' HMI 画面加载时执行的时间补偿脚本 Dim dtPLC dtPLC = SmartTags("DB_TimeSync.DateAndTime") ' 读取 PLC 时间 ' 假设 PLC 时间比实际慢 30 秒,做补偿 dtPLC = DateAdd("s", 30, dtPLC) ' 把补偿后的时间写到另一个显示变量 SmartTags("DisplayTime") = dtPLC

逻辑说明:SmartTags 是 HMI 访问 PLC 变量的方式,DB_TimeSync.DateAndTime 就是区域指针映射的那个 DTL 变量。DateAdd 函数做秒级偏移,补偿量根据实际情况调。这个脚本适合在画面加载时跑一次,或者放在一个周期触发的脚本里。

参数上要注意:DateAdd 的第一个参数是单位,"s" 表示秒,"n" 表示分钟,"h" 表示小时。补偿量可以是正数也可以是负数。如果你不确定偏差是多少,可以先在 HMI 上同时显示 PLC 原始时间和电脑时间,对比几次取平均值。

另一个技巧是格式校验。DTL 类型的变量在 HMI 上显示时,格式是固定的,但如果你通过脚本拼接字符串,可能会遇到月份显示成“1”而不是“01”的情况。可以用 Format 函数处理:

' 格式化日期时间字符串 Dim y, m, d, h, mi, s y = SmartTags("DB_TimeSync.DateAndTime.Year") m = Right("0" & SmartTags("DB_TimeSync.DateAndTime.Month"), 2) d = Right("0" & SmartTags("DB_TimeSync.DateAndTime.Day"), 2) h = Right("0" & SmartTags("DB_TimeSync.DateAndTime.Hour"), 2) mi = Right("0" & SmartTags("DB_TimeSync.DateAndTime.Minute"), 2) s = Right("0" & SmartTags("DB_TimeSync.DateAndTime.Second"), 2) SmartTags("FormattedTime") = y & "-" & m & "-" & d & " " & h & ":" & mi & ":" & s

这段脚本把 DTL 的各个成员取出来,用 Right 函数补零,拼成标准的“YYYY-MM-DD HH:MM:SS”格式。适合用在需要把时间写进报表或日志的场景。

验证方法很简单:在 HMI 上放一个按钮,点击后把 FormattedTime 写到一个文本域里,看看格式对不对。如果月份显示成“1”而不是“01”,说明补零逻辑没生效,检查 Right 函数的参数。

从那以后我每次做时间同步,都会先在 PLC 里把时区设死,然后在 HMI 上同时放原始时间和格式化时间两个显示域,对比一轮再交付。这个习惯帮我省了好几次返工。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询