发布于 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
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”