The value of Zmotion is to bring customers more success!
ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。
ZMC408CE支持8轴运动控制,最多可扩展至32轴,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随等功能。
ZMC408CE支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、Matlab、Qt、Linux、VB.Net、Python等接口。
更多关于ZMC408CE的详情介绍,点击“推荐|8通道PSO的高性能EtherCAT总线运动控制器”查看,产品视频介绍可点击“高性能EtherCAT总线运动控制器,带你玩转“8通道独立PSO”应用场景”查看。
PCIE464M是一款基于PCIe的PCI Express的EtherCAT总线运动控制卡,具有多项实时和高精度运动控制控制功能。
用户可直接将PCIE464M嵌入标准PC机实现高性能的EtherCAT运动控制功能,实现高精多轴同步控制,EtherCAT控制周期最小可达100us!
PCIE464M内置多路高速IO输入输出,可满足用户的多样化高速IO应用需求,如:高速色标锁存、高速PWM、多维位置比较输出PSO、视觉飞拍、速度前瞻、编码器位置检测等应用。
更多关于PCIE464M的详情介绍,点击“PCIE464M-高速高精,超高速PCIe EthrtCAT实时运动控制卡”查看,产品视频介绍可点击“超高速PCle EtherCAT控制卡PCIE464M,即刻提升高速高精智能装备生产力!”查看。
▶▶▶
PT指令与PVT指令
PT(Position-Time)运动:是一种单位时间内的运动位置控制技术,主要用于控制步进电机和伺服电机等运动设备在设定时间内实现精确的轴位置控制。位置跟时间参数一般是PC每个周期计算好对应的坐标,然后传给控制器。
PT算法:在用户定义的“位置和时间”点之间,PT算法计算出一个合适的速度曲线。PT算法保证控制卡的轨迹计算符合每一个已知的点和时间。分段速度简单的由位置和时间的差分计算出来。
PT运动适用场景:适用于近距离的点位运动或低速度的运动。它是非常简单的算法,需要很少的计算量,因此计算速度很快。在低性能的运动系统中很受欢迎。但如果点之间间隔太大,那么运动将会很粗糙,因为每一段的加速度将会显得不连续。
PT运动为保证设定的单位时间内达到规划的目标位置,控制器自动生成相应的加速度、速度曲线规划。如果在极短时间内运动大距离,脉冲频率会过高,导致电机堵转。建议分解成小段,重复发送,连续的多个周期PT运动时, 速度会自动均匀。
PVT(Position-Velocity-Time)运动:是一种基于位置、速度和时间的综合控制方法,通过协调这三个方面的参数,实现对运动系统的精准控制。PVT在一段时间内驱动电机运动设置的距离,可以指定结束速度,小段内速度会自动根据前面的速度与结束速度来自动规划,尽可能连续。位置、速度跟时间参数一般是PC每个周期计算好对应的坐标,然后传给控制器。
PVT算法:在用户定义的“位置/速度/时间”点之间,PVT算法计算出合适的Jerk参数(加加速度,非恒定加速度)。这个算法保证轨迹计算合符每个已知点的位置、速度和时间。
PVT模式算法适用场景:PVT算法对于平滑轨迹和轨迹跟踪非常有效。位置轨迹点可以间隔很近,也可以间隔很大。比如说对于复杂的路径,点位需要间隔很近;对于简单的路径,点位可以间隔很大。PVT可以手动指定点位置,但是要确定好每个点的合适速度值。
▶▶▶
ZBasic快速验证自定义轨迹规划指令MOVE_PTABS
注意距离参数dis的单位不是脉冲数,dis*units才表示具体的脉冲数。
时间参数ticks的单位是伺服周期,控制器的伺服周期可以通过RTSys软件的在线命令输入?*max进行打印。
如下图SERVO_PERIOD:1000 min:500 max:4000表示当前控制器的伺服周期是1000us,伺服周期的可调范围是500us到4000us。
控制器伺服周期可以通过在线命令发送SERVO_PERIOD=500把伺服周期设置成500us,控制器断电重启后生效。
'主函数逻辑 '轴参数初始化 BASE(0,1,2) DPOS=0,0,0 MPOS=0,0,0 UNITS=100,100,100 MAX_SPEED=10000000,10000000,10000000 '停止线程和轴运动 STOPTASK 1 RAPIDSTOP(2) WAIT IDLE '清除控制器报警 DATUM(0) '开始轨迹规划 '单轴Sin曲线,振幅10,周期100个SERVO_PERIOD,初相角 0° Runtask 1,MySingleAxisSin(0,10,Pi/50,0) END '/********************************************************************** '函数功能:单轴sin函数的轨迹 '函数模型:y=Amp*sin(Rad*x+Ipa) ' 输 入 :Amp(振幅)、Rad(角速度ω,弧度制)、Ipa(初相角φ,弧度制) ' 输 入 :AxisNum(运动的轴) ' 输 出 : ' 备 注 :周期=2*Pi/Rad*10(控制周期) '**********************************************************************/ GLOBAL SUB MySingleAxisSin(AxisNum,Amp,Rad,Ipa) LOCAL lvTime lvTime=0 '选择要运动的轴 BASE(AxisNum) WHILE 1 '通过PT运动下发运动指令 MOVE_PTABS(10,Amp*SIN(Rad*lvTime+Ipa)) lvTime=lvTime+1 DELAY(1) WEND ENDSUB
'主函数逻辑 '轴参数初始化 BASE(0,1,2) DPOS=0,0,0 MPOS=0,0,0 UNITS=100,100,100 MAX_SPEED=10000000,10000000,10000000 '停止线程和轴运动 STOPTASK 1 RAPIDSTOP(2) WAIT IDLE '清除控制器报警 DATUM(0) '开始轨迹规划 '多轴的Sin曲线规划 Runtask 1,MyMultAxisSin(10,Pi/50,0,10,Pi/100,0,10,Pi/200,0) END '/********************************************************************** '函数功能:0、1、2轴的3轴sin函数的轨迹 '函数模型:y1=A1mp*sin(Rad1*x+Ipa1) ' :y2=A2mp*sin(Rad2*x+Ipa2) ' :y3=A3mp*sin(Rad3*x+Ipa3) ' 输 入 :Amp(振幅)、Rad(角速度ω,弧度制)、Ipa(初相角φ,弧度制) ' 输 出 : ' 备 注 :周期=2*Pi/Rad*10(控制周期) '**********************************************************************/ GLOBAL SUB MyMultAxisSin(Amp1,Rad1,Ipa1,Amp2,Rad2,Ipa2,Amp3,Rad3,Ipa3) LOCAL lvTime lvTime=0 '选择要运动的轴 BASE(0,1,2) WHILE 1 MOVE_PTABS(10,Amp1*SIN(Rad1*lvTime+Ipa1),Amp2*SIN(Rad2*lvTime+Ipa2),Amp3*SIN(Rad3*lvTime+Ipa3))\ lvTime=lvTime+1 DELAY(1) WEND ENDSUB
'主函数逻辑 '轴参数初始化 BASE(0,1,2) DPOS=0,0,0 MPOS=0,0,0 UNITS=100,100,100 MAX_SPEED=10000000,10000000,10000000 '停止线程和轴运动 STOPTASK 1 RAPIDSTOP(2) WAIT IDLE '清除控制器报警 DATUM(0) '开始轨迹规划 '单在Sin曲线轨迹规划插入对输出口的操作指令 MySingleAxisSinOP(0,10,Pi/50,0,0.25) END '/********************************************************************** '函数功能:单轴sin函数的轨迹+MOVE_OP '函数模型:y=Amp*sin(Rad*x+Ipa) ' 输 入 :Amp(振幅)、Rad(角速度ω,弧度制)、Ipa(初相角φ,弧度制) ' 输 入 :AxisNum(运动的轴),Space(间隔多少个周期操作一下输出口) ' 输 出 : ' 备 注 :周期=2*Pi/Rad*10(控制周期) '**********************************************************************/ GLOBAL SUB MySingleAxisSinOP(AxisNum,Amp,Rad,Ipa,Space) LOCAL lvTime,lvOpFlag lvTime=0 lvOpFlag=0 MOVE_OP(0,OFF) WHILE 1 MOVE_PTABS(10,Amp*SIN(Rad*lvTime+Ipa)) '检测是否执行到Space个周期,执行到需要打开/关闭输出口 IF lvTime MOD(Space*2*Pi/Rad) = 0THEN IF lvOpFlag=1 THEN MOVE_OP(0,OFF) lvOpFlag=0 ELSE MOVE_OP(0,ON) lvOpFlag=1 ENDIF ENDIF lvTime=lvTime+1 DELAY(1) WEND ENDSUB
5.如何通过硬件定时器对输出口进行操作。
(2)测试代码详情
'主函数逻辑 '轴参数初始化 BASE(0,1,2) DPOS=0,0,0 MPOS=0,0,0 UNITS=100,100,100 MAX_SPEED=10000000,10000000,10000000 '停止线程和轴运动 STOPTASK 1 RAPIDSTOP(2) WAIT IDLE '清除控制器报警 DATUM(0) '开始轨迹规划 '单在Sin曲线轨迹规划插入对输出口的操作指令 MySingleAxisSinOP(0,10,Pi/50,0,0.25) END '/****************************************************************************** '函数功能:单轴sin函数的轨迹+输出口多次输出 '函数模型:y=10*sin(Pi/50*x+0) ' 输 入 :AxisNum(运动的轴) ' 输 出 : '具体需求:要求Sin函数每隔0.5个周期打开一次输出口,并且输出口的以脉冲的形式输出4个脉冲 '******************************************************************************/ GLOBAL SUB MySingSinOP_HwTime(AxisNum) LOCAL lvTime,Space lvTime=0 Space=0.5 BASE(AxisNum) MOVE_OP(0,OFF) MOVE_HWTIMER(0, 60000, 30000, 4, OFF, 0) MOVE_HWTIMER(2, 60000, 30000, 4, OFF, 0) WHILE 1 MOVE_PTABS(10,10*SIN(PI*lvTime/50+0)) '检测是否执行到Space个周期,执行到需要打开/关闭输出口,mod是求余指令 IF lvTime MOD (50) = 0THEN MOVE_OP(0,ON) ENDIF lvTime=lvTime+1 DELAY(1) WEND ENDSUB
▶▶▶
Qt进行自定义轨迹规划的算法验证
1.新建QT项目,并添加正运动的动态库到项目里面。
图2-1 新建Qt项目
图2-2 选择Qt编译套件(kits)
图2-3 选择基类
图2-4 库文件复制
图2-5 添加函数库1
图2-6 添加函数库2
图2-7 添加函数库3
(2)上位机如何连接控制器。
//连接控制器 void MainWindow::on_LinkButton_clicked() { int err=0; if(g_handle == NULL) { QString ControllerIp = ui->IPcomboBox->currentText(); QByteArray IpStr = ControllerIp.toLocal8Bit(); err = ZAux_OpenEth(IpStr.data(),&g_handle); if(err!=0) { QMessageBox::about(this, "提示","连接失败请确认IP正确!"); } } else { QMessageBox::about(this, "提示", "句柄非空请先断开链接!"); } }
②启动自定义轨迹规划算法测试。
//点击启动按钮,如果条件满足讲会讲标志位RunFlag设置为从而触发定时器下发自定义的轨迹 void MainWindow::on_StartRun_clicked() { if(g_handle!=0) { if(RunFlag==0) { //初始化轴参数 //例程为方便测试,直接把规划位置DPOS清空 ZAux_Direct_SetDpos(g_handle,0,0); //例程为方便测试,直接把编码器位置MPOS清空 ZAux_Direct_SetMpos(g_handle,0,0); ZAux_Direct_SetUnits(g_handle,0,1000); //关闭硬件定时器 ZAux_Direct_HwTimer(g_handle,0,10000,5000,1,0,0); //启动硬件定时器功能,脉冲周期是50ms,高电平持续时间是25ms ZAux_Direct_HwTimer(g_handle,2,50000,25000,ui->PluseNum->text().toInt(),0,0); //启动自定义轨迹规划算法测试 CurAanle=0; RunFlag=1; } else { QMessageBox::about(this, "提示", "运行中请先停止"); } } } //定时器的超时服务子函数 void MainWindow::MyTimeOut() { if(g_handle!=NULL) { //如果启动条件满足则开始下发运动指令 if(RunFlag==1) { int AxisList[1]={0}; //轴列表 uint32 TicksList[1]={10}; //时间列表 float PosList[1]={0}; //位置列表 float OpCycTime=0; //操作输出口的周期时间 int RemainBuff=0; //剩余缓冲器 int A = ui->ParaAmp->text().toInt(); //更新Sin曲线的振幅 double Rad = qDegreesToRadians(ui->ParaRad->text().toDouble());//更新Sin曲线的角速度 double Ipa = qDegreesToRadians(ui->ParaIpa->text().toDouble());//更新Sin曲线的初相角 OpCycTime = (2*M_PI/Rad*(ui->Angle->text().toInt()/360.0)); //获取剩余轴缓冲器数目 ZAux_Direct_GetRemain_Buffer(g_handle,0,&RemainBuff); //如果剩余缓冲器够下发新的运动指令 if(RemainBuff>10) { for(int i=0;i<10;i++) { // 计算正弦值 PosList[0] = A*qSin(Rad*CurAanle+Ipa); //下发正弦曲线 ZAux_Direct_MultiMovePtAbs(g_handle,1,1,AxisList,TicksList,PosList); //如果到达打开输出口的角度,则下发打开输出口的指令 if(((int)(CurAanle/OpCycTime))*OpCycTime==CurAanle) { ZAux_Direct_MoveOp(g_handle,0,0,1); } CurAanle=CurAanle+1; } } } } }
完整代码获取地址
本次,正运动技术EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划,就分享到这里。
更多精彩内容请关注“ 正运动小助手 ”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等 。