大坝安全远程监控系统的日志功能模块

时间:2010-11-27

     摘要:为了及时掌握大坝运作状况,相关部门给大坝安装了安全监控系统。而该系统系统需要有相应的日志记录模块,用于记录系统的日常事件或者误操作警报的日期及时间戳信息,使管理人员能方便及时地了解了一些关键信息。设计过程中结合用户、管理系统的功能需求,得出了日志功能模块结构,然后用Visual C++设计相应的代码,实现了日志自动生成。

  1 前言

  传统的大坝安全监控系统受到技术和资金的限制,功能比较单一,操作起来也不够方便。

  随着技术的发展,大坝监控的项目和仪器不断增加,监测点增加,维护的工作量大,使得对系统管理软件,即客户端软件的要求也不断提高。现在的大坝安全监控系统应具有采集数据,处理数据,通信,执行命令,系统自检等各种功能;系统网络可以对不同类型的模拟和数字的传感器进行测控和数据采集。要使得管理系统的功能更完善,增加日志功能是非常必要的。

  日志文件为服务器、工作站、和应用软件等资源相关活动记录提供了必要的、有价值的信息,这对系统监控、查询、报表和安全审计是十分重要的。

  2 大坝安全监控系统

  2.1 大坝安全监控系统设备

  大坝安全监控系统的设备种类繁多,整个网络需要各种不同功能的设备,包括各种类型的传感器,总线,数据处理机,服务器,客户机等。大坝安全监控系统的网络结构如图1。


图1 大坝安全监控系统网络结构图

  在较大的监控系统的情况下,监测点有上千多个,数据量很大,就有必要安装多个服务器,多个服务器与客户机就形成一个局域网。

  2.2 大坝安全监控系统的管理软件

  建立了以上硬件基础后,就可以安装系统软件。软件具有系统运行管理、远程控制、人机对话操作、系统自处理、自检等功能。软件功能多,设计起来难度大、但把各种功能分模块来设计,可以使得设计难度降低。管理软件包括六个大模块:现场测量子系统,动态分析子系统,测值分析子系统,系统管理子系统,离线分析子系统,远程监控子系统。

  2.3 管理子系统的日志功能

  日志功能属于系统管理子系统中的一个功能。日志就是指系统所指定对象的某些操作和其操作结果按时间有序的集合。每个日志文件都是由日志记录组成,每条日志记录了的系统事件。通常情况下,系统日志是用户可以直接阅读的文本文件,其内容还包含了一个时间戳和一个信息或者子系统所特有的其他信息。日志文件为服务器、工作站、和应用软件、客户端等资源相关活动记录提供了必要的、有价值的信息,这对系统监控、查询、报表、安全*估、系统自检是十分重要的。

  3 日志功能模块的设计,开发

  3.1 软件的开发环境

  本系统软件选用 Visual C++ 6.0 版本作为开发语言,该平台的特点就是采用了面向对象的程序设计思想,具有可视化、交互式的开发环境。通过事件驱动机制,用户在界面上的任何操作都自动映射到相应的处理代码上,因此不再像传统的结构化程序那样,具有严格的执行流程,程序设计者可把重点放在对象模块的代码编写上。选中Visual C++是基于它的多种优点考虑的。

  日志功能模块当然也是在 Visual C++环境下,编写一个类来实现日志的自动生成,这样简化了开发流程。在软件中,日志都是以文本文件的形式存储在磁盘上,所以程序中使用了大量的操作方面的函数,有写文件函数int_write(handle,buffer,count);打开文件函数int_open(path,oflags);关闭文件函数int _close(int handle);新建文件夹函数int _mkdir(dirname)。

  3.2 日志的开发过程

  3.2.1 日志的结构

  根据大坝安全监测系统的实际要求,系统日志文件拟采用“年-月-日”三级文件夹的结构进行管理。每个年文件夹中,存放有12 个月文件夹。每个月文件夹中,存放有对应于该月天数个的日文件夹。所有的日志文件都存放在日文件夹下,年文件夹和月文件夹目录下不直接存放日志文件。

  在每个日文件夹中,用户每进入系统即对应产生一个或多个日志文件(产生多个日志文件是因为用户在登录期间日期发生了改变)。用户在系统中的全部操作都将记录在日志文件中,并以时间的先后顺序依次排列,方便用户的浏览与查询。

  3.2.2 日志的生成流程

  日志文件自动生成的具体过程可以描述如图 2,具体步骤如下:


