news 2026/4/23 12:35:24

kingscada链接外部数据库处理以及报表系统,案例涉及到数据记录插入数据库的脚本实现方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kingscada链接外部数据库处理以及报表系统,案例涉及到数据记录插入数据库的脚本实现方法

kingscada链接外部数据库处理以及报表系统,案例涉及到数据记录插入数据库的脚本实现方法,数据查询条件的选择脚本实现,数据的展示控件使用,系统中涉及的控件有:日期时间控件、多功能树型控件、listview控件、数据集函数的使用,系统配备mysql数据库,通过odbc与上位机链接

工业场景的数据管理总绕不开数据库和报表操作,最近用KingSCADA做污水厂监控系统时折腾了一把MySQL数据库对接。分享几个实战中特别实用的脚本片段,直接上干货。

环境搭建

先在控制机安装MySQL ODBC驱动(注意选8.0以上版本避免中文乱码),配置DSN时有个坑——必须勾选"允许大数据块截断",否则写入长文本日志时会报错。系统参数设置里得把连接超时改到30秒以上,毕竟工业现场网络波动常有的事。

数据入库

在报警触发按钮里塞入这段脚本:

LocalSQL = "INSERT INTO process_log (timestamp, device_id, value) VALUES(?,?,?)" result = SQLInsert(SQLID1, LocalSQL, DateTime.Now, "PLC_101", 56.78) If result <> 1 Then ErrorLog("入库失败:"+SQLGetError(SQLID1)) End If

SQLInsert的参数绑定方式比拼接SQL安全得多,特别是处理日期时间类型时能自动转换格式。注意数据库连接对象SQLID1需要在全局脚本里初始化,建议配合事务使用——批量插入200条以上数据时,显式调用SQLTransaction能提速3倍不止。

条件查询

kingscada链接外部数据库处理以及报表系统,案例涉及到数据记录插入数据库的脚本实现方法,数据查询条件的选择脚本实现,数据的展示控件使用,系统中涉及的控件有:日期时间控件、多功能树型控件、listview控件、数据集函数的使用,系统配备mysql数据库,通过odbc与上位机链接

日期范围查询配合树形控件搞层级筛选:

'树型控件节点点击事件 Sub OnSelChanged() Local startTime = GetDateStart(DateTimePicker1.Value) '自定义函数处理时分秒清零 Local endTime = GetDateEnd(DateTimePicker2.Value) Local zone = TreeCtrl.GetSelNodePath() //获取类似"厂区/车间/产线"的路径 sql = "SELECT * FROM production_data WHERE timestamp BETWEEN ? AND ?" If zone <> "" Then sql += " AND device_path LIKE '"+zone+"%'" End If SQLSelect(SQLID1, dataset1, sql, startTime, endTime) ListView1.BindDataSet(dataset1) End Sub

这里有个骚操作——用多功能树型控件的节点路径直接作为SQL查询条件,实现三级数据钻取。ListView的列宽建议用像素单位,百分比布局在数据过长时容易跑版。

数据展示

在ListView的绘制事件里加了个温度超标高亮:

Sub OnDrawItem(ItemIndex, hDC) Local temp = dataset1.GetItemValue(ItemIndex, "temperature") If temp > 90 Then SetTextColor(hDC, RGB(255,0,0)) Else SetTextColor(hDC, RGB(0,0,0)) End If End Sub

数据集函数GetItemValue比直接访问控件属性快得多,特别是在5000条以上数据时差异明显。遇到过个坑——日期字段需要显式转换:

Local recordTime = StrToTime(dataset1.GetItemString(0, "timestamp")) DateTimeCtrl.Value = recordTime

当MySQL存的是DateTime类型时,直接取出来是"YYYY-MM-DD HH:mm:ss"字符串格式,不做转换直接塞给日期控件会崩。

性能优化

在工程初始化脚本里预加载设备树:

SQLSelect(SQLID1, dataset_tree, "SELECT path_code, device_name FROM device_tree") TreeCtrl.Clear() While Not dataset_tree.IsEOF() Local nodes = Split(dataset_tree.GetItemString(0, "path_code"), "/") Local parent = "" For Each node In nodes If Not TreeCtrl.FindNode(parent+"/"+node) Then TreeCtrl.InsertNode(parent, node, dataset_tree.GetItemString(0, "device_name")) End If parent += "/"+node Next dataset_tree.Next() Wend

这种分级加载方式比递归查询快得多,实测万级节点能在2秒内完成渲染。注意MySQL的批量查询最好设置FetchSize为500,减少网络传输次数。

报表模块其实可以配合水晶报表直接读取数据集,但更骚的操作是用KingSCADA的画面窗口+HTML控件,直接ajax调接口生成ECharts图表,这样既能复用WEB报表又能避免ActiveX的各种兼容性问题。

这些脚本在多个现场跑了两年没出过大问题,核心就三点:参数化查询防注入、异常处理兜底、数据集操作代替直接控件操作。搞工业数据库别想着用ORM那些花活,老老实实写SQL反而最稳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:35:41

Apollo 6.0 CARSIM自动驾驶控制模块仿真及调试

apollocarsim自动驾驶控制模块仿真 windows联系独编译&#xff0c;和carsim联合仿真仿真调试 有编译和调试过程文档 基于windows平台&#xff0c;所有依赖的库有预编译好的包apollo6.0版本。最近在Windows上折腾Apollo6.0和CarSim联合仿真&#xff0c;差点没把键盘砸了。这玩意…

作者头像 李华
网站建设 2026/4/18 19:29:39

day155—回溯—组合(LeetCode-77)

题目描述给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1&#xff1a;输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#xff1a;输入&#xff1a;n 1, k 1 …

作者头像 李华
网站建设 2026/4/23 11:19:18

计算机小程序毕设实战-基于django+微信小程序的运动饮食健康生活系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华