CSDN博客

img maxiuhui

在发电机组控制中累计运行时间的计算

发表于2002/11/4 13:06:00  680人阅读

 

在发电机组控制中累计运行时间的计算

                         

  : 本文讲解了发电机组控制系统上位机软件的开发过程中,应机组控制要求,开发人员在开发软件的过程中所应用到的计算机数据类型知识

关键词:数据库、面向对象、控件、时钟、文件

发电机组是我公司开发研制,主要应用于电信部门备用电源的系列产品。机组对控制系统的要求主要是及时和准确,在对控制系统的要求中有一项是上位机软件中需要显示机组累计运行时间。功能看起来很简单:只要用系统时间减去起动时的系统时间便等于本次机组运行的时间,加上以前累计运行的时间便等于机组累计运行的时间,待停机信号出现将累计运行时间存盘即可以了。

但在程序编制调试的过程中却发现了问题:

1.如果在运行过程中,用户修改了系统时间,将会导致当前时间-起动时系统时间非常大甚至出现负值而使机组累计运行时间不准;

2.VB中的时间0值是1899年12月30日上午12时0分0秒,所以1秒钟显示为:“1899/12/30 12:00:01 AM”这显然不是我们所需要的;

3.VB的时间类型的变量或常量中年、月、日中任何一位都不可为0,否则将要出错;

4.如果在运行过程中,计算机死机或出错,导致本次运行时间未及时存盘而造成机组累计运行时间不准。


完成计时功能首先应声明三个变量:

静态变量T1,用来存放每一次计算累计时间TL时的系统时间,即累计时间基准

变量 TL,用来存放累计运行时间

变量 T2,用来存放系统当前时间

实现此功能的正常思路:在运行过程中机组状态由“非运行”转为“运行”此时程序将保存当前时间到一个静态变量T1(假设为2000/12/20 00:00:00)中,而运行一段时间后,程序将当前系统时间T2( 假设为2000/12/20 00:20:00与刚刚保存的T1的差(00:20:00)做为此次机组运行的时间。

由于Windows操作系统是个多任务的操作系统,在程序运行过程中可能出现这样的情况,即在程序保存T1之后,用户通过其他程序修改了系统时间(假设修改为   1998/12/20 00:20:00)在程序运行时统计运行时间就会出现T2-T1<0的情况,而VB中负的时间值会解释为1899年以前的日期,这样T2-T1就等于1897年12月30日00:00:00程序显示的时间就会显示错误的累计时间。

为防止在运行过程中,用户修改系统时间,导致当前时间与起动时系统时间之差在合法范围之外而使机组累计运行时间不准的问题。程序每隔1秒钟令T2=系统当前时间,计算T2-T1,如果T2-T1所得到的值在0~6秒内将该值累加到累计时间TL中,无论T2-T1的值如何,都令T1=T2。这样时间基准T1每秒都要更新一次这样,由于T1每秒钟更新一次,所以,无论在程序运行中用户将时间修改成什么值只会造成程序累计时间上的1秒钟的误差。

另外,在VB中的时间类型的0值是1899年12月30日上午12时0分0秒,所以1秒钟显示为:“1899/12/30 12:00:01 AM”并且年、月、日位不能等于0,这显然与我们需要的不符合。

为解决这一问题,先对VB的数据类型进行深入一些的了解。

VB中的时间类型变量存储为 IEEE 64 位(8 个字节)浮点数值形式,其可以表示的日期范围从 100 年 1 月 1 日到 9999 年 12 月 31 日,而时间可以从 0:00:00 到 23:59:59,当其他的类型的数据要转换为时间类型时,小数点左边的值表示日期信息,而小数点右边的值则表示时间。午夜为 0 而中午为 0.5。负整数表示 1899 年 12 月 30 日之前的日期,所以在VB中1秒的时间转化为浮点型数的值为1÷24÷60÷60=1.15×10-5应用此值可以先在程序中将时间变量换算为浮点型变量,再将浮点型变量除以1.15×10-5得到累计的秒数再进行分钟和小时的换算,因为机组累计运行时间是以小时为最大单位的,所以不需要进行年月日的换算。这种方法缺点是计算比较复杂,并且1秒钟对应1.15×10-5有误差,误差累加容易造成累计时间上的误差。

最后,采取了用数据结构方法解决时间问题,即定义数据结构新类型如下:

TYPE TIMEL

      THOUSE AS LONG

      TTIME AS DATE

END TYPE

定义

DIM TIMELJ AS TIMEL

TIMELJ.THOUSE记录累计时间的小时数,而用TIMELJ.TTIME来记录累计时间的分钟和秒。程序每秒钟用当前系统时间T2减去T1所得到的差加入到TIMELJ.TTIME中,当TIMELJ.TTIME的小时位的值≥1时,将小时位的值加入到TIMELJ.THOUSE中。同时将TIMELJ.TTIME的小时位清为0,在显示机组累计运行时间时,将TIMELJ.TTIME拆分开,按位读出它的分、秒并与TIMELJ.THOUSE结合起来就显示了发电机组本次起动以来运行的累计时间。如果在程序开始就将上次运行的累计时间读入到TIMELJ中,那么程序运行过程中显示的时间将是机组累计运行的时间了。在程序运行中,每次从串行口读出一组有效的数据,就对机组的状态进行判别,如果判别为“运行”则将累计运行时间,并定期将该时间存储到硬盘中。在程序加载过程中读出本次机组起动前机组的历史记录,为防止用户误删除历史运行时间数据,而在读取时出现打不开文件的系统错误,在程序中在读取历史运行时间之前将判断历史运行时间文件是否存在。如果已经存在则打开它读取数据,否则将按清零处理,即认为机组是第一次运行。

 

为防止程序异常退出导致的系统时间存盘不及时问题,将机组累计存盘时间提高到3~5秒。

通过长期的对计算机编程知识的学习和应用,积累了一些经验,发现了不少看起来容易但实现起来相当复杂的问题,一旦解决起来就会牵扯到其他多方面的知识,在今后对上位机软件升级或编写新的上位机软件工作过程中将在解决类似问题时节约大量的时间和精力。

 

 

 

 

0 0

相关博文

我的热门文章

img
取 消
img