在一机房中,安装有3个风机(1号,2号,3号。风机即降温设备类似风扇)
同时该机房中有另一硬件,可以监控该机房中的温度,并通过http协议将数据上传到指定的服务器。(定时上传)软件(BS结构)要求可以在不同的温度下对硬件做出不同的控制。
如:
当温度处于上升阶段时,达到40度(含)以上时,要求将2打开,1,3关闭。
此时,温度可能继续上升(可能风扇散热效果不是太好)
当温度在上升阶段达到50度时(含),要求2关,1,3打开。
此时,温度开始下降(实际是有继续上升的可能,但这里不考虑),此时温度可能是这样的下降49,48,43,41,40。
此时,温度又回到40度,但此时是温度处于下降阶段,而在下降阶段温度值是40度时,要求将2关,1,3保留。好了,难题来了:
对于程序来说,得到的值都是40度,怎么判断此40度是处于上升阶段还是下降阶段,因为上升和下降过程中40度要执行不同的控制。这个问题已经纠结了好几天了,请大家帮帮忙。

解决方案 »

  1.   

    我觉得你没有必要在40的时候判断是上升还量下降。你可以换一个思路:if (50 < temp) {
      doMethodA();
    } else if(40 < temp <= 50) {
      doMethodB();
    }使用这种左开右闭的方式就没有你说的那个问题。但对于像这样的监控系统关键的是防抖动的处理。假设测试在
    39,40,41,40,39,40,41.....
    这样的拉动,你就惨了,长时间的开关硬件会加速设备的老化产生故障。
      

  2.   

    不会那么巧每次都能刚好读到40这个温度吧?
    假设温度的变化顺序是这样
    20 ++> 25 ++> 33 ++> 38 ++> 42 ++> 48 ++> 52 ++> 60 --> 53 --> 44 --> 41 --> 38
    那么,需要
    在 “38 ++> 42” 这一步open(2),close(1,3);
    在 “48 ++> 52" 这一步open(1,3),close(2);
    在 “41 --> 38” 这一步close(1,3). (所以全部都是关的哦,因为原文是这么说的: 当温度在上升阶段达到50度时(含),要求2关,1,3打开。
    此时,温度开始下降(实际是有继续上升的可能,但这里不考虑),此时温度可能是这样的下降49,48,43,41,40。
    此时,温度又回到40度,但此时是温度处于下降阶段,而在下降阶段温度值是40度时,要求将2关,1,3保留。--我的理解,保留就也是关的)最直接的想法,需要保存一个“上一次温度”。实际上,仔细分析这个过程,画一个表格的话,大概可以得到:
    ---------------------------------------------
      温度  |   < 40   |   40 ~ 50  |   > 50     |
    ---------------------------------------------
    上升过程| 关1,2,3 | 开2,关1,3 | 开1,3,关2 |
    ---------------------------------------------
    下降过程| 关1,2,3 | 开1,3,关2 | 开1,3,关2 |不是很简单么?
      

  3.   


    public void openAndCloseFans(float curTempreture){
        if (curTempreture < 40.0){
            close(1,2,3);
        }else if (curTempreture > 50.0){
            close(2);
            open(1,3);
        }else{
            if (isClosed(1))
               open(2);
            }else{
               close(2);
            }
        }
    }
      

  4.   

    这个程序必然要至少增加一个保存上次检测时的温度值,oldVlaue嘛你说:
    当温度处于上升阶段时,达到40度(含)以上时,要求将2打开,1,3关闭。
    此时,温度可能继续上升(可能风扇散热效果不是太好)我引发了一点点思考:
    既然温度可能继续上升,那么必然也可能保持一致啊,这样的话不就是温度维持阶段吗,如果你只想判断温度是上升还是下降过程,并且在温度可能维持的情况下必须做操作那两种操作中的一种的话,那么你只有这样:如果出现温度保持在40度,那么给一个boolean记录值,轮换着做上升时或者下降时的操作