当前位置: 首页 > news >正文

风扇开启执行逻辑

执行流程

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 {@Overridepublic 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;}@Overridepublic 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方法执行效果

相关文章:

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…...

调用函数实现数组的输入排序插入与输出

输入一串数字&#xff0c;输出排序插入后输出最后的数字序列&#xff1b; 把主要步骤交给主函数&#xff0c;通过调用函数来实现整体的功能&#xff1a; 写出主函数&#xff08;这里使用冒泡排序&#xff09;&#xff1a; int main(){int n;int a[10];cin>>n;inputa(a…...

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树 文章目录 代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树343. 整数拆分一、动态规划二、贪心&#xff08;不需要掌握&#xff09; 96.不同的二叉搜索树一…...

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中&#xff0c;合合信息智能…...

上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字

题目描述 给定两个正整数 &#x1d45b;n 与 &#x1d451;d &#xff0c;请找到所有最接近 &#x1d45b;n 且是 &#x1d451;d 的倍数的整数。 输入格式 第一行&#xff1a;单个整数表示 &#x1d45b;n第二行&#xff1a;单个整数表示 &#x1d451;d 输出格式 若干行…...

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进&#xff0c;企业对于智能化、自动化的需求日益增长&#xff0c;RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中&#xff0c;RFID技术可以帮助企业获得竞争优势&#xff0c;简化日益复杂的生产流程&#xff0c;推动企业…...

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…...

pc端的鼠标箭头变换

<div style"cursor:pointer"></div>...

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…...

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置 背景: 接上文:https://www.uu2id.com/827.html 付费组件在以下几个地方会弹出:1)文章隐藏内容付费;2)付费资源下载;3…...

MSMQ消息队列

MQ是一种企业服务的消息中间节技术&#xff0c;这种技术常常伴随着企业服务总线相互使用&#xff0c;构成了企业分布式开发的一部分&#xff0c;如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构&#xff0c;则可以考虑使用MQ做消息的中间价技术&#xff0…...

树莓派nmap扫描

debian系统安装nmap&#xff1a; sudo apt install nmap安装nmap完成后&#xff0c;输入 ip route 来查看当前Wi-Fi路由器的ip地址。 第一行的default via后显示的便是网关地址&#xff0c;也就是路由器地址。 获取到路由器ip地址后&#xff0c;在终端中输入&#xff1a; …...

【必看】Spring系列面试题

Spring Core Container, AOP, Data Access, Web... 基础 1. 简单介绍Spring 一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。Spring 支持 IoC&#xff08;Inversion of Control:控制反转&#xff09; 和 AOP(Aspect-Oriented Pro…...

wordpress增加谷歌分析

wordpress增加谷歌分析 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客 http://www.huerpu.cc:7000 一、创建谷歌分析账号与媒体应用 谷歌分析地址&#xff1a;https://analytics.google.com/analytics 创建一个账号&#xff0c;如果你没有的话。 在该账…...

linux的信号量的使用

1.信号量 在多线程情况下&#xff0c;线程要进入关键代码就得获取信号量&#xff08;钥匙&#xff09;{sem_init(&sem, 0, 0);}&#xff0c;没有信号量的情况下就一直等待sem_wait(&sem)&#xff0c;只到别人把钥匙&#xff08;sem_post(&sem)&#xff09;给你。 …...

C--贪吃蛇

前言 贪吃蛇游戏是一个耳熟能详的小游戏,本次我们讲解他的简单的实现,需要掌握基本的API知识(http://t.csdnimg.cn/uHH6y),简单的C语言知识和基本的数据结构链表 简单的准备工作 蛇的节点 在游戏运⾏的过程中&#xff0c;蛇每次吃⼀个⻝物&#xff0c;蛇的⾝体就会变⻓⼀节&a…...

element ui的确认提示框按钮样式修改

修改确认提示框的默认按钮样式&#xff0c;使用css强制修改 例&#xff1a; js代码&#xff1a; this.$confirm("您确定要删除吗&#xff1f;此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancelButtonClass: "…...

【vue】keep-alive:true缓存导致页面数据不刷新

keep-alive生命周期钩子函数&#xff1a;activated、deactivated activated&#xff1a;页面第一次进入的时候&#xff0c;钩子触发的顺序是created->mounted->activated deactivated: 页面退出的时候会触发deactivated&#xff0c; 当再次前进或者后退的时候只触发acti…...

Golang — map的使用心得和底层原理

map作为一种基础的数据结构&#xff0c;在算法和项目中有着非常广泛的应用&#xff0c;以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得&#xff1a; 1.1 当map为nil和map为空时&#xff0c;增删改查操作时会出现的不同情况 我们可以发现&#…...

Oracle如何收缩减小表空间大小

比如我们发现一个表空间占用比较大&#xff0c;但是空闲空间很大&#xff0c;想要减小表空间占用大小。查看表空间的情况 发现BETEST表空间占用大&#xff0c;但是剩余大小比较大&#xff0c;可以减小存储占用。 如果我们想减小到100MB&#xff0c;那么就登录其用户执行&#…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...