C语言实现基于DOS的在线污水检测仪的系统软件
作者:杜树旺,王晓萍 时间:2006-12-22 23:22 来源:
摘要:用模拟多任务处理来实现基于DOS的在线实时监测系统软件,充分利用了C语言的灵活性和强大功能,通过多分支结构和时间中断处理实现了各种状态的设置和运行,比较充分满足了该系统对实时性和稳定性的要求。
关键字:时间中断;键盘中断;多任务处理;模块
该污水监测仪的硬件构成及设计要求“废水在线监控仪器”主要由嵌入式微机系统、取样水路、COD模块、显示器和各种接口组成。可以在线监测COD值、排放流量等数据;预留了模拟输入通道、开关量输入输出通道,并具有强大的可扩充能力。嵌入式微机系统选用台湾研华公司工控级的PC104总线各功能模板(ADM5X86CPU模板、I/O板、MODEM模板、Ethernet接口、基于ProfiBus开放协议的现场总线接口等)
设计要求如下:
测量和清洗功能
1、 能够在线手动或自动测量水样的COD值,并实时(刷新时间为3秒)显示测量结果;
2、 具有手动或定时清洗功能(清洗周期可以设置);
数据存储功能:要求能够保存多种数据,可供查询和通信
1、 分钟趋势数据(实时趋势):最近一分钟20组的实时数据,保存在RAM中,供实时趋势数据通信时读取。
2、 每天小时数据:保存1天24小时的分钟数据,每分钟产生一组,包括分钟趋势数据中的最大值、最小值和平均值,供指定小时的分钟分钟数据通信时读取。
3、 小时趋势数据(最近一个小时的分钟数据):只保存最近一个小时的分钟数据,供小时趋势通信时读取。
4、 每天趋势数据(十分钟数据):每十分钟产生一组数据,每组数据是这十分钟内数据的最大值、最小值和平均值,供天趋势数据通信时读取。
5、 年小时数据(历史数据):每小时产生一组数据,每组数据是这个小时中分钟数据的最大值、最小值和平均值。供周趋势、月趋势数据通信和指定月小时数据通信时读取。
6、 报警数据:每次报警事件中产生一组报警数据,数据包括时间和COD值,共保存150组。
7、 停电数据:记录仪器的停电时间和恢复供电时间,保存20组。
8、 设置的参数:包括系统参数(密码、通讯波特率、地址码、电话号码等)和运行参数(报警限、清洗周期、测量时间、加热时间、浓度选择等)两类。
设置功能
有两种方式可以修改仪器内的系统参数和工作参数。
1、 通过菜单和按键操作,可以方便地设置和修改各种系统参数和各种工作参数。
2、 通过近程的RS485通信接口或远程的MODEM通信(或以太网)通信,同样可以实现各种参数的设置和修改。
查询功能
可以查询仪器的各种系统参数、工作参数和测量数据,如最近一小时的分钟数据,小时数据,报警数据,停电数据等。
报警功能
当仪器检测到任一测量结果超过设定的报警限,并持续两分钟以上时,将记录一次报警事件。报警时间可以通过键盘查询,也可以通过RS485或远程通信方式传送到管理软件中。
通讯功能
1、 具有多种通信功能:本地遵循MODBUS软件通信协议的RS485通信;远程MODEM或以太网通信。
2、 各种数据均可以通过本地或远程通信进行查询和设置,实现信息资源共享。
系统软件实现方案设计为了提高软件的可操作性和可维护性,采用了面向对象的软件设计方法,从用户的功能要求入手,产生一些必须的界面元素,如菜单,对话框,编辑框等,利用事件驱动,以此来保证DOS环境下的实时性要求。
为了设计和程序修改的方便,将该系统软件分为显示模块、按键中断模块、测量模块、数据压缩处理模块、通信模块、定时中断模块、硬件接口模块和文件处理模块。

图1程序模块
* 显示模块:负责监测系统各项功能菜单的显示,提供人机交互的环境;具体的显示菜单则是根据使用者按键的情况来确定。
* 按键处理模块:响应键盘中断,根据按键的键值和当前菜单所处的状态,来决定按键后菜单的显示;同时还要负责处理用户从键盘输入的数据并进行合理性判断。
* 数据压缩模块:负责各种实时数据的处理以及报警事件的判断和记录,并保存到相应的数据文件中。
* 通信模块:负责与上位机通信。
* 定时中断模块:包括各种时间中断函数以及停电时间判断函数,定义了程序运行中的各类定时器和计数器。
* 硬件接口模块:负责处理对硬件的操作,如各种泵、阀和风扇等的控制。
* 测量模块:负责实现即时测量、定时测量和手动测量等动作指令的发布,以及自动清洗的执行。
* 文件处理模块:负责各项数据文件的读、写。
软件实现的几个重要流程
主函数流程main():

图2 主流程
系统初始化包括的内容:图形界面的初始化,程序运行中各个标志的赋值、485通信、MODEM通信(或以太网通信)的初始化以及汉字字库文件的打开,并设置好键盘中断和时间中断向量。从系统文件中读取系统参数和运行参数。停电事件的记录中还包括对数据文件的处理。如果停电时间在一个小时以内,则要对小时分钟数据文件,天分钟数据文件和十分种数据文件的部分数据清零;若停电时间超过一个小时但小于二十四小时,要对小时分钟数据文件全部清零,天分钟数据文件和十分种数据文件中的部分数据清零,还要对月数据的部分数据清零;若停电时间超过二十四个小时,要对小时趋势数据、分钟数据和十分种数据全部清零,同时也要对月数据文件的部分数据清零。采样、显示、数据压缩、测量和清洗等分别调用各自模块中的函数。
显示流程menudisplay():
按键若有变化,按键中断程序会调用按键中断处理函数。该函数会根据按键前菜单的状态标志及现在按键的键值,来计算出当前的菜单状态,同时将与当前菜单显示有关的标志置起,供菜单显示程序调用。时间显示中秒的刷新标志的通过时间中断函数中的定时器来置起的,一秒时间到,秒刷新标志置起,显示程序调用时间刷新函数timerefresh()。

图3 显示流程
以太网通信流程:
主程序开始时,进行各项初始化操作,包括服务器监听套接字的创建、绑定IP地址和监听端口,然后启动监听。监听队列建立后,继续执行主程序中其它工作,如数据测量。压缩,存储等。主程序一个循环后,查询监听队列是否有客户端连接请求,若有,开始接受请求,并创建用于收发数据的套接字,然后读入查询帧或设置帧,并进行相应处理,然后将回送帧发送给客户端,通信完成后返回执行主程序的循环;如果没有连接请求,则直接返回执行主程序循环。

图4 以太网通信流程
小结在软件的编制、调试过程中出现过很多很难处理的问题,如停电事件的判定,经过多次调试运行,最后确定的方法为:利用分钟时间文件中最近一次的时间作为停电时间。还有就是测量过程中对泵、阀的操作,要求关闭必须即时,不能有延误,否则就会造成溶液滴入不准等问题,严重影响仪器的测量精度。为了解决这个问题,只要将整个测量过程分成若干个步骤,每一次对泵、阀的操作都通过时间中断来控制,并且在时间中断中实现相应的开关工作。还有就是整个软件中各个子函数之间的时序也相当重要,他们之间的相互调用不允许出现任何差错,否则就会造成混乱,严重的会造成系统崩溃。