> 摘 要 介绍一个利用共用电话系统和工业控制机组成的锅炉远程监控网络,分析技术方案的特点,指出软件编程的要点,实现对远距离分散的多个锅炉房内锅炉的运行监控。 0 引言 克拉玛依石油管理局供热公司近年来在其下属的十几个锅炉房大力推广工控机,在基础自动化方面取得了很大进展。但是,这些工控机分散于距该公司几千米至几十千米的各个锅炉房内,彼此独立分散,因而公司调度室的管理人员需给锅炉房的技术人员打电话以了解各处的运行状态,甚至驱车前往解决问题。为此,急需建立一个以调度室为中心的远程监控网络,在基础自动化的基础上进一步实现管理自动化。但是,由于其下属锅炉房较多且很分散,从成本及使用要求等方面考虑,采用计算机局域网的方法不适用。我们设计了通过电话交换机(PBX)组成一个远程监控网络,最大限度地利用了原有的工控机和电话网。本系统可以推广至冶金及其它诸多工业控制系统中。 1 监控网络的组成 图1所示为监控网络的组成结构。  图中,各下属锅炉房中有PC总线的486、586工控机,也有1990年前后配备的STD总线工控机。每台工控机控制2~6台热水锅炉,完成数据采集与显示、锅炉出水温度控制、鼓风控制、炉膛负压控制、报警、数据打印等功能。建成监控网络之后,各工控机除了完成原有控制功能外,还增加了通信功能。在硬件方面,每台工控机加装一个MODEM和电话线相连,图1中的虚线表示拨号电话线路,出于工作环境的考虑,MODEM均采用内置式。PBX在网络中起着线路交换的作用。调度室设置一台加装了MODEM的管理用计算机,当它对某一锅炉房的工控机拨号后,该工控机将相关的锅炉系统的运行数据、设置参数、报警信息等通过电话线路(点对点线路)实时传送至调度室的计算机中,由监控人员观察和处置,调度室挂机后即可拨号访问另一锅炉房。 本系统有以下特点: (1)该系统是一种星形网络,借用电话网络和功能完善的智能MODEM,简化了硬件系统和软件设计,并具有方便扩容的优点。 (2)一般的星形网络由于每个站点与中央站点直接相连,因而电缆费用高,加装站点困难。本系统利用现有PBX的电话线路,大大节约建网费用和周期,且传输距离只受电话线路质量的限制。最远的锅炉房距离调度室20km以上,二者之间实现了数据传输。 (3)PBX电话线进入每台计算机的MODEM后,又从MODEM并联连接至原来使用的电话机,从而使MODEM和电话机可以分时使用同一条电话线。只要正确设置MODEM在应答前允许电话响铃的次数,则不影响原有电话机的接入和打出功能。 (4)由于各个工控机是通过拨号电话线路连接至调度室,所以只要有一条电话线,任何一部配备了MODEM和调度室上位机程序的计算机都能够取代调度室计算机,直接拨号访问某一锅炉房的工控机。这就使管理人员在调度室之外的其它地点亦可使用便携式计算机了解各个锅炉房当前的运行情况。 2 MODEM通信模块的软件设计 2.1 方案设计 从调度室的管理要求来看,调度室计算机程序和下位工控机程序应有以下功能:(1)调度室计算机程序应能拨号,从而和相关的工控机建立连接。(2)MODEM连接成功之后,工控机程序应自动发送实时数据至调度室。(3)调度室计算机程序应能将MODEM挂机,结束通信。 由于原有的工控机程序采用的是DOS环境下编程,且运行效果良好,所以我们用C++语言开发了一个DOS环境下的MODEM通信类作为一个独立的模块,原来的源程序中只需增加对该通信类成员函数的调用,就可为原工控程序扩展通信功能。同样,以该MODEM通信类为基础开发了调度室计算机程序。之所以未采用WINDOWS编程,一方面这需要重新编制所有程序,开发及调试周期长,风险大;另一方面,STD总线工控机所能提供的内存只能达到512KB,存储程序的EPROM或电子盘在1MB以下,无法满足运行WINDOWS程序的硬件要求。 该MODEM通信控制类中,数据的发送和接收均采用了中断方式,在后台执行,而中断服务程序的安装与解除、串行通信口和MODEM的初始化均置于该通信类的构造函数和析构函数中,从而使其具有很好的模块性,使用简单。以中断方式通信可以很好地满足工控程序的实时性要求。一般来说,串行通信中,数据接收多采用中断方式,而数据发送既可以采用查询方式,也可以采用中断方式。采用查询方式发送数据时,通信程序的设计比较简单,但是数据发送过程中要不断地监视UART(通用异步发送/接受器)的线路状态寄存器,等待寄存器显示出可传下一个数据字节的信号,耗费了大量的CPU时间,所以只使用于每次发送较少数据的情况。本系统工控机通过速率为14.4KB的MODEM发送的实时数据,大小在几千字节至十几千字节左右,每次发送需几秒至十几秒。很显然,如果采用查询方式发送的话,则数据发送期间工控机不能正常执行数据采集和控制等功能,从用户界面看则不能执行任何键盘和鼠标响应,类似于“死机”的状态。而中断方式则是一种高效的通信状态,每次发送数据时只需将数据放入发送缓冲区,然后向串行口送入第1个字节触发字符发送中断序列,其余字节的发送则由中断例程完成,从而将主程序解脱出来。 2.2 MODEM通信类的设计 通信程序的编程一般比较复杂,尤其是当采用中断方式和使用了MODEM。为了提高模块化程度,我们充分利用了C++的面向对象程序设计(OOP)方法。 首先,将和串行通信有关的数据和行为方式封装于一个基类中,并在此基础上派生出一个MODEM通信类;其次,串行口及MODEM的初始化、中断例程的安装和解除均在MODEM通信类的构造函数和析构函数中完成;另外,封装于通信类的中断例程集中完成了数据的发送、接收,并监控MODEM连接和断开状态的变化,而不需主程序的干预。以中断方式接受数据的一个难点是:接收的字符既可能是发给MODEM的AT命令的结果码,也可能是另一台计算机发送来的一般字符。通过监控MODEM状态改变中断和检查所接收的字符流,该通信类实现了对两种字符自动区分并放置于不同的缓冲区里。主程序可直接从缓冲区中获得AT命令结果码或接收一般字符。 经过以上设计,最后得到的MODEM通信类及其主要的成员函数简介如下。 class EnComm //MODEM通信类。 { public: EnComm //构造函数:完成串行口及MODEM初始化,安装中断向量,中断屏蔽等。 (Int PortAddress, int IntNumber, void interrupt(far *IntHander)(...)); ~EnComm(); //析构函数:MODEM复位,恢复中断向量等。 int SendConfigureString //配置函数:向MODEM发送初始化字符串并返回执行结果。 (const char*ConfigureString, float WaitSecond=1, int CheckResult=0); int Dial //拨号函数:命令MODEM拨号并返回执行结果。 (const char*PhoneNumber, float WaitSecond=60, int CheckResult=0); int HangUp //挂机函数:命令MODEM挂机并返回执行结果。 (float WaitSecond=2, int checkResult=0); int GetModemStatus(void); //返回MODEM状态:命令状态或连接状态。 int SendBinData //发送函数:将数据放入发送缓冲区并启动发送中断。 (char *DataBuffer, int Count); int GetReceiveData //接收函数:从接收缓冲区中读取接收字符流。 (char*Buffer, int Length); }; 2.3 通信编程的几个要点 2.3.1 串行口初始化 假设串行通信口基地址为CommPort(一般为0x2E8,0x2F8,0x3E8或0x3F8四者之一),串行口初始化时要对UART的以下寄存器进行设置。 波特率寄存器(CommPort;CommPort+1):设置波特率。 线控制寄存器(CommPort+3):设置字符长度、停止位个数和奇偶校验类型。 中断控制寄存器(CommPort+1):允许发送保持寄存器空、接受数据准备好、MODEM状态改变、接受数据错等多个类型的中断。 MODEM控制寄存器(CommPort+4):将DTR(数据终端就绪)和RTS(请求发送)位置1,将Bit 3置1以允许中断。 设置寄存器时应首先设置波特率寄存器,因为只有这两个寄存器要求线控制寄存器的第7位为1,接着将线控制寄存器的第7位置0,这样就可以正确访问所有后续的寄存器。 2.3.2 通信中断事件的处理 由于同时允许多种类型的中断,所以设计串行通信中断例程时必须在一开始检测中断标志寄存器的Bit 2和Bit 1以确定中断事件的类型。同一时刻可能发生多个中断,为此,用中断标志寄存器的Bit 0来判断多余的中断是否处于未决状态。当两个或多个中断同时发生时则按下表的顺序进行处理,使原有的中断处于“撤消”状态。在中断例程返回前,必须处理完多余中断。  2.3.3 MODEM初始化字符串和通信数据校验 在对MODEM初始化时,要为MODEM设置一个合适的初始化字符串,以配置CD(载波检测)和DTR(数据终端准备就绪)的检测信号控制方式、差错控制协议和数据压缩协议等,以最大限度地发挥所用MODEM的硬件工作能力[2]。 为了保证通信数据传输的完整和正确,除了利用MODEM的纠错功能外,在软件设计中也要进行数据校验和纠错处理。实时数据传输中,所发送的数据被调度室上位机程序用于数值显示和曲线显示,并且数据是周期性循环发送的(周期约为5s),以便在调度室看到数据的实时变化。下位工控机程序对每次发送的数据以下面格式编码打包:  其中,每次发送的有效实时数据约5KB,字符串DATASTART和DATAEND作为有效数据的起始和结束标志。数据包中还包括有效数据的长度以及算术和校验码。上位机程序则对实时数据包进行解码,并检验实际接收的有效数据是否符合数据长度以及校验码条件,以决定接受或舍弃本次数据。由于实时数据发送的周期性和单方向,舍弃偶尔出错的数据不会造成大的影响。这种校验方案不要求重发出错的数据,因而既可满足使用要求,又大大简化了程序设计的难度。 3 结束语 本系统以较小的投资实现了用于对各个锅炉房每天的例行巡检的远程通信监控功能,以掌握锅炉运行情况、仪表损坏情况、员工对锅炉运行的维护情况等。由于供热公司调度室计算机中配备了与下属锅炉房各工控机程序相对应的上位机程序,接通某个工控机几秒钟后,管理人员在调度室即可面对与工控机程序完全相同的人机界面,观察下属锅炉房各锅炉温度、压力等参数的数值及变化曲线、报警信息等,在十几分钟内就可以完成对一个锅炉房的检查;晚上发生故障时,技术人员在家中通过电话线就可检查部分事故原因。经过一年来的使用,系统的功能和可靠性经受住了考验。 作者简介:刘晓良,男,191年生,助教,主要从事工自动化专业教学、科研和工业控制机应用等研究工作。 |