1127 【万泉河】S7-1200 PLC时钟同步
1, 为什么要时间同步
大部分的情况下, PLC中是不需要时钟的。 即便有时钟,也可以不与真实时间同步,并不会对控制功能产生任何坏的影响。
然而,这只是在初级入门阶段。 当需要用到的PLC功能越来越高级,或者有一些控制功能需要用到实时时钟的时候,就需要其时间准确。 而微型CPU的时钟芯片通常不准确,所以就需要做时钟同步。
比如,某些特殊的应用,需要基于预设的时间做一些逻辑控制。这是属于基本应用,十几年前就一直有的。
还比如,随着自动化程度越来越高,会把一些诸如报警以及归档数据等在PLC中生成,则需要在将数据上传到上位机之前,需要在PLC中给数据打上时间戳, 那自然就需要有比较精确的时钟了。
2, 时钟同步的方法
大致来说,有2种时钟同步的方法。
一种是上位机与PLC通过变量传递时钟信息,通过编程分别读取上位机的时钟,然后再编程写入到PLC时钟。
另一种是在上位机与PLC均支持NTP协议的情况下,设置上位机为NTP服务器,并且设置PLC为NTP客户端。 当然,如果网内有独立的NTP服务器,或者PLC可以通过网关直接访问到广域网, 那直接使用广域网上的NTP服务器地址也可以。
对于普通的WIN系统电脑,通常默认是不具备NTP服务器功能的,需要做一些设置改动,网上有很多这方面的文章可以参考。
当PLC和上位电脑都设置完成后,就可以自动实现了时钟同步,就可以认为电脑的时间即PLC的时间。 那么,电脑也有可能时间不准的,怎么办?
两种方法,一种是再设置电脑为NTP客户端,主动再去跟其他的NTP服务器通讯获取时间信息。包括从外网获得,或者自动化系统内有专门的时钟同步模块。
另一种则是操作工定时检查上位机电脑的时钟, 偏离比较大的时候,手动调整。
3, NTP时钟同步方案的缺点
首先,不利于自动部署。电脑部分的设置可以暂时不谈。这部分设置主要是对注册表的修改,如果需要,完全可以用程序实现。 比如在WINCC启动时,自动将注册表数据导入到注册表。
但困难的是PLC部分。需要在PLC的设置中每次设置NTP服务器的IP地址。 而在不同项目设备分配的IP地址不同的情况下,需要每次都操作一遍。做好了以后再验证功能好用。 这部分的工作逐渐趋于复杂, 普通的工人搞不懂,那就每次都需要工程师来亲自操作实现,极大牵扯了工程师的精力。 第一次做到的时候可以认为有技术含量,然而这样反复做,没有技术含量的事还需要工程师每一次都亲力亲为,就非常不值得了。
如果PLC的操作系统也像WINDOWS系统一样可以直接导入参数即完成配置,那或许能好一点。 然而目前即便有这样的功能, 但还没有听说,也更没有掌握。
其次,不方便验证。
时钟同步功能有效,没有验证的方法。 而如果出于各种原因,导致同步功能失效,也没有发现故障及时产生报警提醒的方法。 需要过了很久,PLC内部时钟产生了严重偏差之后才会偶然发现,而这时候可能已经造成了严重的生产损失。
4, 手动编程实现时钟同步方法的缺点
手动编程需要上位下位的配合,实现时钟同步,这当然很麻烦。 然而不能算作主要的缺点。因为毕竟编程只需要一次,把程序调试好,做好封装,以后的项目直接复制使用,即可完成功能, 其实是符合标准化的自动化原则的。
真正的缺点在于,这种时钟同步的精度不够高。 因为严重依赖于变量本身的刷新周期,而每次读取的时间时刻是随机的,因而导致产生随机性的误差。 通常误差会接近到秒级。
另一个缺点, 也是我一直以来拒绝使用编程方法做时钟同步的原因,就是如果需要从上位将年月日时分秒以及毫秒等数值逐个读出,通过十来个变量,下传给PLC中,再在PLC中拼装成一个完整的时间变量,在我看来就非常笨拙,毫无优雅可言。
自动化行业发展几十年了, 我们每个人还在年月日时分秒拼日期时间,相当于每个人都还在从头造轮子,这是比较恶心的。 另外也包括经常看到一些关于设备寿命累积的文章,在发表的算法程序中,都在那儿一丝不苟地从秒,分,时,日,月等逐级进位,繁杂无比,都是非常惨不忍睹,不忍直视。这个问题有同样焦虑的可以参考我在本文中的做法,也可以直接跟我沟通咨询。
而其实,所谓的YYYY-MM-DD-HH:MM:SS的时间格式表达,也是一个数据格式。无非比普通数据格式复杂一点,但总比UDT自定义数据格式简单,毕竟各平台也都分别有其定义。我们只需要掌握这些数据格式的定义规律,即可以直接使用。
5,使用WINCC实现与S7-1200的时钟同步
以WINCC为例,实现与S7-1200的时钟同步,当然,如果上位是触摸屏以及其它各品牌的SCADA软件,也可以同样参考。
同步的功能分两部分。
1, 如果PLC中系统时间忘记了手动设置,比如还是出厂的2012等某个多年前的时间,则将电脑的当前时间直接下发给PLC。
2, 读取PLC中的时间到变量, WINCC中定时(比如10小时)读取其时间值,并与系统当前时间(NOW)相比较,相减得出来差值,换算为毫秒数,下发给PLC。PLC中在收到这个差值后,将误差值补到系统时间中。为避免修改系统时间造成的干扰,仅在差值超过±1S后才执行。
上述两点,通过判断时间差值来区分。 如果大于1小时,则全部按照1,1小时之内才按照2。第一种方式下发的时间,在经历了变量通讯并在PLC中收到时,产生的误差较大,会超过数秒,然后再会触发第二种同步,将误差修正,实现了对时。
在对时的过程中,还要考虑到时区。S7-1200 PLC中有2个时间, 分别是UTC时间和当地的LOC时间。 西门子的PLC在出厂时设置的为UTC+1 柏林的时区,如果不正确设置,则会导致混乱。 我们当然可以只使用UTC时间,然而在WINCC中通过NOW指令得到的时间也是当地当前时间,我们或许可以假定自己的电脑永远在东八区即UTC+8,然而也正是出于同样的原因,西门子把他们的电脑系统设置在东一区。然后到了东八区的我们手里。
所以正确的处理应该是读取电脑系统的时区Bias值(分钟数),并下发到PLC中,通过SET_TIMEZONE函数将时区值设置送给PLC系统。
最终可以实现,在电脑中修改系统时间,甚至时区时,PLC的LOC时间也实现了同步更新。