计算机应用
COMPUTER APPLICATIONS
1999年 第19卷 第6期 Vol.19 No.6 1999



一个DCS组态软件的设计与实现
徐晓东　杨振坤
　　摘　要　Visual Basic和Visual C++是强大的可视化编程工具，本文结合它们各自的优点介绍如何设计和实现分布式控制系统的工程师站和操作员站软件。
　　关键词　Visual Basic，Visual C++，分布式控制系统，组态，软件
1　引言
　　分布式控制系统（集散控制系统）以其强大的控制功能、可靠的安全性能和良好的可移植性而在国内外工控领域获得广泛应用。本文结合作者与化工部化工机械研究院测控所合作完成的LH-2000分布式控制系统，对于其中的工程师站和操作员站软件设计作一介绍。
　　软件采用Visual Basic5.0 和Visual C++5.0混合编程，充分运用VB强大、高效的界面生成能力、Access数据库功能和VC++易于对内存、硬件操作的特点。同时由于VB、VC++都是微软的产品，它们相互之间的联接也很容易。
　　软件运行于WIN95环境下，程序设计采用面向对象的结构化编程思想，将系统软件划分为既有机联系而又相互独立的几部分。它们彼此之间或直接调用，或通过动态链接库连接。
2　系统软件体系结构
　　系统软件体系结构是针对系统硬件来划分的。LH-2000分布式控制系统硬件分为工程师站、操作员站和现场控制站。相应的系统软件是：工程师站软件、操作员站软件和现场控制站软件。其中工程师站、操作员站位于PC机上，而现场控制站是以196型单片机为处理器的智能板。现场控制站软件用单片机汇编语言编写，不是本文讨论范围。　　
　　PC系统软件包括必要的初始化采集程序、用于工程师站的组态程序以及操作员站上的运行程序。它们都是独立的可执行文件，相互间通过WIN95的共享内存通信。这样软件的开发可由多人协同并行完成，同时也增强了软件系统的可靠性并利于软件维护和升级。初始化过程要设置、启用PC机的相关硬件设备（包括扩展的智能插卡），初始化完成后就能定时接收现场控制站采集数据。系统组态需要针对不同的应用领域先离线进行，投入运行后也能根据现场控制情况在线组态。它是系统工程师级的，有操作权限制约，必须输入合法密码才能修改。运行部分提供良好的人机交互界面，通过它就能实现对整个现场的实时监控。对于具体的工程，PC系统软件执行的顺序如图1。

