全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口

news2024/9/25 21:21:10

上节课程我们介绍了全国产EtherCAT运动控制边缘控制器ZMC432H的硬件接口与功能,本节课程我们主要讲解一下正运动API函数封装原理以及自定义API封装例程。

一、功能简介

全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控,运动控制接口兼容EtherCAT总线和脉冲型的独立式运动控制器,最多支持32轴运动控制,同时支持正运动远程HMI功能,能提供网络组态显示,可实时监控和调整参数配置。

在这里插入图片描述

ZMC432H具备丰富的硬件接口和控制功能模块,能实现高效稳定的运动控制和实时数据采集,以满足工业控制协同工业互联网的应用需求。

ZMC432H内置了Linux系统,可以使用本地的LOCAL接口进行连接,可以做到更快速的指令交互,单条指令与多条指令一次性交互时间为40us左右。

在这里插入图片描述

ZMC432H视频介绍:

全国产EtherCAT运动控制边缘控制器ZMC432H

二、统一的API接口

在这里插入图片描述

所有的控制器和控制卡均使用同一套API函数,均支持C、C++、C#、LabVIEW、Python、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac等操作系统。

各个开发语言都有各自所对应的函数库,所调用的API均一致,这大大提高了可移植性。各个开发语言库的调用方式可参考“ZMotion PC函数库编程手册 V2.1.1”。

文档参考路径:光盘资料\04PC函数\Zmotion PC函数库编程手册及例程源码。
在这里插入图片描述

以下为各个功能部分API指令一览表;

1、控制器连接
在这里插入图片描述

2、控制器信息获取
在这里插入图片描述

3、基本轴参数设置
在这里插入图片描述

4、基本运动控制
在这里插入图片描述

5、VR寄存器
在这里插入图片描述

6、Table寄存器
在这里插入图片描述

7、Modbus寄存器
在这里插入图片描述

8、Flash/文件读写
在这里插入图片描述

更多API接口详情可以参考“ZMotion PC函数库编程手册 V2.1.1”。

在这里插入图片描述

三、在线命令的机制

ZAux_Execute或ZAux_DirectCommand可对Basic指令进行封装。如果使用到没有封装的命令或者想封装自己的函数,可以通过ZAux_Execute发送或ZAux_DirectCommand,或是参照已有代码修改增加相应的函数。

发送字符串命令有两种方式,缓冲方式和直接方式 。具体如图所示:
在这里插入图片描述

直接方式:直接执行单个变量/数组/参数相关命令,此时所有传递的参数必须是具体的数值,不能是表达式;

缓冲方式:可以执行所有命令,并支持表达式作为参数,但是速度慢一些;

以zmcaux.cpp中对已封装的设置运动速度的函数ZAux_Direct_SetSpeed()与获取当前编码器反馈位置的函数ZAux_Direct_GetMpos为例。

程序如下:

#include "zmotion.h" 
#include "zauxdll2.h" 
int ZAux_Direct_SetSpeed(ZMC_HANDLE handle, int iaxis, float fValue) 
{ 
    char cmdbuff[2048]; 
    char cmdbuffAck[2048]; 
    if (iaxis> MAX_AXIS_AUX) //MAX_AXIS_AUX为zuaxdll2.h中定义的宏,zuaxdll2.h为正运动库头文件
    { 
        return ERR_AUX_PARAERR; 
    } 
    sprintf(cmdbuff,"SPEED(%d)=%f",iaxis,fValue);//生成对应命令的字符串 
    ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048); 
}
int ZAux_Direct_GetMpos(ZMC_HANDLE handle, int iaxis, float fValue) 
{ 
    char cmdbuff[2048]; 
    char cmdbuffAck[2048]; 
    if (iaxis> MAX_AXIS_AUX) 
    { 
        return ERR_AUX_PARAERR; 
    } 
    sprintf(cmdbuff,"MPOS(%d)=%f",iaxis,fValue);//生成对应命令的字符串 
    ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048); 
}

四、自定义API封装介绍及例程

1、自定义API封装

自定义封装API的原理实际上是利用了在线命令的机制,上位机生成由各种ZBASIC指令来达到自己想要的功能。

