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

.NET的PLC帮助类

 TCP和UDP协议:

        TCP(传输控制协议)和UDP(用户数据报协议)是TCP/IP协议簇中的两种核心协议。它们在传输层上提供数据传输服务,但具有不同的特性和功能。

        TCP协议是一种提供可靠、面向连接的字节流服务的传输协议。在数据传输前,发送方和接收方必须先建立TCP连接,然后才能进行数据传输。它通过超时重发、丢弃重复数据、数据检验等功能,确保数据能从一端传输到另一端。

        UDP协议则是一种简单的面向数据报的传输层协议,它提供的是非面向连接、不可靠的数据流传输服务。由于UDP在传输数据报前不需要在客户和服务器之间建立连接,也没有超时重发等机制,因此其传输速度相对较快。但这也意味着它不能提供数据传输的可靠性保障。

        总的来说,TCP和UDP各有其优点和使用场景。TCP主要应用于可靠性要求高的应用,如网页浏览、文件传输等;而UDP则更适合于可靠性要求低、对传输速度和经济性有一定需求的应用,如视频流、游戏等。

RS-232和RS-475通信接口标准及Modbus协议:

        RS-232是一种常见的串行通信接口标准,由美国电子工业协会(EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定。其全名为“数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。它通常被应用于计算机、调制解调器和各种电子设备之间的通信连接。

        RS-475是一种由美国电子工业协会(EIA)制定的半双工通信接口标准,它通常被应用于电子设备之间的数据传输。它采用平衡驱动和差分接收,因此具有较好的抗干扰能力,同时传输距离较远,可以达到数百米甚至千米级别。与RS-232不同的是,RS-475通常采用9针D型连接器,并且其引脚定义也与RS-232有所不同。RS-475主要用于工业、科学和医疗等领域的设备间通信,但由于其半双工的限制,应用场景不如RS-232和RS-485广泛。

        Modbus是一种串行通信协议,最初由Modicon公司(现在的施耐德电气 Schneider Electric)于1979年开发,用于可编程逻辑控制器(PLC)之间的通信。此协议已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。西门子的S1200和S1500用的就是Modbus协议

        Modbus协议定义了一个控制器能够识别的消息结构,不管它们是经过何种网络进行通信的。它描述了控制器请求访问其他设备的过程,如果回应来自其他设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在Modbus网络上通信时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。总的来说,Modbus是一种应用于电子控制器之间的通用语言,通过它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

一、使用HslCommunication程序集,官网:胡工科技。

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading;
using HslCommunication;
using HslCommunication.Profinet.Siemens;
using HslCommunication.Profinet.Omron;
using HslCommunication.Profinet.Keyence;namespace PLC.Class
{public class PLCHelper{#region 连接西门子PLC--SiemensS7Net/// <summary>/// 连接西门子PLC--SiemensS7Net/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <returns></returns>private bool ConnectSiemens(SiemensS7Net siemens, string ip, int port){try{IPAddress ipaddress;bool flag = !IPAddress.TryParse(ip, out ipaddress);if (flag){return false;}else{siemens.IpAddress = ip;siemens.Port = port;OperateResult operateResult = siemens.ConnectServer();bool isSuccess = operateResult.IsSuccess;if (isSuccess){return true;}else{return false;}}}catch (Exception){return false;}}/// <summary>/// 给西门子PLC点位写信号/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="flag">给点位传入的值</param>/// <returns></returns>public bool WriteFlagBySiemens(SiemensS7Net siemens, string ip, int port, string point, short flag){if (ConnectSiemens(siemens, ip, port)){OperateResult result = siemens.Write(point, flag);siemens.ConnectClose();return result.IsSuccess;}else{return false;}}/// <summary>/// 读取西门子PLC的状态/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <returns></returns>public bool ReadBoolBySiemens(SiemensS7Net siemens, string ip, int port, string point){if (ConnectSiemens(siemens, ip, port)){OperateResult<bool> value = siemens.ReadBool(point);siemens.ConnectClose();return value.Content;}else{return false;}}/// <summary>/// 读取西门子PLC的值/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="length">读取长度</param>/// <returns></returns>public string ReadStringBySiemens(SiemensS7Net siemens, string ip, int port, string point, ushort length){if (ConnectSiemens(siemens, ip, port)){OperateResult<string> result = new OperateResult<string>();result = siemens.ReadString(point, length);string source = string.Empty;if (!string.IsNullOrEmpty(result.Content)){source = result.Content;}else{for (int i = 0; i < 3; i++){Thread.Sleep(10);result = siemens.ReadString(point, length);if (!string.IsNullOrEmpty(result.Content)){source = result.Content;break;}}if (string.IsNullOrEmpty(result.Content)){return "未读取到PLC信息";}}siemens.ConnectClose();return source;}else{return "false";}}/// <summary>/// 清空西门子PLC点位中的值/// </summary>/// <param name="siemens"></param>/// <param name="ip"></param>/// <param name="port"></param>/// <param name="point"></param>/// <param name="length">写入的长度</param>/// <returns></returns>public bool ClearPlcPocketBySiemens(SiemensS7Net siemens, string ip, int port, string point, int length, string flag = " "){if (ConnectSiemens(siemens, ip, port)){OperateResult result = siemens.Write(point, flag, length);siemens.ConnectClose();return result.IsSuccess;}else{return false;}}#endregion#region 连接欧姆龙PLC--OmronFinsNet/// <summary>/// 连接欧姆龙PLC--OmronFinsNet/// </summary>/// <param name="omron"></param>/// <param name="ip"></param>/// <param name="port"></param>/// <returns></returns>private bool ConnectOmron(OmronFinsNet omron, string ip, int port){//OmronFinsUdptry{IPAddress ipaddress;bool flag = !IPAddress.TryParse(ip, out ipaddress);if (flag){return false;}else{omron.IpAddress = ip;omron.Port = port;omron.SA1 = 239;//if (ip240.Contains(ip))//{//    omron.SA1 = 240;//}//else//{//    omron.SA1 = 239;//}//omron.DA1 = 24;OperateResult operateResult = omron.ConnectServer();if (!operateResult.IsSuccess){for (int i = 0;i < 3;i++){operateResult = omron.ConnectServer();if (operateResult.IsSuccess){break;//return true;}}//SA1使用239连接不上,则采取240连接if (!operateResult.IsSuccess){omron.SA1 = 240;for (int i = 0; i < 3; i++){operateResult = omron.ConnectServer();if (operateResult.IsSuccess){break;//return true;}}}//if (!isSuccess)//{//    return false;//}}return operateResult.IsSuccess;}}catch (Exception ex){LogHelper.WriteErrLog(ex.ToString());return false;}}/// <summary>/// 给欧姆龙PLC点位写信号/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="flag">给点位传入的值</param>/// <returns></returns>public bool WriteShortByOmron(OmronFinsNet omron, string ip, int port, string point, short flag){//if (ConnectOmron(omron, ip, port))//{OperateResult result = omron.Write(point, flag);if (!result.IsSuccess){for (int i = 0;i < 3;i++){result = omron.Write(point,flag);if (result.IsSuccess){break;//return true;}}//if (!result.IsSuccess)//{//    return false;//}}//omron.ConnectClose();return result.IsSuccess;//}//else//{//    return false;//}}//写入float值public bool WriteFloatByOmron(OmronFinsNet omron, string ip, int port, string point, float flag){//if (ConnectOmron(omron, ip, port))//{OperateResult result = omron.Write(point, flag);if (!result.IsSuccess){for (int i = 0; i < 3; i++){result = omron.Write(point, flag);if (result.IsSuccess){break;//return true;}}//if (!result.IsSuccess)//{//    return false;//}}//omron.ConnectClose();return result.IsSuccess;//}//else//{//    return false;//}}public string WritePointByOmron(OmronFinsNet omron, string ip, int port, List<string> pointlst, List<string> dataTypelst, List<string> valuelst,string type,List<string> filedlst){//int sucNum = 0;string errorFileds = "";try{if (type == "EDIT"){//return 0;return "";}//调用时以下6个点位不写入List<string> addNotWritePoint = new List<string>() { "D200", "D202", "D210", "D212", "D0", "D469" };if (ConnectOmron(omron, ip, port)){for (int i = 0; i < pointlst.Count; i++){if (addNotWritePoint.Contains(pointlst[i])){continue;}if (dataTypelst[i] == "FLOAT" && !string.IsNullOrEmpty(valuelst[i])){float flag = Convert.ToSingle(valuelst[i]);bool result = WriteFloatByOmron(omron, ip, port, pointlst[i], flag);if (result){//sucNum++;}else{if (errorFileds.Length > 0){errorFileds += ",";}errorFileds += filedlst[i];LogHelper.WriteErrLog($"IP:{ip},端口:{port},点位:{pointlst[i]},值:{valuelst[i]}写入失败!");}}else if (dataTypelst[i] == "SHORT" && !string.IsNullOrEmpty(valuelst[i])){short flag = Convert.ToInt16(valuelst[i]);bool result = WriteShortByOmron(omron, ip, port, pointlst[i], flag);if (result){//sucNum++;}else{if (errorFileds.Length > 0){errorFileds += ",";}errorFileds += filedlst[i];LogHelper.WriteErrLog($"IP:{ip},端口:{port},点位:{pointlst[i]},值:{valuelst[i]}写入失败!");}}}//return sucNum;}//else//{//    return sucNum;//}}catch (Exception ex){LogHelper.WriteErrLog(ex.ToString());}finally{omron.ConnectClose();}//return sucNum;return errorFileds;}/// <summary>/// 读取欧姆龙PLC的状态/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <returns></returns>public bool ReadBoolByOmron1(OmronFinsNet omron, string ip, int port, string point){if (ConnectOmron(omron, ip, port)){OperateResult<bool> value = omron.ReadBool(point);omron.ConnectClose();return value.Content;}else{return false;}}//读取float型数据public float ReadFloatByOmron(OmronFinsNet omron, string ip, int port, string point){//if (ConnectOmron(omron, ip, port))//{OperateResult<float> value = omron.ReadFloat(point);if (!value.IsSuccess){for (int i = 0;i < 3;i++){value = omron.ReadFloat(point);if (value.IsSuccess){break;//return value.Content;}}//if (!value.IsSuccess)//{//    return 0;//}}//omron.ConnectClose();if (value.IsSuccess){return value.Content;}else{return 0;}//}//else//{//    return 0;//}}//读取short型数据public short ReadShortByOmron(OmronFinsNet omron, string ip, int port, string point){//if (ConnectOmron(omron, ip, port))//{OperateResult<short> value = omron.ReadInt16(point);if (!value.IsSuccess){for (int i = 0; i < 3; i++){value = omron.ReadInt16(point);if (value.IsSuccess){break;//return value.Content;}}//if (!value.IsSuccess)//{//    return 0;//}}//omron.ConnectClose();if (value.IsSuccess){return value.Content;}else{return 0;}//}//else//{//    return 0;//}}//读取Bool类型数据public bool ReadBoolByOmron(OmronFinsNet omron, string ip, int port, string point){OperateResult<bool> value = omron.ReadBool(point);if (!value.IsSuccess){for (int i = 0; i < 3; i++){value = omron.ReadBool(point);if (value.IsSuccess){break;}}}if (value.IsSuccess){return value.Content;}else{return false;}}public string ReadPointByOmron(OmronFinsNet omron, string ip, int port, List<string> filedlst, List<string> pointlst, List<string> datatypelst){string result = "0";JObject jObj = new JObject();try{if (ConnectOmron(omron, ip, port)){for (int i = 0; i < pointlst.Count; i++){if (datatypelst[i] == "FLOAT"){result = ReadFloatByOmron(omron, ip, port, pointlst[i]).ToString();}else if (datatypelst[i] == "SHORT"){result = ReadShortByOmron(omron, ip, port, pointlst[i]).ToString();}else if (datatypelst[i] == "BOOL" && pointlst[i] == "H10"){//涂布单双面3个点位细分—00:单面,01:双面,01;02:连续bool res = false;List<string> H10s = new List<string>() { "H10.00", "H10.01", "H10.02" };foreach (string h10 in H10s){res = ReadBoolByOmron(omron, ip, port, h10);if (res){result = h10.Substring(h10.Length - 1,1);break;}}}jObj.Add(new JProperty(filedlst[i], result));}}}catch (Exception ex){LogHelper.WriteErrLog(ex.ToString());}finally{omron.ConnectClose();}return jObj.ToString();}/// <summary>/// 读取欧姆龙PLC的值/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="length">读取长度</param>/// <returns></returns>public string ReadStringByOmron(OmronFinsNet omron, string ip, int port, string point, ushort length){if (ConnectOmron(omron, ip, port)){OperateResult<string> result = new OperateResult<string>();result = omron.ReadString(point, length);string source = string.Empty;if (!string.IsNullOrEmpty(result.Content)){source = result.Content;}else{for (int i = 0; i < 3; i++){Thread.Sleep(10);result = omron.ReadString(point, length);if (!string.IsNullOrEmpty(result.Content)){source = result.Content;break;}}if (string.IsNullOrEmpty(result.Content)){return "未读取到PLC信息";}}omron.ConnectClose();return source;}else{return "false";}}/// <summary>/// 清空欧姆龙PLC点位中的值/// </summary>/// <param name="siemens"></param>/// <param name="ip"></param>/// <param name="port"></param>/// <param name="point"></param>/// <param name="length">写入的长度</param>/// <returns></returns>public bool ClearPlcPocketByOmron(OmronFinsNet omron, string ip, int port, string point, int length, string flag = " "){if (ConnectOmron(omron, ip, port)){OperateResult result = omron.Write(point, flag, length);omron.ConnectClose();return result.IsSuccess;}else{return false;}}#endregion#region  连接基恩士PLC--KeyenceMcNet/// <summary>/// 连接基恩士PLC--KeyenceMcNet/// </summary>/// <param name="omron"></param>/// <param name="ip"></param>/// <param name="port"></param>/// <returns></returns>private bool ConnectKeyence(KeyenceMcNet keyence, string ip, int port){try{IPAddress ipaddress;bool flag = !IPAddress.TryParse(ip, out ipaddress);if (flag){return false;}else{keyence.IpAddress = ip;keyence.Port = port;OperateResult operateResult = keyence.ConnectServer();bool isSuccess = operateResult.IsSuccess;if (isSuccess){return true;}else{return false;}}}catch (Exception){return false;}}/// <summary>/// 给基恩士PLC点位写信号/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="flag">给点位传入的值</param>/// <returns></returns>public bool WriteFlagByKeyence(KeyenceMcNet keyence, string ip, int port, string point, short flag){if (ConnectKeyence(keyence, ip, port)){OperateResult result = keyence.Write(point, flag);keyence.ConnectClose();return result.IsSuccess;}else{return false;}}/// <summary>/// 读取基恩士PLC的状态/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <returns></returns>public bool ReadBoolByKeyence(KeyenceMcNet keyence, string ip, int port, string point){if (ConnectKeyence(keyence, ip, port)){OperateResult<bool> value = keyence.ReadBool(point);keyence.ConnectClose();return value.Content;}else{return false;}}/// <summary>/// 读取基恩士PLC的值/// </summary>/// <param name="siemens"></param>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="point">PLC点位</param>/// <param name="length">读取长度</param>/// <returns></returns>public string ReadStringByKeyence(KeyenceMcNet keyence, string ip, int port, string point, ushort length){if (ConnectKeyence(keyence, ip, port)){OperateResult<string> result = new OperateResult<string>();result = keyence.ReadString(point, length);string source = string.Empty;if (!string.IsNullOrEmpty(result.Content)){source = result.Content;}else{for (int i = 0; i < 3; i++){Thread.Sleep(10);result = keyence.ReadString(point, length);if (!string.IsNullOrEmpty(result.Content)){source = result.Content;break;}}if (string.IsNullOrEmpty(result.Content)){return "未读取到PLC信息";}}keyence.ConnectClose();return source;}else{return "false";}}/// <summary>/// 清空基恩士PLC点位中的值/// </summary>/// <param name="siemens"></param>/// <param name="ip"></param>/// <param name="port"></param>/// <param name="point"></param>/// <param name="length">写入的长度</param>/// <returns></returns>public bool ClearPlcPocketByKeyence(KeyenceMcNet keyence, string ip, int port, string point, int length, string flag = " "){if (ConnectKeyence(keyence, ip, port)){OperateResult result = keyence.Write(point, flag, length);keyence.ConnectClose();return result.IsSuccess;}else{return false;}}#endregion}
}

相关文章:

.NET的PLC帮助类

TCP和UDP协议&#xff1a; TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是TCP/IP协议簇中的两种核心协议。它们在传输层上提供数据传输服务&#xff0c;但具有不同的特性和功能。 TCP协议是一种提供可靠、面向连接的字节流服务的传输协…...

Linux中nfs:failed: Operation not supported

先给出思路&#xff1a; 一个简单粗暴的方式&#xff1a;卸载重装排除未知问题&#xff0c;步骤如下&#xff1a; 一、在 Linux 上卸载 NFS 服务器&#xff0c;步骤&#xff1a; 停止 NFS 服务&#xff1a; sudo service nfs-kernel-server stop如果您使用的是不同的发行版&am…...

ElasticSearch映射与模板介绍

一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用&#xff0c;ES现在已升级到8.5版本&#xff0c;有些概念和SDK用法都有很大变化&#xff0c;后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…...

通过 Azure 日志分析加强云安全

Microsoft Azure 云服务在安全日志存储、访问、可伸缩性、降低成本和易于部署方面提供了巨大的优势&#xff0c;因此在企业中很受欢迎。 Microsoft Azure 日志记录工具&#xff08;如 Log360&#xff09;可帮助管理 Azure 云基础结构中所有设备和应用程序&#xff08;如虚拟机…...

[H5动画制作系列 ]变量,帧频,监听器等的生命周期基础测试

模式:按照上述抓图,actions层&#xff0c;1帧,写初始化代码,10帧写返回代码到2帧代码,2-10帧之间一直循环。1帧及10帧代码如下&#xff1a; 如果程序在1-10之间循环,会反复创建变量i,多个监听器等。所以,第一帧最好执行一次即可&#xff0c;程序在2-10帧之间一直循环。...

基于SpringBoot的服装生产管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生…...

动态内存操作(2)

接上一篇文章http://t.csdn.cn/1ONDq&#xff0c;这次我们继续讲解关于动态内存的相关知识。 一、常见的动态内存错误 1.对NULL指针进行解引用操作 #include<stdio.h> #include<stdlib.h> #include<limits.h> int main() {int* p (int*)malloc(INT_MAX/4);…...

Windows-Delphi 窗口置顶

露从今夜白&#xff0c;月是故乡明。 1.Delphi将窗口置顶 if topHwnd <> 0 thenbeginSetWindowPos(topHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);tmr1.Enabled : True;end; 其中topHwnd是目标窗口的句柄。 2.窗口取消置顶 if topHwnd <> 0 th…...

CVE-2020-11978 Apache Airflow 命令注入漏洞分析与利用

简介 漏洞软件&#xff1a;Apache Airflow影响版本&#xff1a;< 1.10.10 环境 Vulhub 漏洞测试靶场 复现步骤 进入 /root/vulhub/airflow/CVE-2020-11978/ 目录运行以下命令启动环境 # 初始化数据库 docker compose run airflow-init # 开启服务 docker compose up -…...

面试经典算法1:DFS

一、前言 1、题目描述和代码仅供参考&#xff0c;如果有问题欢迎指出 2、解题代码采用acm模式&#xff08;自己处理输入输出&#xff09;&#xff0c;不采用核心代码模式&#xff08;只编程核心函数&#xff09; 3、解题代码采用C语言&#xff08;ai一键翻译任意语言&#xff…...

Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…...

SmartCode ViewerX VNC 3.11 Crack

SmartCode ViewerX VNC 查看器 ActiveX 轻松地将 VNC 查看器功能添加到您的应用程序中 SmartCode ViewerX VNC Viewer ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX控件&#xff0c;开发人员可以轻松地为其应用程序提供屏幕共…...

傻瓜式Java操作MySQL数据库备份

文章目录 前言存储数据库存储数据表 前言 数据库备份是开发工作中经常要做的事情&#xff0c;好处是mysql提供了一个非常好的命令 mysqldump&#xff0c;直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便&#xff0c;遇到定时备份或者指定备份那么就需…...

redis常用操作命令

日升时奋斗&#xff0c;日落时自省 注&#xff1a;命令区分有点细&#xff0c;择取自己需要的即可 目录 1、单机架构 2、数据库和应用分离 3、分布式基本概念 3.1、应用&#xff08;Application&#xff09;/系统(System) 3.2、模块&#xff08;Module&#xff09;/组件&…...

pytorch gpu安装

cuda https://blog.csdn.net/qq_51570094/article/details/124148671 https://blog.csdn.net/zxdd2018/article/details/127705627 cudnn https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-tar 更改cudnn 保证文件目录中只有一个解压后…...

uni跳转页面不缓存上一个页面的方法

一、前言 要实现一个需求&#xff0c;从a页面跳转到b页面&#xff0c;从b页面跳转到c页面&#xff0c;然后按返回&#xff0c;从c页面直接返回a页面&#xff08;不返回b页面&#xff09; a->b->c c->a 二、实现方法 前端框架使用的是uni-app&#xff0c;我们修改…...

排序:败者树和置换选择排序(解决外部排序中的优化问题)

1.算法目的&#xff08;败者树&#xff09; 解决多路平衡归并带来的问题。 在外部排序中&#xff0c;使用k路平衡归并策略, 选出一个最小元素需要对比关键字(k-1)次&#xff0c; 导致内部归并所需时间增加。&#xff08;可用“败者树”进行优化&#xff09; 2.败者树的定义 …...

【超分:光谱响应函数】

Spectral Response Function-Guided Deep Optimization-Driven Network for Spectral Super-Resolution &#xff08;光谱响应函数引导的深度优化驱动网络光谱超分辨&#xff09; 高光谱图像&#xff08;HSI&#xff09;是许多研究工作的关键。光谱超分辨率&#xff08;SSR&a…...

IoT 物联网 JavaScript 全栈开发,构建家居环境监控系统实战

智能家居环境监测端到端场景&#xff0c;全栈JavaScript开发&#xff0c;串联Ruff硬件、温湿度和空气质量传感器、阿里云 IoT、Serverless函数计算、百度ECharts可视化、最终以微信小程序形式在微信里实时展示家中实时温度&#xff0c;湿度&#xff0c;PM2.5指数。 01 技术架构…...

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...