
现场设备跑过一段时间翻报警记录时发现时间对不上——触摸屏上显示14:23触发的报警PLC里存的时间却是14:17这种事遇到的朋友应该不在少数。MCGS触摸屏搭配S7-200 SMART PLC这套组合在中小型自动化项目里很常见麻烦就麻烦在两个设备各自带实时时钟上电后各走各的时间偏差越攒越大轻则报表时间戳乱套重则批次追溯对不上账。这篇博文就是来解决这个问题的核心思路是把两个时钟拉到同一个基准上并给出从方案选型、PLC程序、MCGS组态到排查调优的完整落地方案。无论你是设备调试工程师、维护电工还是刚接触组态的新手照着做基本都能搞定。1. 为什么要做时间同步三个现场怪象时间同步这件事乍一看是“锦上添花”真等出了问题排查起来特别费劲。我先举三个实际项目里最常见的现象你对号入座一下。1.1 翻报警记录的时间对不上触摸屏上记录的报警历史跟PLC实际逻辑触发的时间对不上或者触摸屏报警界面和电脑上导出的历史曲线差了十几分钟。产线操作员说“两点多报警的记录怎么一点五十”维护人员到了现场也说不清楚。这几乎是每个没用过时间同步的项目都会遇到的不是设备坏了就是两边时钟各走各的。1.2 报表和批次追溯跟着遭殃很多项目要生成日报、班报或者按批次记录工艺参数。如果时间基准不统一报表里出现“开始时间比结束时间还晚”“两个班次的数据重叠”都是家常便饭。客户投诉产品质量的时候你拿不出一份时间自洽的记录就很被动。1.3 两个时钟其实一直在各跑各的MCGS触摸屏有自己内置的系统时钟S7-200 SMART的CPU也有硬件实时时钟。断电一段时间再上电两者的误差就重新开始累计了。就算你手动在触摸屏上校一次时间PLC那边的RTC还是老样子。时间同步的本质就是让整套系统里只有一个可追溯的时间基准其他设备都向它看齐。2. 方案选型Modbus TCP 自定义V区省事又通用定下“必须做时间同步”之后接下来要选实现方案。市面上做法不少但真正适合MCGS 200 SMART这种组合的其实没那么复杂。2.1 几种常见校时方式对比我接触过的校时方案大致有下面四种各有适用场景。方案优点缺点适用场景纯手动触摸屏校时零成本操作直观只校了触摸屏自身PLC时间依然不准治标不治本偶尔应急PLC程序往触摸屏单向同步PLC时间作为基准数据统一性好需要PLC程序配合触摸屏只负责显示以设备本体时间为准的项目触摸屏往PLC单向同步触摸屏作为基准可统一手动校时入口需要写PLC程序和触摸屏脚本触摸屏方便操作员校时的现场NTP/PTP网络校时精度高全系统统一需要额外服务器或网关往往还要支持PTP的交换机成本高大型系统或对时间精度有硬性要求的场合在单套触摸屏加单台PLC的小系统里上NTP/PTP确实有点杀鸡用牛刀而且MCGS和200 SMART都不原生支持PTP协议硬上反而把系统搞复杂。相比之下用Modbus TCP通信在PLC里划一块V区作为时间缓冲区让触摸屏去读写最实在。2.2 为什么最终选Modbus TCPMCGS触摸屏本身支持的协议很丰富但对S7-200 SMART最稳妥、也最不挑软件版本的就是标准Modbus TCP。因为Modbus TCP的寄存器地址是公开的映射规则你把PLC的V区地址算好触摸屏这边按地址读就行两边都不需要安装额外的授权驱动逻辑上也不依赖某个触摸屏品牌换到别的支持Modbus TCP的屏上同样能复用。200 SMART的以太网口做Modbus TCP服务端只需要在程序里调用一条MB_SERVER库指令占用资源很少。通信链路就是普通网线或者交换机不用增加任何硬件带宽占用也就几个寄存器对PLC循环周期基本没有影响。2.3 硬件网络怎么接方案定了接线很简单用网线直连MCGS触摸屏和200 SMART的以太网口或者通过工业交换机连接。给PLC和触摸屏设置同一网段的IP例如PLC为192.168.1.10触摸屏为192.168.1.20子网掩码均为255.255.255.0。保证触摸屏和PLC的以太网口物理链路连通触摸屏的以太网口指示灯和PLC的Link灯都亮起来。现场注意一点200 SMART的以太网口默认支持很多连接Modbus TCP占一个连接号上位机监控、编程软件下载程序各占连接号如果连接数紧张需要分配好避免通信冲突。3. PLC侧程序把RTC时间搬进V区PLC是整个时间同步方案的核心中转站。触摸屏要能读到PLC时间和写入时间靠的都是V区里的自定义缓冲区所以程序关键是把RTC的时间数据读出来、转换好、放到位。3.1 先搞懂200 SMART的RTC数据格式S7-200 SMART的实时时钟通过两条指令操作TODR读取实时时钟TODW写入实时时钟。两条指令都指向一个连续缓冲区。缓冲区格式需要特别注意它一共占用8个字节依次是年、月、日、时、分、秒、保留字节、星期。其中年只保存后两位2025年在缓冲区里就是0x25。所有时间字段都是BCD码不是十进制数。比如12月存的是0x12不是数字12下午3点存的是0x03或0x15不是小时0-2315点存0x15读出来是BCD的15。这个BCD码格式决定了你不能直接把缓冲区里的数据往触摸屏发否则触摸屏那边看到的数值根本不是正常十进制。这也是很多第一次做同步的人最容易翻车的地方。3.2 读时间TODR BCD转十进制PLC程序的第一个作用是“读时间”。我用VB100作为TODR缓冲区的起始地址程序大概分两个环节第一环节调用TODR指令把RTC里的时间读到VB100-VB107。这个很简单但要注意TODR读取的时间每次扫描都在刷新所以后续的BCD转换也要跟随每个扫描周期执行不需要用边沿触发。第二环节把VB100-VB105这6个字节年、月、日、时、分、秒从BCD码转成十进制的整数分别存到VW200、VW202、VW204、VW206、VW208、VW210。这样VW200里就是正常的年份数字比如2025VW202里就是正常的月份数字比如12。BCD转十进制在200 SMART里不用复杂的指令按“高4位是十位、低4位是个位”的规律拆开就行。可以用字节与、移位、整数乘除组合完成也可以用BCDI指令直接转换。关键是转换结果要存成16位字因为后续Modbus读寄存器是按字读的。3.3 写时间十进制转BCD TODWPLC程序的第二个作用是“接收触摸屏下发的时间并写进RTC”。我在V区再划一块区域VW300年、VW302月、VW304日、VW306时、VW308分、VW310秒再加上VW312作为同步触发标志字。触摸屏把时间数据写进VW300-VW310之后把VW312置为1。PLC程序检测到VW312等于1就执行写入流程把VW300-VW310里的十进制整数转成BCD码填入VB400开始的8字节缓冲区。调用TODW指令把VB400-VB407里的时间写进PLC的RTC。写入完成后把VW312清零完成一次握手。用触发标志字而不是让PLC每个扫描周期都执行TODW是为了避免频繁写入RTC。RTC写操作虽然不像EEPROM那样有寿命限制但每次写入都需要短暂的时间没必要实时执行有触发才写一次干净利落。3.4 Modbus寄存器地址映射表这个表非常关键搞清楚它MCGS那边配置通道就非常简单了。S7-200 SMART 的Modbus TCP地址映射规律是保持寄存器40001对应VW0之后每增加2个字节的V区地址就增加1个保持寄存器地址。计算公式为Modbus保持寄存器地址 40001 (VW地址 / 2)比如VW200对应的保持寄存器地址就是 40001 200/2 40101。那么读写时间缓冲区对应的地址如下PLC V区地址内容Modbus保持寄存器地址VW200年40101VW202月40102VW204日40103VW206时40104VW208分40105VW210秒40106VW300下发的年40151VW302下发的月40152VW304下发的日40153VW306下发的小时40154VW308下发的分钟40155VW310下发的秒40156VW312同步触发标志字40157注意MB_SERVER指令里的保持寄存器起始地址要和你的V区映射对应。默认保持寄存器从VB0开始数量要覆盖到40157对应的V区也就是至少要能访问到VW312建议把保持寄存器数量设置成300以上留足余量。4. MCGS侧配置变量、脚本、画面一步到位PLC那边程序写好了通信的“服务器”就算搭起来了剩下的就是把MCGS触摸屏配置成“客户端”既能读时间显示又能下发时间写PLC。4.1 设备通道和变量的映射关系在MCGS组态环境里新建工程后第一步是加设备。设备窗口里选择“通用TCP/IP父设备”子设备选择“标准Modbus TCP设备”或直接选“S7-200 SMART以太网驱动”。这里我建议优先用标准Modbus TCP地址算好之后很直观。配置子设备时IP地址填PLC的IP端口默认502。然后在设备通道里建立通道通道的类型选“保持寄存器”4区地址按上文表格里的Modbus地址填比如40101到40106对应PLC的时间缓冲区。通道建好后新建连接变量。我这里建议命名规范一些后续脚本写起来不容易乱PLC_Year、PLC_Month、PLC_Day、PLC_Hour、PLC_Minute、PLC_Second这6个变量连接40101-40106数据类型选16位无符号整数。Set_Year、Set_Month、Set_Day、Set_Hour、Set_Minute、Set_Second对应连接40151-40156。Set_Trigger连接40157作为同步触发标志。变量建好后在MCGS的实时数据库中把采集周期设为1000ms或更短这样画面上的时间显示能做到每秒刷新一次。4.2 循环策略定时采集PLC时间并显示MCGS要实时显示PLC的时间最直接的方式是用循环策略脚本把读到的PLC_Year、PLC_Month这些变量刷新到画面上。在“运行策略”里新建一个循环策略执行周期设为1000ms然后在脚本里把变量赋给画面上显示用的中间变量或者直接在画面上绑定PLC_Year这些变量让标签框的数据源指向对应通道变量其实不写脚本也能实现显示。不过我还是喜欢加一个小的循环策略这样做的好处是可以在显示之前做数据合法性判断。比如判断PLC_Year是否在有效范围如果读出来的是0或者65535说明通信还没稳定画面可以直接显示“--”避免把乱值暴露给操作员。4.3 一键同步按钮把触摸屏时间写入PLC这是整个方案里操作感最强的一块。画面上放一个“时间同步”按钮按钮的脚本逻辑是取触摸屏当前系统时间拆成年、月、日、时、分、秒减去2000修正年份写入Set_Year等变量最后把Set_Trigger置1通知PLC执行TODW。MCGS脚本里取系统时间的函数在不同版本中命名略有差异常见的是!TimeStr()、!DateStr()或GetCurrentTime系列你在开发环境的脚本函数列表里找到对应的取时间函数即可。脚本大致长这样 伪代码函数名按你用的MCGS版本调整 sysYear 取系统时间年份 sysMonth 取系统时间月份 sysDay 取系统时间日 sysHour 取系统时间小时 sysMinute 取系统时间分钟 sysSecond 取系统时间秒 Set_Year sysYear - 2000 200 SMART RTC只存后两位 Set_Month sysMonth Set_Day sysDay Set_Hour sysHour Set_Minute sysMinute Set_Second sysSecond Set_Trigger 1 触发PLC写入注意一点Set_Year只保存年份的后两位因为S7-200 SMART RTC的年份寄存器范围是00-99对应2000-2099。你把2025直接写进去PLC转换BCD时会乱。PLC程序检测到Set_Trigger为1后会完成TODW并把Set_Trigger清回0。所以MCGS这边不需要再做延时复位整个握手是PLC主动完成的省心且可靠。4.4 开机自动同步扩展手动同步按钮适合平时维护时用但如果操作员忘了点或者半夜换班没人校时时间还是会慢慢偏。更稳妥的做法是加一个“开机自动同步”。实现思路有两种。第一种是在MCGS的启动脚本里做一次同步。MCGS组态环境里可以设置系统启动脚本在触摸屏启动时自动执行一次和按钮同步一样的脚本。第二种是在PLC里做。PLC程序上电后的第一个扫描周期或者等一个延迟后自动把当前RTC时间写回VW300-VW310并触发一次TODW。这种做法其实更简单因为PLC上电时RTC还保留着断电前的时间只要不是断电太久导致RTC走停这个时间通常是可用的相当于每次开机后PLC自己校准自己一次把缓冲区和RTC重新对齐。我建议两个都做PLC上电自动同步一次MCGS启动后再自动同步一次双保险。至于运行中每天定时同步可以用MCGS的循环策略加时间判断每天晚上零点整自动执行一次同步脚本这样即使触摸屏和PLC的RTC每天都有轻微漂移也能在24小时内拉回来。5. 常见问题与排查实录时间同步功能看着简单实际调试时坑还真不少。我把这几年遇到的典型问题整理出来方便大家在现场快速定位。5.1 Modbus TCP连不上的三类原因通信连不上十有八九是下面这三个原因。第一IP地址不在同一网段。PLC设了192.168.1.10触摸屏却是192.168.0.20两边根本不通。这个用触摸屏的诊断页面或者电脑ping一下PLC的IP就能发现。第二MB_SERVER指令没调用或者没配置对。200 SMART的网口默认支持S7协议但Modbus TCP是要通过调用MB_SERVER指令才启用的。你只写了业务逻辑没调用库指令触摸屏那边自然连不上。检查一下程序里有没有相关指令块以及端口是否默认502。第三保持寄存器数量设置不足。如果MB_SERVER指令里设置的保持寄存器数量小于你实际要访问的地址范围读40151、40157这些靠后的地址就会出错。把数量加大一些覆盖到你用到的最大V区地址。5.2 读出来的时间数据“发疯”怎么办如果画面上的PLC_Year显示的是几千上万这种离谱值优先检查两件事。一是寄存器地址算错了。我见过有人把VW200对应到4000120040201实际上公式是40001VW地址/240101差一倍。按照3.4节的表格核对一遍。二是数据类型或者位宽选错。MCGS通道类型一定要选16位寄存器如果你在组态时选了32位浮点或32位整数MCGS会把相邻两个寄存器合并读取比如把40101和40102拼成一个双字那读出来的自然不是年加月而是一大堆乱值。还有一个隐蔽的问题如果PLC侧没有做BCD转十进制直接拿BCD字节当成整数发给触摸屏显示也会是各种奇怪数字比如“0x2512”被当成十进制显示。这种情况就直接回PLC程序里检查转换段有没有执行。5.3 时间写进去没反应按钮点了触摸屏提示“同步成功”但PLC时间纹丝不动基本是触发标志没打通。常见情况是Set_Trigger变量写的是1但PLC程序里检测的地址不是VW312或者PLC里检测的是某个M位而MCGS里写到的是V区两边根本没对上。把PLC程序的VW312监控窗口打开在触摸屏上按下同步按钮看VW312会不会变成1。如果变了再查TODW有没有执行如果没变查MCGS的设备通道地址是不是40157。另一个坑是TODW缓冲区里的BCD转换有误写进去的时间变成乱码比如把25填到一个BCD字节里结果PLC收到的是0x19而不是0x25。这个要回PLC里核对十进制转BCD的逻辑。最后说一个排查神器——MCGS的调试助手。在组态开发环境里打开设备调试窗口可以在线监控每一个通道的实时值选中40101到40106的通道观察数值是否连续变化。如果通道值有规律地每秒跳一次说明通信和数据转换都没问题问题大概率出在画面绑定或脚本逻辑上如果通道值全为0或者恒定不变就要回头查通信链路和PLC程序了。这个算是我调试MCGS项目时最常用的手段比反复看画面试按钮高效得多。6. 我个人的落地经验时间同步这个功能技术上不复杂但放在项目里很能体现细节。我在实际项目中逐渐形成了一套固定做法分享给大家参考。我的习惯是让MCGS触摸屏作为时间基准因为操作员每天都看着触摸屏发现时间不对就能直接校而且如果以后系统要接上位机或物联网网关触摸屏时间更容易统一。PLC那侧保留断电保持的RTC做硬备份通过上电自动同步和每天定时同步来消除漂移。手动同步按钮放在参数设置页面而不是主画面避免误操作但也保证随时能用。说到定时同步频率不要设得太激进。RTC本身每天漂移也就几秒到十几秒每天校准一次足够了。每秒钟同步一次反而可能造成Modbus通信频繁读写虽然不至于出大问题但没必要徒增总线负担。还有一个容易被忽略的细节200 SMART的RTC断电保持是靠CPU内置的超级电容断电时间太长会掉电丢失。对于长期停机的设备重新上电开机后如果触摸屏时间和PLC时间相差很大先手动做一次时间同步再恢复生产能让所有记录从第一天开始就是准的。时间同步做得好不好短期内看不出什么但等客户翻历史报表、追溯异常批次的时候你就能体会到前期这点功夫有多值了。