0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

EtherCAT运动控制边缘控制器功能简介和自定义API封装例程

伺服与运动控制 来源:正运动小助手 2023-08-28 15:08 次阅读

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

01功能简介

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

4f026404-43a4-11ee-a2ef-92fbcf53809c.png

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

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

4f3562c8-43a4-11ee-a2ef-92fbcf53809c.jpgZMC432H视频介绍:

02统一的API接口

所有的控制器和控制卡均使用同一套API函数,均支持C、C++C#LabVIEWPython、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac操作系统。 各个开发语言都有各自所对应的函数库,所调用的API均一致,这大大提高了可移植性。各个开发语言库的调用方式可参考“ZMotion PC函数库编程手册 V2.1.1”。 文档参考路径:光盘资料�4PC函数motion PC函数库编程手册及例程源码。

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

1、控制器连接

ZAux_OpenCom 串口连接控制器
ZAux_SetComDefaultBaud 串口通讯参数设置
ZAux_OpenEth 以太网连接控制器
ZAux_OpenPci PCI卡连接
ZAux_Close 关闭控制器连接
ZAux_Setlp 设置控制IP
ZAux_SearchEthlist 搜索当前网段下控制器的IP
ZAux_SearchAndOpenCom 快速与控制器建立连接
ZAux_SearchEth 快速检索IP列表
ZAux_GetMaxPciCards 读取PCI的控制卡个数
ZAux_FastOpen 与控制器建立连接,指定连接的等待时间MotionRT7用此方式连接

2、控制器信息获取

ZAux_GetControllerInfo 获取控制器卡信息
ZAux_GetSysSpecification 获取控制器最大规格数
ZAux_GetRtcTime 读取控制器RTC时间
ZAux_SetRtcTime 设置控制器RTC时间

3、基本轴参数设置

ZAux_Direct_SetAtype 设置轴类型
ZAux_Direct_GetAtype 读取轴类型
ZAux_Direct_SetUnits 设置脉冲当量(units)
ZAux_Direct_GetUnits 读取脉冲当量(units)
ZAux_Direct_SetAccel 设置加速度,单位为units /s/s
ZAux_Direct_GetAccel 读取加速度,单位为units/s/s
ZAux_Direct_SetDecel 设置减速度,单位为units/s/s
ZAux_Direct_GetDecel 读取减速度,单位为units/s/s
ZAux_Direct_SetSpeed 设置轴速度,单位为units/s
ZAux_Direct_GetSpeed 读取轴速度,单位为units/s
ZAux_Direct_SetDpos 设置轴的规划位置,单位为units
ZAux_Direct_GetDpos 读取轴的规划位置,单位为units
ZAux_Direct_SetMpos 设置反馈位置,单位为units
ZAux_Direct_GetMpos 读取反馈位置,单位为units
ZAux_Direct_GetEncoder 获取控制器接收的脉冲数
ZAux_Direct_SetFastDec 设置快速减速度,单位为units/s/s
ZAux_Direct_GetFastDec 读取快速减速度,单位为units/s/s
ZAux_Direct_SetLspeed 设置轴起始速度,单位为units/s
ZAux_Direct_GetLspeed 读取轴起始速度,单位为units/s
ZAux_Direct_SetSramp 设置S曲线设置。0-梯形加减速
ZAux_Direct_GetSramp 读取S曲线设置。0-梯形加减速
ZAux_Direct_GetMspeed 读取反馈速度,单位为units/s
ZAux_Direct_GetVpSpeed 读取当前轴运行的命令速度,单位为units/s
ZAux_Direct_GetIfIdle 读取轴是否运动结束
ZAux_Direct_GetAxisStatus 读取轴的告警状态
ZAux_Direct_GetAxisStopReason 读取轴历史异常停止原因

4、基本运动控制

ZAux_Direct_Single_Move 单轴相对运动
ZAux_Direct_Single_MoveAbs 单轴绝对运动
ZAux_Direct_Single_Vmove 单轴连续运动
ZAux_Direct_SetJogSpeed 设置JOG时速度
ZAux_Direct_GetJogSpeed 读取JOG时速度
ZAux_Direct_GetFastJog 读取JOG速度输入IN,有输入时,速度由SPEED参数给出。如果没有输入,速度由JOGSPEED参数给出
ZAux_Direct_SetFastJog 设置JOG速度输入IN,有输入时,速度由SPEED参数给出。如果没有输入,速度由JOGSPEED参数给出
ZAux_Direct_SetFwdJog 设置正向JOG输入对应的输入编号-1无效。
ZAux_Direct_GetFwdJog 读取正向JOG输入对应的输入编号-1无效。
ZAux_Direct_SetRevJog 设置负向JOG输入对应的输入编号-1无效。
ZAux_Direct_GetRevJog 读取负向JOG输入对应的输入编号-1无效。

