预警器件控制思考
预警器件控制思考
最小示例思想
当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。
最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件.
如果在一段时间内, 一直是环境异常, 我们那只需要启动一次器件就可以了, 按照上面的方法, 就会一直重复启动器件. 所以我们在启动器件前, 需要判断一下, 器件的状态, 如果要切换状态的话, 那么我们就操作硬件.
(1)当temp > temp_th 时, 当环境刚异常, 并且器件没有启动的时候, 此时我们判断出此状态, 那么我们就启动硬件.
那下一次判断的时候, 环境仍然异常, 但是器件刚才已经启动了, 那么通过判断, 我们就不用启动了.
(2)当temp < temp_th 时, 当环境刚恢复正常时, 并且器件启动的时候, 此时我们判断出此状态, 那么我们就可以关闭硬件了.
那下一次判断的时候, 环境仍然正常, 但是器件刚才已经关闭了, 那么通过判断, 我们就不用重复关闭了.
(3) 所以, 当我们要切换器件状态的时候, 我们首先判断器件当前的状态是否和我们所需一致, 如果一致, 那么我们就不进行切换即可.
(4)最小例程的代码, 是用 red_led 和 blue_led 来存储温湿度应急器件的状态的, 并且这个标志位是和器件io口绑定状态, 我们在操作io口后,我们都要更新这个状态。只是为了避免频繁操作器件,我们在判断预警操作器件的时候,都需要判断当前器件状态,是否已经符合, 如果符合,那么就不操作。我们这里功能不是太复杂,所以就用这种方法来实现。
后续如果加入操作系统的思想的话,尤其是硬件的操作,需要多级容错判断,来保证绝对的安全,这里只做简单分析。
器件状态绑定
我们通过观察发现 ,red_led和 PBout(3)深度绑定, 所以直接新建一个文件, 然后新建一个结构体, 来保存器件的状态, 操作器件开关.
我们先观察下面示例, 然后分析学习, 构建我们的工程:
(1)观察, 这个函数,是操作器件的, 然后每次操作的时候, 都会传入一个status, 就是我们所需的状态,
但是 传入状态并不代表着我们就要频繁操作io口, 因为在一段时间内环境一直异常,我们100ms钟检测一次,当我们检测到异常, 我们就启动器件, 因为要保证预警系统的实时性, 所以下一个100ms检测的时候, 器件已经运行了,我们就无需重复启动了. 所以当我们传入状态后, 想开器件, 就判断一下器件是否已经启动, 如果启动, 就说明在上一个100ms的时候, 就已经启动了,我们这次进入只是为了保证实时性, 从而重复确认.
同理, 关闭器件也一样, 如果我们检测到 环境 从 异常->正常后,
我们就关闭器件,操作io口前, 也同样判断一下, 器件是否已经处于关闭状态, 如果关闭,则无需操作. (注意我们上图运用的是结构体变量, 其函数状态和io口状态深度绑定, 所以通过判断变量,就可以判断出我们所处的状态,从而操作io口)
代码实操:
在加dht11和oled最小例程的基础上,手把手改写代码, 加思路导向
改前的工程:
https://ww0.lanzoul.com/i1jH22680p3a
修改完预警的工程:
https://ww0.lanzoul.com/ihhjp26avqub
失效联系qq:2958360390 回复关键词 最小例程系统预警系统构建
(1) 我们解压打开改之前的工程
(2)然后去锁定预警处理部分的代码
会发现, 我们这里是直接在main函数里面访问temp和humi的, 直接做出预警判断
(3)并且, 和上述说的一样, red_led和 PBout(3) 并没有深度绑定, 所以我们先去 构建一下, 操作器件的函数, 我们构建两个文件一个是temp预警器件, 一个是 humi预警器件。
首先,还和之前一样, 在品字哪里, 新建一个alarm的文件夹, 来存放预警器件的文件, 然后再去add, 逐个创建文件, 我们起名, temp_led.c 和 temp_led.h , humi_led.c和 humi_led.h吧。
详细步骤:(为了避免篇幅过长)
https://blog.csdn.net/qq_57484399/article/details/140862473
(4)如下图,我们先做temp_led.c的预警,
这里我们不谈c语言格式, 只谈随心写代码, 甚至我们可以用中文来代替, 至于格式问题, 是编译器和al的事情, 我们只谈逻辑.
(5)先看之前原始的预警的时候, 操作器件的时候, 是怎么操作的
我们是先判断状态, 让着当状态切换的时候, 我们才操作器件.
但是这些好像和我们用户没什么关系, 我们用户, 只是想, 在报警的时候, 你操作器件就行了, 至于启动不启动器件, 是我们底层控制启动器件的代码通过判断, 才做的事情, 所以, 我们此处进行替换.
(6)至于启动不启动器件, 是函数内部通过判断器件是否处于运行状态, 才操作io口的.我们这里复制 temp_led_Set, 然后直接跳转temp_led.c函数
(7)看到这个是传入的状态, 所以我们还得给led_red绑定一个结构体状态, 通过调用判断这个状态, 再确定是否需要操作io口,
我们去temp_led.h去定义状态结构体
#define red_led_ON 1#define red_led_OFF 0typedef struct
{_Bool red_led_Status;} TEMP_ALARM_INFO;
(8)定义完, 之后, 去temp_led.c里面去创建一个temp_alarm_info的变量, 然后 再去构造函数. 相当于定一个了一个状态了
TEMP_ALARM_INFO temp_info = {0};
(9) 然后我们接着构造控制函数
传入的状态, 我们修改为 _Bool status
void temp_led_Set(_Bool status)
{}
(10)还是根据流程图所示, 我们传入的状态, 就是我们想要的状态, 目前如果 机器是此状态, 我们就跳过不操作io口, 相当于我们切换状态的时候, 我们才操作io口
(11)直接上代码, 如果需要开预警设备, 并且当前状态不是开,则操作io口
如果需要关应急设备, 并且当前状态不是关,则操作io口.
(为什么要判断切换状态呢? 因为我们并不能确保这是 第一次从正常->应急, 或者从应急->预警, 第一次操作,当然可以直接操作io口, 因为在一段时间内, 我们只需要操作一次io口,就行了, 但是为了保证实时性, 我们会一直操作判断器件状态, 从而达到实时性, 后续我们采用操作系统思想解决, 我们这里比较简单粗暴.)
下面我把完善的代码奉上, 请直接复制黏贴即可
temp_led.c
//单片机头文件
#include "stm32f10x.h"#include "temp_led.h"
#include "sys.h"TEMP_ALARM_INFO temp_info = {0};void temp_led_Init(void)
{//初始化小灯, PB3(温度) PB4(湿度) PB5(烟雾浓度)GPIO_InitTypeDef GPIO_InitStructure;//开启硬件时钟 PB5/* GPIOD Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//禁用JTAGD端口GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //配置 pB 3 4 5 GPIO工作模式(推挽输出)/* Configure PD0 and PD2 in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口//控制端口寄存器GPIO输出电平PBout(3) = 0;//temp_led } void temp_led_Set(_Bool status)
{if(status == red_led_ON && temp_info.red_led_Status != red_led_ON) {//操作小灯开PBout(3) = 1;//temp_led//状态设置为开temp_info.red_led_Status = status;}elseif(status == red_led_OFF && temp_info.red_led_Status != red_led_OFF){//操作小灯关PBout(3) = 0;//temp_led//状态设置为关temp_info.red_led_Status = status;}
}
temp_led.h
#ifndef _TEMP_LED_H_
#define _TEMP_LED_H_#define red_led_ON 1#define red_led_OFF 0typedef struct
{_Bool red_led_Status;} TEMP_ALARM_INFO;extern TEMP_ALARM_INFO temp_info;void temp_led_Init(void);
void temp_led_Set(_Bool status);#endif
humi_led.c
//单片机头文件
#include "stm32f10x.h"#include "humi_led.h"
#include "sys.h"HUMI_ALARM_INFO humi_info = {0};void humi_led_Init(void)
{//初始化小灯, PB3(温度) PB4(湿度) PB5(烟雾浓度)GPIO_InitTypeDef GPIO_InitStructure;//开启硬件时钟 PB5/* GPIOD Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//禁用JTAGD端口GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //配置 pB 3 4 5 GPIO工作模式(推挽输出)/* Configure PD0 and PD2 in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口//控制端口寄存器GPIO输出电平PBout(4) = 0;//humi_led } void humi_led_Set(_Bool status)
{if(status == blue_led_ON && humi_info.blue_led_Status != blue_led_ON) {//操作小灯开PBout(4) = 1;//blue_led//状态设置为开humi_info.blue_led_Status = status;}elseif(status == blue_led_OFF && humi_info.blue_led_Status != blue_led_OFF){//操作小灯关PBout(4) = 0;//blue_led//状态设置为关humi_info.blue_led_Status = status;}
}
humi_led.h
#ifndef _HUMI_LED_H_
#define _HUMI_LED_H_#define blue_led_ON 1#define blue_led_OFF 0typedef struct
{_Bool blue_led_Status;} HUMI_ALARM_INFO;extern HUMI_ALARM_INFO humi_info;void humi_led_Init(void);
void humi_led_Set(_Bool status);#endif
main.c
#include "stm32f10x.h" // Device header
#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "OLED.h"#include "humi_led.h"
#include "temp_led.h"uint8_t temp; //读取的环境温度
uint8_t humi; //读取的环境湿度uint8_t temp_th; //设置的温度阈值
uint8_t humi_th; //设置的湿度阈值_Bool red_led; //(温度指示灯)_Bool blue_led; //(湿度指示灯)_Bool set_limit; //管理员是否设置阈值led小灯初始化
//void led_init(void);int main()
{unsigned short timeCount = 0; //发送间隔变量//手动设置环境温度(模拟上帝)temp = 66; //温度是28度humi = 60; //湿度是60% //手动设置阈值(代替远程)temp_th = 30; //温度阈值是30度humi_th = 60; //湿度阈值是60%//小灯状态初始化red_led = 0;blue_led = 0; //测试变量: 管理设置阈值符号位set_limit = 1;
// //小灯初始化
// led_init();//滴答定时器Delay_Init();//dht11初始化DHT11_Init();
// while(DHT11_Init())
// {
printf("DHT11 Error \r\n");
// OLED_ShowString(0,48, "DHT11 Error", 8);
// OLED_Update();
// DelayMs(2000);
// }//oled初始化OLED_Init();humi_led_Init();temp_led_Init();while(1){//(1)设置环境信息阈值(手动输入代替远程控制)if(set_limit == 1){temp_th = 29;humi_th = 88;//设置完阈值就清零,下次不设置了, 直到set_limit被管理员置1//然后再次进入此功能函数里,进行设置阈值set_limit = 0;}//(2)读取环境信息 (手动输入代替器件读取)//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担if(++timeCount >= 10){DHT11_Read_Data(&temp,&humi);
// temp = 99; //人手输入,代替器件,忽略底层,重视逻辑
// humi = 99; OLED_Clear();OLED_ShowChinese(0, 0, "温度");OLED_ShowChinese(0, 24, "湿度:");OLED_Printf(48,0,OLED_8X16,"%2d",temp);OLED_Printf(48,24,OLED_8X16,"%2d",humi); OLED_ShowChinese(80,0 , "℃");OLED_ShowChinese(80,24 , "%"); OLED_Update();timeCount = 0; //从新计时` }DelayXms(10); //10*10 = 100ms//后面跟 1ms的延时, 我们一切从简,先留着//(3)每时每刻判断环境信息是否异常if(temp >= temp_th){//启动器件temp_led_Set(red_led_ON);}else //同理,环境正常时候{ temp_led_Set(red_led_OFF);} //判断湿度是否报警//每时每刻判断环境信息是否异常if(humi >= humi_th){humi_led_Set(blue_led_ON);// if(blue_led == 0) //如果是关闭状态则启动,开启则无操作
// {
// blue_led = 1;
// PBout(4) = 1;
// }}else //同理,环境正常时候{humi_led_Set(blue_led_OFF);
// if(blue_led == 1) //如果是开启状态则启动,关闭则无操作
// {
// blue_led = 0;
// PBout(4) = 0;
// } } } }///**************************************************
//函数名: led_init
//功 能: 温湿度,烟雾浓度小灯初始化
//参 数: 无
//配置参数: PB3(温度) PB4(湿度) PB5(烟雾浓度)
// 推挽输出
// 小灯正极接io口, 负极接地
//返回值: 无
//**************************************************/
//void led_init(void)
//{
// //初始化小灯 , PB3(温度) PB4(湿度) PB5(烟雾浓度)
// GPIO_InitTypeDef GPIO_InitStructure;
// //开启硬件时钟 PB5
// /* GPIOD Periph clock enable */
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// //开启AFIO时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// //禁用JTAGD端口
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
// //配置 pB 3 4 5 GPIO工作模式(推挽输出)
// /* Configure PD0 and PD2 in output pushpull mode */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口// //控制端口寄存器GPIO输出电平
// PBout(3) = 0;//temp_led
// PBout(4) = 0; //humi_led
PBout(5) = 0; //mq2_led
//
//}
相关文章:
预警器件控制思考
预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…...
[Day 43] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的隱私保護機制 隨著區塊鏈技術的廣泛應用,隱私保護成為了一個至關重要的問題。區塊鏈以其去中心化和透明性的特點,為數據管理和交易提供了新的方法。然而,這些特點也帶來了新的挑戰,尤其是在隱私保護方面。本文將深入探討…...
【星海随笔】路由器的启动过程
路由器的启动过程 1.加电之后,ROM运行加电自检程序(Post),检查路由器的处理器、接口、内存等硬件设备。2.执行路由器中的启动程序(Bootstrap),搜索操作系统。路由器操作系统扩张部分可以从Flash RAM中装入,也可从 TFT…...
[翻译] Asset Administration Shells
关于资产管理外壳 (AAS) 资产管理外壳 (AAS) 是工业4.0中的关键概念,为产品、资源(如设备)和过程提供信息隐藏和更高层次的抽象。AAS 是技术和设备无关的机器可读描述,提供访问资产属性和功能的统一接口。与现有解决方案不同&…...
linux 常用磁盘维护命令
badblocks 功能说明:检查磁盘装置中损坏的区块。 语 法:badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块] 补充说明:执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。…...
滑动窗口大总结!!!妈妈以后再也不担心我不会做滑动窗口啦~
写在前面:全部题都源于力扣 讲解题目一:最小覆盖子串题目二:字符串排列题目三:找所有字母异位词题目四:无重复字符的最长子串题目五:滑动窗口的最大值 讲解 滑动窗口算法技巧主要用来解决子数组问题&#…...
从地铁客流讲开来:客流统计与清分释义
一、常见的客流统计 1. 进站客流 定义:指在某个时间段内,乘客进入地铁站的数量。示例:如果某天早上8点到9点之间有5000人次进入地铁站,则这段时间内的进站客流为5000人次。 2. 出站客流 定义:指在某个时间段内&…...
《Excelize权威指南》新书发布
在数据洪流涌动的数字化时代,数据处理与分析已跃升为解锁无限洞察力的金钥匙,赋能商业智慧、重塑医疗健康版图、驱动教育科研创新。然而,当数据量级爆炸式增长,传统工具如 Excel 虽被誉为数据处理领域的常青树,其手动操…...
Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
【设计模式】代理模式详解
1.简介 代理模式是常用的Java设计模式,该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类,并在事后处理消息等。代理类与委托类之间通常存在关联关系,一个代理类对象与一个委托类对象关…...
Python变量和简单的数据类型
1、变量 massageHello python world! print(massage) massageHello world print(massage) 运行这个代码发现,同一个变量出现两个不同的结果 Hello python world! Hello world 在程序中,可随时修改变量的值&…...
切比雪夫距离
切比雪夫距离(Chebyshev Distance),又称棋盘距离或最大值距离,是一种用于测量两个点之间距离的度量方法。在二维平面上,切比雪夫距离定义为两个点之间的最大坐标差值。其公式如下: DChebyshevmax(∣x2−…...
计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(下)
第4章 计算机网络与Internet 4.4 局域网4.4.1 局域网概述4.4.2 以太网4.4.3 令牌环网4.4.4 无线局域网 4.5 Internet4.5.1 Internet 概述4.5.2 Internet 的基本概念4.5.3 Internet 的接入4.5.4 万维网 4.6 Internet的应用4.6.1 电子邮件4.6.2 文件传输4.6.3 搜索引擎 4.4 局域网…...
机器学习用Python还是R?哪个更好一些?
选择使用Python还是R来进行机器学习取决于多个因素,包括个人偏好、项目需求以及可用的资源。这里我可以简要比较一下它们的优缺点: Python的优势: 通用性和灵活性: Python是一种通用编程语言,可以用于多种用途&#…...
4个自定义倒计时
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>4个自定义倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}hea…...
linux系统编程中Shell脚本配置,及linux脚本中的man test
Shell脚本配置是指在脚本中设置各种参数、选项和环境,以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。 1. 脚本开头的配置 Shebang 第一行通常是shebang,它告诉系统使用哪个解释器来执行脚本。例如…...
Win7虚拟机分享(已安装VMware Tools)
前言 之前写过VMware安装Win7并安装VMware tools的博客,但操作仍显繁琐。后来发现可以直接分享已经配置好的虚拟机,所有软件都是安装好的,解压即用。 一. VMware Win7虚拟机配置 已完成的配置和安装的软件 专业版Win7系统(已永久激活)VMware…...
CANOpen EMCY紧急报文介绍
什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时,向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时,就可以发送紧急报文。 紧急报文的格式 错误代码:是0x1003索引预定义错误字段的内容ÿ…...
JAVA项目
目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导,获取源码后台 一、前言 在数字化音乐时代,个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此࿰…...
️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)
引言:种下一棵树最好的时间是十年前,其次是现在 书接上回:将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的:在这个大模型横行的时候,我们常用电脑如何开展大模型的工作…...
Kafka实战(Scala操作)
Kafka基础讲解部分 Kafka基础讲解部分 Kafka实战(Scala操作) 1、引入依赖 版本: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.report…...
Android Framework 之WMS详解
1.WMS说的就是 WindowManagerService:负责为Activity对应的窗口分配Surface,管理Surface的显示顺序以及位置尺寸,控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各…...
opencv-图像仿射变换
仿射变换设计图像位置角度的变化,是深度学习预处理中常用的功能。仿射变换就是对图像的平移缩放旋转翻转操作的组合 如下图,对图中点1,2,3与图二中三个点一一映射,仍然形成三角形,但形状已经发生改变,通过这两组三点求…...
算法的基本概念
一、算法的基本概念思维导图 二、什么是算法: 1.我们知道数据结构就是将我门现实的世界中的问题数据化,存入计算机中,并实现对数据结构的一些基本操作。 2.算法就是如何处理这些存入计算机中的信息,以求高效的解决实际问题。 3…...
124. Go Template应用实例:用代码生成代码
文章目录 生成器模式生成器代码生成 本文用生成器模式作为例子,来演示如何用代码生成代码。 生成器模式 熟悉 Java 开发的同学都知道,lombok 有一个著名的注解 Builder ,只要加在类上面,就可以自动生成 Builder 模式的代码。如下…...
【AI实践】阿里云方言文本转语音TTS
最近要做一些普通话和方言demo 找一个免费工具 免费在线文字转语音工具 | edge-tts 在线体验 (bingal.com) 还有一些方言在阿里云上找了下,基于官方demo改了一下 阿里云语音合成接口说明_智能语音交互(ISI)-阿里云帮助中心 (aliyun.com) 如何下载安装、使用语音…...
java 之 各类日期格式转换
一、前言 大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换! 从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时…...
Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾
在今年的SIGGRAPH图形大会上,Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学,还发布了不少新产品,并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…...
【JAVA设计模式】适配器模式——类适配器模式详解与案例分析
前言 在软件设计中,适配器模式(Adapter Pattern)是一种结构型设计模式,旨在使不兼容的接口能够协同工作。它通过引入一个适配器类,帮助两个接口之间进行适配,使得它们能够互相操作。本文将详细介绍适配器模…...
【Vue】全局组件和局部组件
一、全局组件 定义: 全局组件是在整个Vue应用中都可以使用的组件。它们被注册在Vue的根实例上,因此可以在任何子组件的模板中被引用,而无需在每个组件中重复注册。 注册方式: 全局组件通过Vue.component方法进行注册。这个方法接…...
个人网站空间申请/惠州seo按天计费
测试下...
易语言做网站登录/google官网下载
联想yoga 14s 2021款是联想旗下10月最新上市的一款笔记本,很多朋友在问联想yoga 14s 2021款怎么样?适合做什么?值得买吗?下面一起从价格,屏幕配置,散热续航和接口方面进行详细解读一下,看看这款…...
男人和女人做av网站/数据分析报告
javascript 到 Flash的通信----使用Flash播放器的javascript方法Flash 到 javascript的通信----使用Flash的fscommandFlash 到 Flash的通信----------使用本地连接对象或综合上2种技术1.建立flasha.用文字工具在舞台上创建一个文本域b.选择这个文本域,在属性面板中,从下拉列表中…...
网站正在建设中 自拍/关键词推广优化排名如何
用eclipse的maven工具打包(执行mvn clean install 和 mvn package)后,再启动wildfly, war包应该会自动复制到wildfly的deployments目录下, 可是经常发现deployments目录下的war包少了许多class文件,而maven项目下的war包没有…...
wordpress安装后后台无css/seo平台有哪些
下载DevExpress v20.2完整版 上DevExpress中文网,获取第一手最新产品资讯! DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任&am…...
河南做酒店网络系统网站/h5下一页
QM[zm]04.16 网络共享数据之数据库权限(VIP)小知识:简单的限制同名设备登陆功能 实现思路每次某个设备登陆 就把登陆设备的设备Id上传接口 接口在数据库里面查找对应的设备 找到字段是否已运行为1 当该设备脚本停止 就给接口传送一个信息 让该字段为-1 但是这会涉及…...