ZAux库便是直接利用ZBASIC命令通过ZAux_Execute方式或ZAux_DirectCommand方式发送到控制器上,相应函数可以参考ZBASIC手册对应的命令介绍。

ZAux库是完全开源库,源代码皆可从官网下载,可以在源代码中添加用户自定义的函数,用户也可以新增库进行封装。

PC函数库辅助库的封装

2、实用封装例程

(1)直接获取多种类型数据

用户若想要获取多种数据,如轴的命令位置,轴的反馈位置,板卡上的 IO点等等,往往都是通过多种单独独立的函数获取不同的数据,这样堆积,会导致读写次数的上位,导致程序的卡顿。

为了提升一个上位程序读取控制器数据的速度,往往可以通过自定义一个函数,快速的把数据传输到上位程序上面来,而不是通过多次循环来获取不同类型的数据。

例:假设有一个简易的三轴平台,需要读取轴0,轴1,轴2的命令位置,反馈位置,以及控制器板卡上的输入口0,输入口32,输出口0,输出口33,以及三个轴的状态。

在这里插入图片描述

获取数据程序如下

// test1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include #include "zmotion.h"
#include "zauxdll2.h"
void commandCheckHandler(const char *command, int ret)
{
    if (ret)//非0则失败
    {
        printf("%s fail!return code is %d\n", command, ret);
    }
}
/*************************************************************
Description: //我的自定义直接获取数据函数
Input:       //handle          卡链接
             iaxisNum          轴的总数量
             iaxislist         轴号列表
             fDposlist         输出的命令位置值
             fMposlist         输出的反馈位置值
             iAxisstatuslist   输出的轴状态位置值,按位对应
             startIn           要获取起始的IN编号
             endIn             要获取结束的IN编号
             iIn               输出的IN状态,按位对应
             startOut          要获取起始的OUT编号
             endOut            要获取结束的OUT编号
             iOut              输出的OUT状态,按位对应
Output:      //
Return:      //错误码
*************************************************************/
int  Demo_Direct_MyGetData(ZMC_HANDLE handle,int iaxisNum, int* iaxislist, float* fDposlist,float* fMposlist,int32* iAxisstatuslist,int startIn , int endIn,int *iIn,int startOut , int endOut,int *iOut) 
{
    char cmdbuff[2048];
    char  tempbuff[2048];
    char cmdbuffAck[20480];
    //若传进来的地址为空,则退出
    if(NULL == iaxislist || NULL == fDposlist || NULL == fMposlist ||  NULL == iAxisstatuslist || NULL == iIn || NULL == iOut)
    {
        return  ERR_AUX_PARAERR;
    }
    //若传进来的结束编号小于起始编码,则退出
    if ((endIn<startIn)  ||  (endOut<startOut))
    {
        return  ERR_AUX_PARAERR;
    }
    int ret=0;
    int i;
    //生成命令
    sprintf(cmdbuff, "?");
    //拼接DPOS
    for (i=0;i1000)
        {
            return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
        }
    }
    //拼接MPOS
    for (i=0;i1000)
        {
            return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
        }
    }
    //拼接AXISSTATUS
    for (i=0;i1000)
        {
            return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
        }
    }
    int32 ostart,istart,iend,oend;    //一次最多32个
    bool addflag;
    addflag=false;
    int32 temp;    //一次最多32个
    int32 temp2;    //一次最多32个
    temp=endIn-startIn+1;
    if (temp%32 == 0)
    {
        temp=temp/32;
    } 
    else
    {
        temp=temp/32+1;
    }
    //拼接IN
    for (i=0;iendIn)
        {
            iend=endIn;
        }
        //生成命令
        sprintf(tempbuff, "IN(%d,%d),", istart,iend);
        strcat(cmdbuff, tempbuff);//字符串拼接
        if (strlen(cmdbuff)>1000)
        {
            return ERR_AUX_PARAERR ;  //参数错误,字符串拼接过长
        }
    }
    temp2=endOut-startOut+1;
    if (temp2%32 == 0)
    {
        temp2=temp2/32;
    } 
    else
    {
        temp2=temp2/32+1;
    }
    //拼接OUT
    for (i=0;iendOut)
        {
            oend=endOut;
        }
        //生成命令
        sprintf(tempbuff, "OUT(%d,%d)", ostart,oend);
        strcat(cmdbuff, tempbuff);//字符串拼接
        if (i1000)
        {
            return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
        }
    }
    printf("拼接的字符串:\n",cmdbuff);
    printf("%s\n",cmdbuff);
    ret=ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048);
    if(ERR_OK != ret)
    {
        return ret;
    }
    //printf("%s\n",cmdbuffAck);
    //printf("%d\n",strlen(cmdbuffAck));
    //
    if(0 == strlen(cmdbuffAck))
    {
        return ERR_NOACK;
    }
    float ftempbuff[200];
    int itempbuff[200];
    ZAux_TransStringtoFloat(cmdbuffAck,iaxisNum*2,ftempbuff);//字符串转换为浮点数
    //DPOS输出
    for(i=0;i<iaxisNum;i++)
    {
        //printf("%f\n",ftempbuff[i]);
        fDposlist[i]=ftempbuff[i];
    }
    //MPOS输出
    for(i=0;i<iaxisNum;i++)
    {
        //printf("%f\n",ftempbuff[i+iaxisNum]);
        fMposlist[i]=ftempbuff[i+iaxisNum];
    }
    ZAux_TransStringtoInt(cmdbuffAck,iaxisNum*3+temp2+temp,itempbuff);//字符串转换为整形
    //AXISSTATUS输出
    for(i=0;i<iaxisNum;i++)
    {
        //printf("%d\n",itempbuff[i+iaxisNum*2]);
        iAxisstatuslist[i]=itempbuff[i+iaxisNum*2];
    }
    //IN输出
    for(i=0;i<temp;i++)
    {
        //printf("%d\n",itempbuff[i+iaxisNum*3]);
        iIn[i]=itempbuff[i+iaxisNum*3];
    }
    //OUT输出
    for(i=0;i<temp2;i++)
    {
        //printf("%d\n",itempbuff[i+iaxisNum*3+temp]);
        iOut[i]=itempbuff[i+iaxisNum*3+temp];
    }
    return ERR_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
    char *ip_addr = (char *)"127.0.0.1";               //控制器IP地址
    ZMC_HANDLE handle = NULL;                   //连接句柄
    int ret = ZAux_OpenEth(ip_addr, &handle);   //连接控制器
    if (ERR_SUCCESS != ret)
    {
        printf("控制器连接失败!\n");
        handle = NULL;
        Sleep(2000);
        return -1; 
    }
    printf("控制器连接成功!\n");
    int axis[4]={0,1,2,4};
    float d_dpos[4];
    float d_mpos[4];
    int32 d_axis_status[4];
    int d_in[10];
    int d_out[10];
    ret=Demo_Direct_MyGetData(handle,3,axis,d_dpos,d_mpos,d_axis_status,0,32,d_in,0,33,d_out);
    int i;
    printf("获取到的轴命令位置:\n");
    for (i=0;i<3;i++)
    {
        printf("\t轴%d :%f",i,d_dpos[i]);
    }
    printf("\n");
    printf("获取到的轴反馈位置:\n");
    for (i=0;i<3;i++)
    {
        printf("\t轴%d :%f",i,d_mpos[i]);
    }
    printf("\n");
    printf("获取到的轴状态(按位对应):\n");
    for (i=0;i<3;i++)
    {
        printf("\t轴%d :%d",i,d_axis_status[i]);
    }
    printf("\n");
    printf("获取到的输入口状态:\n");
    int j=0;
    int tempval;
    for (i=0;i0) )
        {
            j++;
        }
        //转换成位
        tempval=d_in[j]>>(i-32*j);
        printf("    IN(%d):%d",i,tempval &(0x01));
        if (((i%8)==0)&&(i>0) )
        {
            printf("\n");
        }
    }
    printf("\n");
    printf("获取到的输出口状态:\n");
    j=0;
    for (i=0;i0) )
        {
            j++;
        }
        //转换成位
        tempval=d_out[j]>>(i-32*j);
        printf("    OUT(%d):%d",i,tempval &(0x01));
        if (((i%8)==0)&&(i>0) )
        {
            printf("\n");
        }
    }
    printf("\n");
    Sleep(20000);
    ret = ZAux_Close(handle);    //关闭连接
    commandCheckHandler("ZAux_Close", ret) ;//判断指令是否执行成功
    printf("connection closed!\n");
    handle = NULL;
    return 0;
}

