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

西门子PLC结构化编程_水处理系统水泵多备多投

文章目录

  • 前言
  • 一、功能概述
  • 二、程序编写
    • 1. 需求分析
    • 2. 编写运行时间累计功能块
    • 3. 创建自定义数据类型
      • 1. 时间排序数据类型
      • 2. 多备多投数据类型
      • 3. 多备多投切换数据类型
    • 4. 编程
      • 1. 创建DB数据块
        • 1. 多备多投数据块
        • 2. 多备多投切换数据块
      • 2. 创建FB功能块
  • 三、程序调用
  • 总结


前言

在之前的文章中,我们讨论了通过SCL语言实现电机主备互投《西门子PLC常用底层逻辑块分享_电机主备互投》,和多台电机按时间排序均衡运行《电机主备互投功能优化_多台设备均衡运行》的方法。
但实际现场中,经常会遇见4用1备、3用2备、2用2备、2用3备等复杂情况,如果对每种情况分别编程,会使程序过于冗杂,故本文提供一种多备多投的实现方法,假设现场有5台水泵,可根据现场要求,自由选择主动泵数量和备用泵数量,实现主备泵自由切换。


一、功能概述

假设有5台水泵,5台水泵的运行逻辑如下:

  1. 具有以下几种情况:4用1备、2用2备、2用3备、3用2备、1用1备、1用4备等任意组合;
  2. 主泵同时启动,触发切换命令后,按照运行时间由小到大的顺序切换备用泵或主泵;
  3. 每台水泵都有故障信号,当某台泵出现故障或运行信号丢失时,能自动切换到其它泵;
  4. 故障出现后,水泵的运行时间需要保持不变,不能丢失;
  5. 每台水泵有3种状态:1. 作为主泵;2. 作为备用泵;3. 不投用;
  6. 有故障的水泵自动停止,并且不允许启动,直到故障解除;
  7. 可选择投用或不投用“多备多投”功能。

二、程序编写

1. 需求分析

  1. 参考文章《电机主备互投功能优化_多台设备均衡运行》的思路,根据5台电机的运行时间,计算出由小到大对应的序号,遍历1-5,每次启动都启动序号1对应的电机;
  2. 当水泵处于故障状态、不投用状态、运行状态时,可将该水泵的运行时间设置为最大值,即可跳过该水泵,启动下一台。

2. 编写运行时间累计功能块

可参考文章西门子PLC常用底层逻辑块分享_设备运行时间统计。
根据该文章可编写FC块“运行时间累计”,并新建数据类型“时钟”。具体步骤这里不再赘述。

3. 创建自定义数据类型

1. 时间排序数据类型

在这里插入图片描述
图1

2. 多备多投数据类型

在这里插入图片描述
图2

3. 多备多投切换数据类型

在这里插入图片描述
图3

4. 编程

1. 创建DB数据块

1. 多备多投数据块

在这里插入图片描述

图4

2. 多备多投切换数据块

在这里插入图片描述
图5

2. 创建FB功能块

新建FB块“水泵多备多投”,添加如下变量。
在这里插入图片描述
图6
编写如下程序:

