连续轨迹加工和速度前瞻:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十二)

XPCIE1032H功能简介

XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。

XPCIE1032H集成了强大的运动控制功能,结合MotionRT7运动控制实时软核,解决了高速高精应用中,PC Windows开发的非实时痛点,指令交互速度比传统的PCI/PCIe快10倍。

在这里插入图片描述

XPCIE1032H支持PWM,PSO功能,板载16进16出通用IO口,其中输出口全部为高速输出口,可配置为4路PWM输出口或者16路高速PSO硬件比较输出口。输入口含有8路高速输入口,可配置为4路高速色标锁存或两路编码器输入。

XPCIE1032H搭配MotionRT7实时内核,使用本地LOCAL接口连接,通过高速的核内交互,可以做到更快速的指令交互,单条指令与多条指令一次性交互时间可以达到3-5us左右。

在这里插入图片描述
➜XPCIE1032H与MotionRT7实时内核的配合具有以下优势:

在这里插入图片描述

1.支持多种上位机语言开发,所有系列产品均可调用同一套API函数库;

2.借助核内交互,可以快速调用运动指令,响应时间快至微秒级,比传统PCI/PCIe快10倍;

3.解决传统PCI/PCIe运动控制卡在Windows环境下控制系统的非实时性问题;

4.支持一维/二维/三维PSO(高速硬件位置比较输出),适用于视觉飞拍、精密点胶和激光能量控制等应用;

5.提供高速输入接口,便于实现位置锁存;

6.支持EtherCAT总线和脉冲输出混合联动、混合插补。

在这里插入图片描述

➜使用XPCIE1032H和MotionRT7进行项目开发时,通常需要进行以下步骤:

1.安装驱动程序,识别XPCIE1032H;

2.打开并执行文件“MotionRT710.exe”,配置参数和运行运动控制实时内核;

3.使用ZDevelop软件连接到控制器,进行参数监控。连接时请使用PCI/LOCAL方式,并确保ZDevelop软件版本在3.10以上;

4.完成控制程序开发,通过LOCAL链接方式连接到运动控制卡,实现实时运动控制。

在这里插入图片描述

➜与传统PCI/PCIe卡和PLC的测试数据结果对比:

在这里插入图片描述

我们可以从测试对比结果看出,XPCIE1032H运动控制卡配合实时运动控制内核MotionRT7,在LOCAL链接(核内交互)的方式下,指令交互的效率是非常稳定,当测试数量从1w增加到10w时,单条指令交互时间与多条指令交互时间波动不大,非常适用于高速高精的应用。

XPCIE1032H控制卡安装

  • 关闭计算机电源。
  • 打开计算机机箱,选择一条空闲的XPCIE卡槽,用螺丝刀卸下相应的挡板条。
  • 将运动控制卡插入该槽,拧紧挡板条上的固定螺丝。

一、C#语言进行运动控制项目开发

在这里插入图片描述

1.到正运动技术官网的下载中心选择需要的平台库文件。

库文件下载地址:http://www.zmotion.com.cn/download_list_21.html
在这里插入图片描述

2.解压下载的安装包找到“ Zmcaux.cs ”,“ zauxdll.dll ”,“ zmotion.dll ”放入到项目文件中。
(1)“Zmcaux.cs”放在项目根目录文件中,与bin目录同级。

在这里插入图片描述

(2)“zauxdll.dll”,“zmotion.dll”放在bin → Debug。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

二、PC函数介绍

相关PC函数介绍详情可参考“ZMotion PC函数库编程手册 V2.1.1”。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、C#进行连续轨迹加工和速度前瞻运动开发

连续轨迹加工和速度前瞻控制人机交互界面如下。
在这里插入图片描述

例程模拟连续轨迹为六边形,可根据需要更改每段运动坐标走出相应轨迹。

在这里插入图片描述

1.在Form1的构造函数中调用接口ZAux_FastOpen(),使在系统初始化的时候自动链接控制器。

private void C_Open_local_Click_Click(object sender, EventArgs e)      //local链接
{
    if (g_handle == (IntPtr)0)
    {
        C_Close_Card_Click(sender, e);
    }
    zmcaux.ZAux_FastOpen(5, "LOCAL", 1000, out g_handle);
    if (g_handle != (IntPtr)0)
    {
        this.Text = "已链接 Local";
        label2.Text = "已链接";
        label2.BackColor = Color.Green;
        timer1.Enabled = true;
    }
    else
    {
        MessageBox.Show("链接失败,请选择正确的LOCAL!");
    }
}