(2)一行命令执行多条不同类型缓冲指令

一般点胶行业、木工行业用的较多的是连续轨迹,连续轨迹之间有插入缓冲输出,如果把运动和连续轨迹分开发送的话,难免会有局限性,可以通过自己单独封装运动函数,来达到一行命令执行多个函数的效果。

例: 假设控制一个XY两轴平台,从坐标点(0,0),(100,0)(输出口0输出50ms) → (100,100)(输出口0输出50ms) → (0,100)(输出口0输出50ms) → (0,0)(输出口0输出50ms)的轨迹,则可以通过自己封装,用一条函数,快速发送下去。

一行命令执行多个函数程序如下

// test1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include #include "zmotion.h"
#include "zauxdll2.h"
void commandCheckHandler(const char *command, int ret)
{
    if (ret)//非0则失败
    {
        printf("%s fail!return code is %d\n", command, ret);
    }
}
/*************************************************************
Description: //我的自定义运动函数
Input:       //handle      卡链接
             iMoveLen      填写的运动长度
             iaxisNum      参与运动总轴数
             iaxislist     轴号列表
             fPoslist      距离列表
             iout          缓冲输出口
             outlist       缓冲输出列表(每条运动,决定是否输出,0为不输出,1为在运动后输出)
             outtime       缓冲输出时间
Output:      //
Return:      //错误码
*************************************************************/
int  Demo_Direct_MyMoveABS(ZMC_HANDLE handle,int iMoveLen,int iaxisNum, int* iaxislist, float* fPoslist,int iout,int *outlist,int outtime) 
{
    char cmdbuff[2048];
    char  tempbuff[2048];
    char cmdbuffAck[20480];
    //若传进来的地址为空,则退出
    int ret=0;
    int i;
    //先读取剩余直线缓冲
    int iBuffLen = 0;
    ret = ZAux_Direct_GetRemain_LineBuffer(handle,iaxislist[0],&iBuffLen);
    if(iBuffLen <= iMoveLen*2)
    {
        return 1002;      //运动缓冲不够
    }
    //生成命令
    sprintf(cmdbuff, "BASE(");
    //拼接运动轴列表
    for (i=0;i1000)
        {
            return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
        }
    }
    sprintf(tempbuff,"%d)\n",iaxislist[i]);//生成对应命令的字符串
    strcat(cmdbuff,tempbuff);
    //拼接运动
    for (i=0;i1000)
    {
        return  ERR_AUX_PARAERR;  //参数错误,字符串拼接过长
    }
    ret=ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048);
    return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
    char *ip_addr = (char *)"127.0.0.1";               //控制器IP地址
    ZMC_HANDLE handle = NULL;                   //连接句柄
    int ret = ZAux_OpenEth(ip_addr, &handle);   //连接控制器
    if (ERR_SUCCESS != ret)
    {
        printf("控制器连接失败!\n");
        handle = NULL;
        Sleep(2000);
        return -1; 
    }
    printf("控制器连接成功!\n");
    ret =ZAux_Direct_SetAtype(handle,0,1);//设置轴0轴类型为1
    commandCheckHandler("ZAux_Direct_SetAtype", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetAtype(handle,1,1);//设置轴1轴类型为1
    commandCheckHandler("ZAux_Direct_SetAtype", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetUnits(handle,0,100);//设置轴0脉冲当量为100
    commandCheckHandler("ZAux_Direct_SetUnits", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetUnits(handle,1,100);//设置轴1脉冲当量为100
    commandCheckHandler("ZAux_Direct_SetUnits", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetAccel(handle,0,500);//设置轴0加速度
    commandCheckHandler("ZAux_Direct_SetAccel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetAccel(handle,1,500);//设置轴1加速度
    commandCheckHandler("ZAux_Direct_SetAccel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetDecel(handle,0,500);//设置轴0减速度
    commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetDecel(handle,1,500);//设置轴1减速度
    commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetDpos(handle,0,0);//设置轴0 DPOS清0
    commandCheckHandler("ZAux_Direct_SetDpos", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetDpos(handle,1,0);//设置轴1 DPOS清0
    commandCheckHandler("ZAux_Direct_SetDpos", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetSpeed(handle,0,100);//设置轴0速度
    commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetSpeed(handle,1,100);//设置轴1速度
    commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判断指令是否执行成功
    ret =ZAux_Direct_SetMerge(handle,0,1);//设置开启连续插补(开启主轴的即可,如轴0,轴1插补,轴0为主轴,主轴号取决于连续插补运动指令轴列表的第一个轴号)
    int axis[2]={0,1};
    float POS[12]={0,0,0,100,100,100,100,0,0,0};
    int otlist[5]={0,1,1,1,1};
    ZAux_Trigger(handle);//触发示波器
    ret = Demo_Direct_MyMoveABS(handle,5,2,axis,POS,0,otlist,50);//
    commandCheckHandler("Demo_Direct_MyMoveABS", ret) ;//判断指令是否执行成功
    Sleep(20000);
    ret = ZAux_Close(handle);    //关闭连接
    commandCheckHandler("ZAux_Close", ret) ;//判断指令是否执行成功
    printf("connection closed!\n");
    handle = NULL;
    return 0;
}

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

3、例程讲解

自定义API封装例程

本次,正运动技术全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口,就分享到这里 。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Genoss GPT简介:使用 Genoss 模型网关实现多个LLM模型的快速切换与集成

一、前言 生成式人工智能领域的发展继续加速&#xff0c;大型语言模型 (LLM) 的用途范围不断扩大。这些用途跨越不同的领域&#xff0c;包括个人助理、文档检索以及图像和文本生成。ChatGPT 等突破性应用程序为公司进入该领域并开始使用这项技术进行构建铺平了道路。 大公司正…

SOLIDWORKS有限元分析

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件&#xff0c;同时它还具有强大的有限元分析功能。有限元分析是一种工程分析方法&#xff0c;它将复杂的实体分解成许多小的有限元素&#xff0c;以便对其进行数学建模和分析。SOLIDWORKS的有限元分析功能可以帮助工程师预测和…

nbcio-boot3.1 解决积木报表基于SSTI的任意代码执行漏洞,积木报表版本从1.4.0升级到最新的1.6.1

1、积木报表基于SSTI的任意代码执行漏洞 使用JeecgBoot 受影响版本中由于积木报表 /jeecg-boot/jmreport/queryFieldBySql Api接口未进行身份校验&#xff0c;使用 Freemarker 处理用户用户传入的 sql 参数&#xff0c;未经授权的攻击者可发送包含恶意 sql 参数的 http 请求&am…

vue3动态组件

1 、 可以通过 shallowRef 把 可以把组件进行包裹 <template><div><el-button click"setclick(son1)">1111</el-button><el-button click"setclick(son2)">2222</el-button><el-button click"setclick(son…

数字变有趣,分析师的必备利器——奥威BI数据可视化工具

数据分析不仅要在短时间内把数据情况摸清、把数据关联梳理清楚&#xff0c;还需要以一直直观易懂的方式将数据信息准确传递给使用者&#xff0c;便于使用者利用这些数据信息去决策管理&#xff0c;这就是数据可视化。说到这&#xff0c;就不得不请出让数据变得有趣、易懂&#…

解决Java中的“Unchecked cast: java.lang.Object to java.util.List”问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

使用Scrapy构建自己的数据集

一、说明 当我第一次开始在工业界工作时&#xff0c;我很快意识到的一件事是&#xff0c;有时你必须收集、组织和清理自己的数据。在本教程中&#xff0c;我们将从一个名为FundRazr的众筹网站收集数据。像许多网站一样&#xff0c;该网站有自己的结构、形式&#xff0c;并有大量…

vs code 环境变量的配置

问题 环境变量中重复出现下面这两项 ..:/home/xxx/.local/bin/:/home/xxx/.local/bin/:...这造成了一些环境污染&#xff0c;因为/home/xxx/.local/bin 这个环境变量放在前面&#xff0c;文件夹里面的可执行的文件会比conda环境更加优先地执行。 解决 先说结论&#xff0c;…

数字孪生重塑生产格局:智慧工厂的前景与挑战

随着科技的飞速发展&#xff0c;数字孪生技术在智慧工厂的建设中正展现出令人瞩目的作用。数字孪生&#xff0c;一种将实际物理对象与数字虚拟模型相结合的前沿技术&#xff0c;不仅改变了生产方式&#xff0c;更为智慧工厂的未来描绘了一幅令人振奋的画卷。 在智慧工厂的建设…

Java实现敏感词过滤功能

敏感词过滤功能实现 1.GitHub上下载敏感词文件 2.将敏感词文件放在resources目录下 在业务中可以将文本中的敏感词写入数据库便于管理。 3.提供实现类demo 代码编写思路如下&#xff1a;1.将敏感词加载到list中&#xff0c;2.添加到StringSearch中&#xff0c;3.校验&#x…

SSL证书如何使用?SSL保障通信安全

由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中&#xff0c;因此&#xff0c;仅需安装数字证书或服务器证书就可以激活功能了。SSL证书主要是服务于HTTPS&#xff0c;部署证书后&#xff0c;网站链接就由HTTP开头变为HTTPS。 SSL安全证书主要用于发送安全电子邮件、访…

最新发布!2023版贵州省标准地图

日前&#xff0c;贵州省自然资源厅最新发布了10幅2023版《贵州省标准地图》&#xff0c;涉及政区、水系、交通、全要素等专题。此次发布的新版《贵州省标准地图》&#xff0c;紧紧围绕聚焦实事、铆定实用、主推实效、力主实惠而组织编制。 贵州省自然资源厅将编制出版2023版《…

TCP拥塞控制详解 | 2. 背景

网络传输问题本质上是对网络资源的共享和复用问题&#xff0c;因此拥塞控制是网络工程领域的核心问题之一&#xff0c;并且随着互联网和数据中心流量的爆炸式增长&#xff0c;相关算法和机制出现了很多创新&#xff0c;本系列是免费电子书《TCP Congestion Control: A Systems …

视频云存储/安防监控/视频汇聚EasyCVR平台新增经纬度选取功能

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

1x1 卷积:解释器

一、说明 在这篇博客中&#xff0c;我们将尝试深入探讨 1x1 卷积操作的概念&#xff0c;该概念出现在 Lin等人 &#xff08;2013&#xff09; 的论文“网络中的网络”和 Szegedy 等人 &#xff08;2014&#xff09; 的论文“Go Deep with Convolutions” 中&#xff0c;该论文提…

MYSQL基本命令和操作

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : JAVA &#x1f606;今日提问 : 你好&#xff0c;我的朋友&#xff0c;在你的人生途中&#xff0c;会面临很多选择&#xff0c;不管选什么样的结果&#xff0c;我们都多少会有些后悔。如果是你&#xff0c;你会选择爱你的&…

win10系统docker创建ubuntu容器解决开发环境问题

一、win10系统使用docker的原因 最近啊&#xff0c;在学习人工智能-深度学习&#xff0c;用的win10系统进行开发&#xff0c;老是出现一些莫名其妙的问题&#xff0c;无法解决&#xff0c;每天都在为环境问题搞得伤透了脑筋。 说到底还是要使用Linux系统进行开发比较合适。 …

无涯教程-Perl - time函数

描述 此函数返回自纪元以来的秒数(对于大多数系统,是1970年1月1日UTC,00:00:00&#xff1b;对于Mac OS,是1904年1月1日,00:00:00)。适用于gmtime和本地时间。 语法 以下是此函数的简单语法- time返回值 此函数返回自纪元后数秒的整数。 例 以下是显示其基本用法的示例代…

软件项目验收测试:验证软件功能与性能的有效手段

软件验收测试是软件产品周期中的最后一个测试活动&#xff0c;因此也叫交付测试。目的是确保软件准备就绪&#xff0c;并且可以让最终用户将其用于执行软件的既定功能和任务。 一、软件项目验收测试的重要性 1、软件项目验收测试是确保软件交付前质量的重要环节。在软件项目开…

小程序-基于vant的Picker组件实现省市区选择

一、原因 因vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入&#xff0c;故须保持跟后台用同一份数据&#xff0c;所以考虑以下几个组件 1、Area 2、Cascader 3、Picker 因为使用的是高德地图的省市区json文件&#xff0c;用area的话修改结构代价太大&…