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

C#之Delta并联机械手的视觉同步分拣

本文导读

前面两节课程我们介绍了怎么建立Delta并联机械手的正逆解以及如何通过视觉进行匹配定位。本节课程给大家分享如何通过C#语言开发正运动Delta并联机械手传送带同步的视觉分拣。

VPLC711硬件介绍

VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器视觉EtherCAT运动控制器,具备强大的运算能力和灵活性。它具有出色的实时性能和多路高速硬件输入与多路高速PSO输出,能够精准控制多轴同步运动,并与外部设备实现多协议的高速通信。

在这里插入图片描述

VPLC711支持多种硬件接口和通信协议,方便与其他设备的连接和集成。除此之外,VPLC711还具备视觉处理功能,能够实时处理图像数据,实现视觉检测、测量和定位等应用。

在这里插入图片描述

VPLC711内置Windows运动控制实时内核MotionRT7,形成一种开放式IPC形态实时软控制器/软PLC,为用户提供灵活集成的运动控制+视觉一体化解决方案。

在这里插入图片描述

VPLC711硬件参数

1.采用x86高性能CPU,EtherCAT可支持1ms 64轴同步运行;

2.板载RS232,RS485,EtherNet5,EtherCAT,USB3.04硬件接口;

3.板载20DI,其中4个高速色标锁存,2组高速单端编码器;

4.板载20DO,其中4个高速单端脉冲轴,4组高速PWM;

5.支持DVI-D,HDMI显示,支持双网口不同IP设置。

想要了解更多关于VPLC711的详情介绍,可以点击“x86平台实时Windows机器视觉EtherCAT运动控制器VPLC711”查看。

一、C#语言进行Delta并联机械手的开发之运动库和视觉库的添加

1.在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。

在这里插入图片描述

2.选择开发语言为“Visual C#”和.NET Framework 4以及Windows窗体应用程序。

在这里插入图片描述

3.找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。

1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。

在这里插入图片描述

2)选择“函数库2.1”文件夹。

在这里插入图片描述

3)选择“Windows平台”文件夹。

在这里插入图片描述

4)根据需要选择对应的函数库,这里选择32位库。

在这里插入图片描述

5)解压C#压缩包,里面有C#对应的函数库。

在这里插入图片描述

6)函数库具体路径如下。

在这里插入图片描述

4.将厂商提供的C#库文件以及相关文件复制到新建的项目中(注意这里面的PC函数库默认提供的是运动库,如果使用视觉功能还需要获取视觉库,视觉库可以找厂商的相关销售或技术人员获取)。
1)将Zmcaux.cs(运动库)和Zvision.cs(视觉库)文件复制到新建的项目里面中。

在这里插入图片描述

2)将zauxdll.dll、zmotion.dll和zvision.dll文件放入bin\debug文件夹中。

在这里插入图片描述

5.用vs打开新建的项目文件,在右边的解决方案资源管理器中点击显示所有文件,然后鼠标右击Zmcaux.cs与 Zvision.cs文件,点击包括在项目中。

在这里插入图片描述

6.双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,using ZVision并声明控制器句柄g_handle。

在这里插入图片描述

二、PC函数介绍

1.链接控制器,获取链接句柄。

在这里插入图片描述

2.皮带同步指令。
在这里插入图片描述

三、Basic脚本快速验证指令用法

1.编写Basic测试脚本进行MoveSync指令的用法测试。

