摘 要:介绍了采用SQL数据库,分别在Webaccess脚本、VB采集程序和Delphi的检测程序中调用,解决大量数据的流通及存储的问题。
关键词:Webaccess;数据库;SQL;ADO;ODBC
某空调通风试验台以Webaccess作为软件平台,用于采集测点数据、执行算法并输出控制信号。但在空调通风试验台的项目中,风速、压力和温度总共有140个采集点,如果采用Webaccess内部点,无法进行存储。因为这些点的数据要被实时地保存。为此,本文介绍了基于Webaccess平台、采用SQL sever作为本工程节点的数据保存数据库,同时也考虑了可以方便其他局域网的应用程序访问本机上的数据,以作为分析的依据。
在本系统中,应用程序访问SQL数据库通过ODBC或ADO两种方式。ODBC是微软开发的数据库编程接口,应用程序可以通过ODBC访问来自不同数据库管理系统的数据。在Windows系统中,包含有ODBC接口的管理程序,如果要使用ODBC数据源,必须首先创建和配置数据源。ODBC管理器根据数据源提供的数据库的位置、数据库的类型和ODBC驱动程序,建立与数据库的连接,应用程序对数据库的操作通过ODBC完成。ADO是微软提供的一种面向各种数据源的高级接口,开发人员只需编写访问数据库的代码而不用去关心如何去实现,即只要关心和数据库的连接;ADO通过OLE DB访问和操作数据库服务器中的数据,通过ADO可以连接数据库,并且指定访问数据源的命令,最后执行命令。
在本系统中,连接一个本地SQLserver,并在这个服务器中建立了一个shuju数据库,这个数据库含有10个数据表,分别为:1个存储修正值的表,3个实时的数据保存数据表,3个数据坐标直接读取表和3个历史坐标存储总表。Webaccess在采集数据之后,存入数据库,数据库再把数据分享到局域网。整个系统的数据流向图如图1所示。
1 通过ODBC访问数据库
在Windows系统中,采用Webaccess作为软件平台,其本身支持对数据库的读写,但需要在Windows的ODBC管理器中添加ODBC数据源。在Windows XP系统的控制面板的管理工具中,数据源管理器中添加SQL server驱动、命名、选择服务器,然后添加数据库shuju,测试连接即完成。每次在脚本中执行SQL语句、进行操作数据库之前,必先连接数据源。下面介绍如何连接shuju数据库、读写存储温度的数据表TDATATABLE和存储矫正值的数据表xiuzheng。
(1)在xiuzheng数据表中存储了在Webaccess中对每个点的传感器数据的矫正值,每当每个点的数据存储到数据库之前,必须读取xiuzheng表中的矫正值,加到读入的数据值上。其代码如下:
SQLDIRECT”CONNECT SESSION 1 TO shuju,sa,”
#建立与数据库的连接,用户名为sa,密码为空[1]
SQLDIRECT "USE SESSION 1" #使用连接
SQLPREPARE "DECLARE C1 CURSOR FOR "
#这一条语句从数据库flag=1处读取,并记录到缓存
SQLPREPARE"SELECTTO1,TO2,TO3,TO4,TO5,TO6,TO7,TO8,TO9,TO10,"
…...
SQLPREPARE "TO51,TO52,TO53,TO54,TO55,TO56,TO57,TO58,TO59,TO60"
SQLPREPARE "FROm xiuzheng WHERE Flag=1"
SQLEXECUTE #sql语句执行
SQLDIRECT "OPEN C1"
#将缓存中的数据读取到本地点中
SQLPREPARE "FETCH NEXT C1 INTO m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,"
……
SQLPREPARE"m51,m52,m53,m54,m55,m56,m57,m58,m59,m60"
SQLEXECUTE
SQLDIRECT "CLOSE C1" #关闭连接
set m1 [expr $m1+[GETVAL TT1]]
#将驱动读取到传感器的数据加上矫正值
set m2 [expr $m2+[GETVAL TT2]]
……
set m60 [expr $m60+[GETVAL VV60]]
(2)将读到的传感器测量的点的数值加上矫正值存储到TDATATABLE。其代码如下:
SQLDIRECT”CONNECT SESSION 1 TO shuju,sa,”
#连接数据库
SQLDIRECT”USE SESSION 1”
SQLPREPARE”INSERT INTO TDATABASE VALUES(”SQLPREPARE”'[GETVAL %TI
MDATE]','[GETVAL %TTMTIME]'”
SQLPREPARE” $m1,$2, $m3,$m4,$m5,”
……
SQLPREPARE”$m56,$m57,$m58,$59,$m60)”
#将系统日期,时间和局部点读取到TDATEBASE数据表中
SQL.EXECUTE
SQLDIRECT”DISCONNECT SESSION1”
2 通过ADO接口连接到数据库
(1)在Webaccess中局部点存储了坐标值,只有当局部点文件被加载时才能把这些点赋值。本文采用在Webaccess的总体脚本中添加VB辅助程序、运行总体脚本时在VB程序中给这些局部点赋值。
在VB辅助程序中,VB控件作为第三方控件在Webaccess平台中实现与数据库的连接。由于嵌入到Webaccess中的控件是通过bwocxrun.exe与Webaccess通信,因此要把bwocx.ocx引用到VB中。在VB中新建ActiveX控件—>工程—>部件bwocxrun ActiveX Control modole—>接口向导—>hWnd—>映射到UserControl—>数据类型为string—>在空白处添加ocx控件。
在VB控件中建立与SQL数据库的连接,本系统采用ADO连接数据库,而在VB中采用ADO接口。主要有两种方式:一是采用ADOdata控件连接数据库,二是采用ADO对象与数据库连接。在采用第二种方式时还有两种方式:分别是ADO对象和ODBC数据源连接或者ADO对象和指定的OLE DB提供者连接数据库。本文采用ADO对象和指定的OLE DB连接方式。以下是与TXYZTABLE的连接:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private sub form_load()
Set conn=New ADODB.Connection
Set rs=New ADODB.Recordset
Dim s1,s2 As String
Dim ft1,ft2…..as byte
Dim xt1,yt1,zt1…as single
conn.ConnectionString=”driver={sqlserver};server=127.0.0.1;uid=sa;pwd=;Connection Timeout=0;Database=shuju”
′与数据库建立连接的字符串[2]
conn.open ′建立与数据的连接
ft1=Bwocxrun1.GetValue(“FT1”,ME.AP)
′通过Bwocxrun控件将Webaccess中的点读到VB中的变量[3]
xt1=Bwocxrun1.GetValue(“XT1”,ME.AP)
yt1=Bwocxrun1.GetValue(“YT1”,ME.AP)
zt1=Bwocxrun1.GetValue(“ZT1”,ME.AP)
……..
S1=”USE shuju”
conn.Execute s1
s2=”INSERT INTO TXYZTABLE VALUES(1,”&ft1&”’,’”&xt1&”’,’”&yt1&”’,’”&zt1&”,’……’)”
conn.Exexute s2
′将这些变量存储到shuju数据库的TXYZTABLE表中
(2)在本系统中,由于如果改变测点额定坐标,将会使以前的坐标信息全部丢失。为了存储过去的历史坐标,系统建立了一个历史坐标数据表。利用Delphi编写了一个辅助程序将当前的测点坐标存储到数据库中,当测量点修改后,可以运行该程序将改动的坐标存储到历史坐标数据库中。当在使用以前的测量点时,也可以在程序中选择以前存储的历史坐标加载到测量点的局部点。
使用Delphi编写试验坐标处理程序时,其程序采用ADO数据库访问接口进行连接数据库,采用ODBC驱动程序连接数据源。图2为该程序的界面。
在编写程序时,需要在新建的窗体上添加ADOConnection和ADOQUERY控件。其中这ADOConnection的connectionstring属性为”Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Data Source=shuju”,并为ADOQUERY添加connection属性为ADOConnection的name[4]。
在MPXYZTABLE中,每一条记录的第一个字段表示第几条实验记录。下面是以压力历史坐标表演示将数据编号读出,并将选择的编号的数据记录读取到坐标数据表的示例:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(′SELECT*FROM MPXYZTABLE′); //连接数据库选择数据表
ADOQuery1.Open; //打开数据表
j:= ADOQuery1.RecordCount;
……
ADOQuery1.FindFirst;
for i:=0 to j-2 do
begin ComboBox1.Items.Add(ADOQuery1.Fields[0].Value); //将编号提取到下拉控件中显示
testname[i]:=ADOQuery1.Fields[0].Value;
ADOQuery1.FindNext; //下一条记录
下面是把历史坐标中选择的编号相应的记录输出到全局变量中,然后把这些变量再写入到坐标表中的代码:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(′SELECT*FROM MTXYZTABLE WHERE FLAG=′′′+ComboBox1.Text+′′′′);
ADOQuery1.Open;
for i:=1 to 240 do
begin
if ADOQuery1.Fields[i].Value=NULL then
//检测记录是否为空
begin
data[i]:=0;
end
else
data[i]=ADOQuery1.Fields[i].Value;
//把MTXYZTABLE中的数据读到数组中
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(′update TXYZTABLE setFLAG=′′′+inttostr(1)+′′′,FT1=′′′+floattostr(data[1])+′ ′′,XT1=′′′+floattostr(data[2])+′′′,YT1=′′′+floattostr(data[3])+′′′,ZT1=′′′+floattostr(data[4])+′′′,′ );
……
ADOQuery1.SQL.Add(′FT2=′′′+floattostr(data[57])+′′′,XT2=′′′+floattostr(data[58])+′′′,YT2=′′′+floattostr(data[59])+′′′,ZT2=′′′+floattostr(data[60])+′′′,′);
//把数组中的值写入到坐标数据表TXYZTABLE
以上就是在Webaccess中SQL数据库的调用和操作。在实际的应用中只要掌握简单的查询语句,就可以对数据库进行操作。
参考文献
[1] 研华(中国)公司自动化事业群.Advantech WebAccess产品使用手册[S].2009.
[2] 陈艳峰,高文姬,邵蕴秋,等.Visul Basic 数据库项目案例导航[M].北京:清华大学出版社,2004.
[3] 刘德生,张天开.基于VB的WebAccess组态功能扩展[J].微型机与应用,2011,30(12):29.
[4] 郑阿奇.Delphi实用教程[M].北京:电子工业出版社,2006.