2.通过定时器更新控制器轴状态(当前坐标、剩余缓冲数,运动状态等)。

private void timer1_Tick(object sender, EventArgs e)
{
    int[] runstate = new int[4];
    float[] curpos = new float[4];
    int RemainBuffer = 0;
    for (int i = 0; i < 4; i++)
    {
        zmcaux.ZAux_Direct_GetIfIdle(g_handle, i, ref runstate[i]);
        zmcaux.ZAux_Direct_GetDpos(g_handle, i, ref curpos[i]);
    }
    zmcaux.ZAux_Direct_GetRemain_LineBuffer(g_handle, 0, ref RemainBuffer);
    label_runstate.Text = "x:" + curpos[0] + "  y:" + curpos[1] + "  z:" + curpos[2] + "  剩余缓冲数: " + RemainBuffer + Convert.ToString(runstate[0] == 0 ? " 运行状态:运行" : "  运行状态:停止"  );
}

3.通过启动按钮的事件处理函数来设置轴参数以及前瞻参数并开始按照设点轨迹进行运动。

private void Button_start_Click(object sender, EventArgs e)    //启动
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
    }
    else
    {
        int RemainBuffer = 0;
        int CornerMode = 0;
        int[] axislist = { 0, 1, 2 };
        float[] poslist = { Convert.ToSingle(endpos1.Text), Convert.ToSingle(endpos2.Text), Convert.ToSingle(endpos3.Text) };
        float[] midlist = { Convert.ToSingle(midpos1.Text), Convert.ToSingle(midpos2.Text), Convert.ToSingle(midpos3.Text) };
        float[] firstlist = { Convert.ToSingle(firstpos1.Text), Convert.ToSingle(firstpos2.Text), Convert.ToSingle(firstpos3.Text) };
        float[] seclist = { Convert.ToSingle(secpos1.Text), Convert.ToSingle(secpos2.Text), Convert.ToSingle(secpos3.Text) };
        float[] thirdlist = { Convert.ToSingle(thirdpos1.Text), Convert.ToSingle(thirdpos2.Text), Convert.ToSingle(thirdpos3.Text) };
        float[] fourlist = { Convert.ToSingle(fourpos1.Text), Convert.ToSingle(fourpos2.Text), Convert.ToSingle(fourpos3.Text) };
        float[] fivelist = { Convert.ToSingle(fivepos1.Text), Convert.ToSingle(fivepos2.Text), Convert.ToSingle(fivepos3.Text) };
        float[] sixlist = { Convert.ToSingle(sixpos1.Text), Convert.ToSingle(sixpos2.Text), Convert.ToSingle(sixpos3.Text) };
        zmcaux.ZAux_Direct_Base(g_handle, 3, axislist); //选择运动轴列表
        zmcaux.ZAux_Direct_SetMerge(g_handle, axislist[0], 1);
        //插补运动使用的是主轴参数,及BASE的第一个轴
        zmcaux.ZAux_Direct_SetSpeed(g_handle, axislist[0], Convert.ToSingle(textBox_speed.Text));
        zmcaux.ZAux_Direct_SetAccel(g_handle, axislist[0], Convert.ToSingle(textBox_acc.Text));
        zmcaux.ZAux_Direct_SetDecel(g_handle, axislist[0], Convert.ToSingle(textBox_dec.Text));
        zmcaux.ZAux_Direct_SetSramp(g_handle, axislist[0], Convert.ToSingle(textBox_sramp.Text));
        if (checkBox1.Checked == true)
        CornerMode += 2;
        if (checkBox2.Checked == true)
        CornerMode += 8;
        if (checkBox3.Checked == true)
        CornerMode += 32;
        //设置前瞻模式及对应参数
        zmcaux.ZAux_Direct_SetCornerMode(g_handle, axislist[0], CornerMode);
        zmcaux.ZAux_Direct_SetDecelAngle(g_handle, axislist[0], Convert.ToSingle(textBox_DecelAngle.Text)* Convert.ToSingle(Math.PI / 180));
        zmcaux.ZAux_Direct_SetStopAngle(g_handle, axislist[0], Convert.ToSingle(textBox_StopAngle.Text) * Convert.ToSingle(Math.PI / 180));
        zmcaux.ZAux_Direct_SetFullSpRadius(g_handle, axislist[0], Convert.ToSingle(textBox_SpRadius.Text));
        zmcaux.ZAux_Direct_SetZsmooth(g_handle, axislist[0], Convert.ToSingle(textBox_ZSmooth.Text));
        zmcaux.ZAux_Direct_SetForceSpeed(g_handle, axislist[0], Convert.ToSingle(textBox_speed.Text));
        //触发示波器
        zmcaux.ZAux_Trigger(g_handle);
        if (run_mode == 1)          //绝对
        {
            //判断缓冲区,如果缓冲不够则等待完成再加载指令
            while (RemainBuffer < 50)
                zmcaux.ZAux_Direct_GetRemain_LineBuffer(g_handle, axislist[0], ref RemainBuffer);
            switch (move_mode)
            {
                case 2:     //XY圆弧
                    zmcaux.ZAux_Direct_MoveCirc2Abs(g_handle, 2, axislist, midlist[0], midlist[1], poslist[0], poslist[1]);
                    break;
                case 3:     //XYZ直线
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, firstlist);
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, seclist);
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, thirdlist);
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, fourlist);
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, fivelist);
                    zmcaux.ZAux_Direct_MoveAbs(g_handle, 3, axislist, sixlist);
                    break;
                case 4:      //螺旋插补   
                    zmcaux.ZAux_Direct_MHelical2Abs(g_handle, 3, axislist, midlist[0], midlist[1], poslist[0], poslist[1], poslist[2], 0);
                    break;
                default:
                    break;
            }
        }
        else    //相对
        {
            switch (move_mode)
            {
                case 2:
                    zmcaux.ZAux_Direct_MoveCirc2(g_handle, 2, axislist, midlist[0], midlist[1], poslist[0], poslist[1]);
                    break;
                case 3:
                    //第一段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, firstlist);
                    //第二段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, seclist);
                    //第三段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, thirdlist);
                    //第四段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, fourlist);
                    //第五段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, fivelist);
                    //第六段运动
                    zmcaux.ZAux_Direct_Move(g_handle, 3, axislist, sixlist);
                    break;
                case 4:
                    zmcaux.ZAux_Direct_MHelical2(g_handle, 3, axislist, midlist[0], midlist[1], poslist[0], poslist[1], poslist[2], 0);
                    break;
                default:
                    break;
            }
        }
    }
}

