.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协议: TCP(传输控制协议)和UDP(用户数据报协议)是TCP/IP协议簇中的两种核心协议。它们在传输层上提供数据传输服务,但具有不同的特性和功能。 TCP协议是一种提供可靠、面向连接的字节流服务的传输协…...
Linux中nfs:failed: Operation not supported
先给出思路: 一个简单粗暴的方式:卸载重装排除未知问题,步骤如下: 一、在 Linux 上卸载 NFS 服务器,步骤: 停止 NFS 服务: sudo service nfs-kernel-server stop如果您使用的是不同的发行版&am…...
ElasticSearch映射与模板介绍
一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用,ES现在已升级到8.5版本,有些概念和SDK用法都有很大变化,后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…...
通过 Azure 日志分析加强云安全
Microsoft Azure 云服务在安全日志存储、访问、可伸缩性、降低成本和易于部署方面提供了巨大的优势,因此在企业中很受欢迎。 Microsoft Azure 日志记录工具(如 Log360)可帮助管理 Azure 云基础结构中所有设备和应用程序(如虚拟机…...
[H5动画制作系列 ]变量,帧频,监听器等的生命周期基础测试
模式:按照上述抓图,actions层,1帧,写初始化代码,10帧写返回代码到2帧代码,2-10帧之间一直循环。1帧及10帧代码如下: 如果程序在1-10之间循环,会反复创建变量i,多个监听器等。所以,第一帧最好执行一次即可,程序在2-10帧之间一直循环。...
基于SpringBoot的服装生产管理系统的设计与实现
目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生…...
动态内存操作(2)
接上一篇文章http://t.csdn.cn/1ONDq,这次我们继续讲解关于动态内存的相关知识。 一、常见的动态内存错误 1.对NULL指针进行解引用操作 #include<stdio.h> #include<stdlib.h> #include<limits.h> int main() {int* p (int*)malloc(INT_MAX/4);…...
Windows-Delphi 窗口置顶
露从今夜白,月是故乡明。 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 命令注入漏洞分析与利用
简介 漏洞软件:Apache Airflow影响版本:< 1.10.10 环境 Vulhub 漏洞测试靶场 复现步骤 进入 /root/vulhub/airflow/CVE-2020-11978/ 目录运行以下命令启动环境 # 初始化数据库 docker compose run airflow-init # 开启服务 docker compose up -…...
面试经典算法1:DFS
一、前言 1、题目描述和代码仅供参考,如果有问题欢迎指出 2、解题代码采用acm模式(自己处理输入输出),不采用核心代码模式(只编程核心函数) 3、解题代码采用C语言(ai一键翻译任意语言ÿ…...
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. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…...
SmartCode ViewerX VNC 3.11 Crack
SmartCode ViewerX VNC 查看器 ActiveX 轻松地将 VNC 查看器功能添加到您的应用程序中 SmartCode ViewerX VNC Viewer ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX控件,开发人员可以轻松地为其应用程序提供屏幕共…...
傻瓜式Java操作MySQL数据库备份
文章目录 前言存储数据库存储数据表 前言 数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需…...
redis常用操作命令
日升时奋斗,日落时自省 注:命令区分有点细,择取自己需要的即可 目录 1、单机架构 2、数据库和应用分离 3、分布式基本概念 3.1、应用(Application)/系统(System) 3.2、模块(Module)/组件&…...
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跳转页面不缓存上一个页面的方法
一、前言 要实现一个需求,从a页面跳转到b页面,从b页面跳转到c页面,然后按返回,从c页面直接返回a页面(不返回b页面) a->b->c c->a 二、实现方法 前端框架使用的是uni-app,我们修改…...
排序:败者树和置换选择排序(解决外部排序中的优化问题)
1.算法目的(败者树) 解决多路平衡归并带来的问题。 在外部排序中,使用k路平衡归并策略, 选出一个最小元素需要对比关键字(k-1)次, 导致内部归并所需时间增加。(可用“败者树”进行优化) 2.败者树的定义 …...
【超分:光谱响应函数】
Spectral Response Function-Guided Deep Optimization-Driven Network for Spectral Super-Resolution (光谱响应函数引导的深度优化驱动网络光谱超分辨) 高光谱图像(HSI)是许多研究工作的关键。光谱超分辨率(SSR&a…...
IoT 物联网 JavaScript 全栈开发,构建家居环境监控系统实战
智能家居环境监测端到端场景,全栈JavaScript开发,串联Ruff硬件、温湿度和空气质量传感器、阿里云 IoT、Serverless函数计算、百度ECharts可视化、最终以微信小程序形式在微信里实时展示家中实时温度,湿度,PM2.5指数。 01 技术架构…...
jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error
1、错误信息 2、解决办法 打开Anaconda Promt界面,进入自己的虚拟环境。在命令行输入以下指令: pip install --upgrade nbconvert...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
