当前位置: 首页 > 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...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

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

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

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...