REGION 功能已启用、已停止IF #PumpSwitch.StaCmd THEN#PumpSwitch.Running := 1;ELSIF#PumpSwitch.StpCmd THEN#PumpSwitch.Running := 0;END_IF;END_REGIONREGION 调用程序"运行时间累计"(Start := #PumpControl[1].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[1].RunTime);"运行时间累计"(Start := #PumpControl[2].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[2].RunTime);"运行时间累计"(Start := #PumpControl[3].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[3].RunTime);"运行时间累计"(Start := #PumpControl[4].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[4].RunTime);"运行时间累计"(Start := #PumpControl[5].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[5].RunTime);END_REGIONREGION 计算运行时间FOR #PumpSwitch.N[0] := 1 TO 5 DO#PumpSwitch.Set[#PumpSwitch.N[0]]."Time" :=#PumpControl[#PumpSwitch.N[0]].RunTime.Day * 86400 +#PumpControl[#PumpSwitch.N[0]].RunTime.Hour * 60 * 60 +#PumpControl[#PumpSwitch.N[0]].RunTime.Min * 60 +#PumpControl[#PumpSwitch.N[0]].RunTime.Second; // 程序判断用时间#PumpSwitch.TimeOut[#PumpSwitch.N[0]] := #PumpSwitch.Set[#PumpSwitch.N[0]]."Time"; // 实际显示时间END_FOR;END_REGIONREGION 计算主泵、备泵、运行泵数量#NumMinPump := 0;FOR #PumpSwitch.N[1] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[1]].ControlWord = 1 THEN#NumMinPump := #NumMinPump + 1;END_IF;END_FOR;#PumpSwitch.NumMinPump := #NumMinPump; // 计算主泵数量#NumBackupPump := 0;FOR #PumpSwitch.N[2] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[2]].ControlWord = 2 THEN#NumBackupPump := #NumBackupPump + 1;END_IF;END_FOR;#PumpSwitch.NumBackupPump := #NumBackupPump; // 计算备泵数量#NumRun := 0;FOR #PumpSwitch.N[3] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[3]].Run THEN#NumRun := #NumRun + 1;END_IF;END_FOR;REGION 泵切换命令IF #NumRun < #PumpSwitch.#NumRun THEN#SwitchPump := 1;ELSE#SwitchPump := 0;END_IF;#SwitchPumpR_TRIG(CLK := #SwitchPump); // 如果此刻运行泵数量小于上一时刻运行泵数量,则说明有泵停机,触发泵切换信号END_REGION#PumpSwitch.#NumRun := #NumRun; // 计算运行泵数量REGION 运行泵数量不足报警IF (#PumpSwitch.#NumRun < #PumpSwitch.NumMinPump) AND #PumpSwitch.Running THEN#PumpSwitch.NumFlt := 1;ELSE#PumpSwitch.NumFlt := 0;END_IF;END_REGIONEND_REGIONREGION 无设备运行时,复位启动命令IF #PumpSwitch.#NumRun = 0 THENFOR #PumpSwitch.N[6] := 1 TO 5 DO#PumpSwitch.Pump[#PumpSwitch.N[6]] := 0;END_FOR;END_IF;END_REGIONREGION 故障停机FOR #PumpSwitch.N[12] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[12]].Flt OR(#PumpControl[#PumpSwitch.N[12]].ControlWord = 3)THEN#PumpSwitch.Pump[#PumpSwitch.N[12]] := 0;END_IF;END_FOR;END_REGIONREGION 按时间顺序计算序号REGION 故障处理FOR #PumpSwitch.N[8] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[8]].Flt OR(#PumpControl[#PumpSwitch.N[8]].ControlWord = 3) OR#PumpControl[#PumpSwitch.N[8]].RunTHEN#PumpSwitch.Set[#PumpSwitch.N[8]]."Time" := 4294967295; // UDInt的最大值为4294967295END_IF;END_FOR; // 将故障泵和没有投用和正在运行的泵时间设为最大值END_REGION// 初始化序号数组FOR #PumpSwitch.I := 1 TO 5 DO#PumpSwitch.Set[#PumpSwitch.I].Sequence := 1; // 初始序号为1END_FOR;// 计算每个元素的序号FOR #PumpSwitch.I := 1 TO 5 DOFOR #PumpSwitch.J := 1 TO 5 DOIF #PumpSwitch.Set[#PumpSwitch.J]."Time" < #PumpSwitch.Set[#PumpSwitch.I]."Time" THEN#PumpSwitch.Set[#PumpSwitch.I].Sequence := #PumpSwitch.Set[#PumpSwitch.I].Sequence + 1; // 遇到更小的数,序号增加ELSIF(#PumpSwitch.Set[#PumpSwitch.J]."Time" = #PumpSwitch.Set[#PumpSwitch.I]."Time") AND (#PumpSwitch.J < #PumpSwitch.I) THEN#PumpSwitch.Set[#PumpSwitch.I].Sequence := #PumpSwitch.Set[#PumpSwitch.I].Sequence + 1; // 处理相同数值的情况,按顺序递增序号END_IF;END_FOR;END_FOR;FOR #PumpSwitch.N[13] := 1 TO 5 DO// 将启动顺序放入存储区,便于上位机显示#PumpSwitch.SequenceOut[#PumpSwitch.N[13]] := #PumpSwitch.Set[#PumpSwitch.N[13]].Sequence;END_FOR;END_REGIONREGION 根据时间顺序切换IF NOT #PumpSwitch.StpCmd THENCASE #PumpSwitch.Step OF0:IF #PumpSwitch.StaCmd AND #PumpSwitch.EnSwitch THEN#PumpSwitch.Step := 1;END_IF;#PumpSwitch.Pump[1] := 0;#PumpSwitch.Pump[2] := 0;#PumpSwitch.Pump[3] := 0;#PumpSwitch.Pump[4] := 0;#PumpSwitch.Pump[5] := 0;1:FOR #PumpSwitch.N[7] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[7]].ControlWord = 1 THEN#PumpSwitch.Pump[#PumpSwitch.N[7]] := 1;END_IF;END_FOR; // 所有主泵同时启动#PumpSwitch.Step := 2;2:REGION 触发泵切换命令IF #SwitchPumpR_TRIG.Q AND #PumpSwitch.EnSwitch THENFOR #PumpSwitch.N[9] := 1 TO 5 DOIF (#PumpSwitch.SequenceOut[#PumpSwitch.N[9]] = 1) ANDNOT #PumpControl[#PumpSwitch.N[9]].Flt ANDNOT #PumpControl[#PumpSwitch.N[9]].Run ANDNOT (#PumpControl[#PumpSwitch.N[9]].ControlWord = 3) THENEXIT; // 找到启动顺序为1对应的泵的序号#PumpSwitch.N[9]END_IF;END_FOR;#PumpSwitch.Pump[#PumpSwitch.N[9]] := 1;END_IF;END_REGIONEND_CASE;ELSE#PumpSwitch.Pump[1] := 0;#PumpSwitch.Pump[2] := 0;#PumpSwitch.Pump[3] := 0;#PumpSwitch.Pump[4] := 0;#PumpSwitch.Pump[5] := 0;#PumpSwitch.N[9] := 0;#PumpSwitch.Step := 0;#PumpSwitch.EnSwitch := 0;END_IF;END_REGIONREGION 赋值FOR #PumpSwitch.N[11] := 1 TO 5 DOIF #PumpSwitch.Clear THEN#PumpControl[#PumpSwitch.N[11]].RunTime.Clear := 1;ELSE#PumpControl[#PumpSwitch.N[11]].RunTime.Clear := 0;END_IF;END_FOR;IF NOT "AlwaysFALSE" THEN#PumpSwitch.StaCmd := 0;#PumpSwitch.StpCmd := 0;#PumpSwitch.Clear := 0;END_IF;END_REGION

