简介:组态王SDK开发包是面向工业自动化监控系统二次开发的专业工具包,适合具备VC++或VB基础、希望扩展或定制组态王功能的开发者。压缩包共66个文件,约3.64MB,包含API头文件(h)、源程序(cpp)、动态库(dll/lib)、可执行示例(exe)以及VC++与VB两套例程工程,并附有《SDKFor组态王使用手册》PDF,便于对照学习。资源还涵盖obj、res、pch等编译中间文件与工程配置文件,可帮助开发者理解完整开发流程。已有1272人浏览学习。通过这套SDK,开发者可以掌握事件驱动编程、数据通信、图形界面设计和实时数据处理等关键技能,快速构建符合实际项目需求的控制方案。 做工业自动化这一行的人,对组态王应该都不会陌生。从车间设备监控到厂级数据采集,组态王(KingView)在许多中小型SCADA项目里几乎是标配。但项目做深了以后,你一定会遇到一个相同的困境:标准功能永远不够用。比如现场需要一套独有的配方管理流程、要把实时数据用自定义格式推给后台系统、又或者需要在画面里塞进去一个独有的计算控件。常规的做法往往是绕路处理,折腾一圈最后还是卡在数据拉不出来、画面插不进去。这个时候,组态王SDK开发包就派上了用场。
这篇文章我会从实际工程项目出发,把组态王二次开发的几种主流路线、SDK开发包里到底有什么、以及我在真实项目里踩过的坑一次讲清楚。适合已经有点组态王基础、正准备碰二次开发的工程师参考,也适合刚接手二开项目的开发人员快速建立整体认知。我不会把网上一搜一大把的教程复制一遍,而是站在调试过现场的视角,给你理清"为什么这么干、到底怎么干、坑在哪里"。
1. 项目概述:组态王SDK开发包到底是干什么的
1.1 从"组态不够用"到SDK补位
先把这个概念说透。组态王本质上是一个运行在Windows环境下的组态软件,它的核心能力是把设备数据采集上来,再通过画面、报表、报警等方式呈现给操作员。但是组态软件再强大,也不可能覆盖所有行业的特殊需求,这时候就需要二次开发。
组态王SDK开发包,通俗点说,就是亚控科技开放出来的一组编程接口和工具集合。它包括动态链接库、头文件、示例工程、帮助文档等。二次开发人员通过这些接口,可以在外部程序中读取组态王的实时变量、下发命令、查询历史数据,也可以在组态王内部挂接自己的代码逻辑。它不是让你重新造一个组态王,而是让你在组态王这棵树上接一段自己专属的枝条。
我在实际项目中感受到的"二次开发需求",基本可以归成三类。
第一类是打通外部系统。组态王里的数据往往封闭在运行系统里,而客户的MES、ERP、自主开发的看板系统需要这些数据。SDK就是那扇门,让外部程序能够稳定地读到组态王的数据,或者把指令送进去。
第二类是扩展组态王的能力边界。比如组态王自带的历史报表不够灵活,你要做一个多维度的自定义分析模块;或者组态王的图形库满足不了特殊的工艺动画效果。这些都需要塞进自定义代码。
第三类是数据汇聚。工厂里有几十套组态王系统,各自独立运行,管理层想在一个统一平台上看到所有车间的情况。这时候就得通过SDK做数据汇总,而不是一套一套去翻现场的画面。
1.2 项目选型之前先想清楚
不过有一点要提醒新手:不是所有需求都需要动用SDK。组态王本身有命令语言脚本、SQL访问功能、OPC接口,很多"好像做不了"的需求其实用这些内置能力也能绕过去。我见过一个项目,现场非要用SDK去读写数据,结果现场工程师对开发完全没有概念,最后用组态王自带的SQL定时上报功能,两天就搞定了。
所以在立项之前,先把需求拆清楚:是数据实时性要求高(秒级以下),还是数据量大,还是界面交互特别复杂?实时数据交互走OPC或SDK外部接口比较合适;只做周期性上报,SQL就是最稳的方案;要做复杂业务逻辑,才考虑在脚本里挂DLL或者做ActiveX控件。这个判断直接决定你的开发周期,千万别一上来就闷头写代码。
2. 组态王二次开发的四条主流技术路线怎么选
2.1 外部程序调用DLL:命令语言的扩展边界
组态王的命令语言(数据改变命令语言、事件命令语言、应用程序命令语言)里支持调用外部的DLL函数。这算是组态王官方留的"后门",也是比较轻量的一种二开方式。
打个比方,组态王的命令语言像是一个简易工具箱,里面的工具数量有限。你要实现一个复杂的计算逻辑、或者调用某个硬件厂商的通信库,工具箱里没有这个工具,但你可以把自己做的DLL当成一个"新工具"塞进去,然后在命令语言里像调用内置函数一样调用它。
这条路线非常适合做算法嵌入。我在一个配料项目里,就把一个PID控制算法封装成DLL,然后在组态王的数据改变命令语言里实时调用,效果非常稳定,在线调整参数也方便。它的开发成本低,只要会写DLL,基本没有额外框架要学。
2.2 OPC与DDE:标准协议打通数据链路
如果不想碰组态王内部的杂乱接口,OPC是一条非常成熟的路。
组态王本身支持OPC,既可以作为OPC服务器对外提供实时数据,也可以作为OPC客户端去采集其他设备的OPC数据。这就意味着,你可以用任何支持OPC的第三方开发工具(C#、Python、LabVIEW都能找到现成的OPC客户端库)去连接组态王,把数据拉出来。
我实测过的做法是:组态王作为OPC服务器,C#程序用OpcAutomation或OPC UA客户端库去读取变量。整个过程不需要额外在组态王里装什么插件,只要在开发系统里把OPC服务器启动起来即可。
DDE要更老一些,现在用得越来越少,但在和旧系统对接的时候偶尔还会碰到。它就是Windows上一个进程间通信的老协议,组态王支持DDE服务,老牌组态软件基本都保留了这个能力。不过DDE的实时性差不少,遇到新项目我不太推荐。
2.3 SQL/ODBC方式:把数据库当交换机
组态王里有一个"SQL访问管理器",它可以定义SQL语句、绑定变量,然后通过ODBC把数据写入外部数据库(SQL Server、MySQL、Oracle都能接)。
这条路线看起来不是典型意义的"SDK二次开发",但我在实际项目里发现它是性价比最高的方案。你只需要在数据库中建立对应的表,然后在组态王里建好数据源、写好插入/更新语句,组态王就会在变量变化时自动执行SQL。外部系统只需要读数据库就可以了,完全不需要和组态王直接打交道。
这种方式的优点是松耦合。组态王挂了、重启了,数据库里的数据还在;外部系统什么时候去读都可以,不会因为时序问题丢数据。缺点是实时性相对受限,一般秒级或者分钟级的同步没问题,但要做到毫秒级的数据响应就做不到了。
2.4 ActiveX控件:画面级深度定制
如果你要做的不只是数据交互,而是要做一个全新的画面组件,比如自定义的趋势控件、三维管道图、特殊的报表组件,那就可以走ActiveX控件路线。
组态王的画面系统支持插入ActiveX控件,你可以用VB/C#/C++做一个标准的ActiveX或COM组件,放到组态王画面上,通过属性、方法、事件跟组态王交互。这种方式能和组态王的画面深度融合,看起来完全像一个原生的组态王功能。
这条路线的难点在于,ActiveX控件开发涉及COM的知识,调试起来也比普通程序麻烦。我建议非必要不要上来就搞控件,除非你的界面需求确实绕不开。
| 技术路线 | 数据实时性 | 开发成本 | 适用场景 | 主要坑点 |
|---|---|---|---|---|
| DLL调用 | 高(毫秒级) | 低 | 算法嵌入、设备协议接入 | 参数类型要对齐,DLL部署位置有限制 |
| OPC | 高(毫秒级到秒级) | 低到中 | 外部程序实时读写组态王变量 | 版本兼容、防火墙设置 |
| SQL/ODBC | 中(秒级为主) | 低 | 数据上报、历史数据存储 | 需保证ODBC数据源配置正确 |
| ActiveX控件 | 高 | 高 | 深度定制画面组件 | COM调试复杂,工作量最大 |
3. 实操:手写DLL并在组态王命令语言中调用
3.1 准备工作与SDK清单
先把环境准备好。开发DLL本身不需要组态王SDK里额外的东西,因为最终是把DLL放到组态王机器上让它调用的,所以你需要的是本机的开发环境。我习惯用Visual Studio 2019,选"动态链接库(DLL)"模板,语言用C++,这样导出的函数对组态王命令语言比较友好。
在动手写之前,先确认几件事情:
- 确认组态王版本。不同版本的命令语言在调用DLL时的规则基本一致,但最好还是以你手上这套组态王自带的帮助文档为准。
- 确认目标机器的系统位数。组态王6.5x版本大多是32位程序,DLL也必须是32位的,否则加载会失败。这个坑我专门吃过一次亏,后面细说。
- 把组态王安装目录下的相关文档翻出来,重点看"外部函数调用"或"动态链接库"这一节,搞清楚命令语言对DLL函数的要求。
3.2 编写一个最简单的DLL导出自定义函数
我拿一个具体的例子来演示。假设现场需要根据两组模拟量输入计算一个综合效率值,这个过程涉及复杂的数学公式,想在命令语言里直接写会非常长,于是我用DLL封装。
在VS里新建一个C++ DLL项目,写这样的代码:
// EfficiencyFunc.h #pragma once #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) double CalcEfficiency(double inputA, double inputB); #ifdef __cplusplus } #endif// EfficiencyFunc.cpp #include "EfficiencyFunc.h" #include <math.h> __declspec(dllexport) double CalcEfficiency(double inputA, double inputB) { // 这里放实际的效率计算逻辑 // 下面只是示例公式 if (inputA <= 0.0 || inputB <= 0.0) { return 0.0; } double output = (inputA / inputB) * 100.0; // 限制范围,防止无效值写回组态王 if (output > 100.0) { output = 100.0; } else if (output < 0.0) { output = 0.0; } return output; }这里有一个非常关键的点:导出接口建议全部用extern "C"修饰。C++编译的时候有这个修饰符和没有,最终生成的函数符号名是完全不同的。组态王命令语言找函数的时候按的是普通的函数名,如果你不做这个处理,编译出来的DLL里函数名带了一堆乱码前缀(C++的name mangling规则),组态王根本认不出来。
编译完之后,你会得到一个EfficiencyFunc.dll文件。我通常在Debug下面,设置成Release模式再编译,因为发布到现场要用Release版本,Debug版本依赖调试运行库,在没装开发环境的机器上很容易出幺蛾子。
3.3 把DLL部署到组态王工程里
DLL生成好了之后,不是扔到哪个文件夹都能调用的。组态王加载外部DLL的方式,我能正常用的有两种:
第一种是放到组态王的安装目录下,最常见的就是C:\Program Files (x86)\KingView\这类目录。组态王运行系统启动时会在这个目录下找外部DLL。
第二种是放到Windows系统目录C:\Windows\System32(32位系统)或C:\Windows\SysWOW64(64位系统装32位DLL)。这种也行,但我不推荐往系统目录里塞业务DLL,容易污染系统环境。
正确做法是把DLL放到组态王安装目录下,然后在组态王开发系统里进行声明。找到组态王的"命令语言"编辑窗口,在对应位置声明要调用的外部函数。不同版本的操作界面有差异,大方向上就是在"函数声明"里面加上:
double CalcEfficiency(double inputA, double inputB);声明好之后,就可以在命令语言里像调用内置函数一样使用了。比如我在数据改变命令语言里写:
效率值 = CalcEfficiency(模拟量A, 模拟量B);这里的"效率值"和"模拟量A、模拟量B"都是组态王里预先定义好的变量。当模拟量A的数据发生改变时,命令语言就会被触发,执行DLL函数然后把结果写回到"效率值"变量里,画面上实时显示出来。
3.4 调试心得与参数类型对齐
调试DLL + 组态王的过程,比调试普通程序多一层"黑盒"感。组态王不会告诉你DLL里面出了什么错,它只会表现出变量不动、数据异常,或者干脆报一个加载失败。以下几条经验你记下来能少走很多弯路:
第一个是参数类型对齐。组态王命令语言里的数据类型包括FLOAT、LONG、STRING、BOOL等。对应的,DLL导出函数参数一定要用C/C++的基础类型。比如组态王的FLOAT对应C的float或double,LONG对应int或long,STRING大多数情况下你需要用char*来对应。我用double作为函数的入参和返回值,实测在组态王里用FLOAT类型变量对接没有太大问题,但如果你用的是float,赋值给组态王的FLOAT变量会更稳妥。建议以你手上的组态王版本帮助文档为准,先写一个小函数做类型验证,确认没问题再往里面填业务逻辑。
第二个是DLL的位数。这是个大坑。组态王6.5系列的运行系统是32位的,它加载外部DLL时也是按32位去找的。你辛辛苦苦用VS编译了一个64位的DLL,放到组态王目录下,运行的时候组态王连提示都不给,就是函数不可用。我当时排查了很久,最后在任务管理器里看了一眼进程位数才反应过来。解决办法很简单:VS里把解决方案平台改成x86,重新编译DLL。
第三个是DLL的依赖库。如果你的DLL调用了其他第三方库,那这些依赖库也必须一起部署到组态王的机器上,不然DLL加载的时候会失败。我遇过一个情况,同事用了一个数学库,结果部署时只带了主DLL,运行现场就是各种莫名其妙的现象,最后用Dependency Walker查了一下才发现缺少依赖项。
第四个是调用频率。命令语言里调用DLL函数时,一定要注意频率控制。比如数据改变命令语言,如果变量变化非常频繁,你的DLL就会被高频调用,如果DLL里有比较重的计算或者磁盘操作,可能会拖慢整个组态王运行系统。我一般会在DLL内部做缓存或限频处理,避免不必要的性能损耗。
4. 常见问题与排查技巧实录
4.1 故障排查速查表
实际操作中,我把最常见的故障整理成一个速查表,每个问题都是我或同事在项目里真实遇到过的。你可以先收藏起来,遇到问题直接对照排查。
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 组态王提示找不到DLL函数 | 导出函数没有加extern "C" | 重新编译DLL,用extern "C"修饰导出函数 |
| 函数能声明但调用时返回值异常 | 参数类型不匹配 | 核对组态王变量类型和C函数参数类型,先用简单函数验证 |
| 64位系统上DLL无法加载 | DLL是64位编译,组态王是32位 | 用x86平台重新编译DLL |
| DLL部署后组态王运行崩溃 | DLL依赖了缺失的第三方库 | 用Dependency等工具检查依赖,补齐文件 |
| 变量值不刷新 | 命令语言触发逻辑不对,或DLL内异常 | 在DLL里增加日志输出,确认每次调用是否执行 |
| 实时性变差 | DLL函数体太重或调用频率过高 | 优化DLL逻辑,做缓存或限频处理 |
4.2 一个真实排查案例
去年有个项目,现场反映组态王画面上的运算结果每隔几分钟就变成0,然后又自己恢复。这个现象非常典型,不会有人第一时间想到是DLL的问题,因为画面大部分时候是正常的。
我远程排查的时候,先怀疑是变量采集的问题,但发现输入变量数值一直是正常的。后来怀疑是命令语言触发的时序问题,但也没发现异常。最后我把DLL里面加了一个写日志的逻辑,把每次计算用的输入值和计算结果全部输出到本地文本文件,运行了一晚上。第二天一看日志傻眼了——输入值A在几次计算里确实是负数,而我的代码里对负数的处理是直接返回0,所以结果就变成了0。
这其实是我自己DLL里做的保护逻辑导致的,输入源偶尔会出现异常负值,而工艺上那个值负了确实是无效的。这个案例想说明的是,当你排查组态王二次开发问题时,不要只盯着组态王配置,也要从DLL内部逻辑找原因。打日志是我比较推荐的方式,别嫌丑,它能帮你省下大把排查时间。
4.3 二次开发的部署保护
最后说一个很多人不注意的点:DLL和组态王工程的备份与版本管理。二开项目交付之后,现场工程师很容易把组态王工程升级、重新安装,造成DLL丢失或者版本不匹配。我在交付项目中都会做两件事:一是在项目中写一个说明文档,标明DLL的版本、修改日期、依赖组件,二是在组态王工程的备份里把DLL文件一并放进去,并且固定放在约定的路径下。这样即使现场重装了系统,也能快速恢复。
还有一个建议:DLL内部变量尽量不要使用全局静态变量来保存业务状态,因为组态王运行系统可能会多次加载、释放DLL,全局状态容易变得不可预期。如果确实需要保存状态,建议通过组态王变量传参,把状态放在组态王侧,而不是放在DLL内部。
组态王二次开发这条路,说难也难,说简单也简单。难的是现场环境千奇百怪,你永远猜不到下一次会遇到什么问题;简单的是核心接口和思路就那么几板斧,走通一次之后,后面所有项目基本都能顺藤摸瓜。
以我个人经验来说,如果你刚接触组态王SDK开发包,不用急着把OPC、ActiveX、SQL全部啃下来,先抓住DLL这一条路线,用一个小功能完整走一遍"写代码-编DLL-部署-命令语言调用"的流程。等你对这条链路有感觉了,再横向扩展其他技术路线,会从容很多。工业现场的项目,稳定比花哨重要,DLL越简单、依赖越少、部署越轻量,后期维护就越省心。
本文还有配套的精品资源,点击获取