风扇开启执行逻辑

执行流程

public static void businessExecutionWork(){
        //以下为业务逻辑部分
        System.out.println("1、根据电池包控制风扇服务执行 开始!");
        //1、获取电池包电压、电流、环境温度
        //获取电池包电压、电流、环境温度
        ObtainBatteryDataService obtainBatteryDataService = new ObtainBatteryDataServiceImpl();
        List<ObtainBatteryBean> sendObtainBatteryData= obtainBatteryDataService.obtainBatteryDataList(BATTERY_ID);

        //2、通过CAN总线发送 CAN信号到总控制系统
        CanChannelUtil canChannelUtil = new CanChannelUtil();
        canChannelUtil.sendObtainBattery(sendObtainBatteryData);
        System.out.println("2、通过CAN总线发送 CAN信号到总控制系统!");


        //3、总控制系统接收CAN信号
        MainCenterBussinessService mainCenterBussinessService = new MainCenterBussinessServiceImpl();
        List<ObtainBatteryBean> receiveObtainBatteryData= canChannelUtil.receiveObtainBattery();

        //4、对电池包电压、电流、环境温度监测
        System.out.println("4、对电池包电压、电流、环境温度监测!");
        boolean status = mainCenterBussinessService.checkBatterystatus(receiveObtainBatteryData);

        //5、根据电池包电压、电流、环境温度控制风扇
        System.out.println("5、根据电池包控制风扇服务执行!");
        if(status){
            //控制风扇打开 打开时间为1分钟!
            mainCenterBussinessService.fanHeatExchanger(true);
        }else{
            mainCenterBussinessService.fanHeatExchanger(false);
        }
        //6、根据电池包控制风扇服务执行 结束
        System.out.println("6、根据电池包控制风扇服务执行 结束!");
    }

监测风扇

public boolean checkBatterystatus(List<ObtainBatteryBean> obtainBatteryBeanList) {
        System.out.println("4.1、检测开始");
        if (obtainBatteryBeanList.size() == 0) {
            return false;
        }
        int i = 0;
        System.out.println("4.1、判断温度、电流、环境温度是否达到临界阀值");
        for (ObtainBatteryBean obtainBatteryBean : obtainBatteryBeanList) {
            if (obtainBatteryBean.getCurrent() > Constants.CURRENT) {
                i++;
                continue;
            }
            if (obtainBatteryBean.getTemperature() > Constants.TEMPERATURE) {
                i++;
                continue;
            }
            if (obtainBatteryBean.getVoltage() > Constants.VOLTAGE) {
                i++;
                continue;
            }
        }
        System.out.println("4.2、估算soc");
        if(i>obtainBatteryBeanList.size()/2){
            System.out.println("4.3、需要预警保护");
            return true;
        }
        System.out.println("4.3、不需要预警保护");
        return false;
    }
临界值配置 配置

/**
 * @desc: 临界值配置 配置
 * @author: langjf
 * @date: 2024/5/6
 */
public class Constants {
    /**
     * 电流阈值
     */
    public static final Double CURRENT = 10D;
    /**
     * 电压阈值
     */
    public static final Double VOLTAGE = 220D;

    /**
     *温度阀值
     */
    public static final Double TEMPERATURE = 80D;

    /**
     * 扇热时间 60秒
     */
    public static final int  HEAT_DISSIPATION_TIME = 60000;

    /**
     * 是否开启扇热
     */
    public static AtomicInteger fanHeatExchanger = new AtomicInteger(0);


    /**
     * 监测周期 5秒
     */
    public static final int MONITORING_CYCLE=5000;

    /**
     * 开启扇热
     */
    public static void fanHeatStart(){
        fanHeatExchanger.addAndGet(1);
        System.out.println("开启扇热");
    }

    /**
     * 关闭扇热
     */
    public static void fanHeatStop(){
        fanHeatExchanger.addAndGet(-1);
        System.out.println("关闭扇热");
    }


