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

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...