最近接手了一个工业监控系统的升级项目,甲方明确要求实现产线数据的自动化日报生成功能。经过技术评估,我发现直接使用Kingscada自带的HistData历史数据库就能完美满足需求,完全不需要引入第三方数据库。下面就以电机温度变量(MotorTemp)为例,详细介绍如何在Kingscada中实现日报表和趋势曲线的开发。
提示:虽然示例使用电机温度变量,但文中介绍的方法适用于Kingscada中任何需要记录的过程变量,包括压力、流量、转速等各类工业参数。
首先需要在开发环境中配置需要记录的过程变量。在Kingscada工程管理器中:
vb复制' 也可以通过脚本动态添加历史记录变量
Sub AddHistorianTag()
Historian.AddTag "MotorTemp", 60 ' 变量名, 记录间隔(秒)
End Sub
配置完成后,可以通过HistDataViewer工具实时查看记录的数据:

注意:如果查询不到数据,请检查历史数据服务是否启动,以及磁盘权限是否配置正确。
日报表的核心是通过SQL查询获取指定时间范围内的统计值:
sql复制SELECT
MIN(Value) AS 最低温度,
MAX(Value) AS 最高温度,
AVG(Value) AS 平均温度
FROM History
WHERE TagName='MotorTemp'
AND DateTime BETWEEN '2023-07-20 00:00:00' AND '2023-07-20 23:59:59'
关键点说明:
BETWEEN子句定义了查询的时间范围(一整天)实际应用中需要自动获取当天日期,而不是硬编码:
vb复制Function GetDailyReportSQL()
Dim today
today = FormatDateTime(Now, vbShortDate)
GetDailyReportSQL = "SELECT MIN(Value), MAX(Value), AVG(Value) " & _
"FROM History WHERE TagName='MotorTemp' " & _
"AND DateTime BETWEEN '" & today & " 00:00:00' " & _
"AND '" & today & " 23:59:59'"
End Function
查询结果可以直接绑定到表格控件,并通过条件格式增强可读性:
vb复制Sub SetConditionalFormatting()
With DataGrid1
.Columns("Value").FormatCondition.Type = 2 ' 单元格值
.Columns("Value").FormatCondition.Operator = 1 ' 大于
.Columns("Value").FormatCondition.Formula1 = "85"
.Columns("Value").FormatCondition.BackColor = RGB(255,200,200)
End With
End Sub
在Kingscada中实现趋势曲线非常简单:
vb复制Sub OnClick()
With HistorianTrend1
.AddPen "MotorTemp", RGB(255,0,0), 2 ' 变量名, 颜色, 线宽
.TimeRange = "24h" ' 显示24小时数据
.ValueAxis.AutoScale = True ' 自动缩放Y轴
End With
End Sub
当需要显示多条曲线时,需要注意性能问题:
vb复制Sub LoadSelectedCurves()
HistorianTrend1.ClearPens ' 清除所有曲线
For Each item In ComboBox1.Items
If item.Selected Then
HistorianTrend1.AddPen item.Value, GetRandomColor(), 1
End If
Next
HistorianTrend1.Refresh
End Sub
增强趋势曲线的实用性:
vb复制Sub SetupTrendInteraction()
With HistorianTrend1
.Cursor.Visible = True
.Cursor.Style = 2 ' 十字游标
.Toolbar.Visible = True ' 显示内置工具栏
End With
End Sub
数据记录中断
查询性能低下
时区不一致问题
vb复制' 磁盘空间监控脚本示例
Sub CheckDiskSpace()
Dim fso, drive, freeSpaceGB
Set fso = CreateObject("Scripting.FileSystemObject")
Set drive = fso.GetDrive("C:")
freeSpaceGB = drive.FreeSpace / (1024^3)
If freeSpaceGB < 5 Then ' 小于5GB时报警
Alarm.Add "DiskSpaceLow", "历史数据磁盘空间不足!", 2
End If
End Sub
建议实施的监控措施:
sql复制-- 数据归档脚本示例
-- 将3个月前的数据移动到归档表
INSERT INTO HistoryArchive
SELECT * FROM History
WHERE DateTime < DATEADD(month, -3, GETDATE())
-- 然后从主表删除
DELETE FROM History
WHERE DateTime < DATEADD(month, -3, GETDATE())
在实际项目中,可以进一步扩展此方案:
vb复制' 自动生成并发送日报表示例
Sub SendDailyReport()
GenerateReport ' 生成报表文件
SendEmail "dailyreport@company.com", "设备日报表", _
"附件为今日设备运行报告", "DailyReport.pdf"
End Sub
通过这个项目,我发现Kingscada内置的历史数据功能其实非常强大,完全能够满足大多数工业监控场景的需求。关键在于合理设计数据记录策略和优化查询方式。对于更复杂的分析需求,可以考虑定期将数据导出到专业分析工具进行处理,而不是试图在SCADA系统中实现所有功能。