图1
3　系统PC软件设计
3.1　初始化采集程序的设计
　　初始化采集程序是工程项目投入运行后PC系统软件中最先被执行的。本系统采用CAN2.0(Control Area Network)总线。操作员站由PC机插入一块ISA总线智能光电隔离CAN控制卡组成。CAN智能卡和计算机之间采用DMA通信方式。所以初始化采集程序先要完成对CAN卡的驱动，使用VC提供的端口输入输出函数outp、inp即可发送对CAN卡的“握手”信息。为了实现DMA传输，要启动选定的DMA通道。这在WIN95下并不是轻易的事情，因为WIN95几乎接管了PC的全部硬件设备，如果仍象DOS下那样操作DMA势必引起死机。需要借助DDK、VToolsD等开发工具编写虚拟设备驱动程序(*.vxd)，在VC应用程序中通过CreateFile（）打开它，利用vxd回传地址读取DMA通道的数据。
　　初始化软件完成的另一工作是创建共享内存。用VC的WIN32函数CreateFileMapping、MapViewOfFile分别创建共享内存和获取读写共享内存的指针。在DLL中相应地用OpenFileMapping打开前面的共享内存映射文件句柄，同样通过MapViewOfFile获取读写共享内存的指针。这样就能在两个应用程序之间建立数据通道。共享内存是本系统的关键环节。只有利用共享内存才能实现VC程序和VB程序之间的数据传递。共享内存还能提供应用程序接口，这是灵活组态的关键。在共享内存中预留了变量数组以供组态时用，这些变量可以看作是不同应用程序间的“全局变量”，用户能够在VC5.0下利用预留变量编写自己的处理程序，然后编译连接成满足特定需要的EXE文件。
3.2　组态程序的设计
　　组态程序主要分为系统组态、数据库组态、回路组态、流程图组态、报表组态。
3.2.1　系统组态的设计
　　系统组态是针对整个控制系统的硬件结构进行组态，它是整个工程项目组态的第一步。本系统采用工业现场总线CAN2.0，各现场控制站和操作员站的基本配置信息即通过系统组态来设定。选择投入运行的现场控制站的类型、个数及各自的站号，确定操作员站站号，还可以设定安全保护，对操作员的操作权限和操作范围进行限定。最后将配置信息以VB中的*.mdb数据库文件保存并下装。
3.2.2　数据库组态的设计
　　数据库是分布式控制系统的信息来源。一个工程项目中所有需要监测和控制的点都在数据库组态中完成。根据点数据类型的不同，数据库组态分为模拟量输入，模拟量输出，开关量输入，开关量输出，计算量。其中计算量即初始化采集程序中提供的应用程序接口变量，从本质上讲也是模拟量。用户使用它组织自己的显示信息，但并不参与输入输出。
　　计算量的组态只要定义变量名称和指定在预留数组中的位置。各I/O型变量的组态项目有基本的共同点，如名称、报警、存盘和I/O地址，除此之外还要针对变量类型和监控的需要来设计组态项目，以较复杂的模拟量输入组态为例：
　　. 索引信息：记录号，工位号。
　　. 显示存储信息：点名称，工程单位，量程转换系数，记录类型。
　　. 报警信息：信号上下限，量程上下限（信号上下限对应的物理量），报警级别，报警上下限，报警上上、下下限。
　　. I/O信息： 站号，板号，通道号。
　　. 仪表类型：指测温型（如热电偶、热敏电阻），测流量型（如各种流量计），测压力型等检测元件的不同型号。因为对不同类型的传感器其测量数据的处理方法有别。
3.2.3　回路组态的功能与实现
　　在完成数据库组态后就可以进行回路组态，回路组态是分布式控制系统组态的关键步骤，主要用于连续过程控制、报警检测与处理、确定输入输出回路等。回路组态数据库的每一项记录包含一条完整回路的必备信息。利用这些信息就能实现对系统的控制。回路组态根据其输入输出的不同分为模入模出回路，模入开出回路，开入开出回路。回路组态的合理与否直接影响控制质量的好坏。回路组态项目有：
　　. 显示信息：回路名称。
　　. 回路类型：由回路的输入输出变量类型而定，在读回路组态数据库时根据它来选取后面组态项目中需要的数据。
　　. I/O信息：输入点1、2，输出点。它们必须是数据库组态中存在的变量类型。
　　. 报警信息：同输入点的报警。
　　. 控制信息：开关特性（即输出是正作用还是反作用），控制规律（PID、串级、前馈、比例等），幅值控制（针对开关量输出），控制极性，控制周期，设定值，P、I、D参数，温度补偿通道（用于温度控制），压力补偿通道（用于压力控制）。
　　. 回路的工作状态与回路控制密切相关，为了跟踪回路的工作状态：手动或自动，在回路组态中还有回路状态一项，离线组态时应全部填入手动，第一次运行时手动调整至满足要求为止。同时对于具体的回路未必是所有组态项都有意义，某些项要按规定填写而实际上不用。
　　对于用户来说回路组态所要完成的工作实质上是按约定的格式和要求填写表格，因此VB提供的DBGrid控件（表格数据库）很适合编写此类程序。它的Method方法和Event事件驱动功能使得对数据库的各种操作编程简洁高效，尤其是能够对关联的数据库文件（*.mdb）自动读取显示和编辑后自动保存。
3.2.4　流程图组态的编制
　　DCS组态软件具有丰富强大的工艺流程图组态功能，这部分工作主要在VB中实现。Visual Basic 具备完善的图形函数和方便实用的图形控件如Line、Shape、Graph、Image。利用这些便能提供给用户基本的流程图编辑功能，如直线、圆、矩形、多边形，同时可以选择线粗细、颜色，对于圆、矩形的填充也能方便地实现。对于较复杂的图形生成，软件则提供了预先设计好的常用现场图形控件如反应罐、阀门、管道、马达等。这些控件是在Autocad中构造出来，对它们编程的难点在于实现鼠标拖动时的自由缩放。因此要了解Autocad的文件存储格式，在VB中用读二进制文件的方法获取构成图形的必备信息参数，当进行缩放操作时只需改变相应的参数。而对于不很复杂的图形控件可以直接存为Bmp或Jpg图形格式，然后利用VB提供的Image控件，将其Stretch属性设置为True即能实现缩放操作。
　　流程图组态的另一项工作是将画面和相关值联系起来，此时界面会弹出在数据库组态中的记录列表，选择所需项目后就实现了画面和选中值的动态连接。如果是开关量则画面会根据实测值呈两态性，而与模拟量对应的画面可以是直接数值显示或棒状图等连续变化显示。
3.2.5　报表组态的实现
　　报表大致分为周期性报表和触发性列表两种。周期性报表一般用来打印生产过程的操作记录和统计（求和等），它取代了操作工的抄表工作。这类报表一般采用定时驱动，通常是时报、班报、日报、月报等。而触发性列表则用来记录在特定事件发生前后的某些点的值，往往用来进行事故或故障分析。
　　在VB下实现报表功能有三种方法：
　　. 利用VB的DDE或OLE（对象链接与嵌入）功能，直接将EXCEL作为报表输出环境。
　　. 利用VB自身提供的Crystal Report控件，先在Report Designer中根据需要生成*.rpt文件，再将Crystal Report的ReportFileName属性设为需要的rpt文件，就能够控制报表的生成和打印。
　　. 以上两种方法的优点是编程容易，但是在功能实现上却受到制约。因此想完全控制报表的生成和打印最好使用VB的打印机控件Printer。Printer控件将外部设备打印机虚拟为VB的一个“软设备”，使得对打印机的编程直接方便。在报表组态过程中只需提供画线和文本编辑功能，即确定报表输出格式和输出的项目以及打印报表的时间。对用户的组态作以记录，然后利用Printer控件的Method：Line,Print,EndDoc等打印输出。
3.3　运行程序的设计
　　运行程序分为实时报警、工艺图、调整图、报警记录、打印报表等。这部分也是用VB编写的。
　　运行软件启动时先一次性从组态数据库（数据库组态和回路组态）中读入所需信息，即实时数据库。由于涉及数据结构的变化，对实时数据库的操作应视不同情况而定。在需要大量而频繁访问时（如DMA传输的数据）用直接读内存的方法，而对于只有少量访问的地方（如报表程序的周期性采样）可编写函数间接读取。从现场控制站传来的数据经VC应用程序送入共享内存区，VB虽然难以直接对内存进行操作，但有调用动态链接库的功能，通过调用DLL和VC的初始化采集程序通信，以完成操作员站的监测和控制功能。
　　运行界面的最上方有一红色窗口是报警区，为了不被别的窗口所覆盖，在VB中调用WIN95的API函数SetWindowPos将报警窗口永远置于屏幕的上端。系统每秒钟读取测量的数据后对其做上下限判断，如有越界则显示相应的报警信息。报警窗口始终显示最新的报警，以前的报警信息要在报警记录中查看。
　　工艺图显示分为静态图和动态图。静态图根据在流程图编辑中的记录一次绘制完成。动态图分为三种情况：图像移动，图像切换，图像移动切换。图像的载体一般是VB中的Image控件和Picture控件。图像移动可以通过改变控件的位置属性或利用控件的Move方法，图像切换需要动态改变控件的Picture属性，而图像移动切换则须以上两种方法并用。当然对于简单的动态显示如线段的平移、方块图的刷新等无须用图像控件，编写相应的函数即可实现。
　　调整图是运行时的主要监控界面。一幅调整图集中了一条控制回路的全部监控信息。它不但显示现场控制站传来的测量数据，而且能根据测量值和设定值的比较确定控制质量的好坏，从而在线修改PID参数、设定值、甚至改回路状态为手动以直接控制输出值的大小。调整图下方有两幅图像：趋势图和棒状图。趋势图记录最近五分钟的测量值、设定值和输出值，并以趋势曲线的形式显示，从中可对控制质量的好坏一目了然。棒状图则是以棒状条的形式动态显示测量值，其左右各有一不同颜色的三角形标尺，分别代表输出值和设定值。在不同的回路状态（自动和手动）下，通过上下箭头键可调节其值。调整图界面如图2所示。

图2
4　说明
　　分布式控制系统的工程师站组态软件和操作员站运行软件是整个控制系统的重要组成部分，它需要完成的任务很多。因此，DCS应用软件的设计和实现也是很复杂的系统工程。我们只是完成了其中基本的工作，还有其它的工作有待于进一步补充，使之不断完善。
作者简介：徐晓东　硕士研究生。专业方向：计算机控制。
作者单位：西安交通大学电气学院　陕西.西安（710049)
参考文献
［1］　王常力,廖道文.集散型控制系统的设计与应用.北京：清华大学出版社,1993
［2］　王常力,罗　安.集散型控制系统选型与应用.北京：清华大学出版社,1996
［3］　Charles Petzold,著.Windows95程序设计.北京：清华大学出版社,1997
收稿日期:1998-12-14