图2 日志的生成流程

  (1)用户进入大坝安全监测系统后,执行的某个动作触发了日志功能。如果是次触发,系统需执行相关初始化工作。然后,程序获取到当前的系统时间,即用户执行操作的时间,该时间在后面将会被记录在日志文件里。程序将该时间与目前待操作的日志文件所对应的时间进行比对。如果年,月,日任意一者发生了改变,系统则将当前进程挂起,新建一个进程完成以下操作。

  (2)如果年发生改变,程序则在系统日志文件夹下新建以当前年命名的年文件夹,并在该年文件夹下依次新建以当前月份,日期命名的月文件夹,日文件夹,并选中该日文件夹。

  (3)如果年没有改变,而月发生了改变,程序则在年文件夹下新建以当前月份命名的月文件夹,并在该月文件夹下新建以当前日期命名的日文件夹,并选中该日文件夹。如果年和月都没有改变,而是日发生了改变,程序则在月文件夹下新建以当前日期命名的日文件夹,并选中该日文件夹。如果年、月、日均未发生改变,系统会自动搜索并选中与当前时间所对应的日文件夹。

  (4)程序将以上文获取的系统时间作文件名,在选中的日文件夹中新建一个日志文件。程序自动把该日志文件设置为待操作的日志文件。此时,进程结束,程序回归到主线程。

  (5)如果系统不是次触发日志功能,则必选中了某带操作的日志文件,直接对其进行操作即可。接着程序打开该日志文件,并向该文件追加日志信息,在保存文件成功后系统的日志功能停止。

  (6)程序继续不断扫描用户的操作,直至再次触发。如果用户退出,日志功能也就关闭。

  3.2.3 日志功能的程序设计

  (1) CDamLog 类的结构日志功能模块设计时,我设计了CDamLog 类。对于外部程序来说,它们所要做的工作就是当用户执行某个动作触发日志功能时,能够做出判断,并返回判断结果,记录到日志文件中。而不必关心是否发生了年、月、日的跳变以及日志文件的存储位置。我对DamLog类中的部分成员进行了封装,把它们定义为protected 型,不允许外部程序进行直接调用。

  外部程序通过建立该类的一个事例DamLog,即可完成日志的自动生成。利用了WriteLogFile函数实现日志的写入,用Enable 和Disable 实现日志功能的开启和关闭。类的结构如图3。


  类的定义如下:

      class CDamLog

  { private:

  int m_filehandle,m_row,m_dirnum,m_filenum;

  BOOL m_uselog; //日志开启,关闭的标志

  char m_Content[1024*1024];

  CString m_Year,m_Month, m_Day; //记录待操作日志文件对应的年月日

  CString m_CurrentYear, m_CurrentMonth, m_CurrentDay;

  //记录用户进行某项操作时对应的年月日

  CString m_LogYear_Path, m_LogMonth_ Path, m_LogDay_Path, m_Log_ Path;

  CString m_logContent; //日志文本内容

  CCriticalSection m_cs; //用于多线程操作

  public:

  void Disable(); //关闭日志功能

  void Enable(); //开启日志功能

  CDamLog(); //构造函数

  ~CDamLog(); //析构函数

  void WriteLogFile(const char* fmt, ... ); //写日志文件

  protected:

  BOOL NewLogFile(); //新建日志文件

  BOOL ChangeDay(); //判断是否发生日的跳变

  BOOL ChangeMonth(); //判断是否发生月的跳变

  BOOL ChangeYear(); //判断是否发生年的跳变

  CString GetCurrentTime(); //获取系统时间

  };

  (2)要编写的程序有:WriteLogFile 写日志文件函数、NewLogFile 新建日志文件等、ChangeYear 是判断是否发生年跳变的函数。下面是ChangeYear 判断是否发生年跳变函数。

  函数取出待操作日志文件对应的年份与用户动作所对应时间的年份进行比对,如果二者不一致,则判断年份发生了改变,并依次在对应目录下新建与用户动作时间相对应的年文件夹,月文件夹和日文件夹。函数ChangeMonth 与ChangeDay 的原理与ChangeYear 类似。

  BOOL CDamLog::ChangeYear()

  { m_CurrentYear = GetCurrentTime().Mid(0,4);

  if (m_Year != m_CurrentYear) //“年”发生了改变

  { m_Year = m_CurrentYear;

  m_LogYear_Path = m_Log_Path + "\\" + m_Curt_Path + "年";

  //构造年文件夹路径

  _mkdir(m_LogYear_Path); //新建年文件夹

  m_CurrentMonth = GetCurrentTime().Mid(5,2);

  m_Month = m_CurrentMonth;

  m_LogMonth_Path = m_LogYear_Path + "\\" + m_CurtYear + "年" +

  m_CurrentMonth + "月"; //构造月文件夹路径

  _mkdir(m_LogMonth_Path); //新建月文件夹

  m_CurrentDay = GetCurrentTime().Mid(8,2);

  m_Day = m_CurrentDay;

  m_LogDay_Path = m_LogMonth_Path + "\\"+m_CurtYear + "年"+

  m_CurrentMonth + "月" +m_CurrentDay + "日"; //构造日文件夹路径

  _mkdir(m_LogDay_Path); //新建日文件夹

  return TRUE; }

  return FALSE;

  }

  4 小结

  设计的过程先是分析日志功能模块的功能需求,进而得到该模块的具体结构,通过编写DamLog 类来实现日志自动生成并以年-月-日的树结构来排放,方便的用户的阅读。当然文中所述的大坝安全监控系统极其日志功能并不是十全十美,更新的技术还有待日后的学习研究。


  
上一篇:将同步信号添加到标清视频信号的通道设计方案
下一篇:基于LabVIEW的LED结温与光衰监测系统

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料