自来水是保障城市经济发展和人民生活的重要基础设施,是保障城市繁荣发展、人民生活以及发展国民经济不可缺少的先决条件。从另一个方面来说,我国是一个高度缺水的发展中国家,随着改革开放的不断深入和发展以及人口数量的不断增长,无论从自来水产量和质量上,社会都对城市供水提供了更高的要求。而实现水厂与供水调度系统的自动化,是保证自来水安全、优质与供水生产调度的科学性、高效性以及合理性的有效措施,现在已经逐步发展为以提高供水质量,提高供水系统安全,降低人耗、物耗、水耗这一综合效益为目标。为了达到这一目标,要求供水调度系统从设计和选型上就必须考虑到水厂、管网和管理信息系统的一体化和配套完整性。本文介绍的就是某自来水公司供水自动监控及调度系统的设计与实现方法。
2 系统功能分析与设计
2.1项目背景
此自来水公司现拥有自来水厂三个,加压站两个及遍布全城的供水管网。自来水厂拟完成绝大部分工艺参数的自动检测及部分参数的自动控制,取水、制水及送水实现自动程控。水厂参数应实时传送至公司总调度室,并能接收并执行总调度室指令。加压站及管网全部纳入系统,加压站实现自动化,管网全部压力、流量等数据实时传送至总调度室。
2.2调度控制中心的基本功能
(1) 数据通讯采集:接收水厂和管网测压点的压力、流量、泵运行参数、耗电量等信息。对采集的数据进行统计和处理,提供对整个系统的网络数据库管理。
(2) 画面显示:厂站、管网的动态运行图、实时趋势图、棒图、运行报表、及其其他自定义画面。还可显示日期、时间、报警、数据、工艺流程、设备状态、趋势、操作指导、调度指令等。
(3) 报警管理:提供全方位的报警功能,可在多种画面中以直观方式通知调度人员系统发生异常。不同级别的报警可在所有操作站上接收,报警没有确认时保持闪光。报警内容有:实际值和偏差值报警、给定值限值报警、系统自诊断报警、识别变送器运行在4~20mA范围以外的报警、输出限幅报警、电源故障报警、模板故障报警、通信故障报警等等。
(4) 统计计算和分析:系统能对供水量、供水总量等进行统计计算,并具有数据存储、查询、建帐等功能,供管理人员进行分析。
根据以上功能分析,可以将系统设计为C/S(客户/服务器)模式,各水厂和加压站设立下位机,负责预处理现场测量点传感器采集的数据,然后通过RS-232将预处理数据传送给监控中心的上位机。上位机对接收到的数据进一步判断,存在越限报警的便启动报警处理方案,并对采集的所有数据分类存储到数据库中。图1是监控网络的组成结构示意图。
3 串口通信的实现
各测量点测得的数据的是通过RS-232标准串行接口传送到监控中心的,因为RS-232驱动能力太低,所以使用了MODEM作为中继器。监控中心读取到这些数据之后,再根据预定义好的规约分析数据,做出报警判断及进行数据存储。监控中心软件运行在Windows 2000操作系统下,为了方便对数据库编程,可以采用Delphi(Windows平台下的可视化软件开发工具)作为监控软件的开发工具。在Delphi中编写串口读写程序的方法基本可以分为两种,一是采用封装了串口读写方法的控件,二是直接调用Win32 API。使用已有控件可以提高编程效率,只需要几条简洁的语句就可以实现串口的读写,但是灵活性太差,不能完全按照个人意愿读写串口,并且有些控件的健壮性也没有得到充分的验证,所以本系统程序编写采用Win32 API(应用编程适配器:Windows的32位应用程序编程接口,一组调用操作系统或其他程序而获得访问服务的例行程序)完成。
API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。下面以处理串口接收数据的子程序为例介绍一下本系统的串口通信程序。接收消息之前应该先用clearcommerror函数处理串口通信错误并报告当前串口状态,如果出现错误向用户发出提示并退出此子程序,如果没有错误就再判断串口接收的数据数是否超过预定以缓冲区的大小。限于篇幅,本文略过这段语句,直接给出读取并处理数据的主体程序,并给出程序的注释。
procedure NOTIFY(var message:tmessage);
var
Temp : string; inputbuffer: array[0..4000>of Char;
nBytesRead, dwError:DWORD ; showReceive:string;
commstate:TCOMSTAT;//存放串口状态的结构体
begin
//略过预处理程序……
//使用readfile函数读取串口数据;在win32 API中使用文件操作函数操作串口
if(not readfile(hcomm,inputbuffer,e,nbytesread,@read_os)) then
begin
if(dwerror<>0)and(dwerror<>error_io_pending) then
begin//读取串口错误,则提示用户,并关闭所有相关句柄
messagebox(0,'readfile error','notice',mb_ok);
stop:=true;
closehandle();
closehandle(post_event);
closehandle(hcomm);
exit;
end
else
begin
waitforsingleobject(hcomm,infinite);
getoverlappedresult(hcomm,read_os,nbytesread,false);
end;
end;
if nbytesread>0 then
begin
temp:=(inputbuffer,1,e);
receivebuffer:=receivebuffer+temp;
buffer:=receivebuffer;
if (temp[length(temp)>=#13)or(temp[length(temp)>=#10)or (length(receivebuffer)>128)
//上位机和下位机定义通信规约为以ASCII的13或者10作为帧结束标志
then
begin
//若处于显示接收内容模式,显示接收到的内容
if d then
begin
showreceive:=buffer;
[2>.Text:='接受内容:'+showreceive;
end
else
[2>.Text:='接受内容:';
//分析故障信息
if temp[length(temp)>=#10 then
failureinfoparse(buffer);//条用故障处理子程序,此子程序分析故障类型,判断故障设备,并把故障信息记录到数据库
receivebuffer:='';//处理完一帧数据就清空缓冲区,为下一次读取做准备
end; end; end;
setevent(post_event);
end;
上位机的图形化监控软件完成调度控制中心的基本功能。上位机网络由一个应用程序服务器、两个监控工作站、一个模拟屏控制机和数据库服务器组成。上述串口读写程序就工作在应用程序服务器上。
4 结束语
本文介绍了一个供水自动监控及调度系统的设计和实现,采用了分布式控制结构,使系统处理事故和进行调度的效率有所改善和提高。但因为考虑设计成本等因素,这种设计方案并不是最优的,在以后的实践研究中会做出进一步改进。
(转载)