前段时间帮客户调试一条产线,触摸屏用的是 MCGS,控制器是西门子 S7-200 SMART。设备本身都没问题,但客户一直抱怨报警记录里的时间对不上,白班看夜班的报警,时间点能差半个多小时。查到最后,问题不在程序逻辑,也不在通信链路,而是藏在最容易被忽略的细节里:触摸屏和 PLC 的系统时间没有同步。
这个问题其实很普遍,尤其是一些没有联网的小型单机设备。触摸屏自己走自己的表,PLC 自己走自己的表,时间一长偏差越来越大。报警记录、趋势曲线、产量统计全都乱了。这篇就把 MCGS 和 S7-200 SMART 做时间同步的几种思路、完整配置步骤和现场调试中容易踩的坑整理出来,给正在做类似项目的朋友一个可以直接抄作业的参考。
1. 现场问题的本质:为什么触摸屏和PLC的时间会各走各的
1.1 一个典型的现场痛点
大部分小型控制系统的架构是“PLC做逻辑控制 + 触摸屏做人机交互”。PLC负责采集模拟量、跑逻辑、输出控制,触摸屏负责显示状态、操作按钮、记录报警。两者之间通过 Modbus TCP、S7 协议或者串口通信交换数据,但时间这个东西,往往不在正常数据交换的范围内。
PLC 内部有一个实时时钟,掉电后靠超级电容维持,这是它自己的时间。MCGS 触摸屏也有自己的操作系统时钟,屏幕调时间是在系统设置里单独调的。两个设备各走各的,出厂后谁也不会主动去校准对方。刚开始可能就差几秒,一周、一个月之后,差半小时甚至几小时都很正常。
我那个客户的情况是,MCGS 触摸屏上的报警记录用的是触摸屏系统时间,PLC 内部逻辑判断用的又是 PLC 时间。两个人对不上,一旦出了质量事故需要追溯数据,时间戳对不上,排查起来非常痛苦。
1.2 时间错位带来的连锁问题
时间错位不只是“看着不舒服”,它会直接影响现场的数据可信度,我举几个常见的例子。
报警记录和故障分析是最直接的。设备跳停了,操作员看到触摸屏上弹出一条报警,但报警列表里存的时间是凌晨 2 点,而 PLC 运行记录里显示的故障发生时间是 2 点 37 分。查监控、查曲线、查操作记录,全都要自己手动换算,这种误差在责任判定和原因分析时非常糟心。
趋势曲线和历史报表也会被牵连。MCGS 的趋势画面里,X 轴时间戳如果用的是自身时间,而 PLC 侧记录的产量计数、温度采样点用的是 PLC 时间,两张图放在一起对不上,数据分析基本没法做。尤其是做食品、制药、化工这类需要批次追溯的行业,审计时时间对不上是要开不符合项的。
还有一个容易被忽略的问题是多设备协同。如果一条产线有多个触摸屏、多台 PLC,大家时间不统一,中控室想对比各工位的运行记录,就会发现各工位的时间轴根本不在一条线上,协同分析非常困难。
1.3 时间同步本质上是在统一数据基准
时间同步不是“顺手做一下”的功能,它是在给整个控制系统的数据建立统一基准。没有这个基准,报警、趋势、报表、审计追踪都只是孤立的数据片段。
对于 MCGS 加 200SMART 这种组合,好消息是,两者的通信链路本身就存在,不需要额外增加硬件成本。要做的只是在已有的通信通道里,专门划出一段数据区,把触摸屏的时间周期性地写到 PLC,或者让 PLC 主动去读触摸屏的时间。这也是本文要讲的核心内容。
2. 时间同步方案怎么选:三种做法对比
2.1 方案一:触摸屏主动下发时间到PLC
这是目前最简单的方案,也是我在现场用得最多的。思路是:MCGS 触摸屏在循环脚本里读取自身系统时间,然后通过已有的通信通道,把年、月、日、时、分、秒写到 PLC 的保持寄存器里。
为什么这个方案最省事?因为 MCGS 作为主站,主动权在自己手里。它不需要等 PLC 来读,也不需要额外增加定时器逻辑,只需要在组态软件里建立一个循环策略,每秒执行一次写操作。PLC 侧更简单,只需做好 Modbus TCP 从站或者 S7 通信服务,让触摸屏能访问到指定 V 区即可。
这个方案唯一的限制是,它同步的是“PLC 数据区里的时间镜像”,而不是直接改写 PLC 系统时钟。大多数现场场景只需要 PLC 程序能拿到一个和触摸屏一致的时间,用于逻辑判断和记录,这就足够了。
2.2 方案二:PLC主动读取触摸屏时间
反过来,让 S7-200 SMART 做 Modbus TCP 主站,或者用 GET/PUT 指令主动去读 MCGS 触摸屏里提供的时间寄存器,也能达到同步效果。
这种方式的优点是 PLC 程序完全掌握主动权,什么时候读、读几次、读到后怎么处理,都由 PLC 决定。如果你希望 PLC 上电后第一时间校正自己的时间,或者每隔一段时间自动校准一次,那用这个方案更直接。
缺点是需要 MCGS 做从站,也就是要把触摸屏的某个变量区映射成可以被外部访问的寄存器。MCGS 触摸屏做 Modbus TCP 从站需要单独配置驱动和寄存器映射表,比方案一多一层工作,很多不熟悉 MCGS 内部机制的人在这里容易被绕晕。
2.3 方案三:统一NTP授时
大型项目中,如果现场有多台 PLC、多台触摸屏和上位机系统,逐个去同步太累,最理想的方式是搭一个 NTP 时间服务器,所有设备都去对同一个时钟源。
但 S7-200 SMART 本身不支持 NTP 客户端功能,MCGS 部分型号也未必内置 NTP 对时功能。真要做统一授时,通常要增加额外的网关模块或者由上位机软件定时下发标准时间,成本和工作量都不小。对于一台触摸屏配一台 PLC 的小系统,完全没必要上 NTP,用方案一就够了。
2.4 方案对比速览
| 对比项 | 触摸屏主动下发(推荐) | PLC主动读取 | NTP统一授时 |
|---|---|---|---|
| 实现难度 | 低 | 中 | 高 |
| PLC侧改动 | 少,只需从站通信 | 需要写主站轮询程序 | 需要额外硬件或软件支持 |
| MCGS侧改动 | 循环脚本加变量映射 | 需要配置从站驱动 | 依赖触摸屏型号是否支持 |
| 适用场景 | 单机设备、小系统 | PLC作为控制核心的场景 | 多设备、多HMI的大系统 |
| 成本 | 无 | 无 | 需要网关或授权软件 |
从我个人的经验来看,单台 MCGS 配单台或者两三台 200SMART 的项目,无脑选方案一就行,性价比最高,后期维护也最简单。
3. 实操配置:MCGS主动下发时间到200SMART
3.1 动手前需要准备的东西
先把需要用到的软硬件和参数确认清楚,别到现场才发现缺少东西。
硬件方面,需要一台带网口的 MCGS 触摸屏(大多数型号都支持),一台 S7-200 SMART PLC,一根普通网线或者通过交换机连接两者。软件方面需要 MCGS 嵌入版组态软件,和 STEP 7-MicroWIN SMART 编程软件。
另外要确认触摸屏和 PLC 的 IP 地址在同一网段。比如 PLC 设置成 192.168.2.10,触摸屏设置成 192.168.2.20,子网掩码统一为 255.255.255.0。这是基础中的基础,很多人时间同步调不通,第一步就栽在这里。
还要想清楚通信协议走哪一种。MCGS 访问 S7-200 SMART 有两种常用方式:一种是用 MCGS 自带的“西门子S7-200 TCP”驱动,直接读写 V 区;另一种是用“Modbus TCP”驱动,通过 Modbus 寄存器地址访问。本文的实操以 Modbus TCP 为例,因为它的通用性更强,也好排查问题。
3.2 PLC侧配置:IP地址与MBUS_SERVER从站
首先用网线连接 PLC 和电脑,在 STEP 7-MicroWIN SMART 里找到“通信”设置,把 PLC 的 IP 地址设置好。IP 设置完成后,程序里需要调用 Modbus TCP 从站库指令。
在 S7-200 SMART 的指令树中,展开“库”目录,找到“Modbus TCP”,双击“MBUS_SERVER”指令,把它拖拽到主程序中。调用时需要指定一个背景数据块,比如 MBUS_SERVER_R0。然后在每个扫描周期都调用一次这个指令,使能条件用 SM0.0 常真。
MBUS_SERVER 指令的关键参数如下:
- Connect:连接使能,接 SM0.0,一直保持为真。
- IP_Port:端口号,默认 502,一般不用改。
- MaxIQ:允许外部访问的 I/Q 点数,我习惯设 128。
- MaxAI:允许外部访问的模拟量字数,设为 16。
- MaxHold:保持寄存器最大字数,至少要大于时间同步用到的寄存器数量,建议设 16 或者更大。
- HoldStart:保持寄存器起始地址,比如 &VB1000,注意这里用的是指针格式。
- ErrorCode:错误代码输出,接一个整数变量,比如 MW0,方便调试时看错误。
这里有一个大家都容易犯的错误:调用 MBUS_SERVER 后,必须在“库存储区”里分配一段 V 区给库使用。右键“程序块”,选择“库存储区”,分配一段不与保持寄存器重叠的 V 区地址,例如 VB0 到 VB99。如果库存储区和保持寄存器区重叠,通信会异常,甚至程序下载后 PLC 报错。
3.3 MCGS侧配置:驱动、通道与变量映射
打开 MCGS 嵌入版组态软件,在“设备窗口”里添加一个“Modbus TCP”设备驱动,或者如果手头有“西门子S7-200 TCP”驱动,也可以直接用它。两种驱动的区别在于地址写法不同,但都能实现功能。
如果你用的是 Modbus TCP 驱动,需要建立一个设备通道,把通道类型设置为“保持寄存器”。因为我们在 PLC 侧把 HoldStart 设置成了 VB1000,所以保持寄存器的地址从 40001 开始。时间数据一共需要 6 个寄存器,分别存放年、月、日、时、分、秒,地址对应关系如下:
| 数据项 | 保持寄存器地址 | PLC中对应V区 |
|---|---|---|
| 年 | 40001 | VW1000 |
| 月 | 40002 | VW1002 |
| 日 | 40003 | VW1004 |
| 时 | 40004 | VW1006 |
| 分 | 40005 | VW1008 |
| 秒 | 40006 | VW1010 |
在 MCGS 实时数据库中建立对应的变量:Year、Month、Day、Hour、Minute、Second,数据类型全部选“整数”,读写属性设置为“读写”。然后把每个变量和上面的通道关联起来。
这里有一个细节要注意:如果 MCGS 的 Modbus TCP 驱动中通道地址是按“0 起始”显示,那么 40001 可能显示为 0,40002 显示为 1,以此类推。不同版本的 MCGS 表现不一样,建立通道后先不要急着下载,在设备调试窗口里手动写一个测试值,看看 PLC 那边能不能收到,先把这个地址对应关系确认清楚。
3.4 循环脚本:让触摸屏把系统时间推给PLC
变量和通道都建好之后,核心就是让触摸屏周期性把时间写到 PLC。这一部分通过 MCGS 的“运行策略”功能实现。
在 MCGS 的“运行策略”窗口中,新建一个“循环脚本”,设置循环周期为 1 秒,也就是每秒执行一次时间写入。脚本内容很简单,就是把系统时间函数的结果赋给刚才建立的那几个变量:
Year = !TimeGetYear(0) Month = !TimeGetMonth(0) Day = !TimeGetDay(0) Hour = !TimeGetHour(0) Minute = !TimeGetMinute(0) Second = !TimeGetSecond(0)MCGS 脚本函数中,参数 0 表示读取当前系统时间。不同版本的 MCGS 函数名可能有细微差别,有的是 !TimeGetYear(0),有的版本需要在脚本编辑器里查一下函数列表。如果在脚本编辑器的函数列表里看到 Time 开头的一组函数,基本就是这一套。
脚本写好后,MCGS 会在每个扫描周期给变量赋值,然后由设备驱动按照设备刷新周期把值写到 PLC 的保持寄存器中。设备刷新周期可以在设备的“内部属性”里设置,我一般设为 1 秒,太快了没必要,太慢了时间校准会滞后。
3.5 验证结果:怎么确认PLC已经收到时间
这一步很多人会跳过,但恰恰是最值得做的。下载程序后,用 STEP 7-MicroWIN SMART 打开状态图表,添加 VW1000 到 VW1010 这几个地址,把显示格式设为“十进制”,监控看看数值是否和当前时间一致。
另外,你可以在 MCGS 触摸屏上做一个临时画面,直接显示这几个变量,或者用 MCGS 调试助手在电脑上模拟运行,先观察变量值是否是系统当前时间,再观察设备通道是否显示“通信正常”。
如果变量值正确但 PLC 中没有收到,优先检查通道地址是否对得上,以及驱动关联的设备地址是否和 PLC 配置一致。Modbus 通信里有一个很常见的“地址偏移一位”的问题,我放在后面的常见问题里详细说。
3.6 扩展:如果还要同步PLC系统时钟怎么办
前面这套方案是把时间写到 PLC 的保持寄存器中,PLC 程序如果要使用时间,直接读 VW1000 到 VW1010 就可以了。但有些项目要求 PLC 的系统时钟本身也被改掉,也就是说要让 PLC 执行 SET_RTC 指令,把系统时间设置为校准后的时间。
这需要在 PLC 侧写一小段转换逻辑。S7-200 SMART 的 SET_RTC 指令需要提供一个 8 字节的缓冲区,格式依次是:年、月、日、时、分、秒、保留字节、星期,而且年只需要两位 BCD 码。也就是说,保持寄存器中的十进制数 2025,要转换成 BCD 码 16#25 才能写进去。
我的做法是,在 PLC 程序中做一个同步触发位,比如 M0.0 置位后,执行下面这段逻辑思路:先从 VW1000 到 VW1010 读入十进制时间值,再用 I_BCD 指令转换成 BCD,最后把低字节存入 RTC 缓冲区,调用 SET_RTC 完成写入。如果后续不用 PLC 系统时钟做逻辑判断,这一步完全可以省掉,没必要给自己增加工作量。
4. 反向方案:让200SMART主动去读MCGS的时间
4.1 设计思路
有的项目里,PLC 是绝对的控制核心,需要 PLC 上电后自己去获取正确时间。这种情况下,可以让 S7-200 SMART 做 Modbus TCP 主站,主动去读 MCGS 触摸屏的时间变量。
具体思路是:在 MCGS 触摸屏中,把系统时间放到一组内部变量里,并通过 Modbus TCP 从站驱动把这些变量映射成可被外部访问的保持寄存器。然后在 PLC 中用 MBUS_CTRL 指令建立主站连接,用 MBUS_MSG 指令周期性地读取这些寄存器,读回来后再放到自己的 V 区中用。
这种方案的好处是 PLC 掌握主动权,特别适合那种“设备一上电,PLC 要立刻知道自己该往哪个方向走”的场景。坏处是 MCGS 的从站配置对很多人来说比较陌生,第一次搞要花点时间。
4.2 MCGS侧怎么设置为从站
在 MCGS 设备窗口中添加一个“Modbus TCP 从站”驱动,或者一些型号上叫“Modbus TCP Server”。配置一个 IP 地址和端口号,端口默认用 502。
然后在从站驱动的寄存器映射表里,建立 6 个数据区条目,把 MCGS 内部的 Year、Month、Day、Hour、Minute、Second 六个变量依次映射到保持寄存器 40001 到 40006。这一步相当于告诉外部主站:“我的时间变量在这些寄存器里,你可以来读。”
PLC 侧使用 MBUS_CTRL 初始化主站通信,然后用 MBUS_MSG 指令去读。MBUS_MSG 指令的参数中,Slave 填触摸屏的从站地址,RW 填 0 表示读,Addr 填 40001,Count 填 6,DataPtr 指向 PLC 中存放读取结果的首地址。每秒钟执行一次读操作,时间就能保持一致。
4.3 什么时候优先用反向方案
从我接触过的项目来看,反向方案并不常见,但有一种情况我会优先推荐:当控制系统的核心逻辑全部在 PLC 中,而且触摸屏只是作为显示终端时。如果现场负责人习惯在触摸屏上调时间,而所有时间判断逻辑都依赖 PLC 的系统时钟,那么让 PLC 主动去同步触摸屏时间更为合理。
反过来,如果系统里除了触摸屏还有其他上位机软件需要统一时间,触摸屏主动下发更好,因为这样所有设备都以触摸屏时间为基准,便于管理。最终还是看项目的控制架构偏向哪一头。
5. 现场调试的7个坑与排查心得
5.1 Modbus地址偏移一位
这个坑几乎每次都会遇到。MCGS 的 Modbus TCP 驱动中,通道地址的起始编号有“1 起始”和“0 起始”两种显示方式。如果你在 PLC 侧配置的 HoldStart 是 VB1000,对应的 Modbus 地址是 40001,在 MCGS 里填写通道地址时如果填成了 0,实际访问的会是 40000,也就是 VB0998,直接错位。
解决办法是在设备调试窗口里,先写一个固定值比如 12345 到某个通道,然后在 PLC 状态图表里看 VW1000 还是 VW0998 收到了这个值,通过这种方式反向确认地址对应关系。
5.2 高低字节顺序颠倒
Modbus 寄存器默认是大端序,高位字节在前,低位在后。S7-200 SMART 的 VW 也是大端序,两者本来是对得上的。但如果 MCGS 侧某个版本的驱动做了字节交换处理,或者你在 PLC 侧用了不同的库版本,就有可能出现年和月看起来正常,但日和小时完全不对的情况。
遇到这类问题,最简单的办法是在 MCGS 脚本里固定写入一个容易识别的值,比如把 Year 写成 4660,在 PLC 侧看收到的是 4660 还是 12385。如果值反了,就在 MCGS 通道属性里找找有没有“字节顺序”或者“高位在前”之类的选项,把它反过来即可。
5.3 BCD码和十进制混用
这也是一个典型的新手坑。PLC 的 RTC 缓冲区里用的是 BCD 码,但 MCGS 的脚本函数返回的是普通的十进制整数。如果你直接把 Year 变量赋值 2025 写到 RTC 缓冲区,PLC 会把它理解为 16#2025,也就是十进制 9253,结果完全不相关。
保持寄存器里存十进制数本身没问题,PLC 程序里面直接当整数用就行。但如果后续要用 SET_RTC 改写 PLC 系统时钟,必须先把十进制转换成两位 BCD,并注意年份只保留低字节。这个转换逻辑建议在 PLC 中做,不要指望 MCGS 来处理。
5.4 MBUS_SERVER使能条件不对
有些朋友会把 MBUS_SERVER 的使能端接成一个按钮或者一个标志位,导致程序跑起来后 Modbus 服务器功能时好时坏。MBUS_SERVER 这个指令要求每个扫描周期都保持调用,使能端应该接 SM0.0,而不是接其他条件。如果它没有持续使能,外部主站可能连接成功,但读写数据不定时超时。
调试时如果发现 MCGS 显示通信错误,检查一下使能端是不是常真。还有一个容易忽略的是,背景数据块如果被其他地方误用,也可能导致指令运行异常。
5.5 库存储区与数据区重叠
在 PLC 程序中用了 Modbus TCP 库指令之后,必须在 STEP 7-MicroWIN SMART 中为库指令分配一段专用的库存储区。如果你把库存储区分配到了 VW1000 附近,正好和 HoldStart 重叠,Modbus 通信能建立,但数据会被库指令自己覆盖,写进去的时间值莫名其妙变成其他内容。
建议库存储区放在 V 区靠前的位置,比如 VB0 到 VB99,保持寄存器从 VB1000 开始,两者中间留足余量。如果项目里还有其他库指令也用 V 区,记得检查所有库存储区的地址是否冲突。
5.6 触摸屏自身时间不准
做了半天同步,最后发现同步来源就是错的,这种情况也很多。MCGS 触摸屏的系统时间如果长期没校准,它自己就走偏了,你让它把时间往下发,就是把错的时间广播给 PLC。
所以调试时一定要先确认触摸屏的“系统时间”是正确的。触摸屏一般都有“时间设置”页面,有的支持与电脑同步,有的需要手动设置。建议在项目交付时,把触摸屏时间校准这一步写进调试流程,最好每一次停电重启后都检查一下。如果触摸屏支持 GPS 校时或者 NTP,优先开启。
5.7 写入周期太快导致通信拥塞
有人为了让时间同步更精确,把循环脚本周期设置成 100 毫秒甚至更短。实际上完全没必要,PLC 和触摸屏的时间同步做到秒级一致已经足够现场使用了。太快的写入频率会让通信通道频繁被占用,反而影响其他数据的采集和下发。
我一般把循环周期设为 1 秒,同时设备驱动刷新周期也设为 1 秒。如果你发现同步之后时间误差依然在几十秒以上,问题通常不是周期不够快,而是触摸屏本身的系统时间在跳变,先检查触摸屏的时钟是否稳定。
5.8 问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| MCGS通信正常,但PLC收不到数据 | 通道地址偏移或寄存器地址错误 | 用固定测试值反向确认地址 |
| PLC收到的时间数值特别大 | 高低字节顺序颠倒 | 写入固定值判断字节顺序 |
| PLC侧时间用不了 | 十进制与BCD混用 | 检查PLC程序里的数据转换 |
| Modbus连接经常断开 | MBUS_SERVER使能条件不对 | 检查是否接SM0.0 |
| 写进去的数据被莫名覆盖 | 库存储区与数据区重叠 | 重新分配库存储区 |
| 时间同步后误差还是很大 | 触摸屏自身时间不准 | 先校准触摸屏系统时钟 |
| 通信响应慢,其他数据卡顿 | 写入周期设置太短 | 将循环周期调至1秒以上 |
我在做这类项目时有个习惯,会在触摸屏主画面放一个“时间校准”按钮,按下后在画面显示当前 PLC 时间和触摸屏时间,方便现场人员在设备运行一段时间后快速检查两个时间是否偏差。条件允许的话,再做一个简单的“一键同步”功能,让操作人员可以手动触发一次时间下发。这个设计看着不起眼,但在后期维护时能省掉不少沟通成本。
时间同步这件事,技术含量不算高,但它就像设备的“心电基准”,没有它,再漂亮的报警查询和趋势曲线,关键时刻都帮不上忙。希望这篇分享能让你少踩几个坑。