风扇开启执行逻辑
执行流程
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…...
调用函数实现数组的输入排序插入与输出
输入一串数字,输出排序插入后输出最后的数字序列; 把主要步骤交给主函数,通过调用函数来实现整体的功能: 写出主函数(这里使用冒泡排序): 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. 整数拆分一、动态规划二、贪心(不需要掌握) 96.不同的二叉搜索树一…...
多模态产品在智能文档处理应用的展望------以TextIn模型为例
前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中,合合信息智能…...
上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字
题目描述 给定两个正整数 𝑛n 与 𝑑d ,请找到所有最接近 𝑛n 且是 𝑑d 的倍数的整数。 输入格式 第一行:单个整数表示 𝑛n第二行:单个整数表示 𝑑d 输出格式 若干行…...
RFID在汽车制造中的应用如何改变行业
随着工业4.0和中国制造2025的推进,企业对于智能化、自动化的需求日益增长,RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中,RFID技术可以帮助企业获得竞争优势,简化日益复杂的生产流程,推动企业…...
sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座
4月17日,可一科技特邀美国sCrypt公司的开发工程师周全,在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性,以及智能合约的基本原理,利用“智能家居触发机制”等生动比喻&#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是一种企业服务的消息中间节技术,这种技术常常伴随着企业服务总线相互使用,构成了企业分布式开发的一部分,如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构,则可以考虑使用MQ做消息的中间价技术࿰…...
树莓派nmap扫描
debian系统安装nmap: sudo apt install nmap安装nmap完成后,输入 ip route 来查看当前Wi-Fi路由器的ip地址。 第一行的default via后显示的便是网关地址,也就是路由器地址。 获取到路由器ip地址后,在终端中输入: …...
【必看】Spring系列面试题
Spring Core Container, AOP, Data Access, Web... 基础 1. 简单介绍Spring 一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Pro…...
wordpress增加谷歌分析
wordpress增加谷歌分析 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 http://www.huerpu.cc:7000 一、创建谷歌分析账号与媒体应用 谷歌分析地址:https://analytics.google.com/analytics 创建一个账号,如果你没有的话。 在该账…...
linux的信号量的使用
1.信号量 在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。 …...
C--贪吃蛇
前言 贪吃蛇游戏是一个耳熟能详的小游戏,本次我们讲解他的简单的实现,需要掌握基本的API知识(http://t.csdnimg.cn/uHH6y),简单的C语言知识和基本的数据结构链表 简单的准备工作 蛇的节点 在游戏运⾏的过程中,蛇每次吃⼀个⻝物,蛇的⾝体就会变⻓⼀节&a…...
element ui的确认提示框按钮样式修改
修改确认提示框的默认按钮样式,使用css强制修改 例: js代码: this.$confirm("您确定要删除吗?此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancelButtonClass: "…...
【vue】keep-alive:true缓存导致页面数据不刷新
keep-alive生命周期钩子函数:activated、deactivated activated:页面第一次进入的时候,钩子触发的顺序是created->mounted->activated deactivated: 页面退出的时候会触发deactivated, 当再次前进或者后退的时候只触发acti…...
Golang — map的使用心得和底层原理
map作为一种基础的数据结构,在算法和项目中有着非常广泛的应用,以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得: 1.1 当map为nil和map为空时,增删改查操作时会出现的不同情况 我们可以发现&#…...
Oracle如何收缩减小表空间大小
比如我们发现一个表空间占用比较大,但是空闲空间很大,想要减小表空间占用大小。查看表空间的情况 发现BETEST表空间占用大,但是剩余大小比较大,可以减小存储占用。 如果我们想减小到100MB,那么就登录其用户执行&#…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
