基于Windows平台设备驱动模块的开发

2011-07-25 06:49冯克平上海工程技术大学资产管理及保障处上海201260
计算机工程与设计 2011年9期
关键词:板卡组态串口

冯克平(上海工程技术大学资产管理及保障处,上海201260)

0 引 言

计算机在工业领域的广泛应用以及工业自动化程度的迅速提高,人们对工业自动化的要求也越来越高,表现在种类繁多的控制设备和过程监控装置在工业领域的广泛应用,使得传统的工业软件已无法满足用户的各种需求。在开发传统的工业软件时,工控领域的工程师需通过手工或委托第三方编写人机接口应用软件,开发周期长,效率低,可靠性差;或者购买专用的工控系统,通常是封闭的、功能专一的很难与外界进行数据交互,升级和增加功能都受到严重的限制。工业实时监控组态软件的出现,为根本改变这一状况提供了可能[1]。

工业实时监控组态软件是从分布式监控系统(distributed control system,DCS)发展而来。它不仅保留了DCS所具有的大规模数据采集处理功能、数据通讯及信息管理和操作显示功能,而且有其独特的优点:实时多任务、接口开放、使用灵活、功能多样、运行可靠和可扩充性。工业实时监控组态软件,顾名思义它是以灵活多样的组态方式而不是编程方式为用户提供良好的开发界面和简捷的使用方法,其预设的各种软件模块可以非常容易地实现和完成监控层的各项功能[2]。

评价一个工业实时监控组态软件的优劣,首先要看它支持I/O设备的种类是否丰富,以及在组态了多种I/O设备下的目标应用程序的运行速度,然后还要看它是否便于功能扩展及版本升级。所以,如何开发一个具有支持丰富的I/O设备并有很好的数据通讯的实时性,这在开发工业实时监控组态软件中占据了重要的地位。

本文以从事开发工业实时监控组态软件和设备驱动模块的经验,分析当今各种主流工控设备和标准通信协议,探讨如何在Windows平台上构建一个适用于各种I/O通讯方式的设备驱动模块开发平台,从设计思路到应用实例,提出了开发设备驱动模块的框架结构及其关键部分的过程实现。

1 Windows平台下监控组态软件综述

在Windows平台上开发的工业实时监控组态软件系统,要充分发挥Windows所具有的实时多任务特性,一般将数据读写、数据显示打印等分成若干个任务线程来完成。主要模块有:系统任务管理、数据采集、画面显示、报表打印、系统组态、设备驱动模块等[1]。通常工业实时监控组态软件系统是由组态子系统和运行子系统两大部分构成的[2]:

(1)组态子系统自动化工程设计师为实施其控制方案,常在组态子系统支持下进行应用程序的系统生成工作。通过建立一系列用户数据文件(如:设备配置文件IO.ini,图形目标文件Monitor.ini),供运行子系统运行时使用。组态子系统可由若干个组态程序模块组成,如设备驱动组态模块、数据采集组态模块、图形显示组态模块、实时数据库组态模块等。

(2)运行子系统在系统运行环境下,目标应用程序被载入计算机内存并投入实时运行。系统任务管理模块会根据已组态好的用户数据文件以多线程方式启动各个运行模块,完成采集和监控现场设备的数据,将现场工程运行状况以图形或报表的方式显示出来。运行子系统由画面显示模块、数据采集模块、设备驱动模块等组成。

本文的分析主要涉及“数据采集模块”和“设备驱动模块”。

1.1 动态链接库技术

作为Windows系统中一种重要的模块化方法,动态链接库(DLL)技术是一种在Windows平台下代码可重用的技术。本文设计的设备驱动模块开发平台就是采用Windows的动态链接库技术,即每个设备的驱动模块都以DLL形式提供的。

在数据采集模块中,因采用了动态链接库技术,所以可以针对不同的设备、不同的通讯协议和实际需求,调用对应的设备驱动模块DLL。即用hLibrary=LoadLibrary(设备驱动模块文件名)方式动态装载驱动模块,然后用lpDriverProc=GetProcAddress(hLibrary,"Driver")记住DLL的地址,当需要访问该设备的时候调用该DLL中的函数,这样可大大提高系统的可靠性,满足不同情况的要求,同时也可以提高程序开发的效率。

