回复:在Wincc设置PLC的时钟...

n次看你的背影

  • 帖子

    2321
  • 精华

    73
  • 被关注

    53

论坛等级:奇侠

注册时间:2008-03-11

普通 普通 如何晋级?

发布于 2009-01-14 22:45:40

0楼

以前我也做过同样的事情,而且测试通过了,不过上位和下位时间不是严格意义上的同步,有时间误差,误差应该不会超过2秒。在时间要求不是很精确的场合应该可以使用。我把我的思路和相关代码复制给你,可以参考一下。
我的思路是:写一个全局脚本读取上位WinCC的系统日期、时间,并将其写到PLC预先按照一定顺序、一定数据类型定义好的数据块中。注:全局脚本循环触发的时间不易太小(本人设定1秒),不然WinCC执行全局脚本的负担很重,会耗费WinCC较多的资源。然后在PLC里面提取上位写下来的数据,并且把这些无符号16位的整型数据转换成BCD码,年要先减去2000再转成一个byte的BCD码,毫秒是转成一个word的BCD码,然后按照PLC里面时间顺序存放在此数据块中。最后通过sfc0将8个字节的BCD码写到PLC的操作系统中。

上位WinCC的代码如下:
#include "apdefap.h"

int gscAction( void )
{

#pragma code ("kernel32.dll")//调用动态链接库
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);

SetTagWord("Year",sysTime.wYear);
SetTagWord("Month",sysTime.wMonth);
SetTagWord("Day",sysTime.wDay);
SetTagWord("Hour",sysTime.wHour);
SetTagWord("Minute",sysTime.wMinute);
SetTagWord("Second",sysTime.wSecond);
SetTagWord("Milliseconds",sysTime.wMilliseconds);
return 0;
}

PLC的代码如下:

L DB444.DBW 400 //上位年的数据
L W#16#7D0
-I //年减去2000
ITB
T DB444.DBB 414 //年转换成BCD码

L DB444.DBW 402 //上位月的数据
ITB
T DB444.DBB 415 //月转换成BCD码

L DB444.DBW 404 //上位日的数据
ITB
T DB444.DBB 416 //日转换成BCD码

L DB444.DBW 406 //上位小时的数据
ITB
T DB444.DBB 417 //小时转换成BCD码

L DB444.DBW 408 //上位分钟的数据
ITB
T DB444.DBB 418 //分钟转换成BCD码

L DB444.DBW 410 //上位秒的数据
ITB
T DB444.DBB 419 //秒转换成BCD码

L DB444.DBW 412 //上位毫秒的数据
ITB
T DB444.DBW 420 //毫秒转换成BCD码


CALL SFC 0 //调用sfc0
PDT :="Test".SystemTime //把数据块DB444的符号定义为TEST;
RET_VAL:=LW100 //数据块DB444从DBB414开始定义为DATE_AND_TIME的数据类型;Name为SystemTime
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32907条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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