孙宏林,巫 影
(海军工程大学 船舶与动力学院,武汉430033)
组态王6.5以前的版本,虽然支持最快的数据采集和处理的速率为毫秒级的,但是组态王自带的数据库存储速率仍然是秒级的,存储速率往往达不到实际的需要,而且数据存储所占的磁盘空间较大,不适合长时间、大规模的数据存储及访问。虽然在组态王6.5以后的版本中采用了新的数据压缩和搜索技术,数据库压缩比低于20%,大大节约了压缩空间,提高了访问速度,支持毫秒级存储和查询,但是数据库中的数据仍是以二进制文件的形式存储的,引用不够直观,方便,数据的存储和查询方面的能力还偏弱。为此在某型舰船模拟器的研制中利用组态王6.5的SQL访问功能,连接到Access 2000数据库,实现了数据的时时存储和查询。*.REC文件中存放的数据,不能用Excel直接打开,可以在VBA中调用动态连接库来访问[1-2]。
组态王SQL访问功能是为了实现组态王和其它ODBC数据库之间的数据传输,它由组态王的SQL访问管理器来实现与数据库的通信。组态王SQL访问管理器用来建立数据库列和组态王变量之间的联系。通过表格模板在数据库中创建表格,表格模板信息存储在SQL.DEF文件中;通过记录体建立数据库表格列和组态王变量之间的联系,允许组态王通过记录体直接操纵数据库中的数据。这种联系存储在BIND.DEF文件中。组态王可以与其它外部数据库(支持ODBC访问接口,例如Microsoft Access数据库,Oracle数据库,SQLServer数据库,dBase数据库等等)进行数据传输,这里选用Access2000数据库。
在D盘根目录下建立一个名为“模拟器数据库.mdb”的Access空数据库。然后在本机上的ODBC数据源中建立一个基于Micrisoft Access Driver(*.mdl)的数据源名——“模拟器数据库”。在组态王中创建一个内存整型变量DeviceID,用来保存SQLConnect()函数为每个数据库连接分配的数值。在组态王的应用程序命令语言对话框中,选择启动时使用下述命令连接数据库:
SQLConnect(DeviceID,“dsn=模拟器数据库;uid=;pwd=”);用户名和密码可以根据需要而定。
在组态王中创建表格模板“经航模板”、“主推模板”、“辅推模板”、“发电机模板”和“柴油机模板”。定义各个字段名称,变量类型、变量长度和索引类型。经航电机的表格模板见图1。
使用下述命令创建Access数据库表格,取名为“经航电机”:
SQLCreateTable(DeviceID,“经航电机”,“经航模板”);
“经航电机”表格中的各列与“经航模板”中的字段一一对应。
在组态王中创建记录体“经航记录”、“主推记录”、“辅推记录”、“发电机记录”和“柴油机记录”。记录体中的字段名称、顺序等要与表格模板中定义的一致。经航电机的记录体见图2。
这样就建立了组态王变量与Access数据库表格中的各列之间一一对应的联系。在组态王的应用程序命令语言中选择运行时,时间间隔设为55ms。使用下述命令可以将经航电机的数据时时地存入经航电机表格中:
SQLInsert(DeviceID,“经航电机”,“经航记录”);
图2 经航记录
另外还可以根据需要,在组态王的数据改变命令语言中选择经航电机变量,使用上述命令,只要数据发生改变就可以将经航电机的数据存入经航电机表格,甚至于可以在画面命令语言中使用上述的命令将经航电机的数据按照需要存入到数据库表格中。
该命令使用记录体“经航记录”中定义的连接,在表格“经航电机”中插入一个新的记录。该命令执行后,组态王运行系统会将经航电机变量的当前值添加到Access数据库表格“经航电机”中最后一条记录。
在组态王中创建记录体“经航查询”、“主推查询”、“辅推查询”、“发电机查询”和“柴油机查询”,用于定义查询时的连接。图3是经航电机查询记录体。这里“经航查询”记录体的字段名称和顺序要与“经航记录”和“经航模板”中的一致。
图3 经航查询
使用下列命令查询数据库:
SQLSelect(DeviceID,“经航电机”,“经航查询”,“”,“”);
该命令选择表格“经航电机”中所有符合条件的记录,并以记录体“经航查询”中定义的连接返回选择集中的第一条记录。可以设置查询的条件和选择集的排列顺序,此处没有设定条件,将返回该表格中所有记录。执行该命令后,运行系统会把得到的选择集的第一条记录的各个字段的值,赋给记录体经航查询中定义的与其连接的各组态王变量。
同时还有其他的一些命令语言可配合使用,例如:
SQLFirst(DeviceID);返回第一条记录;
SQLprev(DeviceID);返回前一条记录;
SQLNext(DeviceID);向后移动一条记录;
SQLLast(DeviceID);移到最后一条记录;
SQLGetRecord(DeviceID,RecordNumber);返回指定序号记录;
SQLEndSelect(DeviceID);结束选择集,释放资源。
下面是在某画面命令中使用的部分程序:
s1=“励磁电流调节<1”;
s2=“首电枢接通指示灯=1”;
s3=“尾电枢接通指示灯=1”;
s4=“运行2指示灯=0”;
s5=“运行1指示灯=0”;
s=s1+“and”+s2+“and”+s3+“and”+s4+“and”+s5;
SQLSelect(DeviceID,“经航电机”,“经航查询”,s,“”);
NumRows=SQLNumRows(DeviceID);
if(NumRows==0)\本站点\经航扣分=40;
SQLEndSelect(DeviceID);
SQLSelect(DeviceID,“经航电机”,“经航查询”,“”,“”);
SQLLast(DeviceID);
if(JHDJ1_06R==1)\本站点\经航扣分=\本站点\经航扣分+15;
else if(JHDJ1_07R==1)\本站点\经航扣分=\本站点\经航扣分+15;
else if(JHDJ1_09R==1)\本站点\经航扣分=\本站点\经航扣分+10;
else if(JHDJ1_12R==0)\本站点\经航扣分=\本站点\经航扣分+10;
else if(JHDJ1_14R==0)\本站点\经航扣分=\本站点\经航扣分+10;
SQLEndSelect(DeviceID)。
在组态王的画面命令中,可以编制条件更为复杂的查询,非常灵活。
在组态王的应用程序命令语言中,退出时使用SQLDisconnect(DeviceID);命令,可以断开组态王与数据库的连接。
组态王共提供了200多种函数可供用户调用,其中数据库操作函数就有40多种,上面提到的只是很小的一部分,同时组态王支持用户自定义函数,用户可以根据需要自己编制合适的函数。另外组态王的命令语言是类似于C语言的,灵活,方便,易于用户编制程序。
利用组态王的数据库访问功能,可以建立组态王与Access数据库的联系,组态王提供了丰富的数据库操作函数,可以在任意一种命令语言中调用,可以方便地进行创建表格,插入、删除记录,编辑已有的表格,清空、删除表格,查询记录等操作。Access数据库可以不必打开,只在后台执行就行了。数据库中的数据可以根据需要随时进行转存,大大节省了应用程序所占的磁盘空间,在某型舰船模拟器中应用该方法效果良好。
[1]王成志.工控软件“组态王”的数据处理和Excel报表自动生成程序设计[J].微计算机信息,2002,18(4):63-65.
[2]李卫中.用access扩展组态王的功能[J].化工自动化及仪表,2002,29(4):82-84.