4.停止按钮,通过函数接口ZAux_Direct_Single_Cancel()停止运动。

private void Button2_Click(object sender, EventArgs e)              //停止
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int iret = 0;
    iret = zmcaux.ZAux_Direct_Single_Cancel(g_handle, m_AxisMaster, 2);
}

5.坐标清零按钮通过函数接口ZAux_Direct_SetDpos()来重置当前运动坐标位置。

private void Button_zero_Click(object sender, EventArgs e)      //坐标清零
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
    }
    else
    {
        for (int i = 0; i < 3; i++)
        {
            zmcaux.ZAux_Direct_SetDpos(g_handle, i, 0);
        }
    }
}

四、调试与监控

CornerMode功能前瞻设置说明

系统的速度前瞻功能:一方面可以对指令进行整体规划,即对各段速度进行整体规划,再配合指令段内的加减速控制,可以使机床保持高速运行提高效率,使负载运动更加流畅,告别停停走走,系统通过Merge 速度融合功能实现;

另一方面,再保证高速运行基础上为了限制机械冲击和过切等,还需进行减速识别,通过提前识别轨迹变化,从而按照安全的减速度提前减速,系统通过减速/停止融合功能、抑制冲击功能实现。

整体来看,速度前瞻功能既可提升整机效率,也可减少冲击增加柔性,降低零部件磨损,增加设备使用寿命。

01 拐角减速

ZAux_Direct_SetCornerMode=2

拐角减速应用场合:不改变运动轨迹,仅在拐角处自动判断是否减速,一般用于改善机台抖动的问题,对轨迹精度有要求,对速度要求没那么快的场合。

拐角减速功能解决的问题是:当指令间夹角过大时,如果仍以较大速度运行,会在夹角处产生较大的机械冲击,轨迹偏离。

控制器会对指令间轨迹变化的夹角进行提前识别,比较其与减速/停止角的大小关系,提前决定是否进行减速,保证在指令连接处平稳过渡。

如图,OA过渡AB段位置时角度小于减速角度则,S1-S2段不进行减速,AB过渡BC段时角度大于减速角度则进行减速处理过渡过程如S2-S3段,BC过渡CD段角度大于停止角度速度需要降到零如S3-S4段位置处理。
在这里插入图片描述
在这里插入图片描述

减速角度是指电机的参考角度相对上一条运动的变化值。如下图。此角度值不是实际轨迹的角度,是换算到电机变换的角度,此角度值仅为参考。
在这里插入图片描述

(1)拐角减速未开启