三、程序调用

在主程序中调用FB块“水泵多备多投”。
在这里插入图片描述
图7
程序分析:

  1. 实际应用时,#PumpControl[1].Run - #PumpControl[5].Run关联水泵1 - 5的运行反馈信号,#PumpSwitch.Pump[1] - #PumpSwitch.Pump[5]关联水泵1 - 5的启动命令,#PumpControl[1].Flt - #PumpControl[5].Flt关联水泵1 - 5的故障信号;
  2. 变量EnSwitch作为使能信号,只有EnSwitch置1时,功能才会正常投用,否则就算按下StaCmd启动按钮也不会实现主备互投;
  3. EnSwitch复位后,主备互投功能取消,此时可自由启停任意水泵;
  4. 按下StpCmd停止按钮后,所有水泵停止运行,EnSwitch自动复位;
  5. 当实际运行泵的数量小于应该运行的数量,会触发NumFlt运行泵数量不足报警,提醒操作员及时处理故障;
  6. 可在上位机画面中为每台泵添加“选择框控件”,关联ControlWord变量,ControlWord=1表示作为主泵,ControlWord=2表示作为备泵,ControlWord=3表示该泵不投用;
  7. 程序会根据选择的主泵数量和备泵数量,自动判断当前的主备互投模式。

总结

