首页 高级语言开发 正文

回复

组态王驱动的C#接口

高级语言开发 浏览:5943 回复:24 收藏

lyseed  2011-11-30 10:51

组态王驱动的C#接口
所有描述对组态王6.53,6.55适用
开发工具是 VS 2005


开发一个组态王驱动,需要三个步骤
1 按组态王定义的接口写一个COM
2 将写完的COM加入到组态王的DevLst_Default.dat文件
3 向系统注册COM


组态王的驱动原始接口是由C++定义的,我将C++的定义翻译成C#的定义.
并且提供一个项目模板,写一个组态王的驱动,变成非常容易的事情.
.NET非常好的封装了COM对象,开发一个COM就象开发一个普通的DLL一样简单,
使用这个C#接口,可以利用.NET的全部资源.

组态王的驱动,有二个问题.
一个是大量的使用指针来传递变量和结构,这些指针只能在本进程使用,
这样驱动就不能跨进程使用,更不能安装在不同的电脑,形成分布式服务.
调用这些驱动,更象调用一个本地DLL.
这到不影响什么,组态王一样可以很好的运行.
第二个问题比较严重,严重到什么程度呢?严重到妨碍组态王的顺利升级.
组态王的接口定义有一个结构,叫Packet,所有与主程序的数据交换都是靠这个结构完成的.
这个Packet结构里有一个成员变量叫CPtrList,这是一个类,出自MFC,组态王也是把MFC的源代码拷贝过来使用.
这就出现问题了,如何在C#里还原这个类?一个类大概包含成员变量和成员函数,现在叫方法.
在内存中还原一个类,必须要有基本一致或完全一致的内存布局,一个类的内存布局是由连接器和操作系统决定的.
也就是我们的开发工具,我尝试了一些方法,在C#中还原这个类,但是都不能成功,
使用内存搜索,直接找主程序传递过来的变量,这个到是可以变相的还原了这个类,
但不是一个规范的方法,只要操作系统改变,或者微软升级了什么文件,这个方法就可能出错.
我询问了其他C++程序员,讨论的结果是使用规范的方法,是没有办法在C#中还原这个类的.
最后,我只好用C++写了一个DLL来完整的还原这个类,还好,这个DLL是一劳永逸的,只要组态王不改变接口,
这个DLL就一直可以使用,在C#中调用这个DLL来完成还原CPtrList,得到变量,其他的事情还是完全在C#中处理.
我把这个DLL取名ProcessPacket.dll.

对于组态王,有一个潜在的问题,如果组态王的主程序,这个由亚控完成,使用的连接器,与另外一些人开发驱动的连接器不兼容,
驱动一样不能使用,到目前为止,微软的VC6.0,VC7.0,VC8.0都完全兼容,不知道以后会是什么样.
把驱动的开发,与第三方开发工具紧密结合在一起,不知道组态王是如何考虑这个问题的.


组态王的驱动开发完成后,还不能被使用,需要加入到组态王的DevLst_Default.dat文件中,才能被组态王使用.
我提供了另一个工具KingDriverManager.exe.
可以添加或删除驱动,可以引入或输出DES文件,也可以生成自注册的EXE文件,方便程序转移.

什么时候需要写一个驱动?凡是组态王主程序不方便完成的都可以由驱动完成,因为驱动可以利用.NET的全部资源.
驱动也就是一段代码,作用是与主程序交换数据.
具体来讲:
1 有一个新硬件时.
2 复杂计算,组态王的命令语言效率极低,复杂的计算可以放到驱动里用C#完成
3 精确测速,主要是使用脉冲测速,需要精确计时,组态王不能准确的完成
4 读写数据库,组态王的命令语言效率极低,利用C#,可以快速的处理数据库
5 显示特殊窗口,可以在驱动里显示任意窗口
6 生成一个B/S应用,可以利用驱动开发一个HTTP服务器,在其他地方用IE观察本地数据
7 与其它程序交换数据,比如你自己定义一个协议,而不是利用OPC交换数据.

不知道如何上传压缩包.

压缩包文件
1 一个完整的组态王驱动接口的C#项目源代码
2 开发模板的KingDriverInterface.zip文件,可以把这个KingDriverInterface.zip文件放到你的VS项目模板目录,
VS环境就可以直接生成全部需要的代码,都是完整的C#代码
3 一个模板安装SetupKingDriverInterface.vsi文件,如果你不知道VS模板目录,
直接双打击这个文件SetupKingDriverInterface.vsi,就安装了这个项目模板.
4 组态王驱动编辑器KingDriverManager.exe,用它可以添加你写的驱动
5 组态王接口的原始定义,这是亚控的文件

2442179599

我知道了