请问:怎么判断 5 分钟内变量 a 持续大于 b。

请教个问题:变量a、b的值都是通过通讯获取的,现在需求是当 5 分钟内变量 a 持续大于 变量 b,则进行处理。这个需求咋弄。

五分钟内一旦有一次变量 a < b,则时间重新计算

a、b 的值通过 modbus tcp 来自硬件,就是网络通讯直接来自硬件,不是来自数据库。

伪代码:


timestart = 当前时间
while (1)
{
a, b = 从通讯获取
if (a<b && 当前时间-timestart<5分钟) 
    timestart = 当前时间
else if (当前时间-timestart>5分钟)
   处理
}

你参考一下代码


import java.util.HashMap;
import java.util.Map;

public class DataObject {
    private double a;
    private double b;
    private long timestamp;
    private boolean continuousGreater;

    public DataObject(double a, double b) {
        this.a = a;
        this.b = b;
        this.timestamp = System.currentTimeMillis();
        this.continuousGreater = false;
    }

    public void updateData(double a, double b) {
        this.a = a;
        this.b = b;
        long currentTime = System.currentTimeMillis();
        if (a > b) {
            this.timestamp = currentTime;
            this.continuousGreater = true;
        } else {
            if (currentTime - this.timestamp > 5 * 60 * 1000) {
                this.continuousGreater = false;
            }
        }
    }

    public boolean isContinuousGreater() {
        return continuousGreater;
    }
}

public class Main {
    public static void main(String[] args) {
        // 模拟多个对象存储在Map中
        Map<String, DataObject> dataMap = new HashMap<>();
        dataMap.put("Object1", new DataObject(10.0, 5.0));
        dataMap.put("Object2", new DataObject(8.0, 6.0));
        // ...

        // 模拟定时任务,每隔1秒更新对象的数据并进行处理
        Thread task = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000); // 每隔1秒执行一次
                    for (Map.Entry<String, DataObject> entry : dataMap.entrySet()) {
                        DataObject dataObject = entry.getValue();
                        // 模拟从硬件获取最新的a和b的值
                        double a = Math.random() * 10; // 替换为实际获取值的代码
                        double b = Math.random() * 5; // 替换为实际获取值的代码
                        dataObject.updateData(a, b);

                        if (dataObject.isContinuousGreater()) {
                            // 进行处理
                            System.out.println(entry.getKey() + ":a持续大于b");
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        task.start();
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的核心是如何判断变量a在过去5分钟内持续大于变量b。可以通过以下步骤来实现:

    1. 获取变量a和变量b的值: 可以使用网络通讯库,如requests库,向特定的API或服务器发送请求,获取变量a和变量b的值。具体的请求方式和参数需要根据实际情况进行配置,这里提供一个示例代码:
    import requests
    
    def get_variable_value(variable_name):
        url = "http://example.com/api/"
        params = {
            "variable": variable_name
        }
        response = requests.get(url, params=params)
        # 解析响应,获取变量值
        value = response.json()["value"]
        return value
    
    variable_a = get_variable_value("a")
    variable_b = get_variable_value("b")
    
    1. 判断变量a是否持续大于变量b: 可以使用一个变量记录当前的计时器,初始化为0。然后设置一个变量max_duration表示持续大于的最长时间,这里是5分钟。每次获取到变量a和变量b的值后,判断a是否大于b,如果是,则将计时器加上当前获取的时间间隔;如果不是,则将计时器重置为0。如果计时器超过了max_duration,则表示变量a在过去5分钟内持续大于变量b。

    下面是一个示例代码,假设获取变量a和变量b的值的函数已经定义为get_variable_value

    from datetime import datetime, timedelta
    
    def check_variable_a_greater_than_b(max_duration):
        start_time = datetime.now()
        current_time = start_time
        elapsed_time = timedelta()
        while elapsed_time < max_duration:
            variable_a = get_variable_value("a")
            variable_b = get_variable_value("b")
            if variable_a > variable_b:
                elapsed_time = current_time - start_time
            else:
                start_time = current_time
                elapsed_time = timedelta()
            current_time = datetime.now()
        return elapsed_time >= max_duration
    
    is_a_greater_than_b = check_variable_a_greater_than_b(timedelta(minutes=5))
    

    在示例代码中,check_variable_a_greater_than_b函数会在循环中获取变量a和变量b的值,并根据变量的大小比较更新计时器和时间。最后返回计时器是否大于等于最长持续时间。

    这是一个基本的解决方案,根据实际情况可能需要进行适当的修改和优化。如果没有获取变量值的API或服务器,可以根据实际情况修改数据获取方式。同时需要注意处理异常情况,比如网络连接错误等。

    希望以上解决方案能对您有所帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^