本文提供了一种结构化的水泵多备多投方法,可作为标准块应用于生产实际中。

相关文章:

西门子PLC结构化编程_水处理系统水泵多备多投

文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …...

AutoGen 框架深度解析:构建多智能体协作的事件驱动架构

在当下多智能体(Multi-Agent)AI系统快速发展的背景下,AutoGen 作为微软研究院开源的编程框架,为构建可扩展、灵活且可调试的智能体协作应用提供了完备的工具与最佳实践。本文将从设计动机、核心架构、关键概念、安装与快速上手、典型场景、进阶特性、生态与扩展、最佳实践,…...

算法相关概念

1 算法概述 1.1 算法概念 算法是特定问题求解步骤的描述&#xff0c;也是独立存在的一种解决问题的思想和方法 对于算法而言&#xff0c;实现他的编程语言无关紧要&#xff0c;重要的是思想和方法&#xff01;&#xff01;&#xff01; 公式&#xff1a;程序算法数据结构&a…...

《Astro 3.0岛屿架构让内容网站“脱胎换骨”》

内容优先的网站越来越成为主流。无论是新闻资讯、知识博客&#xff0c;还是电商产品展示&#xff0c;用户都希望能快速获取所需内容&#xff0c;这对网站的性能和体验提出了极高要求。而Astro 3.0的岛屿架构&#xff0c;就像是为内容优先网站量身定制的一把神奇钥匙&#xff0c…...

Vue3 + Element-Plus + 阿里云文件上传

Element-Plus 阿里云文件上传 1、选择文件夹方法2、Chrome 浏览器查看 input typefile 元素上传的文件方法3、上传文件4、FormDataFormData 是什么创建 FormDataFormData 常用方法FormData 的实际应用性能与注意事项总结 1、选择文件夹方法 input typefile 元素想要上传文件夹…...

【Linux】第十一章 管理网络

目录 1.TCP/IP网络模型 物理层&#xff08;Physical&#xff09; 数据链路层&#xff08;Date Link&#xff09; 网络层&#xff08;Internet&#xff09; 传输层&#xff08;Transport&#xff09; 应用层&#xff08;Application&#xff09; 2. 对于 IPv4 地址&#…...

用vite动态导入vue的路由配置

在Vue应用中&#xff0c;通过路由可以实现不同页面之间的切换&#xff0c;同时也可以实现页面之间的传参和控制页面的显示与隐藏。但是我们在开发的过程中&#xff0c;会发现在路由配置中的路由配置和我们的项目结构高度重复&#xff0c;在我们修改页面文件结构时非常的麻烦与复…...

sources.list.d目录

sources.list可能大家很熟悉&#xff0c;是配置镜像链接的地方。 sources.list.d其实就是一个目录&#xff0c;在linux系统中.d后缀一般定义为一个目录&#xff0c;且很喜欢用这种方式。 这种方式有一个好处&#xff0c;就是修改不会影响到sources.list文件&#xff0c; 在这里…...

【C语言】文件操作

目录 一为什么使用文件 二什么是文件 程序文件 数据文件 文件名 二进制文件和文本文件&#xff1f; 三文件的打开与关闭 流的概念 标准流 文件指针 指针的声明 指针的初始化 四文件的打开与关闭 打开 fopen()函数 五总结&#xff1a; 前言&#xff1a; …...

静态库与动态库简介