'**************************************************************************************
'背景:假设有一对对射型的光电传感器固定在流水线的两端,来实时检测流水线上的产品到位情况
'MOVESYNC指令参数填写说明:
'syncposition:物体到感应点时皮带轴的位置,需要通过编码器锁存把产品的对应位置记录下来。
'pos1:跟随轴1原点到光电传感器感应点的位置,对于每个产品都是固定的。
'**************************************************************************************
GLOBAL CONST BeltAxis=4  '皮带轴是轴4
GLOBAL CONST FollowAxis1=0  '跟随轴1是轴0
GLOBAL CONST InducPos1=30  '跟随轴1原点到光电传感器感应点的位置
GLOBAL CONST StandbyPos1=50'跟随轴1的待机位
GLOBAL CONST EmptyPos1=400  '跟随轴1的放料位
'停止所有轴
RAPIDSTOP(2)
WAIT IDLE     
'初始化相关轴的轴参数
BASE(FollowAxis1, BeltAxis)
ATYPE = 1,1
UNITS = 1000,1000
SPEED = 50,100
DPOS = 0,0
'触发示波器采集波形
TRIGGER
DELAY(1000)
'跟随轴先运动到待机位
BASE(FollowAxis1)
MOVEABS(StandbyPos1)
'皮带轴开始运动
VMOVE(1)  AXIS(BeltAxis)
'假设皮带运动到200的位置时,有一个产品被检测到
BASE(FollowAxis1)
Wait UNTIL MPOS(BeltAxis)> 200
MOVESYNC(0, 2000, 200, BeltAxis, InducPos1) '跟随轴加速同步段该指令执行完后将同步上产品
MOVE_OP(0, ON)                               '同步上后打开真空吸          
MOVESYNC(0, 1000, 200, BeltAxis, InducPos1)  '继续同步1s
MOVESYNC(-1, 0, 0, -1, EmptyPos1)            '走到放料位置
MOVE_OP(0, OFF)                              '到放料位后关闭真空吸  

2.通过RTSys软件的示波器观察波形,分析同步过程。

在这里插入图片描述

在这里插入图片描述

根据示波器的数据分析

1、产品刚刚被检测到时,皮带的位置是200,跟随轴的位置是50。

2、跟随轴追上产品,并保持速度和皮带轴同步时皮带的位置是400,跟随轴1的位置是230。

3、由1和2可知,产品在同步过程中前进了200(400-200)。

4、因为跟随轴1原点到光电传感器感应点的位置InducPos1我们给的数据是30,所以在跟随轴1和皮带平行的情况下,皮带带着产品往前跑了200后,此时此刻跟随轴1原点到光产品的实际距离是230(200+30)。

5、那么第4点计算的结果和第2的同步完成后跟随轴1的实际位置是一致的,所以流水线同步指令测试正常。

四、C#例程建设之视觉流水线同步分拣

1.皮带同步指令关键参数详细介绍。

ZAux_Direct_MoveSync(ZMC_HANDLE handle,float imode,int synctime,float syncposition,int syncaxis,int imaxaxises,int *piAxislist,float *pfDisancelist).

(1)参数imode:

imode = 0+angle,表示同步模式,如果皮带和X轴平行,填0即可。

imode = -1,表示结束同步模式,可运动到指定的绝对位置,一般同步上抓取完物料后运动到放料位使用。

(2)参数synctime: 同步时间,ms单位.运动在指定时间内完成,完成时轴跟皮带轴上物体保持速度一致。0表示根据运动轴的速度加速度来估计同步时间。

(3)参数syncposition: 视觉或传感器识别到皮带是的产品时,皮带此时此刻的位置信息MPOS。

(4)参数pfDisancelist:如果是视觉定位产品时,这个参数直接填视觉识别到产品时产品的世界坐标。

如果用光电传感器检测产品时,这个参数是固定的,在传感器刚刚好感应到产品时,产品当前位置的绝对坐标。可以在此时此刻手动运动从轴来定位到产品处来获取位置信息。

2.视觉流水线同步分拣流程图。

在这里插入图片描述

(1)视觉匹配定位代码详情。