1.2 硬件通讯接口分析归类

工业实时监控组态软件中通讯接口的一大特点就是面向种类繁多的硬件设备,有通过插在PCI、ISA插槽的板卡形式与计算机连接,有通过串行口以RS232/485的方式和上位机通信,有通过网络通讯方式与工业实时监控组态软件连接,仔细分析各自的特点并找出它们的共性,对开发通用的设备驱动模块是非常有价值的,如图1所示。

(1)独立板卡类通讯

独立板卡类包括模数(A/D)转换板、数模(D/A)转换板、开关量(DI/DO)输入输出板及通信板卡等。它们直接插入计算机的总线槽里,通过ISA或PCI总线扩展槽与计算机进行数据通信。每块板都有一个基地址范围,计算机通过访问该基地址即可达到输入输出数据。

在Windows平台下,生产板卡类的厂家一般会提供以下4种主要的WindowsAPI函数:

板卡初始化:Open()、Start();

功能设置查询:SetRange()、SetGain()、GetRange()、GetGain()、IsDataReady()、Status();

数据 IO:In()、Out()、DI()、DO();

暂停、关闭:Stop()、Close()。

(2)串口类通讯

各种智能仪表和智能模块设备通常是通过串口 (通常叫COM口)与计算机连接通讯,或者说通过计算机的串口,采用该设备的通信协议与之通讯。但在Windows平台下,无论是哪种通信协议,其通讯操作就如同对文件操作一样,串行设备的打开和关闭操作与文件的打开和关闭使用的函数完全相同。几个重要的WinAPI函数说明如下:

打开关闭串口通讯资源函数——CreateFile和CloseHandle;

配置串口通讯资源函数——BuildCommDCB和SetComm-State;

读写串口数据函数——ReadFile和WriteFile;

设置通讯事件函数——WriteCommEvent。

(3)网络类通讯

网络通讯可以采用TCP(transfercontrolprotocol)或者UDP(userdatagramprotocol)两种方式,一般在工控软件中考虑到数据的可靠传输,多数是采用TCP面向连接的通讯协议。

Windows平台提供了方便的网络应用开发接口——Socket,用户所开发的应用程序可以通过网络与其它Socket应用程序通信。使用Socket开发应用程序主要包括以下几个基本步骤:创建并配置Socket、建立Socket连接、通过Socket进行数据的发送和接收、关闭Socket。

2 数据采集模块及设备驱动模块设计

根据以上分析可以看出,无论那种通讯方式都存在设备初始化、数据的读写、关闭通讯口3个基本步骤,而其它操作(如:功能设置查询、配置通讯资源等)或归类在设备初始化阶段或用设备配置文件(如:IO.ini)详细描述。

图1 3类硬件通讯接口数据读写流程比较

2.1 设备驱动模块

(1)函数接口

用动态链接库(DLL)技术设计设备驱动模块,定义入口函数为Driver(WORDFunc,DWORDlpParam),其中Func是标志,lpParam是根据Func不同值由采集模块调用时给出的参数指针,根据上节分析,对3类通讯方式定义一种较为统一的数据结构,其描述见表1。

当数据采集模块依次调用 Driver(DRV_INITIAL,lpParam)、Driver(DEV_INITIAL,lpParam)、Driver(GRP_INITIAL,lpParam)、Driver(GRP_READ,lpParam)、Driver(DEV_INITEND,lpParam)、Driver(DRV_INITEND,lpParam),就可以完成设备初始化、数据的读、关闭通讯口的3个基本步骤。而对1.2中归纳的3类硬件通讯接口,其调用Driver时的接口参数略有不同。

