点击上方“正运动小助手”,随时关注新动态!
上节课程我们介绍了全国产EtherCAT运动控制边缘控制器ZMC432H的硬件接口与功能,本节课程我们主要讲解一下正运动API函数封装原理以及自定义API封装例程。
01
功能简介
全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控,运动控制接口兼容EtherCAT总线和脉冲型的独立式运动控制器,最多支持32轴运动控制,同时支持正运动远程HMI功能,能提供网络组态显示,可实时监控和调整参数配置。
ZMC432H具备丰富的硬件接口和控制功能模块,能实现高效稳定的运动控制和实时数据采集,以满足工业控制协同工业互联网的应用需求。ZMC432H内置了Linux系统,可以使用本地的LOCAL接口进行连接,可以做到更快速的指令交互,单条指令与多条指令一次性交互时间为40us左右。
ZMC432H视频介绍:
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3060216976670900231
02
统一的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、控制器连接
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,或是参照已有代码修改增加相应的函数。
发送字符串命令有两种方式,缓冲方式和直接方式。具体如图所示:
直接方式:直接执行单个变量/数组/参数相关命令,此时所有传递的参数必须是具体的数值,不能是表达式;缓冲方式:可以执行所有命令,并支持表达式作为参数,但是速度慢一些;以zmcaux.cpp中对已封装的设置运动速度的函数ZAux_Direct_SetSpeed()与获取当前编码器反馈位置的函数ZAux_Direct_GetMpos为例。程序如下:#include"zmotion.h"#include"zauxdll2.h"intZAux_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); }intZAux_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库是完全开源库,源代码皆可从官网下载,可以在源代码中添加用户自定义的函数,用户也可以新增库进行封装。
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3061729918411259908
API函数封装介绍
2、实用封装例程
(1)直接获取多种类型数据
用户若想要获取多种数据,如轴的命令位置,轴的反馈位置,板卡上的IO点等等,往往都是通过多种单独独立的函数获取不同的数据,这样堆积,会导致读写次数的上位,导致程序的卡顿。为了提升一个上位程序读取控制器数据的速度,往往可以通过自定义一个函数,快速的把数据传输到上位程序上面来,而不是通过多次循环来获取不同类型的数据。例:假设有一个简易的三轴平台,需要读取轴0,轴1,轴2的命令位置,反馈位置,以及控制器板卡上的输入口0,输入口32,输出口0,输出口33,以及三个轴的状态。
获取数据程序如下:// test1.cpp : 定义控制台应用程序的入口点。#include"stdafx.h"#include<windows.h>#include"zmotion.h"#include"zauxdll2.h"voidcommandCheckHandler(constchar *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: //错误码*************************************************************/intDemo_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, "?");//拼接DPOSfor (i=0;i<iaxisNum;i++) { sprintf(tempbuff,"DPOS(%d),",iaxislist);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接if (strlen(cmdbuff)>1000) {return ERR_AUX_PARAERR; //参数错误,字符串拼接过长 } }//拼接MPOSfor (i=0;i<iaxisNum;i++) {sprintf(tempbuff,"MPOS(%d),",iaxislist);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接if (strlen(cmdbuff)>1000) {return ERR_AUX_PARAERR; //参数错误,字符串拼接过长 } }//拼接AXISSTATUSfor (i=0;i<iaxisNum;i++) {sprintf(tempbuff,"AXISSTATUS(%d),",iaxislist);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接if (strlen(cmdbuff)>1000) {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; }//拼接INfor (i=0;i<temp;i++) { istart = startIn+32*i; iend =istart+31;if (iend>endIn) { 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; }//拼接OUTfor (i=0;i<temp2;i++) { ostart = startOut+32*i; oend =ostart+31;if (oend>endOut) { oend=endOut; }//生成命令sprintf(tempbuff, "OUT(%d,%d)", ostart,oend);strcat(cmdbuff, tempbuff);//字符串拼接if (i<temp-1) {strcat(cmdbuff, ",");//字符串拼接 }if (strlen(cmdbuff)>1000) {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); fDposlist=ftempbuff; }//MPOS输出for(i=0;i<iaxisNum;i++) {//printf("%f\n",ftempbuff[i+iaxisNum]); fMposlist=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=itempbuff[i+iaxisNum*2]; }//IN输出for(i=0;i<temp;i++) {//printf("%d\n",itempbuff[i+iaxisNum*3]); iIn=itempbuff[i+iaxisNum*3]; }//OUT输出for(i=0;i<temp2;i++) {//printf("%d\n",itempbuff[i+iaxisNum*3+temp]); iOut=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); }printf("\n");printf("获取到的轴反馈位置:\n");for (i=0;i<3;i++) {printf("\t轴%d :%f",i,d_mpos); }printf("\n");printf("获取到的轴状态(按位对应):\n");for (i=0;i<3;i++) {printf("\t轴%d :%d",i,d_axis_status); }printf("\n");printf("获取到的输入口状态:\n");int j=0;int tempval;for (i=0;i<=32;i++) {if (((i%32)==0)&&(i>0) ) { 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;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("\n"); } }printf("\n"); Sleep(20000); ret = ZAux_Close(handle); //关闭连接 commandCheckHandler("ZAux_Close", ret) ;//判断指令是否执行成功 printf("connection closed!\n"); handle = NULL;return0;}(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<windows.h>#include"zmotion.h"#include"zauxdll2.h"voidcommandCheckHandler(constchar *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: //错误码*************************************************************/intDemo_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) {return1002; //运动缓冲不够 }//生成命令sprintf(cmdbuff, "BASE(");//拼接运动轴列表for (i=0;i<iaxisNum-1;i++) { sprintf(tempbuff,"%d,",iaxislist);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接if (strlen(cmdbuff)>1000) {return ERR_AUX_PARAERR; //参数错误,字符串拼接过长 } }sprintf(tempbuff,"%d)\n",iaxislist);//生成对应命令的字符串strcat(cmdbuff,tempbuff);//拼接运动for (i=0;i<iMoveLen;i++) {//printf("%d,%d\n",i*iaxisNum,i*iaxisNum+1);if (outlist==0) //该段运动不输出 {strcat(cmdbuff, "MoveAbs(");sprintf(tempbuff,"%f,%f)\n",fPoslist[i*iaxisNum],fPoslist[i*iaxisNum+1]);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接 } elseif (outlist==1) {strcat(cmdbuff, "MoveAbs(");sprintf(tempbuff,"%f,%f)\n",fPoslist[i*iaxisNum],fPoslist[i*iaxisNum+1]);//生成对应命令的字符串strcat(cmdbuff, tempbuff);//字符串拼接strcat(cmdbuff, "Move_op2(");sprintf(tempbuff,"%d,%d,%d)\n",iout,1,outtime);//生成对应命令的字符串 strcat(cmdbuff, tempbuff);//字符串拼接 }else {return ERR_AUX_PARAERR;//参数错误 } }printf("拼接的字符串:\n");printf("%s\n",cmdbuff);if (strlen(cmdbuff)>1000) {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;return0;}
示波器采样波形如图所示:
3、例程讲解
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3061733370189234180
完整代码获取地址
▼
本次,正运动技术全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
回顾往期内容
开奖啦!参与《运动控制系统应用与实践》赠书活动的粉丝们看这里
送书福利!全自主IDE的《运动控制系统应用与实践》
全国产EtherCAT运动控制边缘控制器(一):ZMC432H硬件接口
高柔SS加减速曲线在锂电池焊接中的应用
EtherCAT和Ethernet的不同点有哪些, 通信周期又是什么意思?
工业以太网时代,该如何选择总线运动控制器?
EtherCAT运动控制器在数控加工手轮随动中的应用
EtherCAT运动控制器在数控加工手轮随动中的应用之C++
正运动技术运动控制器如何快速实现单轴/多轴同步跟随功能?
运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出
运动控制器PSO视觉飞拍与精准输出的C++开发(二):多轴PSO等距/周期输出
运动控制器PSO视觉飞拍与精准输出的C++开发(一):单轴PSO
运动控制器八通道PSO的视觉飞拍与精准输出
Windows实时运动控制软核(七):LOCAL高速接口测试之Labview
Windows实时运动控制软核(六):LOCAL高速接口测试之Matlab
Windows实时运动控制软核(五):LOCAL高速接口测试之VC6.0
Windows实时运动控制软核(四):LOCAL高速接口测试之VB.NET
Windows实时运动控制软核(三):LOCAL高速接口测试之C++
Windows实时运动控制软核(二):LOCAL高速接口测试之Qt
Windows实时运动控制软核(一):LOCAL高速接口测试之C#
开放式激光振镜运动控制器:C++ 快速调用图形库应用
开放式激光振镜运动控制器:C++振镜矫正方法与实现
开放式激光振镜运动控制器:C++快速开发
开放式激光振镜运动控制器(五):ZMC408SCAN 光纤激光器的能量控制
开放式激光振镜运动控制器(四):ZMC408SCAN振镜控制光纤激光器加工
开放式激光振镜运动控制器(三):ZMC408SCAN轴控光纤激光器加工
开放式激光振镜运动控制器(二):ZMC408SCAN激光接口与控制
开放式激光振镜运动控制器(一):ZMC408SCAN接口与功能
运动控制器PSO位置同步输出(三):高精度等间距二维三维PSO输出
运动控制器PSO位置同步输出(二):PSO模式详解
运动控制器PSO位置同步输出(一):硬件平台与PSO指令简介
经济型EtherCAT运动控制器(十):EtherCAT总线快速入门
经济型EtherCAT运动控制器(九):示波器使用
经济型EtherCAT运动控制器(八):轴参数与运动指令
经济型EtherCAT运动控制器(七):运动缓冲
经济型EtherCAT运动控制器(六):数据储存
经济型EtherCAT运动控制器(五):多任务运行
经济型EtherCAT运动控制器(四):ModbusRTU或ModbusTcp与触摸屏通讯
经济型EtherCAT运动控制器(三):PLC实现多轴直线插补与电子凸轮
经济型EtherCAT运动控制器(二):ZBasic实现多轴直线插补运动
经济型EtherCAT运动控制器(一):功能简介与应用场景
运动控制+机器视觉Demo软件框架(三):视觉纠偏+连续插补的配方编辑
运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配
运动控制+机器视觉Demo软件框架(一):机械参数和配方文件的管理
运动控制+机器视觉Demo软件框架系统概述
开放式激光振镜+运动控制器(六):双振镜运动
开放式激光振镜+运动控制器(五):ZMC408SCAN控制器硬件介绍
开放式激光振镜+运动控制器(四):PSO位置同步输出在激光振镜加工中的应用
开放式激光振镜+运动控制器(三):振镜矫正
开放式激光振镜+运动控制器(二):振镜填充
开放式激光振镜+运动控制器(一):硬件接口
EtherCAT轴扩展模块EIO16084在运动控制系统中的应用EtherCAT运动控制器中脉冲接口的快速调试与诊断EtherCAT运动控制器之ZMIO300模块的使用EtherCAT运动控制器的PLC编程(四) 电子凸轮
EtherCAT运动控制器的PLC编程(三) 电子齿轮
EtherCAT运动控制器的PLC编程(二) 圆弧插补
EtherCAT运动控制器的PLC编程(一) 直线插补
快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一
快速入门 | 篇二十一:正运动技术运动控制器自定义通讯
快速入门 | 篇二十:正运动技术运动控制器MODBUS通讯
快速入门 | 篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介
快速入门 | 篇十八:正运动技术脉冲型运动控制器的使用
快速入门 | 篇十七:运动控制器多轴插补运动指令的使用
快速入门 | 篇十六:正运动控制器EtherCAT总线快速入门
快速入门 | 篇十五:运动控制器运动缓冲简介
快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令
快速入门 | 篇十三:正运动技术运动控制器ZDevelop 编程软件的使用
快速入门 | 篇十二:正运动技术运动控制器U盘接口的使用
快速入门 | 篇十一:正运动技术运动控制器中断的应用
快速入门 | 篇十:运动控制器多任务运行特点
快速入门 | 篇九:如何进行运动控制器示波器的应用?
快速入门 | 篇八:如何进行运动控制器EtherCAT总线的基础使用?
快速入门 | 篇七:如何进行运动控制器ZCAN总线扩展模块的使用?
快速入门 | 篇六:如何进行运动控制器数据与存储的应用?
快速入门 | 篇五:如何进行运动控制器输入/输出IO的应用?
快速入门 | 篇四:如何进行运动控制器与触摸屏通讯?
快速入门 | 篇三:如何进行运动控制器ZPLC程序开发?
快速入门 | 篇二:如何进行运动控制器ZBasic程序开发?
快速入门 | 篇一:如何进行运动控制器固件升级?
EtherCAT与RTEX驱动器轴回零的配置与实现
G代码在运动控制器上的应用
运动控制器的自定义G代码编程应用
离线仿真调试,加快项目进度!
8轴EtherCAT轴扩展模块EIO24088的使用
运动控制器之追剪应用Demo
运动控制器激光振镜控制运动控制器轴回零的配置与实现
运动控制器位置锁存功能的应用
ZMC运动控制器SCARA机械手应用快速入门
运动控制器RTEX总线使用入门
正运动技术CAD导图软件配合控制器的使用方法
EtherCAT总线运动控制器应用进阶一
EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立
EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续
EtherCAT运动控制卡开发教程之Qt(上):开发环境配置与简单运动控制应用
EtherCAT运动控制卡开发教程之python
EtherCAT运动控制卡的SCARA等机器人指令的应用
EtherCAT运动控制卡的PWM与模拟量输出和运动速度同步
EtherCAT运动控制卡硬件比较输出以及编码器锁存
EtherCAT运动控制卡IO动作与运动控制的同步
EtherCAT运动控制卡实时程序的运行和读写控制
EtherCAT运动控制卡的运动暂停、恢复与系统安全设置
EtherCAT运动控制卡小线段前瞻的连续插补运动
EtherCAT运动控制卡的多轴插补运动和手轮运动
EtherCAT运动控制卡的辅助调试工具与方法介绍
EtherCAT运动控制卡的总线轴参数设置和轴运动
EtherCAT运动控制卡的硬件接线与C#的硬件外设读写与回零运动
EtherCAT运动控制卡的硬件接线与C#的单轴运动控制
简单易用的运动控制卡(十六):螺距补偿和反向间隙补偿
简单易用的运动控制卡(十五):PC启停控制器的实时程序
简单易用的运动控制卡(十四):PWM、模拟量输出与运动控制的同步
简单易用的运动控制卡(十三):IO动作与运动控制的同步
简单易用的运动控制卡(十二):运动控制系统的安全设置
简单易用的运动控制卡(十一):运动的暂停恢复和速度倍率设置
简单易用的运动控制卡(十):连续插补和小线段前瞻
简单易用的运动控制卡(九):圆弧插补和螺旋插补
简单易用的运动控制卡(八):直线插补和手轮运动
简单易用的运动控制卡(七):一次性加载多条连续小线段数据
简单易用的运动控制卡(六):Basic文件下载和连续轨迹加工
简单易用的运动控制卡(五):IO配置与回零运动
简单易用的运动控制卡(四):函数库的封装
简单易用的运动控制卡(三):轴参数配置和单轴运动控制
简单易用的运动控制卡(二):外设读写与ZDevelop诊断
简单易用的运动控制卡(一):硬件接线和上位机开发
运动控制卡在ROS上的应用(下)
运动控制卡在ROS上的应用(上)
EtherCAT运动控制卡和LabVIEW构建智能装备(五)
EtherCAT运动控制卡和LabVIEW构建智能装备(四)
EtherCAT运动控制卡和LabVIEW构建智能装备(三)
EtherCAT运动控制卡和LabVIEW构建智能装备(二)
EtherCAT运动控制卡和LabVIEW构建智能装备(一)
EtherCAT运动控制卡在LabVIEW中的运动控制与数据采集
运动控制卡应用开发教程之MATLAB
运动控制卡应用开发教程之C++
运动控制卡应用开发教程之Python
运动控制卡应用开发教程之C#
运动控制卡应用开发教程之Linux
运动控制卡应用开发教程之VB.NET
运动控制卡应用开发教程之VB6.0
运动控制卡应用开发教程之VC6.0
运动控制卡应用开发教程之使用Qt
运动控制卡应用开发教程之LabVIEW
运动控制卡应用开发教程之激光振镜控制
运动控制卡应用开发教程之硬件比较输出
关于正运动技术
深圳市正运动技术有限公司成立于2013年,专注于纯国产运动控制技术研究和通用运动控制软硬件平台和产品的研发,是国家级高新技术和专精特新“小巨人”企业。
正运动技术汇集了来自华为、中兴等公司的优秀人才。力求创新,目前公司拥有专利、著作权等知识产权五十余项。在坚持自主创新的同时,积极联合各大高校和科研院所协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。
正运动技术除本部研发中心外,设有中山、武汉、上海三个研发分部。为更好地服务客户,本部之外设有苏州、东莞两个区域性服务中心,设有佛山、厦门、青岛、西安、武汉、成都、天津、郑州等销售和技术服务机构。
经过众多合作伙伴多年的开发应用,正运动技术的产品广泛地应用于3C电子、半导体、新能源、机器人、包装印刷、纺织服装、激光加工、医疗制药、数控机床、传统加工等领域。
|