风扇开启执行逻辑

news2024/11/24 13:01:39

执行流程

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方法执行效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个适用于 Vue3.x 非常好用的组件库【Naive UI】

一、Naive UI 介绍 Naive UI 是一种简单易用、不太复杂的用户界面&#xff08;UI&#xff09;框架&#xff0c;主要用于Web应用程序的开发。它提供了超过80个组件&#xff0c;覆盖了表格、表单、弹窗、图表等多个方面&#xff0c;这些组件不仅功能强大&#xff0c;而且高度可定…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录&#xff1a; /tomcat/bin/catalina.sh 添加设置参数&#xff1a; JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

C++可变参数模板类通过递归和特化方式展开

可变参数模版类有2种方式展开参数包&#xff1a;通过继承和通过递归特化。在此只举例一个后着的例子以阐述展开的方式和过程。这些内容其实书上都有&#xff0c;我只是在看《深入C11 代码优化与工程应用》一书中遇到了些困惑&#xff0c;可能书中的写法与我的理解不对版&#x…

【C++历练之路】哈希思想的应用——位图、布隆过滤器

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们使用hash思想学习了哈希表&#xff0c;进行了模拟实现unordered_set与unordered_map。这些都是用hash思想实现出来的数据结构&#xff0c;今天我们来学习一下hash的应用——位图、布隆过滤器。 目…

课题组里有一个卷王是什么体验?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Ansys ACT的一个例子

由XML和IronPython文件组成&#xff0c;文件结构如下&#xff1a; ExtSample.xml <extension version"1" name"ExtSample1"><guid shortid"ExtSample1">2cc739d5-9011-400f-ab31-a59e36e5c595</guid><script src"sam…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类&#xff0c;废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到第五个模块&#xff0c;文件批量复制模块&#xff08;快捷键&#xff1a;Ctrl5&#xff09; 点击右边的“搜索添加”按钮&#…

[muduo网络库]——muduo库三大核心组件之Channel类(剖析muduo网络库核心部分、设计思想)

接着上文[muduo网络库]——muduo库的Reactor模型&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;接下来详细介绍一下这三大核心组件中的Channel类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 Channel Channel类封装了一个 fd 、fd感兴…

onnx模型截取部分

这个是有需求的&#xff0c;比如有多个输入节点&#xff0c;我只用其中几个&#xff0c;或有多个输出节点&#xff0c;我只用其中几个。 比如这个输入&#xff0c;我们可以直接把transpose去掉&#xff0c;用类pytorch的N,C,H,W的格式输入。 还有如下输出&#xff1a; tran…

灵活QinQ

拓扑图 配置 sysname AR1 # interface GigabitEthernet0/0/0.10dot1q termination vid 10ip address 12.1.1.1 255.255.255.0 arp broadcast enable # interface GigabitEthernet0/0/0.20dot1q termination vid 20ip address 21.1.1.1 255.255.255.0 arp broadcast enable # …

LeetCode 题目 120:三角形最小路径和

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…

《QT实用小工具·六十三》QT实现微动背景,界面看似静态实则动态

1、概述 源码放在文章末尾 该项目实现了微动背景&#xff0c;界面看似静态实则动态&#xff0c;风动&#xff0c;幡动&#xff0c;仁者心动&#xff0c;所以到底是什么在动&#xff1f;哈哈~ 界面会偷偷一点一点改动文字颜色的颜色填充。 虽然是动态&#xff0c;但是慢到难以…

羊大师解析,如何遵守《节约用水条例》

羊大师解析&#xff0c;如何遵守《节约用水条例》 《节约用水条例》的实施旨在倡导和推动全社会形成节约用水的良好风尚&#xff0c;以应对日益严峻的水资源短缺问题。羊大师发现随着这一条例的深入实施&#xff0c;越来越多的人开始意识到节约用水的重要性&#xff0c;并积极…

HTML5实现简洁好看的个人主页,个人小站(多种风格附源码)

文章目录 1.烟灰主题个人主页1.1 个人主页界面1.2 个人信息界面1.3 兴趣爱好界面1.4 个人作品界面 2.紫霞主题个人主页2.1 个人主页界面2.2 个人信息界面2.3 兴趣爱好界面2.4 个人作品界面 3.墨夜主题个人主页3.1 个人主页界面3.2 个人信息界面3.3 兴趣爱好界面3.4 个人作品界面…

《小猫咪大城市》 48小时销量破40万套,一匹休闲游戏黑马诞生

易采游戏网5月13日消息&#xff0c;近日一款名为《小猫咪大城市》的游戏在Steam、Switch和Xbox平台上正式发售&#xff0c;凭借其独特的游戏设定和可爱的猫咪角色&#xff0c;迅速赢得了玩家们的喜爱。据官方宣布&#xff0c;游戏在发售后的短短48小时内&#xff0c;销量已经突…

汽车灯罩材料使用PMMA(亚克力)具有哪些优势?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩材料使用PMMA&#xff08;亚克力&#xff09;具有哪些优势 首先&#xff0c;PMMA具有高透明度&#xff0c;其透光率可达92%以上&#xff0c;使得光线能够均匀、清晰地透过灯罩&#xff0c;为驾驶者提供明亮且均匀的照明效果&#xff0c;确保行车安全。 其次&#xff…

JavaEE初阶-多线程进阶1

文章目录 前言一、常见的锁策略1.1 乐观锁与悲观锁1.2 重量级锁与轻量级锁1.3 自旋锁与挂起等待锁1.4 可重入锁与不可重入锁1.5 公平锁与非公平锁1.6 互斥锁与读写锁 二、synchronized的优化策略2.1 锁升级2.2 锁消除2.3 锁粗化 前言 多线程进阶的内容在面试中容易考&#xff…

解决SpringBoot整合MyBatis和MyBatis-Plus,请求后不打印sql日志

问题发现 在整合springBootmyBatis时&#xff0c;发现请求不打印sql日志&#xff0c;示例代码如下&#xff1a; RestController public class MyController {AutowiredProductMapper productMapper;GetMapping("/test")public void test() {System.out.println(&qu…