在这里插入图片描述

(2)拐角减速开启,运动达到减速条件

在这里插入图片描述

在这里插入图片描述

02 自动倒角

ZAux_Direct_SetCornerMode=32

自动倒角应用场合:改变运动轨迹,不会降低速度, 针对轨迹拐角较大的场合,倒角处运动轨迹做自动平滑处理,所以一般应用在对速度要求快,对轨迹精度要求不高的场合。

自动倒角功能一般是用于拐角处按照一定的倒角半径进行轨迹的弧度化处理,使速度变化更平滑。

(1)倒角未开启
在这里插入图片描述

(2)倒角开启,拐角位置图形变平滑
在这里插入图片描述

在这里插入图片描述

03 小圆限速

ZAux_Direct_SetCornerMode=8

小圆限速应用场合:不改变运动轨迹,一般应用在圆弧加工,根据圆弧半径计算当前圆弧的限制速度。

小圆限速功能用于处理,在运行轨迹中可能运行圆弧轨迹拟合成的小圆,由于角度偏转较大导致出现轨迹偏转,因此在这种位置需要进行速度限制的处理。开启小圆限速,小圆半径超过限速半径的时候不会对速度限制,小圆半径小于限速半径的时候则会开始对速度进行限制。

(1)开启小圆限速,小圆半径100 > 限速半径30,速度正常达到顶点。

在这里插入图片描述
在这里插入图片描述

(2)开启小圆限速,小圆半径100 < 限速半径150,速度受到限制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本次,正运动技术连续轨迹加工和速度前瞻:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十二),就分享到这里。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/410590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盈致MES系统助力企业实现数字化转型

盈致MES系统通过以下几个方面帮助企业实现数字化转型&#xff1a; 生产流程透明化&#xff1a;MES系统通过实时采集生产现场的数据&#xff0c;实现了生产流程的透明化管理。企业可以实时了解生产进度、设备状态、质量检测等信息&#xff0c;提高了生产管理的效率和准确性。 优…

不再为写作发愁:4款AI写作软件推荐

当下&#xff0c;在写作领域&#xff0c;AI写作软件越来越多&#xff0c;为有写作需求的人群提供了很大的帮助&#xff0c;让写作者们能够更高效、更便捷地进行创作。下面将介绍4款值得关注的AI写作软件&#xff0c;帮助你轻松写作。 推荐工具一 爱制作AI 推荐指数&#xff1a…

网络编程-编码与解码(Protobuf)

编码与解码 下面的文字都来自于极客时间 为什么要编解码呢&#xff1f;因为计算机数据传输的是二进制的字节数据 解码&#xff1a;字节数据 --> 字符串&#xff08;字符数据&#xff09; 编码&#xff1a;字符串&#xff08;字符数据&#xff09;–> 字节数据 我们在编…

(二十三)Flask之高频面试点

目录&#xff1a; 每篇前言&#xff1a;Q1&#xff1a;为什么把request和session放在一起&#xff1f;Q2&#xff1a;Local对象的作用&#xff1f;Q3:&#xff1a;LocalStack对象的作用&#xff1f;Q4&#xff1a;一个运行中的Flask应用程序分别包括几个Local/LocalStack&#…

能为企业节省巨额成本的稳定性测试!你确定不来看看吗?

首先来说说性能测试&#xff1a; 性能是软件的一种非功能特性&#xff0c;他关注的不是软件是否完成了特定的功能&#xff0c;而是软件在完成特定功能是展示出来的及时性。 及时性从不同的视角代表不同的指标&#xff1a; 用户&#xff1a;响应时间 系统管理员&#xff1a;资…

20240223-2092.查找所有有秘密的人

题目要求 给你一个整数 n&#xff0c;表示有 n 个人&#xff0c;编号从 0 到 n - 1。你还给你一个 0 索引的二维整数数组 meetings&#xff0c;其中 meetings[i] [xi, yi, timei] 表示 xi 和 yi 在 timei 有一个会议。一个人可以同时参加多个会议。最后&#xff0c;给你一个整…

用Python Matplotlib画图导致paper中含有Type-3字体,如何解决?

用Python Matplotlib画图导致paper中含有Type-3字体&#xff0c;如何解决&#xff1f; 在提交ACM或者IEEE论文之前&#xff0c;都会有格式的检查&#xff0c;格式的其中一个要求是paper中不能含有Type-3的字体。因为Type-1和True Type字体都是矢量字体&#xff0c;而Type-3并不…

工控网关在智能制造领域的应用与实践-天拓四方