独立板卡类通讯如表2所示,串口类通讯如表3所示,网络类通讯如表4所示,可以看出,对于不同类型的硬件通讯接口只需定义各自的设备驱动模块列表(DRVPARAPTR)和部分设备列表(DEVPARAPTR)而无需改动其它部分,即可完成数据采集模块和设备驱动模块间的接口定义,大大地减少了设备驱动模块开发的工作量,缩短了软件的开发周期,也能够确保设备驱动模块的稳定性。

表1 通讯方式入口参数定义描述

表2 独立板卡类DLL函数接口的参数定义

表3 串口类DLL函数接口的参数定义

表4 网络类DLL函数接口的参数定义

图2 数据读写流程

(2)内部数据结构

内部数据结构是服务于设备驱动模块内程序处理流程中所必需的数据结构,所以通用于不同类型的硬件通讯接口。考虑到多任务及Windows所特有的消息传递特性,设备驱动模块的内部数据结构定义如下(简略):

typedef struct tagDATA{

HWND hWnd; //设备驱动模块内部的窗体句柄,用于通讯口的消息处理

HANDLE hMutex;//用于存放IO共享缓存的互斥

WORD *LinePtr;//存放IO共享缓存,结构为BUFF

WORD NumbersInLine;//动态记录IO共享数据区中有效个数

unsigned char ReadPosOfLine;

unsigned char WritePosOfLine;

}DATA;

typedef struct tagBUFF{

HWND MainWinhWnd;//调用模块窗口句柄,用于返回数据或设备通讯状态

WORD GroupID;

WORD*AnswerData;//数据采集模块的数据区指针

WORD *PostErrorCode;//保存通讯口的返回值

}BUFF;

其中,互斥量hMutex是针对多任务运行环境下,各设备驱动模块线程访问共享数据区(*LinePtr所指向)而设计的。变量 ReadPosOfLine、WritePosOfLine和 NumbersInLine,动态记录环形共享数据区中的有效数据个数以及存入取出的位置。*AnswerData中存放的是数据采集模块写入设备的原始数据或设备中读出的返回给数据采集模块的数据。

图2说明了数据采集模块对设备驱动模块的一次读写数据的流程,前提是设备驱动模块已被调用了设备初始化等操作。

2.2 数据采集模块

如前所述,数据采集模块启动后,用hLibrary=LoadLibrary(设备驱动模块文件名)方式动态装载设备驱动模块,并用lpDriverProc=GetProcAddress(hLibrary,"Driver")记住DLL的地址,然后分别调用Driver(DRV_INITIAL,lpParam)、Driver(DEV_INITIAL,lpParam)、Driver(GRP_INITIAL,lpParam)对设备作初始化操作,当需要读写数据的时候调用函数 Driver(GRP_READ,lpParam)或 Driver(GRP_WRITE,lpParam),在数据采集模块退出时调用Driver(GRP_INITEND,lpParam)、Driver(DEV_INITEND,lpParam)、Driver(DRV_INITEND,lpParam),关闭设备驱动模块结束通讯。

利用Windows的多任务工具,对不同的设备端口开设各自独立的线程进行监测,可以实现对所有硬件设备数据采集的并行处理。数据采集模块在装载设备驱动模块之前需要得到所有通讯设备的有关信息,如:地址范围、工程量上下限、报警范围、串口的波特率大小等等,一般是在组态子系统下由设备驱动组态模块和数据采集组态模块完成,并构成设备配置文件(如:IO.ini)。而在运行环境下,数据采集模块通过读入配置文件得到这些参数,在以后的 Driver()调用中作为参数lpParam传递给设备驱动模块。

3 调用函数的主要流程

本节以串口通讯类的设备驱动模块为例,简述各调用函数的主要流程,如图3~图6所示。

图3 设备驱动模块列表初始化及退出流程

图4 设备列表初始化及退出流程

图5 数据组表初始化及退出流程

图6 设备驱动模块内的窗体消息处理流程

4 应用分析

应用本文所述方案,在自行开发的“工业实时监控组态软件”中先后开发了支持以下一些主要设备的设备驱动模块:

独立板卡类通讯:CONTEC各类板卡、研华各类板卡;

串口类通讯:三菱PLC、欧姆龙PLC、西门子PLC、Sharp-PLC;