5、VR寄存器

ZAux_Direct_SetVrf 设置VR寄存器
ZAux_Direct_GetVrf 读取VR寄存器
ZAux_Direct_GetVrInt 整型方式读取VR寄存器

6、Table寄存器

ZAux_Direct_SetTable 设置系统table寄存器
ZAux_Direct_GetTable 读取系统table寄存器

7、Modbus寄存器

ZAux_Modbus_Set0x 设置modbus位寄存器
ZAux_Modbus_Get0x 读取modbus位寄存器
ZAux_Modbus_Set4x 设置modbus寄存器(REG)
ZAux_Modbus_Get4x 读取modbus寄存器(REG)
ZAux_Modbus_Set4x_Long Modbus4x寄存器写操作(LONG)
ZAux_Modbus_Get4x_Long Modbus4x寄存器读操作(LONG)
ZAux_Modbus_Set4x_String Modbus字寄存器操作(ASCII)
ZAux_Modbus_Get4x_String Modbus字寄存器操作(ASCII)
ZAux_Modbus_Set4x_Float 设置modbus寄存器(float类型)
ZAux_Modbus_Get4x_Float 读取modbus寄存器(float类型)

8、Flash/文件读写

ZAux_WriteUFile 向U盘中写文件
ZAux_ReadUFile 从U盘中读取文件
ZAux_FlashWritef 写控制器FLASH空间
ZAux_FlashReadf 读控制器FLASH空间

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

03在线命令的机制

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

发送字符串命令有两种方式,缓冲方式和直接方式。具体如图所示:

4f9d2b38-43a4-11ee-a2ef-92fbcf53809c.jpg

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

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

以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); 
}

04自定义API封装介绍及例程

1、自定义API封装

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

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

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

API函数封装介绍

2、实用封装例程

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

用户若想要获取多种数据,如轴的命令位置,轴的反馈位置,板卡上的IO点等等,往往都是通过多种单独独立的函数获取不同的数据,这样堆积,会导致读写次数的上位,导致程序的卡顿。 为了提升一个上位程序读取控制器数据的速度,往往可以通过自定义一个函数,快速的把数据传输到上位程序上面来,而不是通过多次循环来获取不同类型的数据。

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

4fb65fe0-43a4-11ee-a2ef-92fbcf53809c.png

获取数据程序如下:

