当前位置: 首页 > 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;那么就登录其用户执行&#…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…...