静态库与动态库简介 基本概念 静态库 静态库是在编译链接阶段被直接整合到可执行文件中的代码集合。链接器会从静态库中提取程序所需的所有对象&#xff0c;并将它们复制到最终的可执行文件中。 特点&#xff1a; 可执行文件包含了所有代码&#xff0c;运行时无需外部依赖…...

02《小地图实时》Unity

创建一个新的项目 创建一个球体 作为主角 重命名为Player 在主角上创建空的子物体 重命名为MiniMapIcon 增加一个精灵图片 并设置为绿色 增加一个层&#xff08;目的是在小地图中看的到 而在场景中看不到这个绿色Icon&#xff09; 命名为MiniMap 在主摄像机中设置剔除遮罩Culli…...

【Redis】基础4:作为分布式锁

文章目录 1. 一些概念2. MySQL方案2.1 方案一&#xff1a;事务特性2.1.1 存在的问题2.1.2 解决方案 2.2 方案二&#xff1a;乐观锁2.3 方案三&#xff1a;悲观锁 3. Redis3.1 实现原理3.2 实现细节3.2.1 问题1&#xff1a;持有期间锁过期问题3.2.2 问题2&#xff1a;判断和释放…...

迭代器与生成器

目录 Iterator 的作用 Iterator 的遍历过程 Symbol.iterator方法 实现iterator接口的自定义类示例 Generator函数 迭代器对象的next方法的运行逻辑 迭代器对象除了具有next方法&#xff0c;还可以具有return方法。 Iterator 的作用 为各种数据结构&#xff0c;提供一个统…...

Python 实现的运筹优化系统数学建模详解(动态规划模型)

相关代码链接&#xff1a;https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在计算机科学与数学建模的广阔领域中&#xff0c;算法如同精密的齿轮&#xff0c;推动着问题的解决与系统的运行。当面对复杂的优化问题时&…...

miniconda在ARM64位芯片上面的安装

文章目录 前言一、特点二、适用场景三、下载安装及使用1.下载脚本文件2.安装命令3.常见用法 总结 前言 Miniconda 是一个轻量级的 Python 发行版&#xff0c;它是 Anaconda 的一个简化版本。Anaconda 是一个广泛使用的数据科学平台&#xff0c;包含了众多的 Python 包和工具&a…...

vue跨域问题总结笔记

目录 一、Websocket跨域问题 1.nginx配置 2.VUE CLI代理 3.env.development配置 4.nginx日志 5.解决 一、解决跨域的几种常用方法 1.Vue CLI代理 2.JSONP 3.WebSocket 4.NGINX解决跨域问题 6.Java解决跨域 二、Vue跨域问题详解 1. 什么是跨域 2. 跨域的例子 3.…...

自动驾驶领域专业词汇(专业术语)整理

以下是分类整理的自动驾驶领域专业词汇表&#xff0c;涵盖 AI、芯片、传感器、自动驾驶核心、辅助驾驶、安全、通信、车灯、泊车、测试标准 等类别&#xff1a; AI相关 缩写英文全称中文解释AIArtificial Intelligence人工智能&#xff0c;模拟人类智能的技术体系NNNeural Ne…...

说一下react更新的流程

beginWork 使用v-dom和current fiber去生成子节点的workInProgress Fiber 期间会执行函数组件、类组件、diff子节点 给我需要变更的节点&#xff0c;打赏effectTag 增placement 2 0010 删deletion 8 1000 改 update 4 0100 增和改 placementAndUpdate…...

C 语言函数指针与指针函数详解

一、引言 在 C 语言的编程世界中&#xff0c;函数指针和指针函数是两个既强大又容易混淆的概念。它们为 C 语言带来了更高的灵活性和可扩展性&#xff0c;广泛应用于回调函数、动态链接库、状态机等多种场景。深入理解和掌握函数指针与指针函数&#xff0c;对于提升 C 语言编程…...