// 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
", 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 ((endIn1000)
        {
            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("拼接的字符串:
",cmdbuff);
    printf("%s
",cmdbuff);
    ret=ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048);
    if(ERR_OK != ret)
    {
        return ret;
    }
    //printf("%s
",cmdbuffAck);
    //printf("%d
",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;i0) )
        {
            j++;
        }
        //转换成位
        tempval=d_in[j]>>(i-32*j);
        printf("    IN(%d):%d",i,tempval &(0x01));
        if (((i%8)==0)&&(i>0) )
        {
            printf("
");
        }
    }
printf("
");
    printf("获取到的输出口状态:
");
    j=0;
    for (i=0;i<=33;i++)
    {
        if (((i%32)==0)&&(i>0) )
        {
            j++;
        }
        //转换成位
        tempval=d_out[j]>>(i-32*j);
        printf("    OUT(%d):%d",i,tempval &(0x01));
        if (((i%8)==0)&&(i>0) )
        {
            printf("
");
        }
    }
    printf("
");
    Sleep(20000);
    ret = ZAux_Close(handle);    //关闭连接
    commandCheckHandler("ZAux_Close", ret) ;//判断指令是否执行成功
  printf("connectionclosed!
");
    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
", 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];
charcmdbuffAck[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)
",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("控制器连接失败!
");
        handle = NULL;
        Sleep(2000);
        return -1; 
    }
    printf("控制器连接成功!
");
    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("connectionclosed!
");
    handle = NULL;
    return 0;
}

示波器采样波形如图所示

4fcc7e6a-43a4-11ee-a2ef-92fbcf53809c.png

4fea8ff4-43a4-11ee-a2ef-92fbcf53809c.png

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

关于正运动技术

深圳市正运动技术有限公司成立于2013年,专注于纯国产运动控制技术研究和通用运动控制软硬件平台和产品的研发,是国家级高新技术和专精特新“小巨人”企业。

正运动技术汇集了来自华为、中兴等公司的优秀人才。力求创新,目前公司拥有专利、著作权等知识产权五十余项。在坚持自主创新的同时,积极联合各大高校和科研院所协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。

正运动技术除本部研发中心外,设有中山、武汉、上海三个研发分部。为更好地服务客户,本部之外设有苏州、东莞两个区域性服务中心,设有佛山、厦门、青岛、西安、武汉、成都、天津、郑州等销售和技术服务机构。

经过众多合作伙伴多年的开发应用,正运动技术的产品广泛地应用于3C电子半导体新能源机器人、包装印刷、纺织服装、激光加工、医疗制药、数控机床、传统加工等领域。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16064

    浏览量

    176913
  • FlaSh
    +关注

    关注

    10

    文章

    1613

    浏览量

    147628
  • 运动控制
    +关注

    关注

    4

    文章

    561

    浏览量

    32785
  • 上位机
    +关注

    关注

    27

    文章

    929

    浏览量

    54679
  • ethercat
    +关注

    关注

    18

    文章

    630

    浏览量

    38527

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

文章出处:【微信号:伺服与运动控制,微信公众号:伺服与运动控制】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    EtherCAT运动控制卡的自定义运动曲线

    今天,正运动小助手给大家分享一下EtherCAT运动控制卡的自定义运动曲线,主要介绍一下如何通过
    的头像 发表于 09-27 11:19 1816次阅读
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b>卡的<b class='flag-5'>自定义</b><b class='flag-5'>运动</b>曲线

    开放式激光振镜运动控制器在Ubuntu+Qt下自定义图形标刻

    开放式激光振镜运动控制器在Ubuntu+Qt下自定义图形标刻
    的头像 发表于 10-08 10:45 546次阅读
    开放式激光振镜<b class='flag-5'>运动</b><b class='flag-5'>控制器</b>在Ubuntu+Qt下<b class='flag-5'>自定义</b>图形标刻

    经济型EtherCAT运动控制器EtherCAT总线快速入门

    相关参数的配置,EtherCAT总线初始化操作,以及初始化成功以后的运动控制。 一、XPLC006E功能简介 XPLC006E是正
    发表于 05-11 09:49

    EtherCAT运动控制器进行自定义API封装例程

    本节课程我们主要讲解一下正运动API函数封装原理以及自定义API封装
    发表于 10-26 15:11

    自定义fifo接口控制器

    自定义fifo接口控制器,利用sopc builder实现。
    发表于 03-22 14:09 1次下载

    iOS自定义转场动画例程与需要注意的问题

    控制器可以根据特定任务模态化地present和dismiss另一个视图控制器API介绍 每一个自定义转场涉及三个主要对象: from view controller (消失的那个)
    发表于 09-26 16:41 0次下载
    iOS<b class='flag-5'>自定义</b>转场动画<b class='flag-5'>例程</b>与需要注意的问题

    如何制作自定义控制器

    在您拥有自己的自定义模块控制器,完美地工作用于Gamecube模拟的PC!
    的头像 发表于 09-04 09:33 5223次阅读
    如何制作<b class='flag-5'>自定义</b><b class='flag-5'>控制器</b>

    用于改进应用的自定义逻辑外设

    PIC® 和 AVR® 微控制器 (MCU) 上的自定义逻辑外设是功能强大的工具,可用于创建独立于 CPU 运行的分立逻辑小块。PIC 微控制器具有可配置逻辑单元 (CLC),而 AV
    的头像 发表于 05-06 09:51 864次阅读
    用于改进应用的<b class='flag-5'>自定义</b>逻辑外设

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

    全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控,
    的头像 发表于 07-29 09:15 733次阅读
    全国产<b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>-ZMC432H

    全国产EtherCAT运动控制边缘控制器(一):ZMC432H硬件接口

    运动技术EtherCAT运动控制边缘控制器ZMC432H接口介绍。
    的头像 发表于 08-03 09:18 888次阅读
    全国产<b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>(一):ZMC432H硬件接口

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

    运动API函数封装介绍与自定义API封装例程
    的头像 发表于 08-17 10:36 593次阅读
    全国产<b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>(二):统一的上位机<b class='flag-5'>API</b>接口

    全国产EtherCAT运动控制边缘控制器(四):轴参数配置与单轴运动PC上位机C++控制

    全国产EtherCAT运动控制边缘控制器的轴参数设置与单轴运动
    的头像 发表于 09-27 15:42 638次阅读
    全国产<b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>(四):轴参数配置与单轴<b class='flag-5'>运动</b>PC上位机C++<b class='flag-5'>控制</b>

    EtherCAT运动控制边缘控制器ZMC432H的轴参数配置和单轴运动控制

    全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控,
    的头像 发表于 10-16 09:49 827次阅读
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>ZMC432H的轴参数配置和单轴<b class='flag-5'>运动</b><b class='flag-5'>控制</b>

    全国产EtherCAT运动控制边缘控制器(五):IO配置与回零运动的Python+Qt开发

    全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控,
    的头像 发表于 10-22 10:51 866次阅读
    全国产<b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制</b><b class='flag-5'>边缘</b><b class='flag-5'>控制器</b>(五):IO配置与回零<b class='flag-5'>运动</b>的Python+Qt开发

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划。
    的头像 发表于 08-15 11:49 452次阅读
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>PT/PVT实现用户<b class='flag-5'>自定义</b>轨迹规划