iFIX 技术文章:iFIX历史数据库

 iFIX历史趋势记录提供了生产过程数据的采集、存储和显示功能。数据从SCADA服务器(或者SCADA节点)采集到历史数据文件中,用户能使用面向对象的图表在Proficy iFIX工作台中查询或显示这些被记录下来的数据。通过对已经存档的历史数据(生产过程数据)的分析或追溯,即可以再现生产过程、又可以对生产过程中的能耗、效率或设备使用状况等多方面进行深度数据挖掘。

 iFIX历史数据记录的操作步骤如下:

  1. 定义所需采集数据的标签名(或者数据源), 并定义采集组存放这些标签;
  2. 定义每个采集组的参数(节点、采集速度、相位、控制标签、状态和标签);采集速度越快,则数据越准确,数据容量越大。iFIX定义的有效数据采集周期为:1s、2s、10s、20s、30s、1m、2m、10m、20m、30m(s:秒,m:分钟)。iFIX推荐的最小采集周期为10秒,默认值是30秒。
  3. 定义每个历史数据文件存储的时间长度(以小时为单位,如4小时、8小时、24 小时)。
  4. 在SCU中启动历史采集程序htc.exe,指定文件存放位置。运行iFIX,开始采集数据,并把数据保存在历史数据文件中。

计算历史数据需要占用的磁盘空间容量的公式如下:

文件占用字节数 = (3500×A) + ((8×B)×C)
  • A – 采集组的个数;
  • B – 每个采集组包含的平均采集点数;
  • C – 所有采集组将数据写入文件的次数(所有采集组每个标签点采集并写入文件的数据记录条数)

【例】以历史定义为 2 个采集组,采集速度为 1 分钟,使用 4 小时的文件格式。一个组包含 80 个标签名,而另一个包含 20 个。在此情况下,A、B 和 C 的值如下:

变量 数值 计算
A 2 2个采集组 / 文件
B 50 = (80+20) ÷ 2
C 480 60条(每分钟一条)/ 小时 × 4小时(4小时文件)×2(个采集组)= 480

将上表数值带入公式计算历史数据文件大小:

(3500 x 2) + ((8 x 50) x 480) = 199,000 bytes

 因此,此配置所生成的 4 小时历史数据文件大约 200K。

[注]:此公式假定数据值在每个扫描周期都超过记录死区,因此并不是精确的评估。根据数据库配置,结果可能有出入。

历史数据库ODBC表(FIX Dynamics Historical Data)结构如下:

字段 数据类型 字段长度 含义
NODE 文本 8 节点名称
TAG 文本 32 标签名称
FIELD 字段 19 字段名称
VALUE 单精度型 默认
DATETIME 日期/时间 默认 日期时间
MODE 文本 10 模式
STATUS 文本 20 状态 
ALARM 文本 40 警告
INTERVAL 文本 9 间隔

[注]每个节点生成一个以节点名称为数据表名称的数据表

 iFIX 历史数据库通过 ODBC 访问。为了实现 ODBC 连接和 SQL 查询,确认 SQL 查询语句里所查询的表名和在历史数据采集组中定义的节点名相同。使用 DSN 名称 FIX Dynamics Historical Data。

以下为使用 ADO 方式连接 ODBC 数据源的示例代码。

Private Sub QueryDatabase(strTag As String, strStartTime As String, strEndTime As String)
	Dim conn As Connection
	Dim rs As Recordset
	Dim strQuery As String
	strQuery = "SELECT * FROM THISNODE " + _
		   "WHERE TAG = '" + strTag + "' " + _
		   "AND INTERVAL = '1.0' " + _
		   "AND (DATETIME >={ts '" + strStartTime + "'} AND " + _
		   "DATETIME <={ts '" + strEndTime + "'})"
	If conn Is Nothing Then
		Set conn = New Adodb.Connection
		conn.ConnectionString = "DSN=FIX Dynamics Historical Data;UID=sa;PWD=;"
		conn.Open
	End If
	If rs Is Nothing Then
		Set rs = New Adodb.Recordset
	End If
	rs.Open strQuery, conn, adOpenForwardOnly, adLockReadOnly, adCmdText
	If rs.RecordCount > 0 Then
		'读取记录
		Do While (Not rs.BOF And Not rs.EOF)
			strTime =rs.Fields("DATETIME").Value & ""
			'下一条
			rs.MoveNext
		Loop
	End If
	rs.Close
	conn.Close
	Set conn = Nothing
	Set rs = Nothing
End Sub

 

标签: , , , ,
文章分类 iFIX技术文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*