政策支持与市场驱动:充电桩可持续发展的双轮引擎

随着全球能源转型加速&#xff0c;新能源汽车成为实现低碳交通的重要方向。然而&#xff0c;充电基础设施不足仍是制约其普及的关键瓶颈。当前&#xff0c;国际主流的充电桩运营模式包括政府推动、电网企业推动及汽车厂商推动三种模式&#xff0c;但单一模式均存在显著局限性。…...

在 Ubuntu 22.04 x64 系统安装/卸载 1Panel 面板

一、 1Panel 是什么&#xff1f; 1Panel 是一款基于 Go 语言开发的现代化开源服务器管理面板&#xff08;类似宝塔面板&#xff09;&#xff0c;专注于容器化&#xff08;Docker&#xff09;和云原生环境管理&#xff0c;提供可视化界面简化服务器运维操作。 1. 1Panel主要功…...

dummy cli-tool ubuntu22.04使用

项目场景&#xff1a;dummy cli-tool ubuntu22.04使用 提示&#xff1a;这里简述项目相关背景&#xff1a;执行python3 run_shell.py时报错 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) …...

厚铜板的镀前处理差异:工艺参数与成本影响

在现代电子设备中&#xff0c;厚铜电路板因其优异的导电性能和良好的热管理能力而备受青睐。生产过程中&#xff0c;对铜层进行电镀加厚是一个关键步骤&#xff0c;它涉及到一系列复杂的化学和物理过程。在进行电镀之前&#xff0c;必须对电路板进行适当的准备工作&#xff0c;…...

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十六章 多线程:从pthread到JMM的升维

一、并发编程的范式革命 1.1 C多线程的刀耕火种 C语言通过POSIX线程&#xff08;pthread&#xff09;实现并发&#xff0c;需要开发者直面底层细节&#xff1a; 典型pthread实现&#xff1a; #include <pthread.h> int counter 0; pthread_mutex_t lock PTHREAD…...

数据库学习笔记(十三)---存储过程

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇存储过程&#xff0c;下一篇是存储函数;虽然MYSQL命令很多&#xff0c;但是自…...

JWT(JSON Web Token)源码分析

Java - JWT的简单介绍和使用 Java JWT&#xff1a;原理、机制及案例示范 什么是JWT&#xff1f; 1.1 JWT的基本概念 JWT&#xff08;JSON Web Token&#xff09;是一种用于在各方之间传递JSON格式信息的紧凑、URL安全的令牌&#xff08;Token&#xff09;。JWT的主要作用是验…...

Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格

以下是 Vue 3 中通过 createApp 创建的 app 实例的所有核心方法&#xff0c;包含完整示例、使用说明及对比表格&#xff1a; 1. app.component() 作用&#xff1a;注册全局组件 参数&#xff1a; name&#xff1a;组件名称&#xff08;字符串&#xff09;component&#xff…...

Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试

通过本次实验&#xff0c;成功搭建了 Hadoop 单机环境并运行了基础 MapReduce 程序&#xff0c;为后续分布式计算学习奠定了基础。 掌握 Hadoop 单机模式的安装与配置方法。 熟悉 Hadoop 环境变量的配置及 Java 依赖管理。 使用 Hadoop 自带的 WordCount 示例程序进行简单的 …...

线段树合并与分解

合并 #include <bits/stdc.h> using namespace std; #define asd(i,a,b) for(int ia;i<b;i) #define int long long const int inf 0x3f3f3f3f, N 1e5 5, Z 1e5; int n, m, fa[N], o[N][25], dep[N], tot, root[N], ans[N]; vector<int> g[N]; struct node…...

驱动开发硬核特训 │ 深度解析 fixed regulator 驱动与 regulator_ops

一、引言&#xff1a;本次目标 本篇聚焦于&#xff1a; Regulator 子系统基础概念设备树节点与驱动代码的对应关系regulator_desc、regulator_ops、regulator_dev 的完整讲解驱动端的实际注册与管理流程 通过一个实际案例&#xff0c;系统掌握 regulator 子系统 的全貌。 二…...