    /**
     * 查看开启状态
     * @return
     */
    public static boolean getFanHeatStatus(){
        if(fanHeatExchanger.get()>0){
            System.out.println("当前开启状态为:开启");
            return true;
        }
         System.out.println("当前开启状态为:关闭");
        return false;
    }
}
发送CAN信号
/**
 * @desc:发送CAN信号
 * @author: langjf
 * @date: 2024/5/6
 */
public class CanChannelUtil {

    List<ObtainBatteryBean> beanList=new ArrayList<>();


    /**
     * 发送CAN信号 实际信号值为0101 类型二进制数据流 此处为数据模拟 暂不做处理
     * @param beanList
     */
    public void sendObtainBattery(List<ObtainBatteryBean> beanList){
        this.beanList=beanList;
    }


    /**
     * 接收CAN信号 实际信号值为0101 类型二进制数据流 此处为数据模拟 暂不做处理
     * @return
     */
    public List<ObtainBatteryBean> receiveObtainBattery(){
        return beanList;
    }

}
获取电池包的单体电压 电流 环境温度

/**
 * @desc: 获取电池包的单体电压 电流 环境温度
 * @author: langjf
 * @date: 2024/5/6
 */
public class ObtainBatteryUtil {
    /**
     * 获取电池电流
     * @param batteryId
     * @return
     */
    public static Double getCurrent(String batteryId){
        //system get current 模拟值
        Double current =Math.random()*100;
        return current;
    }

    /**
     * 获取电池电压
     * @param batteryId
     * @return
     */
    public static Double getVoltage(String batteryId){
        //system get voltage 模拟值
        Double voltage =Math.random()*220;
        return voltage;
    }

    /**
     * 获取电池温度
     * @param batteryId
     * @return
     */
    public static Double getTemperature(String batteryId){
        //system get temperature 模拟值
        Double temperature =Math.random()*100;
        return temperature;
    }


    /**
     * 获取电池包中所有电池编码集合 模拟值
     * @return
     */
    public static List<String> getBatteryIdList(){
        //system get batteryIdList 模拟值
        List<String> batteryIdList =new ArrayList<>();
        while (batteryIdList.size()<=10){
            String code="设备"+Math.random()*100;
            if(!batteryIdList.contains(code)){
                batteryIdList.add(code);
            }
        }
        return batteryIdList;
    }
 }
电池数据封装
/**
 * @desc: 电池数据封装
 * @author: langjf
 * @date: 2024/5/6
 */
@Data
public class ObtainBatteryBean {

    /**
     * 电池包ID
     */
    private String batteryId;

    /**
     * 电流
     */
    private Double current;

    /**
     * 电压
     */
    private Double voltage;

    /**
     * 温度
     */
    private Double temperature;
}
得到电池包含的数据 包括电流 电压 温度

/**
 * @desc: 得到电池包含的数据 包括电流 电压 温度
 * @author: langjf
 * @date: 2024/5/6
 */
public class ObtainBatteryDataServiceImpl implements ObtainBatteryDataService {
    @Override
    public ObtainBatteryBean obtainBatteryData(String batteryId) {
        ObtainBatteryBean obtainBatteryBean=new ObtainBatteryBean();
        obtainBatteryBean.setBatteryId(batteryId);
        obtainBatteryBean.setTemperature(ObtainBatteryUtil.getTemperature(batteryId));
        obtainBatteryBean.setCurrent(ObtainBatteryUtil.getCurrent(batteryId));
        obtainBatteryBean.setVoltage(ObtainBatteryUtil.getVoltage(batteryId));
        return obtainBatteryBean;
    }

    @Override
    public List<ObtainBatteryBean> obtainBatteryDataList(String equipment) {
        List<String> batteryIdList=ObtainBatteryUtil.getBatteryIdList();
        List<ObtainBatteryBean> obtainBatteryBeanList=new ArrayList<>();
        batteryIdList.stream().forEach(batteryId -> {
            obtainBatteryBeanList.add(obtainBatteryData(batteryId));
        });
        return obtainBatteryBeanList;
    }


}

