故事作者:万泉河

最近创作

看看TA的故事

【万泉河】WINCC读取S7系统时间

已锁定

万泉河

  • 帖子

    10885
  • 精华

    132
  • 被关注

    892

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

【万泉河】WINCC读取S7系统时间

5799

25

2016-12-20 17:36:05

star star star

【万泉河】WINCC读取S7系统时间


这其实是一个老掉牙的问题了, 但总有人需要用到。 其实官方网站也有过相应的例子, 但实现起来过程比较复杂,通常是在PLC程序中把日期时间年月日时分秒打散,传到上位以后再组装起来。


所以有的人即便找到了,手头有, 也经常搞不定。


前段时间在QQ群里, 又有人问了这个问题,我凭近几年的新理解, 给提了句:系统时间的本质是个浮点数。


但可惜没什么人理我, 还是继续闹哄哄地讨论如何打散, 如何拼接, 如何换算年等等的细节问题了。


所以整理了这个例子,比较简单的方式实现了WINCC读取S7系统时间的问题, 分享给大家。


首先, 我说系统时间的本质是个浮点数, 啥意思呢?


大家首先打开excel, 在单元格中输入当前时间,然后把单元格的显示格式修改为数值, 可以看到当下时间2016-12-20 16:04对应得到的浮点数是42724.67, 如果把格式的小数点给的足够多, 显示的数值是:42724.671820949100000


而倒过来, 如果在一个单元格中输入数值1,但显示格式为日期时间, 得到的日期是1900-1-1。数值为2,则日期是1900-1-2。


所以我们知道了, 42724其实是今天离开日期的起点日1900-1-1的天数。 而后面的0.67呢, 则是时间值变换到天数的小数部分。 比如0.5, 对应的是中午12:00, 0.25则对应的是早晨6:00


有朋友会说了, 且慢, 不是讲WINCC的么,怎么跑题到EXCEL去了?


其实我告诉你啊, 电脑系统都一回事儿。 西门子其实也不是独创另外一套标准。大家用的都是同一套计算方法。


所以我们只需要在PLC里面计算出这个浮点数的值, 送到电脑, 自然能从电脑中得到对应的时间值。


只不过很可惜的是, PLC支持的浮点数据类型只有32位的双字, 浮点数的表达精度只有7位,并不能完整表达到秒。 而只能到分。 在很多时候还是不够用。


所以怎么办呢,切成两部分, 整数部分和小数部分分别传送。


整数部分,就是当天与日期起点的相差天数, 在S7-300中其实有个数据类型,叫DATE,它的本质也就是这个意思。


而在通过SFC1 READ_CLK 读取到了当前的DT之后, 有个库函数, FC6 DT_DATE就是可以读取到当下的DATE值,存储在一个WORD中。WINCC可以直接使用。


而小数部分呢,PLC系统中有个Time_of_Day的数据类型,估计大家一辈子也没用到过。 这个数据记的是当天从0点跑过的秒数,存放在一个DWORD中。秒与天有什么换算关系呢?1天=86400秒, 1秒=1/86400天 啦!


而这个数据, 也有个库函数,FC8 DT_TOD 可以直接拆分得到。


因为数据的转换, WINCC定义变量时都可以做, 所以两个数据都可以直接使用。 转换部分留给WINCC即可。


这就是PLC中所要编制的程序。


看看够简单吧?


而WINCC中则更简单了, 在画面中插入2个Microsoft Date and Time Picker Control, 格式分别设置为日期和时间格式,而value分别绑定到WINCC传来的2个变量,注意时间部分的变量已经转换为以天为单位的小数。




运行, 就得到了PLC系统的日期和时间。


等等, 好像有点不大对劲, 日期怎么错的呢?监控下PLC得到的天数和EXCEL中刚才测试的不一样。 原来SIEMENS PLC中定义的日期的起始点是1990-1-1,相差了90年。


这简单, 差多少天换算的时候给补上多少天即可。


整个实现的过程应该很简单,如果有人心里没底的话,可以跟我讨要例子的源程序。






【万泉河】WINCC读取S7系统时间 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3227条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。