西门子6ES341-1AH01-0AE0
本文介绍了一种BOPP薄膜生产线的CC-bbbb现场总线集散控制系统,系统采用三菱Q02CPU PLC,直流传动采用590系列直流调速器,多种检测信号通过分布式I/O组件AJ65SBTB1-16D、FX2N-32CCL等,经由 CC-bbbb传送至PLC。文中简要介绍了BOPP薄膜生产过程及CC-bbbb结构特点,由于该生产线连续作业,设备分布较分散约80米,控制过程较为复杂,因此整个集散控制系统在功能上由4个相对独立的子系统组成,即速度链传动控制系统、温控系统、测厚系统及辅助控制系统。实际应用表明该系统简洁、可靠,实时性强,为今后进一步的应用提供了有力实证。
关键词: 现场总线;CC-bbbb;集散控制;BOPP;PLC;工控机;单片机
中图分类号 TP273,TP391 文献标识码:A
1 引言
BOPP是Biaxial Oriented PolyPropylene (双向拉伸聚丙烯)的缩写,BOPP薄膜具有拉伸强度大,透明度高,保鲜性好、光泽明亮、彩印鲜艳、外观装饰华贵等优点,而且还具有很高的机械强度和附着力以及极好的化学性和良好的化学稳定性(与名种酸、碱、盐不发生化学反应),耐水耐热,是一种塑料包装材料,广泛应用于香烟、服装、食品、印刷品等、也可做粘胶带基及电容器的电介质。
BOPP薄膜生产线工作原理是:根据薄膜生产工艺要求,将挤出机及机头的各节筒体分别加热到不同的工作点,按配方通过料斗不断地注入料粒;熔融状的物料由机头挤出后,经过冷却辊冷却,形成窄而厚的薄膜厚片;薄膜厚片经过储片架整理后,被送入纵向拉伸区,根据工艺要求由慢速辊和快速辊进行2.5~5.0倍的纵向拉伸处理;横向拉伸区用于实现薄膜的第二次拉伸,即横向拉伸,该区域涉及薄膜的横拉分区加热控制、同步传动控制、破膜检测及其处理等问题,是实现有效成膜的关键之一;薄膜经过双向拉伸(即纵拉和横拉)后,被送入后处理区域进行后续工艺的处理,再经过上卷辊整理,由两台收卷辊轮换进行恒张力收卷,终形成成品膜。
BOPP薄膜生产线全长约80米,如图1所示,其中主要包括1:挤出机及机头系统;2:冷辊装置;3:前扫描测厚装置;4:储片架;5:纵向拉伸区域;6:横向拉伸区域;7:横拉辊装置;8:后处理区域;9:后扫描测厚装置;10:上卷辊装置;11:收卷区域。
为了进一步提高控制系统的可靠性和自动化程度,便于系统功能的扩充,提出在原有生产设备的基础上采用CC-bbbb现场总线等技术对控制系统进行改造。建立起由PLC、分布式控制模块、工控机、单片机及智能仪表组成的集散控制系统,以实现对生产线的集散控制、工艺曲线的实时显示、关键参数的存储等,便于生产管理和提高产品质量。
2 集散控制系统结构设计
2.1 CC-bbbb开放式现场总线
CC-bbbb是Control & Communication bbbb(控制与通信链路系统)的简称,是三菱电机于1996年推出的开放式现场总线,其数据容量大,通信速度可多级选择,高达10Mbps。它是一个复合的、开放的、适应性强的网络系统,能够适应于较高的管理层网络到较低的传感器层网络的不同范围[1]。CC-bbbb是一个以设备层为主的网络,整个一层网络可由一个主站和六十四个从站组成。网络中的主站由PLC担当,从站可以是远程I/O模块、特殊功能模块、带有CPU和PLC本地站、人机界面、变频器及各种测量仪表、阀门等现场仪表设备。采用第三方厂商生产的网关还可以实现从CC-bbbb到ASI总线的连接。
CC-bbbb的底层通信协议遵循RS485,一般情况下,CC-bbbb主要采用广播轮询的方式进行通信,CC-bbbb也支持主站与本地站、智能设备站之间的瞬间通信[2]。具体方式为:主站将刷新数据RY/RWw发送到所有从站,与此同时轮询从站1;从站1对来自主站的轮询作出响应RX/RWr,并将该响应同时告知其它从站;然后主站轮询从站2(此时并不发送刷新数据),从站2给出响应,并将该响应告知其它从站;依次类推,不断循环,图2所示为广播轮询时的数据传输帧格式。除了广播轮询式的循环通讯方式外,CC-bbbb还提供主站、本地站及智能设备站之间的信息瞬时传送功能。信息从主站传递到从站,信息数据将以150字节为单位分割,并以150字节传递。若从从站传递到主站,每批信息数据大为34字节。瞬时传送需由专门指令来完成,但不会影响循环通讯的时间。
2.2 集散控制系统结构
考虑到BOPP薄膜的生产工艺特点及其复杂性等因素,本文设计并构造的集散控制系统结构如图3所示。在该CC-bbbb现场总线网上,Q02CPU是主站,QJ61BT11作为接口
模块。从站有两大类:一类是远程I/O站,由AJ65BTB2-16R和AJ65SBTB1-16D远程I/O模块组成,共8个模块,每个模块占用1个逻辑从站资源,主要用于实现对各直流调速电机的起停、切换、联锁、故障等控制和检测;另一类由FX2N-32CCL和A80BDE-J61BT13远程设备模块构成,共5个模块,考虑到所要传输的信息量较大,在这里每个模块被设计成占用4个逻辑从站资源,主要用于实现与FX2N-80MR PLC和工控机的连接[3]。因此,整个CC-bbbb网络由一个主站和28个逻辑从站构成。
该集散控制系统除了应用CC-bbbb网络外,还采用了其它通讯网络方式对系统各局部区域进行控制,如RS-422、RS-485等。
前部传动控制用FX2N-80MR PLC(从站9#~12#)通过FX2N-485BD板卡,采用RS-422网络对挤出机、冷辊电机、慢速辊电机、快速辊电机和横拉辊电机共5台直流电机进行控制与检测;后部传动控制用FX2N-80MR PLC(从站17#~20#)采用相同的RS-422方式对后处理电机、上卷辊电机、收卷1电机和收卷2电机共4台直流电机进行控制与检测,它们共同实现对速度链传动控制子系统的控制。此外,位于前操控台的FX2N-80MR PLC(从站13#~16#)和位于后操控台的FX2N-80MR PLC(从站21#~24#)分别通过其RS-422编程口与各自的单片机系统相连,用于实现调速电机的速度设定、速度显示、调速器内部状态监测等。
工控机IPC1(从站25#~28#)采用RS-485通讯网络,通过CD901智能仪表对整个温控子系统进行实时监测与控制,该温控子系统包括对挤出机、机头、纵向拉伸和横向拉伸共34个独立的加热区的温度控制。另外,位于后操控台的FX2N-80MR PLC(从站21#~24#)还通过FX2N-485BD板卡,采用RS-485通讯方式与张力控制器LE-40MTB相连,用于实现对薄膜左、右张力的检测与恒张力收卷控制。
工控机IPC1还有一个重要的任务就是控制并驱动前扫描测厚装置,检测并显示薄膜厚片的厚度,以及显示传动子系统、温控子系统的关键工艺参数情况,便于工艺技术人员及时调整相关参数,保证产品质量。工控机IPC2主要用于控制、驱动后扫描测厚装置,检测并显示成品膜的厚度,产品的终公差分布情况在这里得到充分的体现。IPC1与IPC2被置于同一个电控柜中,由于距离相隔很近,因此采用RS-232C通讯方式将它们连接起来,进行数据共享。这两台工控机共同构成了薄膜测厚子系统。
2.3 一个集散控制流程简例
图4所示是该集散控制系统对其中的后处理电机进行控制的过程,图中2、3、6、7、9表示CC-bbbb网络,1和8表示从站(21#~24#)通过其RS-422编程口与单片机进行数据交换,4和5表示从站(17#~20#)通过其485BD板卡与直流调速器进行RS-422数据通讯。
来自码盘的数值经1、2、3、4传输后,进入DC调速器6,作为后处理电机的速度设定值,该调速器与光码共同组成一个独立的转速闭环控制系统。另外,后处理电机的实际转速值经5、6、7、8传输后,转换为当前的薄膜生产线的线速度,由LED显示出来,供操作人员使用,同时该线速度还经由9被传输至IPC1,供工艺技术人员集中使用。
3 集散控制子系统设计
由于BOPP薄膜生产线的生产工艺复杂、生产设备及种类繁多、安装地点较为分散,因此该集散控制系统涉及多CPU类型(PLC、IPC、单片机)、多种通讯网络结构(CC-bbbb、RS-422、RS-485、RS-232C),它们共同组成一个有机的整体。本文设计的集散控制系统在控制功能上可以分为四类控制子系统:速度链传动控制系统、温控系统、测厚系统和辅助控制系统。
3.1 速度链传动控制系统
3.1.1 速度链传动
生产线的主传动系统由挤出机电机、冷辊电机、慢速辊电机、快速辊电机、横拉辊电机、后处理电机、上卷电机、收卷1电机和收卷2电机组成,它们分别由DC调速器1~调速器9来驱动,电机转速设定值由操控台上的码盘值间接给出。根据生产工艺的要求,除挤出机电机单独控制外,其余7台电机(注:收卷1和收卷2不同时使用)必须保持严格的同步速度,即要求按照特定的速度链进行增/减速,且本级电机的速度变化只能影响本级和后续各级,不允许改变前面各级电机的速度。
设码盘值M0~M6分别表示调速器2~调速器8的转速设定系数,N0~N6分别表示调速器2~调速器8的转速设定值的百分比。则速度链由下式表示:
其中Ki表示对应码盘值的基值常数。由式(1)易知,N0仅受自身码盘M0的控制,与其它码盘值无关。另外,当任一码盘值Mi改变时,它只影响自身和其后的设定值Ni~N6,而不影响其前面的设定值N0~Ni-1。
3.1.2 传动控制
主传动控制分为前部传动控制和后部传动控制两部分,它们独立构成自己的二级RS-422网络。前部传动控制由从站9#~12# PLC与调速器1~5组成,后部传动控制由从站17#~20# PLC与调速器6~9组成,其中,从站9#~12# PLC和从站17#~20# PLC既作为CC-bbbb网络的从站,又作为二级RS-422网络的主站。图5所示表示该二级网络的主站与单台调速器进行参数的读写通讯过程,与多台调速器进行读写控制时,是采用逐台通讯、轮换进行的,通讯波特率高为19200波特,实践表明完全满足系统的实时性要求。
图6所示表示快速辊在速度链传动控制过程中的转速控制方式。根据单机/联动选择开关可以实现快速辊的单个控制方式和速度链控制方式,图中的“码盘值”表示快速辊的速度可以由操控台上的码盘进行在线修改;“固定值1”表示穿片速度,此时快速辊与慢速辊的线速度相同;“固定值2”表示在薄膜生产过程中,若出现破膜信号,则快速辊及其后续主传动辊立即降至某一固定值,便于操作人员进行处理。
3.2 温控系统
温控系统主要由工控机、34套CD901温控仪、RS-232C/RS-485转换器、功率模块等组成。工控机对温控系统的温度设定及实时温度监测是采用RS-485通讯方式实现的,图7所示为温控系统的通讯控制过程。系统采用ASCII码传输模式,可以对设备地址、波特率、数据位和校验位等进行设定。本系统采用9600bps、1位起始位、8位数据位、无奇偶校验、1位停止位,ID地址范围为1~34。首先工控机发送EOT(04H)进行数据初始化,然后发送数据,表1表示工控机查询参数的数据格式。温控仪接收到数据后,便发出相应的响应数据,表2表示温控仪响应工控机查询过程的数据格式。表3表示工控机参数写入过程的数据格式,当温控仪接收到正确的参数写入命令后,则发出ACK(06H)响应信号;当接收到不正确的指令数据时,则发出NAK(15H)信号。其中Device address为温控仪的ID地址,STX(02H)表示开始控制字符,Identifier为操作符,DATA表示操作数据,ETX(03H)为数据结束字符,BCC为校验码(异或和)。
温度的设定与监测都要首先由工控机向温控仪发送数据,每批数据的发送均要占用一定的系统时间(约3ms)。由于CD901的通讯为应答式方式,因此不能只是不断地向温控仪发送数据,而应采取分时方式进行处理。为确保通讯过程的正常进行,用10ms的时间发送一帧数据,若通讯失败就重复发送,重复次数超过3次则认为通讯故障并报警。若发送成功,此时还不能立即发送第二帧数据,要等温控仪返回正确的通讯数据才可以继续发送新数据。工控机发送的数据指令含有ID地址,当数据发送成功后,只有符合指定ID地址的温控仪才会返回正确的应答数据,这样就可以根据工控机发送的ID号来鉴别是哪个温控仪返回的数据了。由于该RS-485通讯的波特率设置为9600bps,而温控系统惯性大,温度变化较慢,实际应用证明完全满足工程要求。
此外,考虑到温度设定过程的随机性特点,在本系统中建立了一个监控线程来专门监测设定温度值的变化情况,一旦设定值发生变化就将温度监测线程挂起,发送新的温度设定值,设定成功后继续恢复对实时温度值的监测。这样利用MFC自带的多线程功能,充分利用了bbbbbbs的多任务处理功能。多串口数据的接收也采用线程的方法,建立一个线程来监视串口是否有新的数据,一旦有新数据则将其保存,并继续监测串口。
3.3 测厚系统
BOPP薄膜测厚系统由两个独立部分组成,一个是前扫描测厚系统,用于测量薄膜厚片的厚度;另一个是后扫描测厚系统,用于测量成品膜的厚度。它们分别由IPC1和IPC2工控机进行测控,虽然它们地处生产线不同位置,且相对独立,但测量原理、基本功能及结构大致相似。均由V型扫描架、扫描驱动装置、控制器及扫描传感器等组成,在扫描架上装有自动/手动、扫描、退出、样品、参考等触点开关和方式、状态指示灯等,同时还配有电机用来驱动扫描传感器的往复运动等。
测厚系统软件采用VC编写,以充分利用其图形和对硬件接口的直接操作功能,软件系统分为系统管理模块和扫描工作模块两部分。系统管理模块主要用于系统参数的修改、显示测量曲线、复制图表、在线打印工作参数及控制扫描架工作状态等。扫描工作模块受系统管理模块控制,主要具有4种工作方式:扫描工作方式、退出扫描方式、参考工作方式和样品工作方式。图8所示为后扫描工作模块程序流程图。
扫描工作方式是4种工作方式的核心部分,用于完成对测量系统的控制、数据采集及后续处理等功能。退出扫描方式用于当出现破膜现象时,系统自动退出当前对薄膜的扫描测量过程,为进入其它工作方式作准备。参考工作方式用于检查传感器的稳定性,此时系统自动进行背景计数、空气计数和旗计数,并自动计算出旗空比,若旗空比为0.75,则表明传感器的工作是稳定的。样品工作方式用于进行样品试验,由于生产原料的差异性,会造成薄膜测厚的基准的变化,因此当改变原料时,通过对新样品的试验,获得对新基准的修正参数,校正测量值以提高测量的准确性。
3.4 辅助控制系统
辅助控制系统主要包括对储片架升降、换卷系统、罗茨风机、排风风机、跟紧辊、自动注油系统、恒张力收卷等的控制。图9所示是双收卷辊在自动换卷方式下的状态转移图[4]。
4 结束语
本文所述集散控制系统已于2002年11月成功应用于常州市绝缘材料总厂BOPP薄膜生产线上,至今生产线运行可靠,控制性能良好。实践还表明该系统可扩展性好,适应性强,明显缩短了系统的研制周期,节省了大量控制线缆。本系统的成功应用为今后进一步的类似使用提供了有力实证。
COM(Component bbbbbb Model)组件技术是构造二进制兼容软件的规范,通过它可以建立能够相互传输数据的组件,其服务器-客户机结构非常适合工控软件应用程序的开发。由于工控软件不仅包括PC机上的HMI(人-机界面)程序,还包括与各种基于ISA或PCI总线的数据采集卡进行数据交换的程序,这部分程序对开人员的硬件水平要求较高,而且开发难度较大,与HMI程序是相互独立的,所以可以把工控软件分成两部分,即把HMI程序作为客户机端程序,把与硬件进行数据交换的程序作为服务器端程序。基于这种思想,本文将服务器-客户机结构应用到现场总线控制系统的组态软件中,着重介绍客户机和服务器的功能及实现。首先介绍现场总线控制系统的组成。
1 系统组成
现场总线控制系统主要由PC机、ISA或PCI总线智能适配器、智能测控模块、组态软件、HMI软件、COM服务器、用户软件等构成。
现场总线系统中所有信息的传递都是双向的,COM服务器介于智能适配器和上位机软件之间,负责完成数据的传输。上位机软件相当于客户机端应用软件,它使用COM服务器提供的接口来操作适配器,对适配器进行初始化及向特定单元写入和读出数据。
由于在bbbbbbs保护模式下不能直接访问存储器,所以需要编写VxD驱动程序,将物理地址转换成线性地址,然后COM就可以象使用DLL一样调用VxD的函数,完成对ISA或PCI总线智能适配器的操作。
从测控模块到上位机软件自下而下的数据传输完成了用户对测控模块的监测;而上层软件通过COM将数据送往适配器,再由适配器送往测控模块,实现了用户对测控模块工作参数的设置及工作状态的管理。图1给出了系统软件结构框图。
2 组态软件的功能
现场总线控制系统组态软件是一套基于bbbbbbs 98和bbbbbbs 2000平台(或更高版本)、用于快速构造和生成上位机监控系统的组成软件,它提供了从数据采集到数据处理、远程控制、报警处理、报表输出等实际工程问题的完整解决方案。它使用COM服务器提供的接口与适配器进行数据交换,是COM客户机端的程序。
3 COM组件技术
组件是完成一定功能的软件块,可以被其它程序使用,而且容易替换。为了使每个人编写的组件具有可移植性,必须建立一个标准,保证其兼容性和可互换性。COM正是这样一种标准,遵循COM规则就可以建立能够相互交换数据的组件。
在现场总线控制系统中,COM组件服务器负责组态软件等上位机软件与智能适配器之间的数据传输,因为适配器通过CAN现场总线与测控模块连接,所以对适配器的操作就是对模块的监测与控制。
COM服务器提供的接口中有适配器初始化、模块检查、向模块发送数据及读取模块数据等函数。下面着重介绍数据发送接收模式及如何编写这4个有代表性的函数。
3.1 适配器初始化函数
只有适配器初始化成功后,才能进行其它操作。由于在bbbbbbs保护模式下不能直接访问适配器,COM程序需要调用VxD程序将存储对应的物理地址转换成线性地址指针lpBaseAddress,这样对适配器的操作就转换成对以该指针为首地址的数组的操作。向这个数组的0x3F0、0x3F1和0x3F8单元分别写入上闰机节点号以及适配器与模块间的通信波特率和适配器程序规定的命令字0xC6(表示适配器初始化),等待几十ms后,如果适配器接收到上面的数据并做出适当的反应,它会将0x3F8单元清零,这就表示初始化适配器成功;如果该单元不为零,则初始化失败。
3.2 数据传输格式
适配器初始化成功后,就可以同它交换数据了。下而简单说明一下发送数据和接收数据的格式。
适配器初始化得到的线性地址指针lpBaseAddress的1~5单元分别存放上位机节点号、模块节点号、保留字、发送或接收字节长度及模块操作的命令字。lpBaseAddress[6]~lpBaseAddress[256]存放所要发送的数据;从lpBaseAddress[0x106]单元开始存放接收到的数据,lpBaseAddress[0x3F8]存放操作适配器的命令字,适配器根据这个单元内容进行处理,如果是0xC6,则初始化适配器和模块上的CAN控制器;如果是0xC7,则将数组里的数送给模块上的E2PROM,模块收到数据后根据lpBaseAddress[5]的命令字进行相应处理;如果是0xB0,则按照接收到的数据配置模块工作状态;如果是0xA5,则将此时的测量值送到适配器上,由COM程序读出。
3.3 模块检查函数
适配器初始化成功后,还要检查适配器与下面的测控模块是否连接好,或者是否存在组态软件要组态的模块,也就是要进行模块检查操作。模块检查的命令字是0xAD,向数组的1~5单元分别写入上位机节点号、模块节点号、保留字、发送数据长度和模块检查命令字0xAD,向0x3F8单元写入0xC7(表示向适配器写入数据),等待几十ms后,如果0x3F8单元清零而且0x100单元被置为0xAA,表示该模块存在而且可以通信;否则,表明该模块不存在或者硬件上有问题。
3.4 写适配器数据函数
在确定了网络中存在哪些可通信的模块之后,就可以向它们发送数据并进行配置。为了实现向适配器发送数据,总共编写了4个函数、SendData([in]BYTE SendBuf[256])、SendFinish([in]BOOL bFinish)、FinishQuery([out]BOOL*bFinish)和ReceiveResult([out]BOOL *bSendFinish)。SendData负责把一个模块所需要发送的数据以数组的形式放到服务器的一个二维数组(Room[64][256])里,每个模块的数据作为一行。由于向适配器发送数据后,要等待一段时间判断模块是否接收成功,所以SendFinish中开启辅助线程来发送数据并等待结果,这相可不占用COM主程序的时间,使客户调用接口函数后能立即返回,执行其它操作。FinishQuery查询数据发送是否结束。ReceiveResult弹出一个非模式对话框,显示哪些模块接收到数据,哪些没有。
3.5 读适配器数据函数
除了向适配器发送数据,还可以从适配器上读取模块传上来的数据。读取数据的命令字是0xA5。实现该任务的函数是GetPV([in]BYTE bDesNode,[out]float value[8]),个参数是模块节点号,第二个参数是返回的测量值数组。
这里,COM是用ATL编写的本地服务器,COM对象的线程是套间线程。接口定义了6个函数,COM程序流程图如图2所示。
COM对象接口的函数声明以及适配器初始化的程序如下:
COM接口定义:
interface INCardWork :IDispatch
{
[id(1),helpbbbbbb("适配器初始化函数,返回值为是否成功")]
HRESULT NcardInit([in]BYTE
bSrcNode,[in]BYTE bIntrAdd,[in]BYTE bRate,[in]long bSegmantAdd,[out]BOOL *flag);
[id(2),helpbbbbbb("将客户端传送的数组赋值给Room[][]")]
HRESULT SendData[in]BYTE SendBuf[256]);
[id(3),helpbbbbbb("启动多线程")]
HRESULT SendFinish ([in]BOOL bFinish);
[id(4),helpbbbbbb("此函数返回值表示数据是否已向下位机发送完毕,同时可显示哪些模块未被配置,通常在此函数前先用FinishQuery([out]BOOL*bFinish)查询发送是否完毕")]
HRESULT ReceiveResult([out]BOOL *bSendFinish);
[id(5)],helpbbbbbb("此函数返回值表示数据是否已向下位机发送完毕,“真”表示发送完毕")]
HRESULT FinishQuery([out]BOOL *bFinish);
[id(6),helpbbbbbb("网络检查,用来在发送数据前检测是否有该节点存在")]
HRESULT NetCheck[in]BYTE sour,[in]BYTE des,[in]BYTE type,[out]BOOL *flag);
[id(7),helpbbbbbb("读取模块的测量值")]
HRESULT GetPV([iv]BYTE bDesNode,[out]float value[256]);
}
适配器初始化函数:
#include <conio.h>
#include "winioctl.h"
//包含其它头文件
……
STDbbbbbbIMP CNCardWork::NcardInit(BYTE bSrcNode,BYTE bIntrAdd,BYTE bRate,long bSegmentAdd,BOOL *flag)
{
NcardCtrl cardctrl; //NcardCtrl类的函数调用VxD函数
exbSrcNode=bSrcNode; //给上位机节点赋值
exbRate=bRate; //下位机与适配器的通信波特率
BOOL transfersign; //初始化是否成功标志
DWORD dwSegmentaddress=bSegmentAdd;//适配器段地址
HANDLE hDevice=NULL; //指向线性指针对句柄
LpBaseAddress=(PBYTE)cardctrl.MapLinearAddress(dwSegmentaddress,0x400,hDevice);
//调用VxD函数,获得指向ISA总线物理地址的线性地址指针
cardctrl,UnMapLinearAddress(lpBaseAddress,hDevice);
//关闭VxD
//调用适配器初始化函数
_outp(0x310,0x01); //打开邮箱锁
lpBaseAddress[0x3F0]=bSrcNodeNumber;//上位机节点号
lpBaseAddress[0x3F1]=bRate; //波特率
lpBaseAddress[0x3F8]=0xC6; //适配器初始化命令字
DrvDelay(20,false); //延时20ms
………… //初始化后其它操作
_outp(0x310,00); //关闭邮箱锁
return S_OK;
}
4 虚拟设备驱动程序
VxD是虚拟设备驱动程序(Virtual Device Driver)的缩写,中间的x表示某一设备。它能够无限制地访问所有硬件设备、自由地检测操作系统的数据结构(如描述符和页表)以及访问任何内存位置。
本文中,VxD将ISA总线对应的物理地址转换成段线性地址,供应用程序使用。VxD的开发工具是VtoolsD,转换时用的函数为MapPhysToLinear。以下是部分程序代码:
//定义结构体
typedef struct _MapDevRequest
{
PVOID mdr_PhysicalAddress;DWORD mdr_SizeInBytes;
PVOID mdr_LinearAddress;WORD mdr_Status;
}MAPDEVREQUEST,*PMAPDEVREQUEST;
#include<vtoolscp.h>
//包含其它头文件
…………
bbbbbS pDIOCbbbbbs
{
PMAPDEVREQUEST pRea; //自己定义的结构体
switch(pDIOCbbbbbs->dioc_IOCtlCode)
{
case DIOC_OPEN:
case DIOC_CLOSEHANDLE:break;
case MDR_SERVICE_MAP:
pReq=*(PMAPDEVREQUEST*)pDIOCbbbbbs->dioc_InBuf;
pReq->mdr_LinearAddress=MapPhysToLinear
(pReq->mdr_PhysicalAddress,pReq->mdr_SizeInBytes,0);
if(pReq->mdr_LinearAddress==NULL)
pReq->mdr_Status=MDR_STATUS_ERROR;
else
pReq->mdr_Status=MDR_STATUS_SUCCESS;
break;
case MDR_SERVICE_UNMAP:break;
default:
return ERROR_INVALID_FUNCTION;
}
return DEVIOCTL_NOERROR;
}
在现场总线控制系统中使用COM组件技术,不仅可以使数据传输部分的功能独立于客户端程序,减小开发难度,而且使其可以被任何支持二进制代码的程序如Excel电子表格等直接调用。当系统中采用服务器和客户端方式时,代码更加易于维护。即使要升级服务器端程序,只要接口不变,其客户端程序也完全不需要修改,大量后续工作被减轻。象服务器端一样,客店端也只需关心服务器的接口,而不必考虑其如何实现数据交换。也就是说,COM服务器或客户机中的一端功能发生改变,只要其接口保持不变,另一端不需修改就可以工作。本文所介绍的技术已在胜利油田某注水站等实际工程项目中得到成功的应用。