针对凌波微步大侠的报表格式,我也做了一下实验,首先是数据存储,定义表格结构如下:

字段解释如下:
ID:自动编号字段,每增加一条记录自动加1;
OP:当前操作员(即当前班次)
DT:采样的时间//此字段设置索引,对查询速度有很大的提高,特别是数据记录很多的时候。
P1:1号压力值
...
P3:3号压力值
T1:1号温度值
...
T3:3号温度值
在全局动作中写入如下代码:
Function action
Dim objConnection
Dim strConnectionString
Dim P1101VALUE,P1102VALUE,P1103VALUE,T1101VALUE,T1102VALUE,T1103VALUE
Dim strSQL
Dim objCommand
Dim DsnStr
Dim dt
Dim UserName
DsnStr=HMIRuntime.Tags("@DatasourceNameRT").Read '取当前的DSN值
strConnectionString = "Provider=MSDASQL;DSN="&DsnStr&";UID=;PWD=;"
HMIRuntime.Trace strConnectionString
dt=Now()
P1101Value = HMIRuntime.Tags("P1101_PV").Read
P1102Value = HMIRuntime.Tags("P1102_PV").Read
P1103Value = HMIRuntime.Tags("P1103_PV").Read
T1101Value = HMIRuntime.Tags("T1101_PV").Read
T1102Value = HMIRuntime.Tags("T1102_PV").Read
T1103Value = HMIRuntime.Tags("T1103_PV").Read
UserName = HMIRuntime.Tags("@CurrentUserName").Read '取当前操作员
HMIRuntime.Trace p1101value
strSQL = "INSERT INTO WINCC_DATA (OP,DT,P1,P2,P3,T1,T2,T3) VALUES ("
strsql=strsql+"'"& UserName &"'"
strsql=strsql+",'"&dt&"'"
strSql=StrSql+","& P1101Value &""
strSql=StrSql+"," & P1102Value &""
strsql=strsql+","& P1103Value &""
strsql=strsql+","& T1101Value &""
strsql=strsql+","& T1102Value &""
strsql=strsql+","& T1103Value &")"
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.Open
Set objCommand = CreateObject("ADODB.Command")
HMIRuntime.Trace "Ok"
HMIRuntime.Trace strsql
objCommand.ActiveConnection = objConnection
objCommand.CommandText = strSQL
HMIRuntime.Trace "Ok1"
objCommand.Execute
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
End Function
设置每30秒触发一次。把数据写入数据库中。接下来是如何实现报表的格式,采用EXECL不是一个好方法,因为对于求平均值和最大值/最小值来说,要先把数据写入EXECL中,然后才能再EXECL中做统计计算。在这里我们使用SQL语句的强大的数据统计功能,在WINCC的报表编辑器中有一个动态对象:ODBC数据库域。这个对象是WINCC5.1所没有的。这个对象中可以使用标准SQL语句。

如上图所示,select avg(p1) from wincc_data where op='甲' and dt>='2009-03-01' and dt<'2009-04-01'---是一个求甲班3月份一号压力平均值的语句。 这个动态控件可以把这个语句的执行结果直接显示出来,而且从图中也可以看出,通过下方的变量功能可以使用一个WINCC的字符串类型的变量动态化SQL语句,这样稍微写一些代码结合界面选择就可以实现不同月份的查询。
另 select max(p1) from wincc_data where op='甲' and dt>='2009-03-01' and dt<'2009-04-01'是求甲班3月份一号压力的最大值,Min是求最小值。在报表编辑器的多放一些这样的控件,再把这些控件排列成表格的形式就可以了。
在这里需要注意的是每个控件都执行一次SQL语句,都要连接一下数据库,如果有100个这样的控件,就需要执行100次查询,当然100次查询对于本地SQL数据库来说是一点问题都没有的。如果数据表中数据记录很多,查询次数也很多的话,可能预览的时候会有一定的查询等待时间。呵呵,我们以前在网络SQL数据库上,数据表中有几万条记录,循环执行几百次的查询,执行起来有明显的等待,不过后来用存储过程来做就好多了。
以上写数据库的代码,我调试过了是正确的。select 语句也是没问题的,求平均值,最大/最小值也是对的。但我只是在报表编辑器中做了两行记录。共12个查询,而且只以3月份为例。呵呵,速度很快。
管理员注:本帖已被纳入此次探讨发帖整理之方案汇总,请
点此详阅