网络类通讯:三菱PLC。

从每个设备的开发周期看,设备数与时间成反比,举例来说,如果在同类通讯设备中开发第一个需两个人月数,那么开发第二个仅需一个人月数,甚至更少的时间。

根据不同的工业现场,在自行开发的“工业实时监控组态软件”中配置对应硬件接口的设备驱动模块构成应用系统,经用户现场组态运行,已成功应用在多项具体项目中:

国内:上海宝钢《高炉煤粉制粉装置的数据采集监控系统》、南京梅山炼铁厂《1#高炉温度、压力计算机监控系统》、浙江平湖熔剂厂《现场数据采集系统》等;

国外:东芝燃料电磁检测系统、日本洗车机喷漆系统、TOYOTA BODY设备检视生产管理系统等。

5 结束语

经实际开发并应用于工业现场,可以证明本文所给出的设计思路及设备驱动模块的框架结构具有以下特点:

(1)缩短开发周期:本文对硬件通讯操作的分析归类,对软件开发人员来说不仅可以节省对同类通讯设备的重复开发,更因分类清晰而便于系统的模块化开发,缩短开发周期。

(2)良好的开放性:按照本文的设计思路及框架结构所开发的工业实时监控软件系统,具有良好的开放性,它能与多种通讯协议互联,支持多种硬件设备,提供多种数据访问接口。

(3)易于调试、维护升级:共性设计并进行模块化开发,不仅有利于开发过程中的调试,而且对以后的系统维护和产品升级也带来了便利。

[1]胡松.关于工控组态软件的几个技术问题[J].科技风,2010(17):270-270.

[2]李贺斌.监控组态软件中设备驱动程序开发平台的研究与实现[D].秦皇岛:燕山大学,2006.

[3]张勇旭,李力雄,康盛.通用组态软件驱动程序的设计与开发[J].工业控制计算机,2009,22(9):1-6.

[4]马婧,马茜.基于数据采集卡和组态软件的PLC控制系统仿真[J].先进制造与管理,2008,27(7):29-31.

[5]万红进.通用过程监测软件的研究与开发[D].南京:南京理工大学,2007.

[6]孙立军,丁伟玲.浅析组态软件的发展趋势[J].机电产品开发与创新,2008,21(2):87-88.

[7]朱晓凤.基于SOCKET编程实现的组态软件与控制器的网络通讯[J].电子元器件应用,2010,12(5):41-47.

[8]中国工控网.组态软件对比分析[OL].http://a.gongkong.com/customer/gktx/imgpdf/ztrjdbfx.pdf.

[9]陈在平,彭登峰.基于Visual Studio.NET的OPC客户端的研究与实现[J].制造业自动化,2008,30(12):22-72.

[10]史颖.基于VC的OPC客户端软件研究与实现[D].乌鲁木齐:新疆大学,2007.

[11]高连生,盛柏林.动态链接库在组态软件中的应用[J].工业控制计算机,2010,23(6):21-22.

[12]王晓岚.基于VB6.0串口通信的气压测高系统数据采集实现[J].现代电子技术,2010,33(3):116-118.

[13]李光春,黄建国,王志刚.多线程技术在数据采集中的应用[J].电子元器件应用,2009,11(7):85-87.

[14]刘世德,王玉正,韩新强.Windows下实时数据采集的实现[J].机械制造与自动化,2010,39(3):133-134.

[15]李金波,陈庆文.数据采集服务器设计[J].自动化技术与应用,2010,29(5):39-43.

猜你喜欢
板卡组态串口
浅谈AB PLC串口跟RFID传感器的通讯应用
基于PLC及组态技术的恒温控制系统开发探讨
车载控制器CVRE板卡显红故障分析及处理
基于PLC和组态的智能电动拧紧系统
基于组态王软件和泓格PIO-D64 板卡的流水灯控制
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
一种基于光纤数据传输的多板卡软件程序烧写技术
串口技术的实物调试和虚拟仿真联合教学模式
铸造行业三维组态软件的应用