随着工业4.0和智能制造的深入推进&#xff0c;工控系统作为连接管理层与执行层的关键纽带&#xff0c;其智能化、网络化水平日益成为衡量企业现代化程度的重要标志。工控网关作为实现工控系统内外信息交互的“智能桥梁”&#xff0c;在提升工业控制网络的连通性、安全性和智能化…

第3集《灵峰宗论导读》

《灵峰宗论》导读。诸位法师&#xff0c;诸位同学&#xff0c;阿弥陀佛&#xff01;&#xff08;阿弥陀佛&#xff01;&#xff09; 请大家打开讲义第5面&#xff0c;悟道。 这一科我们是说明论主略史&#xff0c;在这一科当中&#xff0c;我们根据弘一大师所编的《蕅益大师年…

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C++ QT项目5】——基于HTTP与JSON数据流的天气预报界面设计

【C QT项目5】——基于HTTP与JSON数据流的天气预报界面设计 一、项目概述二、UI设计与stylesheet样式表三、天气预报数据接口四、JSON数据4.1 概述4.2 QT生成JSON数据4.3 QT解析JSON数据4.4 将JSON数据解析到QMap中 五、软件开发网络通信架构5.1 BS架构/CS架构5.2 HTTP基本概念…

Vi/Vim 使用小窍门,如何消除搜索后的关键字高亮

Vim/Vi 基本上是 *nix 世界最受欢迎的编辑器了&#xff0c;不知道为什么&#xff0c;一直以来觉得和 Emacs 比起来&#xff0c;Vim 更加有亲和力。用起来很舒服。 今天就记录一个困扰了我很久的问题。 大家应该都知道&#xff0c;在 Vi 里面如果要搜索某个关键字&#xff0c;…

2024国际生物发酵展览会不容错过-欧瑞安电气

参展企业介绍 山东欧瑞安电气有限公司成立于2013年&#xff0c;坐落于泰山脚下的泰安国家高新区&#xff0c;是国家高新技术企业、国家专精特新“小巨人”企业、中国产学研合作创新示范企业、山东省“隐形冠军”企业、山东省技术创新示范企业、山东省高端品牌培育企业、山东省…

Mac使用K6工具压测WebSocket

commend空格 打开终端&#xff0c;安装k6 brew install k6验证是否安装成功 k6 version设置日志级别为debug export K6_LOG_LEVELdebug执行脚本&#xff08;进入脚本所在文件夹下&#xff09; k6 run --vus 100 --duration 10m --out csvresult.csv script.js 脚本解释&…

免费分享一套SpringBoot+Vue实验室(预约)管理系统,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue实验室(预约)管理系统 &#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue实验室(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue实验室(预约)管理系统 Java毕…

【深度学习笔记】3_11 模型选择、欠拟合和过拟合

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;做了部分个人理解标注&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.11 模型选择、欠拟合和过拟合 在前几节基于Fashion-MNIST数据集的实验中&#xff0c;我们评价了机器学习模型在训练数据集和测试数…

【前端】nginx 反向代理,实现跨域问题

前面讲跨域的问题&#xff0c;这篇 C# webapi 文章里面已经说过了。在上述文章中是属于从服务器端去允许访问的策略去解决跨域问题。而这里是从客户端的角度利用反向代理的方法去解决跨域问题。 反向代理&#xff1a;其原理就是将请求都接收到一个中间件&#xff08;中间地址&a…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目&#xff0c;是基于Java开发的一种CI&#xff08;Continuous integration&#xff0c;持续集成&#xff09; &CD (Continuous Delivery&#xff0c;持续交付)工具&#xff0c;用于监控持续重复的工作&a…

深入浅出JVM(十二)之垃圾回收算法

上篇文章深入浅出JVM&#xff08;十一&#xff09;之如何判断对象“已死”已经深入浅出的解析JVM是如何评判对象不再使用&#xff0c;不再使用的对象将变成“垃圾”&#xff0c;等待回收 垃圾回收算法有多种&#xff0c;适用于不同的场景&#xff0c;不同的垃圾收集器使用不同…

Matlab自学笔记二十七:详解格式化文本sprintf各参数设置方法

1.一个程序引例 上篇文章已经介绍了格式化文本的初步应用&#xff0c;程序示例如下&#xff1a; sprintf(|%f\n|%.2f\n|%8.2f,pi*ones(1,3)) 2.格式化操作符各字段的含义解析 格式化操作符可以有六个字段&#xff0c;只有主字符%和转换格式是必需的&#xff0c;其他都是可选…
最新文章