组态软件的设备驱动是怎么实现的? 有做个这方面的大侠说说思路,有简单例子最好 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 组态程序,跟仪表plc通讯,不同的协议,在程序中加载,设置就可以了 那应该就是硬件抽象层了,屏蔽了不同硬件的通信协议一个简单的办法是定义一个抽象类,定义基本的行为,类似于start、stop、transform等接口,然后定义不同子类,实现不同的plc协议 一般组态软件不会直接驱动PLC硬件的,而是通过通讯线路(网络或者串口等)进行联系,在组态软件中包装好模块的通讯协议既可。 组态软件,一般通过抽象层(OPC)与硬件联系。 以下是我在网上搜索的资料,大家帮忙关于工控组态软件中设备驱动程序的思考在工控组态软件的开发过程中,如何将大量不同的外部设备接入到系统中,是一个非常重要也是非常麻烦的事情;在系统发布后,此项工作基本上就成了软件维护工作的同义词。将外部设备接入到系统的难度在于:1、 部设备厂家众多,种类繁杂,数据交换方式多种多样,处理方法各不相同。2、 外部设备必须与系统主程序分开,不能够每增加一个外部设备就得重新编译整个系统。3、 外部设备接入系统的方法和接口必须向用户公开,但又不能公开整个系统。4、 外部设备接入系统的方法必须简单,必须支持多种编程语言。归纳起来,外部设备与系统的数据交换方式有如下几种:1、 过RS232、RS485、RS422、MODEM等串行通讯设备进行通讯(如GE PLC)。2、 通过PCI、ISA等方式(如研华的812PG模拟量采集卡)。3、 现场总线网络(如Lonworks网络)。4、 以太网络。5、 USB接口。6、 DDE方式。7、 OPC方式。8、 窗口消息方式(如某些电力系统的五防接口)。9、 等等。现在流行的解决办法有如下几种:1、 一台数据处理前置机,前置机与系统主机之机通过系统内定标准的方式,方式公开,在前置机实现不同外部数据的标准化。2、 通过硬件的规约转换器实现(但仅用在诸如串行设备和现场总线等方面)。3、 为每一种外部设备编制通讯管理程序,将外部数据标准化并通过标准的网络通讯规约传入系统。4、 以C语言格式提供标准的DLL访问方式,在DLL中将外部数据标准化。5、 以COM方式编程,提供标准的访问接口。6、 提供OPC接口。本人在主持开发电力工控组态软件的过程中,选用的是第3种解决办法,即通过为每一种外部设备编制通讯管理程序,将外部数据标准化并通过标准的网络通讯规约传入系统。当时选用此方法的原因是:1、 单机与网络环境下的编程一致性。2、 编程简单,给用户提供基于Winsocket的标准规约,以及编程例子,用户只需按照规约要求向系统传送数据即可。3、 程序实现的语言无关,只要提供Winsocket编程即可。系统推出至今,效果良好,但在系统维护的过程中,也发现一些问题:1、 每一种外部设备的管理程序都是一个单独的执行程序,当外挂的外部设备种类比较多时,系统的任务栏比较杂乱。2、 在用户不熟悉系统时,会关闭某些外部设备管理程序,会误运行外部设备管理程序。4、 外部接口通讯管理程序的实现不够规范,用户的发挥余地太大,反而无所适从。5、 外部接口通讯管理程序的编程工作量相对较大,而且必须将相当部分的精力放在界面的编制上。由于种种原因,本人在软件的升级开发中,决定放弃这种方法,转而使用基于COM的编程方式,采用类似插件的方法来实现外部设备的接入,初步设想如下:1、 从理论上分析,采用OPC的方法也许最符合工控组态软件的发展方向。但是,工控组态软件的开发重点是为不同行业提供通用软件平台,并给用户更多的二次开发能力。本人主持开发的软件不完全是一个组态软件,它只是吸取了组态软件的思想,也决定解决组态软件的许多不足。因为本软件的应用领域是电力系统、水力系统,这两个行业的软件有许多可以归纳的特征。不必象组态软件那样一切从零开始。而OPC也只是组态软件的产生物,许多复杂的数据结构用它处理不太方便(不是不能处理)。2、 COM是现在软件的发展方向,DCOM和COM可以无缝地结合,使得软件不需修改即可在单机或网络环境下使用。采取统一接口的方式也为用户提供了固定、简单的编程模式。并可实现用户可选择的编程语言无关性。3、 在系统中对外部设备的定义如下:计算机一[本地]外部设备种类一外部设备一外部设备二外部设备三外部设备种类二外部设备一外部设备二外部设备三外部设备种类三外部设备一外部设备二外部设备三计算机二外部设备种类一外部设备一外部设备二外部设备三计算机三…… 提供一个针对每一种外部设备的标准访问接口(是每一种,也就是说每一种外部设备有多个外部设备),定义如下:属性Opened: 外部设备是否已打开函数Open: 启动外部设备的处理,该函数启动一个循环处理接收和发送的线程函数Close: 停止外部设备的处理函数WriteData: 向外部设备写入数据,在数据中包括了写入的地址(因为同一种外设有多个),参数是Variant数组。事件OnReadData: 当外部设备有数据时产生,并由主程序接收该数据,参数是Variant数组。采用事件而不是函数的原因是保证实时性。函数SetPara: 设置针对每一种外设的特殊参数设置,而通用设置在主程序中完成。函数SetDeviceNum: 设置每一种外设的数量。函数SetDevicePara: 设置针对每一个外设和特殊参数设置,而通用设置在主程序中完成。4、 主系统处理流程如下:外设编程时:为每一种外设编制程序,都实现上述的接口,外部设备程序以Active动态库(DLL)提供。配置系统时:从许多已编制的外设程序中选择所需的,配置参数(可能要调用SetPara、SetDeviceNum、SetDevcePara等函数),并形成外设信息文件(不是注册表,因为所有信息可能要复制到另外的计算机上重复使用)。系统启动时:从信息文件中读出需要打开的的外部设备动态库,调用Open函数。系统退出时:将每个已打开的外设通过Close关闭。系统运行时:当接收到系统需要向外设发送数据的消息时,查找对应的外设模块,调用WriteData。当接收到外设OnReadData消息时,处理外设数据。本人正在为此作前期准备工作,也尝试了一些实验,取得了一些经验,发现了一些问题,希望与各位交流:1、 在只知道某DLL的程序名时(没有独立的类库文件),如何在运行状态下(不是编译时)判断它是否是支持接口的动态库,是否支持本接口(名为IdeviceAccess)?2、 在只知道某DLL的程序名时,如何在运行状态下动态地建立它的对象接口,并访问它?3、 您对此问题有什么高见(不一定是这两个技术细节问题)? 不同的PLC有不同的协议,需对不同的协议编写相应的驱动,称之为OPC Server,驱动通过串口或以态网与PLC硬件通讯,从PLC中相应的地址取出数据到内存中,OPC Client通过COM接口与OPC Server建立连接,从OPC Server的内存中取出数据。接口支持可以通过QueryInterface进行查询 1,2 . LoadLibary , GetProcAddress,更好的是采用com技术,不过复杂度增加3.不用com直接采用配置文件方法,可以xml表示,最上层建立各种标准的xml标签, 定义好各种标准接口:对于不同设备建立不同的xml配置文件;每种第三方设备,提供一个传输层,完成标准调用到设备相关调用的转换;最上层用户针对标准接口编程,采用先查后用方式调用 请问各位大牛一个MFC GDI资源释放的问题 线程非返回暂停或摧毁。结果卡死机了 为什么加载DLL函数失败呢? 关于CStringArry和CMap的复制问题 使用boost中的问题:没办法编译lib 心里发毛了 关于DLL的相关问题 关于串口的一个问题,谢谢 提个OutLook2000中得到Event的问题,希望有知道的朋友来回答一下,万分感谢! 请教关于程序外壳变换的原理 将套接字保存到数组中为何无效? 求一款可以控制指定进程占用CPU使用率的软件,通过让指定进程休眠/阻塞的办法实现吗? 出售几本书(C++编程思想, C++Primer中文第4版, Windows程序设计) --北京
在工控组态软件的开发过程中,如何将大量不同的外部设备接入到系统中,是一个非常重要也是非常麻烦的事情;在系统发布后,此项工作基本上就成了软件维护工作的同义词。
将外部设备接入到系统的难度在于:
1、 部设备厂家众多,种类繁杂,数据交换方式多种多样,处理方法各不相同。
2、 外部设备必须与系统主程序分开,不能够每增加一个外部设备就得重新编译整个系统。
3、 外部设备接入系统的方法和接口必须向用户公开,但又不能公开整个系统。
4、 外部设备接入系统的方法必须简单,必须支持多种编程语言。
归纳起来,外部设备与系统的数据交换方式有如下几种:
1、 过RS232、RS485、RS422、MODEM等串行通讯设备进行通讯(如GE PLC)。
2、 通过PCI、ISA等方式(如研华的812PG模拟量采集卡)。
3、 现场总线网络(如Lonworks网络)。
4、 以太网络。
5、 USB接口。
6、 DDE方式。
7、 OPC方式。
8、 窗口消息方式(如某些电力系统的五防接口)。
9、 等等。
现在流行的解决办法有如下几种:
1、 一台数据处理前置机,前置机与系统主机之机通过系统内定标准的方式,方式公开,在前置机实现不同外部数据的标准化。
2、 通过硬件的规约转换器实现(但仅用在诸如串行设备和现场总线等方面)。
3、 为每一种外部设备编制通讯管理程序,将外部数据标准化并通过标准的网络通讯规约传入系统。
4、 以C语言格式提供标准的DLL访问方式,在DLL中将外部数据标准化。
5、 以COM方式编程,提供标准的访问接口。
6、 提供OPC接口。
本人在主持开发电力工控组态软件的过程中,选用的是第3种解决办法,即通过为每一种外部设备编制通讯管理程序,将外部数据标准化并通过标准的网络通讯规约传入系统。当时选用此方法的原因是:
1、 单机与网络环境下的编程一致性。
2、 编程简单,给用户提供基于Winsocket的标准规约,以及编程例子,用户只需按照规约要求向系统传送数据即可。
3、 程序实现的语言无关,只要提供Winsocket编程即可。
系统推出至今,效果良好,但在系统维护的过程中,也发现一些问题:
1、 每一种外部设备的管理程序都是一个单独的执行程序,当外挂的外部设备种类比较多时,系统的任务栏比较杂乱。
2、 在用户不熟悉系统时,会关闭某些外部设备管理程序,会误运行外部设备管理程序。
4、 外部接口通讯管理程序的实现不够规范,用户的发挥余地太大,反而无所适从。
5、 外部接口通讯管理程序的编程工作量相对较大,而且必须将相当部分的精力放在界面的编制上。
由于种种原因,本人在软件的升级开发中,决定放弃这种方法,转而使用基于COM的编程方式,采用类似插件的方法来实现外部设备的接入,初步设想如下:
1、 从理论上分析,采用OPC的方法也许最符合工控组态软件的发展方向。但是,工控组态软件的开发重点是为不同行业提供通用软件平台,并给用户更多的二次开发能力。本人主持开发的软件不完全是一个组态软件,它只是吸取了组态软件的思想,也决定解决组态软件的许多不足。因为本软件的应用领域是电力系统、水力系统,这两个行业的软件有许多可以归纳的特征。不必象组态软件那样一切从零开始。而OPC也只是组态软件的产生物,许多复杂的数据结构用它处理不太方便(不是不能处理)。
2、 COM是现在软件的发展方向,DCOM和COM可以无缝地结合,使得软件不需修改即可在单机或网络环境下使用。采取统一接口的方式也为用户提供了固定、简单的编程模式。并可实现用户可选择的编程语言无关性。
3、 在系统中对外部设备的定义如下:
计算机一[本地]
外部设备种类一
外部设备一
外部设备二
外部设备三
外部设备种类二
外部设备一
外部设备二
外部设备三
外部设备种类三
外部设备一
外部设备二
外部设备三
计算机二
外部设备种类一
外部设备一
外部设备二
外部设备三
计算机三
……
提供一个针对每一种外部设备的标准访问接口(是每一种,也就是说每一种外部设备有多个外部设备),定义如下:
属性Opened: 外部设备是否已打开
函数Open: 启动外部设备的处理,该函数启动一个循环处理接收和发送的线程
函数Close: 停止外部设备的处理
函数WriteData: 向外部设备写入数据,在数据中包括了写入的地址(因为同一种外设有多个),参数是Variant数组。
事件OnReadData: 当外部设备有数据时产生,并由主程序接收该数据,参数是Variant数组。采用事件而不是函数的原因是保证实时性。
函数SetPara: 设置针对每一种外设的特殊参数设置,而通用设置在主程序中完成。
函数SetDeviceNum: 设置每一种外设的数量。
函数SetDevicePara: 设置针对每一个外设和特殊参数设置,而通用设置在主程序中完成。
4、 主系统处理流程如下:
外设编程时:
为每一种外设编制程序,都实现上述的接口,外部设备程序以Active动态库(DLL)提供。
配置系统时:
从许多已编制的外设程序中选择所需的,配置参数(可能要调用SetPara、SetDeviceNum、SetDevcePara等函数),并形成外设信息文件(不是注册表,因为所有信息可能要复制到另外的计算机上重复使用)。
系统启动时:
从信息文件中读出需要打开的的外部设备动态库,调用Open函数。
系统退出时:
将每个已打开的外设通过Close关闭。
系统运行时:
当接收到系统需要向外设发送数据的消息时,查找对应的外设模块,调用WriteData。当接收到外设OnReadData消息时,处理外设数据。
本人正在为此作前期准备工作,也尝试了一些实验,取得了一些经验,发现了一些问题,希望与各位交流:
1、 在只知道某DLL的程序名时(没有独立的类库文件),如何在运行状态下(不是编译时)判断它是否是支持接口的动态库,是否支持本接口(名为IdeviceAccess)?
2、 在只知道某DLL的程序名时,如何在运行状态下动态地建立它的对象接口,并访问它?
3、 您对此问题有什么高见(不一定是这两个技术细节问题)?
接口支持可以通过QueryInterface进行查询