由于最近手头一个项目用ntp和smitic模式去做时间同步都不成功,咨询西门子热线怀疑是plc硬件版本的问题,由于项目已经运行,程序太多不能停机,所以就想着用wincc读取服务器的时间,然后把读取的时间写入plc来做时钟同步,服务器是外置gps时钟的客户端,时间同步没问题,具体步骤如下:
下面的方法是使用wincc的脚本把本地或者系统时间写到数据块(db350)的变量中。
这些变量作为date_and_time数据类型变量被调用,传送到系统块set_clk (sfc0)中。
说明
步骤1
1、创建一个共享数据块db350,在里面建立如下变量,如图所示:
2、创建1个功能fc30,在里面调用sfc0,如图所示:
3、写设置校对周期的循环时间程序,示例中设置为60s,如图所示:
4、在ob1中调用fc30,step7的程序到此结束。
步骤2
1、打开wincc变量管理器,新建如下变量,变量类型为无符号8位值,格式调整为bytetobcdbyte,如图所示:
2、打开全局脚本,在全局动作中写如下脚本,编译保存,
注意函数使用“设置系统时间”将格林威治时间写入控制器。如果希望将系统时间写入控制器,可以在c脚本中,将“get local time”注释掉,用“get system time”(在c脚本中被注释掉的部分)替代。如图所示:
脚本附件:
#include apdefap.h
void setcputime()
{
#pragma code(kernel32.dll);
void getlocaltime(systemtime *lpst);
#pragma code();
systemtime time;
bool ret;
//printf(start function setcputime\r\n);
//getsystemtime(&time); //use if system time is needed
getlocaltime(&time); // use if local time is needed
ret = settagmultiwait(%d%d%d%d%d%d%d,
year,time.wyear-2000,
month,time.wmonth,
day,time.wday,
hour,time.whour,
minute,time.wminute,
second,time.wsecond,
flag,1
); //end settagmultiwait
} // end function
3、至此wincc这边设置完成,然后下载plc程序,运行wincc就可以啦!