wincc中定时器的使用可以使wincc按照指定的周期或者时间点去执行任务,比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。wincc已经提供了一些简单的定时器,可以满足大部分定时功能。但是在有些情况下,wincc 提供的定时器不能满足我们需求,这时我们就可以通过 wincc提供的脚本接口通过编程的方式实现定时的功能,因为脚本本身既可以直接调用wincc其他功能,比如报表打印,也可以通过中间变量来控制其他功能的执行,比如通过置位/复位归档控制变量来触发变量记录的执行。wincc 提供了c 脚本和vbs脚本,本文主要以全局 c 脚本编程为例介绍定时功能的实现。 2脚本中定时器介绍
既然在全局脚本中可以编程控制其他功能的执行,那么首先看看全局脚本的触发:
图1 脚本触发器分类 如图1所示: 脚本触发器分为使用定时器和使用变量, 定时器又分为周期执行和非周期执行一次,比如每分钟执行一次脚本属于周期执行,指定2012年10月1日执行一次属于非周期执行。 使用变量触发脚本,即在变量发生变化时,脚本就执行一次, 而变量的采集可以根据指定周期循环采集,或者根据变化采集,根据变化实际是1秒钟采集变量一次。 3使用脚本实现更多定时器功能
利用脚本自身的定时器, 可以通过在脚本中编程的方式实现更多其它定时功能。 3.1整点归档
wincc提供了变量归档,变量归档分为周期归档和非周期归档,不管是周期归档或非周期的归档,都又可以通过一些变量或脚本返回值来控制归档, 比如:整点归档。下面的设置结合wincc脚本,实现了在整点开始归档,归档五分种后停止归档,即每个小时仅归档前五分钟的数据。 软件环境:windows 7 professional service pack1 , wincc v7.0 sp3
归档名称:processvaluearchive
归档变量:newtag
归档周期:1 分钟
归档控制变量 startarchive
c脚本触发周期:10秒
脚本代码:
#include apdefap.h
int gscaction( void )
{ #pragma option(mbcs)
#pragma code (kernel32.dll);
void getlocaltime (systemtime* lpst);
#pragma code();
systemtime time;
int t1;
getlocaltime(&time);
t1=time.wminute;
if(t1==00)
{
settagbit(startarchive,1);
}
if(t1==05)
{
settagbit(startarchive,0);
}
return 0;
} 归档设置如图2:
图2 归档设置 同理,在以上脚本的基础上做修改,可以实现在某个指定的时间点打印报表,只要在满足触发条件时调用下列函数: rptjobprint(myprintjob); myprintjob为事先创建好的打印作业。
脚本主要部分在于获取系统当前时间,下面的脚本实现了获取当前时间并分别获取年、 月、日、时、分、秒、毫秒,星期几的功能。 varname1到varname8为wincc内部变量。若在wincc画面上显示时,由于默认i/o 域
的格式为999.99, 要把 varname1的显示格式改为9999。 #include apdefap.h int gscaction( void )
{ #pragma option(mbcs) #pragma code (kernel32.dll); void getlocaltime (systemtime* lpst); #pragma code(); systemtime time; getlocaltime(&time); settagword(varname1,time.wyear);
settagword(varname2,time.wmonth);
settagword(varname3,time.wdayofweek);
settagword(varname4,time.wday);
settagword(varname5,time.whour);
settagword(varname6,time.wminute);
settagword(varname7,time.wsecond);
settagword(varname8,time.wmilliseconds);
return 0;
} 设置或读取系统时间的函数如下: setsystemtime
setlocaltime
getsystemtime
getlocaltime 系统中本地计算机时间和格林威治时间是有区别的。函数“setsystemtime / getsystemtime”用于设置或读取格林威治时间。 函数“setlocaltime / getlocaltime”用于设置或读取本地计算机时间。 两种时间会因地理的时区不同而改变。两个函数使用方法相同。 3.2 wincc项目激活时避免脚本初次执行及延迟执行脚本 全局脚本在项目激活时,是要执行一次的,在有些情况下,需要避免脚本执行,就采用在脚本中去判断。比如可以创建wincc内部布尔型变量 flag,脚本如下: #include apdefap.h int gscaction( void )
{ #pragma option(mbcs) if ( gettagbit(flag)==1)
settagword(newtag,1);//根据自己的需求编写对应代码.
else
settagbit(flag,1); //return-type: bool
return 0;
} 除了避免项目运行激活时触发脚本执行,我们还可以通过sleep() 延迟脚本功能执行,比如开机后五分钟开始执行脚本具体功能,代码如下: #include apdefap.h int gscaction( void )
{ #pragma option(mbcs)
#pragma option(mbcs)
#pragma code(kernel32.dll);
void sleep(int milliseconds);
#pragma code() sleep(300000); //延迟300秒即五分钟 int temp; //根据自己的需求编写对应代码.
temp=gettagword(newtag); //return-type: word
temp++;
settagword(newtag,temp);
return 0;
}