执行

public class Main {

    /**
     * 设备ID
     */
    private  static final String BATTERY_ID = "Battery";
    public static void main(String[] args) {


        try {
            while (true){
                //判断风扇是否开启
                System.out.println("判断风扇是否开启");
                Boolean fanHeatStatus = Constants.getFanHeatStatus();
                if(!fanHeatStatus){
                    //未开启 执行电池包检测 业务逻辑
                    businessExecutionWork();
                    //判断是否开启
                    fanHeatStatus = Constants.getFanHeatStatus();
                    if(fanHeatStatus){
                        //风扇开启后60秒后在进行 电池包检测
                        System.out.println("风扇已开启 等待风扇开启60秒 进行扇热");
                        Thread.sleep(Constants.HEAT_DISSIPATION_TIME);
                        System.out.println("风扇已开启60秒,执行关闭风扇;");
                        Constants.fanHeatStop();
                    }
                }
                System.out.println("5秒后继续检测电池包");
                Thread.sleep(Constants.MONITORING_CYCLE);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
           System.out.println("异常中断!");
        }

    }
}

main方法执行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/608979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 怎么将映射出的路径设置为非root用户权限

在Docker中&#xff0c;容器的根文件系统默认是由root用户拥有的。如果想要在映射到宿主机的路径时设置为非root用户权限&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 使用具有特定UID和GID的非root用户运行容器&#xff1a; 在运行容器时&#xff0c;你可以使用-u…

监控异地组网怎么组网?

监控异地组网是指在不同地域的网络环境下&#xff0c;实现对监控设备的远程访问和管理。在传统的网络环境下&#xff0c;由于网络限制和设备配置等问题&#xff0c;监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题&#xff0c;引入了天联组网技术&#xff0c;实…

Mysql幻读

幻读指的是一个事务在前后两次查询同一个范围的时候&#xff0c;后一次查询看到了前一次查询没有看到的行。 幻读仅专指“新插入的行” 在可重复读隔离级别下&#xff0c;普通的查询是快照读&#xff0c;是不会看到别的事务插入的数据的。因此&#xff0c;幻读在“当前读”下…

【JavaEE网络】HTTP/HTTPS协议的工作原理与格式详解

目录 HTTP/HTTPSHTTP是什么理解“应用层协议”理解HTTP协议的工作过程HTTP协议格式 HTTP/HTTPS HTTP是什么 应用层&#xff0c;一方面是需要自定义协议&#xff0c;一方面也会用到一些现成的协议 HTTP及HTTPS是应用层重点协议 使用浏览器&#xff0c;打开网站&#xff0c;这…

自动化运维工具——Ansible

一、Ansible的概念&#xff1a; 1.Ansible的介绍&#xff1a; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以…

OpenHarmony 实战开发(南向)-Docker编译环境搭建

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 基于HPM的Docker…

2024车载测试还有发展吗?

2024年已过接近1/4了,你是不是还在围观车载测试行业的发展? 现在入车载测试还来得及吗? 如何高效学习车载测试呢? 首先我们看一下车载测试行情发展,通过某大平台,我们后去数据如下: 这样的数据可以预估一下未来车载测试还是会持续发展. 随着科技的发展和汽车行业的不断创新,…

第08章 IP分类编址和无分类编址

8.1 本章目标 了解IP地址的用途和种类了解分类编址和无分类编址区别掌握IP地址、子网掩码、网关概念及使用掌握子网划分及超网划分方法掌握无分类编址的改变和使用 8.2 IP地址的用途和种类 分类编址&#xff1a;造成地址的浪费&#xff0c;以及地址不够用&#xff1b;无分类编…

labview技术交流-字符串数组连接成字符串

应用场景 我们可能需要将一维的字符串数组转换成一整条字符串&#xff0c;然后方便记录在数据库或表格中的一个单元格中。 代码展示 方案一 我们使用for循环完成这样的功能需求&#xff0c;见下图&#xff1a; 这种方案可能相对基础和普通&#xff0c;但是它更方便和易于扩展…

在Flask中使用Celery完成异步和定时任务(Flask、Celery、Redis)

编程目标 通过使用Flask和Celery&#xff0c;实现一个简单的Web应用程序&#xff0c;能够接收HTTP POST请求&#xff0c;并异步发送电子邮件。 说明 使用Flask创建一个简单的Web应用程序&#xff0c;包含一个HTTP POST路由&#xff0c;用于接收发送电子邮件的请求。使用Cele…

【Java SE】对象的比较

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容满满干货&#xff0c;将会深入介绍对象与对象之间是如何进行比较的&#xff0c;我们知道基本数据类型是可以直…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具&#xff0c;毕竟是开源了&#xff0c;也是使用 Java 写的嘛&#xff0c;另外一点就是使用 docker 来安装&#xff08;自动挡&#xff0c;不用自己考虑太多的环境因素&#xff09;&#xff0c;这样子搭建起来更快一点&#xff0c;我们…

【STM32 |新建一个工程】基于标准库(库函数)新建工程

目录 STM32开发方式 库函数文件夹 建工程步骤 库函数工程建立 建立工程总结 STM32开发方式 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式&#xff08;库函数的方式&#xff09;、基于HAL库的方式基于库函数的方式是使用ST官方提供的封装好的函数&…

17、线上系统中垃圾回收参数的精准调校指南

17.1、前文回顾 在上一篇文章中,我们已经通过逐步的图解方式,详细解释了CMS垃圾回收的运行机制。简单来说,CMS垃圾回收器采用了四个阶段来进行垃圾回收,以尽量避免长时间的“Stop the World”现象。这四个阶段分别是:初始标记、并发标记、重新标记和并发清理。 在初始标…

AlphaFold 3 可以预测所有生命分子的结构和相互作用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《二十二》Qt 音频编程实战---做一个音频播放器

1.UI界面制作 作为一个音乐播放器&#xff0c;最基础的肯定就是播放、暂停、上一首以及下一首&#xff0c;为了使这个界面好看一点&#xff0c;还加入了音量控制、进度条、歌曲列表等内容&#xff0c;至于这种配色和效果好不好看&#xff0c;我也不知道&#xff0c;个人审美一如…

【Java基础】数学相关的方法

基本方法 Return TypeFunctionDescriptionstatic doublerandom()返回值为 double&#xff0c;值为正号&#xff0c; ≥0.0 <1.0static 数值类型abs(数值类型 a)返回值为a的绝对值static doublepow(double a, double b)将第一个参数的值返回到第二个参数的幂static doublesq…

Taro 快速开始

大家好我是苏麟 , 今天聊聊Trao. 官网 : Taro 介绍 | Taro 文档 (jd.com) 点击快速开始 全局安装 CLI 初始化一个项目 选择配置 : 根据自己需求选择 安装失败先不用管 , 用前端工具打开项目 npm install 安装 , 显示安装失败 怎么解决 ? : 查看报错信息 百度 , 问 AI 工具 运…

第十讲:指针(2)

第十讲&#xff1a;指针&#xff08;2&#xff09; 1.对于数组名的理解1.1验证数组名就是数组首元素的地址1.2sizeof数组名和&数组名1.2.1sizeof数组名1.2.2&数组名 2.使用指针访问数组3.数组传参的本质4.冒泡排序5.二级指针6.指针数组7.指针数组模拟二维数组 这一讲讲…

TODESK怎么查看有人在远程访问

odesk怎么查看有人在远程访问 Todesk作为一款远程桌面控制软件&#xff0c;为用户提供了便捷的远程访问与控制功能。但在享受这种便利的同时&#xff0c;许多用户也关心如何确保自己设备的安全&#xff0c;特别是如何知道是否有人在未经授权的情况下远程访问自己的电脑。本文将…