Linux中的shell脚本练习

1.判断字符串是否为空 #!/usr/bin/bash while : #:默认值为真 do read -p "请输入你的密码: " a pass123456 if [ -z $a ];thenecho "您输入的密码不能为空"exit 1 elseif [ $a $pass ];thenecho "登录成功"breakelseecho "您的密码输入有…...

MySQL基础篇 | 1-数据库概述与MySQL安装

【MySQL基础篇-1】数据库概述与MySQL安装 1. 数据库概述2. MySQL环境搭建2.1. MySQL的四大版本2.2. 软件下载1. 数据库概述 MySQL官网网站:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/ SQL Server:SQL Server是微软开发的大型商业数据库。C#、.net等语言常使用,与wi…...

JVM 自动内存管理

一、运行时数据区域详解 Java 虚拟机在运行 Java 程序时&#xff0c;会将所管理的内存划分为多个不同的数据区域&#xff0c;各区域有着独特的用途、创建和销毁时间。 程序计数器&#xff1a;作为线程私有的较小内存空间&#xff0c;它是当前线程执行字节码的行号指示器。字节…...

InitializingBean接口和@PostConstruct-笔记

1. InitializingBean 简介 1.1 功能简介 InitializingBean 是 Spring 框架中的一个接口&#xff0c;用在 Bean 初始化后执行自定义逻辑。它提供了 afterPropertiesSet() 方法&#xff0c;该方法在以下时机被 Spring 容器自动调用&#xff1a; 属性注入完成后&#xff08;即所…...

考研408-计算机组成原理冲刺考点(1-3章)

第一章 计算机系统概述 1.计算机核心 早期的冯诺依曼计算机是以运算器为中心的,而现在的计算机是以存储器为中心的 2.五大部件 3.汇编程序、编译程序、解释程序的辨析...

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。 一、基础 1. 意图 定义一个操作中的算法骨架,将某些步骤延迟到…...

一文了解无人机系统

无人机系统&#xff0c;又称无人驾驶航空器系统&#xff08;Remotely Piloted Aircraft System&#xff0c;RPAS&#xff09;&#xff0c;作为一个由无人机平台、遥控站、指令与控制数据链及其他部件构成的完整技术体系&#xff0c;其系统架构包含多个核心分系统。具体而言&…...

系统架构师2025年论文《论软件的设计模式》

论软件的设计模式 摘要: 2016 年,我所在的公司承担了某市医院预约挂号系统的研发任务。我作为公司的技术总监,希望能打造基于该系统的系列产品,参与到项目的设计中,以期开发扩展性和可维护性良好的预约挂号系统,为以后的产品开发打下基础。网络靶场是网络安全技术研究的…...

集成电路流片随笔19:full_handshake

全双工握手接收模块 (full_handshake_rx)&#xff0c;它的功能是接收来自发送端 (tx) 的数据&#xff0c;并对发送端进行应答&#xff08;ACK&#xff09;。模块实现了基于握手的通信机制&#xff0c;以确保数据的可靠传输。模块的输入输出分别连接于发送端和接收端&#xff0c…...

Android Framework 探秘

以下文字来源AI&#xff0c;准确性不敢保证&#xff01; 安卓Framework层概述 安卓的 Framework&#xff08;框架层&#xff09; 是安卓系统的核心组成部分&#xff0c;位于应用层和系统底层&#xff08;如Linux内核&#xff09;之间&#xff0c;负责为应用提供统一的接口和功…...

亚马逊云科技2025战略解析:AI驱动下的全球生态重塑

一、战略转向&#xff1a;从“云优先”到“AI优先”的核心逻辑 1. 千亿美元资本投入AI基建 芯片自研突破&#xff1a;2025年资本支出70%投向AI芯片与液冷数据中心。自研芯片矩阵全面升级&#xff0c;包括3纳米工艺的Trainium3&#xff08;算力提升4倍&#xff09;、单核性能…...

