- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于iFix历史记录程序开发与优化
基于iFix历史记录程序开发与优化
iFix是全球使用最多的组态软件,提供了丰富的API编程接口,可以使得第三方程序使用这些接口通过编程访问iFix实时数据库中的数据,将获得的实时数据保存到关系型数据库中。为了方便数据的读取和转移,减少软件安装复杂度,还可以使用结构化存储的方法将数据保存到文件中。
【关键词】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框架,并确保应用程序中已经引用了 System.Data.SqlClient命名空间。创建表值参数时需要用到一些新的SQL数据类型(如DataTable、DataColumn等)。
首先创建一个本地数据表,确保DataTable中创建符合用户定义的表型的列计数和数据类型。
以下为写入数据到表值参数中,并写入数据库的代码:
//写入数据到表值参数
DataTable dt = GetTableSchema();
DataRow r = dt.NewRow();
r[0] = DataID.ToString();
r[1] = ;
for (int i = 0; i myAL.Count; i++)
{
r[1] = r[1] + (string)myAL[i] + - + Convert.ToString((float)alTagValue[i + 1]) + ,;
}
dt.Rows.Add(r);
TableToDB(dt); //插入DB
//将表类型写入数据库
public void TableToDB(DataTable dt)
{
string TSqlStatement = insert into [HistData].[dbo].[ + RcdDate.ToString() + ](DataID,Item) + SELECT nc.DataID ,nc.Item FROM @NewBulkTvp AS nc;
SqlCommand cmd = new SqlCommand(TSqlStatement, conn);
SqlParameter catPara
原创力文档


文档评论(0)