```csharp
/************************************************************************************
'任务编号:     无
'函数功能:     视觉定位产品
'Input:        无
'Output:       无 
'返回值:       子线程---进行视觉定位             
**************************************************************************************/
public void RunSubTaskVisua()
{int TempArrid = 0;float TempVar = 0;WriteLog("视觉功能正常启动");while (SysRunFlag > 0){//暂停按钮没有按下时while (SysRunFlag == 1) {//采集图像VisuaOper.CameAcquisition();//进行模板匹配RTDisplay.Image = VisuaOper.ShapeFind();if (MainWindows.BeltMpos != 0)//如果采集照片的时候皮带编码器位置获取正常{//操作MoveSyncBuff数据先加锁while (true){if (MainWindows.SetMoveSyncFlag == 0){MainWindows.SetMoveSyncFlag = 1;break;}}//找到可以存储数据的数组起始下标int ArrId = 0;for (int i = 0; i < 50; i++){if (MainWindows.MoveSyncBuff[i, 0] == 0){ArrId = i;break;}}//开始存储数据  一次匹配最多10个结果TempArrid = ArrId;for (int i = 0; i < 10; i++){//如果分数满足要求if (MainWindows.VisionRst[i, 0] >= MainWindows.VisionScore){int j;//如果有重复的目标需要剔除for (j = 0; j < TempArrid; j++){TempVar = MainWindows.VisionRst[i, 1] - MainWindows.BeltMpos - MainWindows.MoveSyncBuff[j, 1] + MainWindows.MoveSyncBuff[j, 4];if (((TempVar) <= 10) && (TempVar >= -10)){j = -10;break;}}if (j >= 0){MainWindows.MoveSyncBuff[ArrId, 0] = 1;MainWindows.MoveSyncBuff[ArrId, 1] = MainWindows.VisionRst[i, 1];   //存储匹配结果的X坐标MainWindows.MoveSyncBuff[ArrId, 2] = MainWindows.VisionRst[i, 2];   //存储匹配结果的Y坐标MainWindows.MoveSyncBuff[ArrId, 3] = MainWindows.VisionRst[i, 3];   //存储匹配结果的角度偏移MainWindows.MoveSyncBuff[ArrId, 4] = MainWindows.BeltMpos;          //存储匹配到产品时,传送带的位置信息ArrId = ArrId + 1;IdentiNum.Text = (Convert.ToInt32(IdentiNum.Text) + 1).ToString();WriteLog("视觉目标:" + "(" + MainWindows.VisionRst[i, 1].ToString("0,0") + "," + MainWindows.VisionRst[i, 2].ToString("0,0") + ")");}}//分数清空MainWindows.VisionRst[i, 0] = 0;}//解锁MainWindows.SetMoveSyncFlag = 0;}}Thread.Sleep(100);}
}

(2)流水线同步分拣代码详情。

/************************************************************************************
'任务编号:     无
'函数功能:     流水线同步分拣
'Input:        无
'Output:       无 
'返回值:       无             
**************************************************************************************/
public void RunSubTaskMotion()
{float[] MoveSyncTemp = new float[5];float TempMpos = 0;while (SysRunFlag > 0){while (SysRunFlag == 1){if (MainWindows.MoveSyncBuff[0, 0] == 1){MainWindows.ZauxErr = zmcaux.ZAux_Direct_GetMpos(MainWindows.g_Handle, MainWindows.ConveyorAxisId, ref TempMpos);//如果编码器位置抓取正确if (0 == MainWindows.ZauxErr) {//编码器往前运动了多少TempMpos = TempMpos - MainWindows.MoveSyncBuff[0, 4];//判断是否处于同步起始区if (((MainWindows.MoveSyncBuff[0, 1] + TempMpos) >= MainWindows.SyncReX[0]) && ((MainWindows.MoveSyncBuff[0, 1] + TempMpos) <= MainWindows.SyncReX[1])){WriteLog("开始同步抓取");//取一组数据MoveSyncTemp[0] = MainWindows.MoveSyncBuff[0, 1] ;    //XMoveSyncTemp[1] = MainWindows.MoveSyncBuff[0, 2] ;    //Y  MoveSyncTemp[2] = MainWindows.GetBinHigt;            //取料高度MoveSyncTemp[3] = MainWindows.MoveSyncBuff[0, 3];    //AanleMoveSyncTemp[4] = MainWindows.MoveSyncBuff[0, 4];    //Mpos//下发同步运动的指令//0、复位输出口zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0);//1、先同步上传送带zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 0, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);//2、同步一段时间(关节轴有滞后) 50mszmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 50, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);//3、打开真空吸嘴zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 1);//4、同步一段时间 1500mszmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 700, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);//5、同步段把Z轴提升到安全高度,选择轴到放料角度MoveSyncTemp[2] = MainWindows.StandPos[2];             //取料高度zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 100, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);//4、解除同步去放料点MoveSyncTemp[0] = MainWindows.EmptPos[0];    //XMoveSyncTemp[1] = MainWindows.EmptPos[1];    //Y  MoveSyncTemp[2] = MainWindows.EmptPos[2];    //放料高度MoveSyncTemp[3] = MainWindows.EmptPos[3];    //Aanlezmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, -1, 0, 0, -1, 4, MainWindows.gVAxisList, MoveSyncTemp);//5、关闭真空吸嘴放料,Delay100mszmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0);zmcaux.ZAux_Direct_MoveDelay(MainWindows.g_Handle, MainWindows.gVAxisList[0], 100);//6、去安全高度MoveSyncTemp[0] = MainWindows.EmptPos[0];    //XMoveSyncTemp[1] = MainWindows.EmptPos[1];    //Y  MoveSyncTemp[2] = MainWindows.StandPos[2];    //放料高度MoveSyncTemp[3] = MainWindows.EmptPos[3];    //Aanlezmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MoveSyncTemp);//操作MoveSyncBuff数据先加锁while (true){if (MainWindows.SetMoveSyncFlag == 0){MainWindows.SetMoveSyncFlag = 1;break;}}//视觉匹配缓冲区数据往前覆盖for (int k = 0; k < 49; k++){MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0];MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1];MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2];MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3];MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4];}//解锁MainWindows.SetMoveSyncFlag = 0;//等待输出口打开int TimeOut = 10000;TimeOut = 100000;//等待轴停止int AxisIdle = 0;                 //轴停止状态while (TimeOut > 0){zmcaux.ZAux_Direct_GetIfIdle(MainWindows.g_Handle, MainWindows.gVAxisList[0], ref AxisIdle);if (AxisIdle == (-1)){break;}Thread.Sleep(10);TimeOut = TimeOut - 10;}if (TimeOut <= 0){//超时要报错,程序要停止WriteLog("等待轴停止超时");//Thread.Sleep(100);SysRunFlag = 0;break;}SortNum.Text = (Convert.ToInt32(SortNum.Text) + 1).ToString();WriteLog("放料成功");//退出while 单次循环continue;}else if ((MainWindows.MoveSyncBuff[0, 1] + TempMpos) > MainWindows.SyncReX[1]){//操作MoveSyncBuff数据先加锁while (true){if (MainWindows.SetMoveSyncFlag == 0){MainWindows.SetMoveSyncFlag = 1;break;}}//视觉匹配缓冲区数据往前覆盖for (int k = 0; k < 49; k++){MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0];MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1];MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2];MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3];MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4];}//解锁MainWindows.SetMoveSyncFlag = 0;//如果视觉匹配缓冲区没有数据了if (MainWindows.MoveSyncBuff[0, 0] == 0){//Delta去待机位zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos);WriteLog("去待机位");}}}}else{//Delta去待机位zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos);}Thread.Sleep(50);}//停止传送带zmcaux.ZAux_Direct_Single_Cancel(MainWindows.g_Handle, MainWindows.ConveyorAxisId, 2);}
}

本次,正运动技术C#之Delta并联机械手的视觉同步分拣,就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

相关文章:

C#之Delta并联机械手的视觉同步分拣

本文导读 前面两节课程我们介绍了怎么建立Delta并联机械手的正逆解以及如何通过视觉进行匹配定位。本节课程给大家分享如何通过C#语言开发正运动Delta并联机械手传送带同步的视觉分拣。 VPLC711硬件介绍 VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器…...

01:Linux的基本命令

Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中&#xf…...

GNSS 载波、测距码和导航电文的关系简介

1、GNSS 载波、测距码和导航电文 在卫星导航系统中&#xff0c;载波、测距码和导航电文是构成GPS信号的三个基本组成部分&#xff0c;它们共同工作以实现精确的卫星定位和导航功能。以下是对这三个组成部分的详细介绍&#xff1a; 1. 载波&#xff08;Carrier&#xff09;&…...

deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题

deepE介绍 deepE是一个开源的用于端侧(自动驾驶车,机器人)等环境的系统问题与性能分析工具。基于ebpf功能实现 deepE项目地址 欢迎star 测试程序 #include <iostream> #include <thread> #include <mutex>static std::mutex lock;void func1() {int l…...

YOLOv5改进 | 主干网络 | ODConv + ConvNeXt 增强目标特征提取能力

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 …...

TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍

TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍 添加 一个PLC,设置PLC的IP地址,如下图所示, 添加全局DB块,新建几个变量,如下图所示, 在数据块中添加了 tag1 …… tag6 ,共 6 个浮点数类型的变量,用来接收通过 WinCC 从 Excel 文件中读取的数据。 添加 HMI…...

第5篇 区块链的技术架构:节点、网络和数据结构

区块链技术听起来很高大上&#xff0c;但其实它的核心架构并不难理解。今天我们就用一些简单的例子和有趣的比喻&#xff0c;来聊聊区块链的技术架构&#xff1a;节点、网络和数据结构。 节点&#xff1a;区块链的“细胞” 想象一下&#xff0c;区块链就像是一个大型的组织&a…...

vue长列表,虚拟滚动

1.新建子组件&#xff0c;将数据传递过去(几万条数据的数组&#xff0c;一次性展示多少条&#xff0c;每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…...

【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历 开篇词&#xff1a;干货篇&#xff1a;1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇&#xff1a;我是杰叔叔&#xff0c;一名…...

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…...

tensorflow神经网络

训练一个图像识别模型&#xff0c;使用TensorFlow&#xff0c;需要以下步骤。 1. 安装所需的库 首先&#xff0c;确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…...

Python基础001

Python输出语句 print输出字符串 print("中国四大名著&#xff1a;","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是&#xff1a;") p…...

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…...

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…...

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术&#xff0c;当传统的基于错误信息或数据回显的注入方法不可行时&#xff0c;例如当Web应用进行了安全配置&#xff0c;不显示任何错误信息或敏感数据时&#x…...

在C++中如何理解const关键字的不同用法(如const变量、const成员函数、const对象等)

在C中&#xff0c;const关键字是一个非常重要的修饰符&#xff0c;它用于指明变量、函数参数、成员函数或对象的内容是不可变的。理解const的不同用法对于编写高质量、易维护的C代码至关重要。下面详细解释const在几种不同上下文中的用法和含义。 1. const变量 当变量被声明为…...

JavaSEJava8 时间日期API + 使用心得

文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…...

【亲测解决】Python时间问题

微信公众号&#xff1a;leetcode_algos_life&#xff0c;代码随想随记 小红书&#xff1a;412408155 CSDN&#xff1a;https://blog.csdn.net/woai8339?typeblog &#xff0c;代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始&#xff0c;计划开始】&#xf…...

Linux屏幕驱动开发调试笔记

引言 首先了解下什么是MIPI-DSI&#xff1a; MIPI-DSI是一种应用于显示技术的串行接口&#xff0c;兼容DPI(显示像素接口&#xff0c;Display Pixel Interface)、DBI(显示总线接口&#xff0c;Display Bus Interface)和DCS(显示命令集&#xff0c;Display Command Set)&#…...

Nginx Http缓存的必要性!启发式缓存有什么弊端?

&#x1f440; Nginx Http缓存的必要性&#xff01;启发式缓存有什么弊端&#xff1f; 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

自然语言处理——Transformer

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

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

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

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...