NGINX ngx_http_addition_module 模块响应体前后注入内容

一、模块概述 模块名称&#xff1a;ngx_http_addition_module引入版本&#xff1a;自 0.7.9 起支持 addition_types&#xff0c;0.8.29 起支持“*”通配&#xff1b;功能&#xff1a;对符合 MIME 类型的响应&#xff0c;在响应体前后分别插入指定子请求 URI 返回的内容&#x…...

SpringMVC 使用thymeleaf 进行数据展示

thymeleaf 是前端的视图解析器&#xff0c;可以用于html页面上变量的渲染&#xff0c;如何来使用thymeleaf&#xff0c;下面我们来说一下&#xff1a; 首先引入相关的依赖&#xff1a; <dependency><groupId>org.thymeleaf</groupId><artifactId>thym…...

Github两种鉴权模式PAT与SSH

Github两种鉴权模式PAT与SSH 文章目录 Github两种鉴权模式PAT与SSH1. PAT鉴权2. SSH鉴权3.两种鉴权的切换 1. PAT鉴权 通过 HTTPS 协议克隆和推送代码&#xff0c;使用用户名/密码或个人访问令牌&#xff08;PAT&#xff09;鉴权&#xff0c;所以PAT是与HTTPS协议相关的。该鉴…...

XrayR启动失败

公司要用服务器之间进行数据加密&#xff0c;这里用的XrayR 我使用的Centos 7。 我这里使用一键脚本安装后&#xff0c;/etc/XrayR目录下没有配置文件。 解决方案 XrayR安装时&#xff0c;系统没有unzip工具&#xff0c;也是会安装失败的&#xff0c;因为Centos7已经停止维…...

FPGA-数字时钟

FPGA-数字时钟 总体设计 ​ 用FPGA驱动数码管按照HH-MM-SS的格式显示时间&#xff0c;每秒用串口向上位机发送当前时间&#xff0c;当串口收到HH:MM:SS&#xff0c;对时间进行校准。由于年月要考虑到大小月&#xff0c;闰年等。为了简单起见&#xff0c;只考虑时分秒。 数码管…...

数据结构 RBT 插入操作的 Python 代码实现

目录 一、红黑树的性质二、红黑树的插入1. 插入根节点或根节点变红2. 双亲节点 P 为黑色3. 双亲结点 P 和叔伯结点 U 均为红色4. 双亲结点 P 为红色&#xff0c;叔伯结点 U 为黑色或缺失1&#xff09;情形一2&#xff09;情形二 三、插入的 Python 代码实现 红黑树动画演示网站…...

颖儿生活提案:用海信璀璨505U6真空冰箱重建都市鲜食自由

热播剧《六姊妹》中&#xff0c;演员颖儿饰演的何家艺以泼辣坚韧的形象深入人心&#xff0c;一双手撑起家庭的"烟火气"&#xff1b;戏外&#xff0c;她平衡事业与家庭&#xff0c;以自律姿态书写鲜活人生。 近日&#xff0c;颖儿向公众展示家中厨房&#xff0c;意外…...

JQuery 使用技巧

文章目录 隐藏/显示淡入淡出滑动追加新元素删除元素/内容设置 CSS 样式尺寸遍历Ajax根据 input 控件中的值 实时改变另一个值 $()是jQuery()的简写getElementByTagName();如&#xff1a; $(“div”)getElementByTagName(“div”); $()的作用是用于查找出 HTML 的标签、属性、样…...

光流法:从传统方法到深度学习方法

1 光流法简介 光流&#xff08;Optical Flow&#xff09;是指图像中像素灰度值随时间的变化而产生的运动场。 简单来说&#xff0c;它描述了图像中每个像素点的运动速度和方向。 光流法是一种通过分析图像序列中像素灰度值来计算光流的方法。对于图像数据计算出来的光流是一个二…...