摘 要: 结合高速铁路国家实验室“车厢环境检测”项目,探索如何用VB设计一些辅助程序,并将这些程序嵌到WebAccess组态软件中,通过两者的紧密结合,解决一些现实中的棘手问题,扩展组态软件的功能以便更好地满足用户需求。
关键词: VB; WebAccess; I/O点; 控件; SQL; Excel
WebAccess组态软件是基于浏览器开发的B/S架构的组态软件,可实现远程监控和远程在线维护。项目选用150点WebAccess组态软件,其中包括150个外部点、150个内部点和不受个数限制的本地点,每个点相当于一个寄存器。外部点用来存储外部设备通过通信传送给计算机的数据,内部点是中间变量点(包括计算点、累算点、常数点),它们都是全局有效的;本地点相当于局部点,只在对应的画面内有效。使用以上所有资源,在实际设计过程中遇到三个WebAccess不能解决的问题:(1)内部I/O点不够用; (2)本身不带微风速采集器的驱动程序;(3)不能按需求将SQL数据库中表导成Excel表和实现多表并发(将多个Excel表合成一个)。
当软件本身不能实现某些功能时,就需要考虑一些辅助软件,这里将VB作为一个辅助软件,通过它设计一些辅助程序,并将这些辅助程序与WebAccess巧妙地结合在一起,就可以很好地解决以上三个问题。
1 VB程序使用SQL数据库扩展组态I/O点
高铁车厢环境检测项目中要检测的参数包含60点温度、60点风速、20点压力、2点湿度,对应每一点都要有一个修正值和最终值(测量值+修正值),为了便于Matlab绘制参数云图,每个点还要有一个标志值(表示该点在试验中是否被选用)和X、Y、Z三个坐标值(表示该点在车厢中的位置),以上这些点要求都是全局有效的,对一个只有150点的WebAccess是远远不能满足的。如果采用I/O点数多的WebAccess,不仅会增加成本,而且会使利用率很低,因为每一个点的三个坐标值、修正值及标志值在试验开始前都是设定好的,实验过程中它们的值保持不变。根据这个特点,在每个值设定好后,用VB编写的辅助程序将不同属性的设定值存储到SQL特定数据库的不同表中,在某个画面需要某些值时再用VB编写的辅助程序从数据库中读出这些值并存储到本地点,在这个画面中就可以随意使用这些储存着特定值的本地点,在画面退出后,本地点所占的内存空间被释放,这些点就不存在,但它们对应的值却始终存储在SQL数据库中。采用这种方法,不仅节省大量I/O点,而且不会影响系统的性能。SQL数据库存方框图如图1,相关VB程序如下:
‘******将温度点T1的标志位FT1及三个坐标XT1、YT1、ZT1通过VB控件读到变量ft1、xt1、yt1、zt1中,其他温度点的标志位及坐标用同样的方法读到相应的变量中,然后将这些变量的值存储到testdata数据库 TXYZTABLE表中******’
ft1 = Bwocxrun1.GetValue("FT1", Me.AP)
xt1 = Bwocxrun1.GetValue("XT1", Me.AP)
yt1 = Bwocxrun1.GetValue("YT1", Me.AP)
zt1 = Bwocxrun1.GetValue("ZT1", Me.AP)
……
s1 = "USE testdata"
Conn.Execute s1
s2 = " INSERT INTO TXYZTABLE VALUES (1,′" & ft1 & "′,′" & xt1 & "′,′" & yt1 & "′,′" & zt1 & "′,……,′" & ft60 & "′,′" & xt60 & "′,′" & yt60 & "′,′" & zt60 & "′)"
Conn.Execute s2
‘******将testdata数据库TXYZTABLE表中数据读出存储到变量ft1、xt1、yt1、zt1、……、ft60、xt60、yt60、zt60中,再通过VB控件将变量这些变量的值赋给相应的WebAccess点******
s3 = “DECLARE C1 CURSOR FOR
SELECT
FT1,XT1,YT1,ZT1,FT2,XT2,YT2,ZT2,……,FT60,XT60,YT60,ZT60 FROM TXYZTABLE WHERE Flag=1”
Conn.Execute s3
s4 = “OPEN C1 FETCH NEXT C1 INTO ft1,xt1,yt1,zt1, ft2,xt2,yt2,zt2,……, ft60,xt60,yt60,zt60 CLOSE C1”
Conn.Execute s4
Call Bwocxrun1.SetValue("FT1", ft1, Me.AP)
Call Bwocxrun1.SetValue("XT1", xt1, Me.AP)
Call Bwocxrun1.SetValue("YT1", yt1, Me.AP)
Call Bwocxrun1.SetValue("ZT1", zt1, Me.AP)
……
以上程序是对温度标志位及温度坐标的存取程序,系统中用到的其他的点,只要在系统运行过程中保持其值不变,都可以用同样的方法实现存取,从而节省系统I/O点。
2 风速数据采集
微风速采集器由16块1504四通道空气速度测试接口模块组成,每个模块4个通道,共64个通道(实际只用60个),每个通道与一个热式传感器探头相连接,在风速采集器上可以直接得到每个探头测得的风速值,并显示在液晶屏上,也可以通过串口线将风速采集器与电脑相连接,利用上位机软件进行大规模的数据采集与数据处理。但WebAccess本身不带风速采集器的驱动程序,无法将数据读到WebAccess相应的点中。
解决上述问题有两种方法,第一种解决方法是请相关公司编写风速采集器的驱动程序,但这个方法有很多不利之处:除需要增加成本之外,还需为技术人员提供相关资料以及调试实际设备的机会,耗时耗财。第二种解决方法是利用WebAccess支持在画面中嵌入由第三方软件制作的控件的特点,用VB编写一个串口通信和数据处理程序,通信协议采用与微风速采集器一致的协议,将风速采集器测得数据存到VB控件所占的内存空间中,对测得数据进行处理后得到风速参数,再将风速参数写到对应的WebAccess点中,就能方便自如地显示和处理风速参数。通过VB控件这个媒介,在没有设备驱动的情况下同样可以将数据传送到对应的WebAccess点中,在一定程度上可以摆脱WebAccess自身不带很多设备驱动的限制,在设计系统选择设备时就可以有更多的机会。其方框图如图2,相关VB程序如下:
‘******定义程序中所需变量******
Sub ReceiveTextFromCom()
Dim av As Variant //存储通信得到的数据
Dim b(1 To 60)As Single //存储转化成字节型的数据
Dim ab(0 To 300) As Byte //通信得到的数据转化成
字节存储
Dim ac(0 To 300) As Byte //通信得到的数据转化成
字节后去除通信信息存储
Dim j,k,m As Integer //中间变量
‘******读取串口接收缓冲区的数据,将接收到的数据转换成字节型,并计算风速值赋给b(1)~b(60)。数组ab()中存储的是风速值,每4个字节表示一路风速值,但ab(128)存储回车符,便于通信校验用,数据处理时应去掉******
j = MSComm1.InBufferCount //串口寄存器中数据个
数赋值给j
av = MSComm1.Input //串口寄存器中数据赋值给av
ac = av //av变量值赋值给ac
For k = 10 To j - 1 Step 1 //去除开头部分的通信
辅助字节
ab(m) = ac(k)
m = m + 1
Next k
b(1) = (ab(0) - 48) * 10 + (ab(1) - 48) + (ab(2) -
48) / 10 + (ab(3) - 48) / 100
……
b(32) = (ab(124) - 48) * 10 + (ab(125) - 48) + (ab
(126) - 48) / 10 + (ab(127) - 48) / 100
b(33) = (ab(129) - 48) * 10 + (ab(130) - 48) + (ab
(131) - 48) / 10 + (ab(132) - 48) / 100
……
b(60) = (ab(237) - 48) * 10 + (ab(238) - 48) + (ab
(239) - 48) / 10 + (ab(240) - 48) / 100
‘******将VB控件中的风速值b(1)~b(60)写到WebAccess对应(VV1~VV60)点中******
Call Bwocxrun1.SetValue("VV1", b1, Me.AP)
Call Bwocxrun1.SetValue("VV2", b2, Me.AP)
……
Call Bwocxrun1.SetValue("VV60", b60, Me.AP)
‘************为用户控件初始化属性************
Private Sub UserControl_InitProperties()
m_BackColor = m_def_BackColor
m_ForeColor = m_def_ForeColor
m_Enabled = m_def_Enabled
Set m_Font = Ambient.Font
m_BackStyle = m_def_BackStyle
m_BorderStyle = m_def_BorderStyle
m_AP = m_def_AP
End Sub
3 将SQL数据库表导成Excel表并合并
在实际应用中要将不同编号、不同车型、不同时间的试验数据(包括温度值、压力值、风速值、温度点坐标、压力点坐标、风速点坐标及试验信息)在试验过程中分别存储到指定数据库的7个表中,在试验结束后将所有的数据导成一个Excel表(包含7个Sheet,每个Sheet对应前面的一项试验数据)并根据用户设定的路径保存,最后将SQL数据库中对应的表清空,这样做不仅便于用户查找和转移试验数据,还便于Matlab读取数据和绘制云图,同时可以防止因数据库数据量过大而导致错误。实现上述功能的唯一方法是将SQL数据库中对应的7个表导成7个Excel表,再将这7个Excel合并成一个包含7个Sheet的Excel表,最后将合并好的Excel表存到用户指定的路径下。 WebAccess自身所带的TCL脚本语言不能实现上述功能,但WebAccess可以调用其他软件编写的应用程序(.exe文件),通过此思路用VB编写一个能够实现所需功能的应用程序,在试验结束时,用WebAccess TCL脚本语句调用该应用程序,根据用户的实际需求完成功能后自动退出应用程序。其方框图如图3,相关VB程序如下:
‘******定义程序中的变量******
Dim xapp,xapp1 As Excel.Application
//定义xapp、xapp1为Excel应用对象
Dim wb,wb1 As Excel.Workbook
//定义wb、wb1为Excel工作薄
Dim ws,ws1 As Excel.Worksheet //定义ws、ws1为
Excel工作表
‘******建立一个新的Excel工作簿,并在其中添加4个sheet,再将工作簿中的7个sheet重新命名后存储到Pathname指定的路径下,最后退出创建的xapps对象******
Set xapps = CreateObject("Excel.Application")
xapps.Workbooks.Add
Set wb = xapps.ActiveWorkbook
sheetcount = wb.Sheets.Count
wb.Sheets.Add
wb.Sheets.Add
wb.Sheets.Add
wb.Sheets.Add
Set ws = wb.Sheets(1)
ws.Name = "TDATATABLE"
//用同样的方法命名其他6个sheet
wb.SaveAs pathname
xapps.Quit
‘******将新建的ADODB连接Conn连接到指定服务器的数据库,并将其打开,为操作数据库做好准备******
Dim rs As ADODB.Recordset //定义rs为ADODB
记录集
Dim Conn As ADODB.Connection
//定义Conn为ADODB连接
Set rs = New ADODB.Recordset
//建立一个新的ADODB记录集赋给rs
Set Conn = New ADODB.Connection
//建立一个新的ADODB连接赋给Conn
Conn.ConnectionString="Driver={sqlserver};server=服务器名称;uid=用户名;pwd=用户密码;database=testdata"
Conn.Open
‘******将testdata这个数据库中TDATATABLE表,导成名为TDATATABLE Excel表,并存储到到E盘根目录下。用同样的方法将其他表导出相应的Excel表******
Dim s1, s2 As String
s1 = "USE master"
Conn.Execute s1
s2 = "DECLARE @myPath varchar(200)SET @myPath= ′bcp testdata.dbo.TDATATABLE out E:\TDATATABLE.xls -c -q -S""服务器名称"" -U""用户名"" -P""用户密码""′EXEC master..xp_cmdshell @myPath"
Conn.Execute s2
‘******将TDATATABLE.xls中的数据存储到另一个Excel表的sheet1中,修改一下程序,便可以将其他的Excel表中数据存储到同一个Excel表中的不同sheet下,实现多表合一******
Set xapp = New Excel.Application //新建 Excel应用 对象赋给xapp、xapp1
Set xapp1 = New Excel.Application
xapp.DisplayAlerts = False
xapp1.DisplayAlerts = False //Excel 选择默认应答消息,
防止弹出消息对话框
xapp.Workbooks.Open ("E:\TDATATABLE.xls")
//用对象xapp打开指定路径工作簿
Set wb = xapp.ActiveWorkbook //将当前工作簿赋值
给wb
xapp.Worksheets(1).Activate //把sheet1置为当前工作表
Set ws = xapp.ActiveSheet //将当前工作表赋值给ws
ws.UsedRange.Copy //把ws工作表中所使用
范围的数据复制
xapp1.Workbooks.Open pathname
//用对象xapp1打pathname开指定路径工作簿
xapp1.Worksheets(1).Activate //把当前工作簿的sheet1
置为当前工作表
Set ws1 = xapp1.ActiveSheet //将当前工作表赋值给
ws1
ws1.Range("A1", "A1").PasteSpecial xlPasteValues
//从A1行A1列开始将粘贴板中数据粘贴到当前工作表ws1
xapp.ActiveWorkbook.Save
xapp1.ActiveWorkbook.Save //保存打开的工作簿
VB是一种可视化的、面向对象的和采用事件驱动方式的结构化程序设计语言,它可以开发 Windows 环境下的各类应用程序,用它来做组态软件的助手,可以更好地满足实际需求。除此,VB简单易学、效率高,且功能强大,设计人员不必花大量的时间学习就可以写出满足要求的程序。在这个项目中,VB编写的相关辅助程序扮演着十分重要的角色,解决了很多实际问题,给设计人员带来很大帮助。
参考文献
[1] Advantech WebAccess产品使用手册[S].研华(中国)公司工业自动化事业群,2009.
[2] 陈艳峰,高文姬,邵蕴秋,等.Visual Basic 数据库项目案例导航[M].北京:清华大学出版社,2004.
[3] 臧玉琴,腾跃.Visual Basic界面、多媒体与操作系统程序设计[M].北京:人民邮电出版社,2003.