news 2026/4/16 14:40:02

wincc与Excel数据交互,全脚本实现,根据条件自动查询数据到wincc系统,适合winc...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
wincc与Excel数据交互,全脚本实现,根据条件自动查询数据到wincc系统,适合winc...

wincc与Excel数据交互,全脚本实现,根据条件自动查询数据到wincc系统,适合wincc实际运行时,需要根据实际需求条件从表格中查询数据,使用数据集方式,不用每次都加载Excel,提高数据查询的速度

最近在调试WinCC项目时遇到个需求:需要根据设备实时状态从两千多条Excel记录中快速抓取参数。试过常规的VBA交互方案,发现每次查询都要重新加载Excel,速度慢得能赶上老牛拉破车。折腾两天搞出了个全脚本的优化方案,实测查询速度从8秒缩短到0.3秒,这里把实现思路分享给大家。

先说痛点,传统方案是这样的:

Function QueryData(condition) Set excel = CreateObject("Excel.Application") Set workbook = excel.Workbooks.Open("D:\data.xlsx") '...循环查找数据...' workbook.Close excel.Quit End Function

每查一次数据都要开闭Excel对象,相当于每次都要把整本字典从头翻到尾。数据量小还行,遇到几千条记录直接卡成PPT。

改进方案用ADO+内存驻留,先把Excel数据吃到内存里:

Dim globalData '声明全局变量存数据 Sub InitData() connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\data.xlsx;Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'" Set conn = CreateObject("ADODB.Connection") conn.Open connStr Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM [Sheet1$]", conn globalData = rs.GetRows() '关键操作:二维数组存储数据' rs.Close conn.Close End Sub

这里GetRows方法直接把整个Excel表转成二维数组,实测加载2000行x20列数据约1.2秒。建议在工程启动时调用InitData,或者做个数据刷新按钮。

wincc与Excel数据交互,全脚本实现,根据条件自动查询数据到wincc系统,适合wincc实际运行时,需要根据实际需求条件从表格中查询数据,使用数据集方式,不用每次都加载Excel,提高数据查询的速度

查询函数改成内存操作:

Function FastQuery(deviceID) If Not IsArray(globalData) Then InitData '防呆设计 For row = 0 To UBound(globalData, 2) If globalData(0, row) = deviceID Then '假设设备ID在第一列 FastQuery = globalData(3, row) '返回第四列参数 Exit Function End If Next End Function

这里有个坑要注意:GetRows返回的数组是[列,行]结构,和常规认知相反。用UBound(globalData,2)获取总行数,取数时记得先列后行。

更高级的玩法可以用字典建立哈希索引,适合精确匹配:

Dim dict Sub BuildIndex() Set dict = CreateObject("Scripting.Dictionary") For row = 0 To UBound(globalData, 2) key = globalData(0, row) & "|" & globalData(1, row) '组合键 dict.Add key, row Next End Sub Function SuperQuery(line, device) indexKey = line & "|" & device If dict.Exists(indexKey) Then SuperQuery = globalData(5, dict(indexKey)) '取第六列参数 End If End Function

这种预先生成索引的方式,能把查询时间压缩到毫秒级。实测5000条数据下,传统方案8.7秒,数组遍历0.3秒,字典查询0.002秒,速度差异堪比高铁和共享单车。

最后在WinCC里挂接个查询按钮:

Sub Button_Click() currentID = SmartTags("DeviceID") '从PLC读取当前设备ID result = FastQuery(currentID) SmartTags("TargetValue") = result End Sub

几个优化建议:

  1. Excel文件用另存为"Excel 97-2003 工作簿"格式,兼容性更好
  2. 数据变化后记得重新InitData和BuildIndex
  3. 字段较多时建议用常量定义列号,比如Const COL_TEMP = 3
  4. 错误处理要加到位,特别是文件被占用时的异常捕获

这种方案在需要频繁调参的生产线场景特别好用,比如不同型号产品切换时,省去了人工查表的麻烦。曾有个项目用这种方法实现200+设备参数自动装载,比原计划的数据库方案节省了80%实施时间。

最后提醒:别在脚本里用Select *,明确指定需要的列能减少内存占用。就像搬家别把整个房子带走,只带必要的家具就好。

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

Unity游戏翻译革命:XUnity.AutoTranslator全面解析

Unity游戏翻译革命:XUnity.AutoTranslator全面解析 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在游戏全球化浪潮中,语言障碍成为众多开发者面临的共同挑战。XUnity.AutoTransl…

作者头像 李华
网站建设 2026/4/12 7:45:51

Qwen3-1.7B本地部署痛点解决:免配置镜像实战推荐

Qwen3-1.7B本地部署痛点解决:免配置镜像实战推荐 1. 背景与挑战:大模型本地部署的现实困境 随着大语言模型在实际业务中的广泛应用,越来越多开发者希望将高性能模型部署到本地环境,以实现数据隐私保护、低延迟响应和定制化功能扩…

作者头像 李华
网站建设 2026/4/14 1:12:44

恒压供水系统(1拖2)的PLC控制实现

恒压供水(1拖2) 功能:1.一托二(1台变频器带2台泵),2泵循环软启动工作。 2.带手动工频 3.带睡眠功能 4.变频器型号厂家不限制 硬件:西门子200smart,昆仑通态触摸屏 最近搞了一个恒压供水系统的项目,用的是西门子的S7-200 SMART PLC&#xff0c…

作者头像 李华
网站建设 2026/4/15 9:13:53

Qwen3-VL多轮图文对话:上下文保持能力部署实测

Qwen3-VL多轮图文对话:上下文保持能力部署实测 1. 背景与技术定位 随着多模态大模型在视觉理解、语言生成和跨模态推理方面的持续演进,Qwen3-VL 系列的发布标志着阿里通义千问在视觉-语言任务上的又一次重大突破。特别是 Qwen3-VL-2B-Instruct 模型&am…

作者头像 李华
网站建设 2026/4/10 16:41:27

HY-MT1.5-7B翻译模型实战|前端调用与vLLM部署全解析

HY-MT1.5-7B翻译模型实战|前端调用与vLLM部署全解析 在多语言内容需求日益增长的今天,高质量、低延迟的机器翻译能力已成为企业全球化服务的核心支撑。无论是跨境电商的商品本地化、跨国团队协作文档处理,还是面向少数民族地区的公共服务信息…

作者头像 李华
网站建设 2026/4/10 6:09:07

工业电机控制中的电子电路基础完整示例

工业电机控制中的电子电路基础:从理论到实战的完整构建在现代工厂的自动化产线中,一台数控机床启动时的平稳加速、一个机器人关节的精准定位,背后都离不开同一个核心——电机控制系统。而支撑这一切的,并非仅仅是算法或软件&#…

作者头像 李华