iFix是全球使用最多的组态软件,提供了丰富的API编程接口,可以使得第三方程序使用这些接口通过编程访问iFix实时数据库中的数据,将获得的实时数据保存到关系型数据库中。为了方便数据的读取和转移,减少软件开发安装复杂度,还可以使用结构化存储的方法将数据保存到文件中。
1 概述
在本项目中,要求将iFix实时数据库里的一部分数据保存到外部数据库中。数据的个数约为300个,需要每秒保存一次,24小时不间断存储。
2 数据流
利用iFix提供的API接口来读取iFix的实时数据库数据,是较为简便的方法,通过调用相关API函数,可直接读写iFix的实时数据库。经过测试,如果读取300个iFix数据,需耗时500ms左右。外部数据库使用SQL Server 2008。
根据上述方案,数据流如图1所示。
3 读取与保存数据
3.1 读取数据的方法
iFix提供了一个EDA的DLL类,通过类中的API接口,可以读取iFix实时数据库中的数据。
这个类主要提供了4个函数,分别为:ReadFloat(),WriteFloat(),ReadAscii()和WriteAscii(),功能为读取浮点值,写入浮点值,读取ASCII码值和写入ASCII码值。
在这里,需要用到的是ReadFloat()这个函数,其函数定义为:
void ReadFloat(LPCTSTR Node, LPCTSTR Tagname, LPCTSTR Field, float * FValue)
其中Node为iFix节点名,Tagname为要读取的标签名,Field为所读取的域名,FValue为当前值。
3.2 保存数据的方法
VS中可以方便的利用标准的SQL语句对SQL Server进行操作。我们每秒需要插入300个数据,如果使用最普遍的Insert语句,效率将非常低。所以,需利用SQL Server 2008的表值参数方法,高效的将数据插入数据库中。表值参数提供一种将客户端应用程序中的多行数据封送到 SQL Server 的简单方式。经测试,利用表值参数的方法批量保存输入,一次插入300个数据只需要100ms,满足用户需求。
3.2.1 定义表型
首先,表值参数以使用CREATE TYPE 语句定义的强类型表结构为基础。 必须先在 SQL Server 中创建一个表类型并定义结构,才能在应用程序中使用表值参数。打开数据库管理器,输入如下语句并执行,便可以建立一个表结构了。
CREATE TYPE TableType AS TABLE (DataID VARCHAR(50), Item VARCHAR(MAX));
3.2.2 在VS中插入数据
表值参数必须要先安装.NET 3.5框架,并确保应用程序中已经引用了 ent命名空间。创建表值参数时需要用到一些新的SQL数据类型(如DataTable、DataColumn等)。
首先创建一个本地数据表,确保DataTable中创建符合用户定义的表型的列计数和数据类型。
以下为写入数据到表值参数中,并写入数据库的代码:
//写入数据到表值参数
DataTable dt = GetTableSchema();
DataRow r = ();
r[0] = ng();
r[1] = "";
for (int i = 0; i < ; i++)
{
r[1] = r[1] + (string)myAL[i] + "-" + ng((float)alTagValue[i + 1]) + ",";
}
(r);
TableToDB(dt); //插入DB
//将表类型写入数据库
public void TableToDB(DataTable dt)
{
string TSqlStatement = "insert into [HistData].[dbo].[" + ng() + " ](DataID,Item)" + " SELECT , FROM @NewBulkTvp AS nc";
SqlCommand cmd = new SqlCommand(TSqlStatement, conn);
SqlParameter catParam = hValue("@NewBulkTvp", dt);
ype = ured;
me = "p";
eNonQuery();
}
4 存储的优化
使用数据库来保存数据较为方便,但是如果需要分析数据或者转移数据的时候就必须写专门的代码来实现数据的导出。这时,如果使用结构化存储的方法将数据保存在文件中就显得更为方便。使用COM的结构化存储技术编写存储组件,将获得的实时数据用保存到独立文件数据库中,在数据存储时建立索引,同时使用内存中的现有的索引数据进行校验,在内存中构建存储结构数据,再由内存中的数据直接映射到文件数据库中,将大幅提高文件的写入数据和读取索引的速度,便于数据的读取和转移,减少软件安装复杂度。同时,在保存或读取数据时,通过合并排序、线程间同步技术来提高历史数据的效率和精确度。
5 总结
虽然优化前的程序,已完全满足当前用户需求,但是经过优化,可以提供更多更大量的数据处理能力,和高效简单的存储方法。利于以后程序的功能扩展。
参考文献
[1]Mike Server 2008从入门到精通[M].北京:清华大学出版社,2011-4-1
[2]GE 4.5电子书[EB/OL],2009.
作者简介
倪璘罡(1984-),男,江苏省太仓市人。现供职于上海交通大学。 研究方向为控制工程。
作者单位
上海交通大学 上海市 200240
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。