本文共 7567 字,大约阅读时间需要 25 分钟。
前记:
- 在编写程序之前,请务必先熟悉Project的结构树
- 硬件务必保证连接无误且稳定,这是程序能正常调试的前提
在《Power PMAC运动控制器 学习笔记1》中,有些许错误,在此更正一下,在文章末尾的画矩形的Demo中,所画图形并非方方正正的矩形的原因在于:Power PMAC中有一个状态位(Coord[x].NoBlend)是用来控制各运动点之间是否进行插补的,Coord[x].NoBlend
默认为0,即使能Move Blending,因此走出来的矩形并非理想形状,具体细节在后续博文中介绍。
本教程主要针对PMAC脚本语言进行讲解,如有机会再对C的编写进行详细介绍。在后续的系列中,主要分以下几部分进行讲解:
本文主要概述一些基本知识,包括Power PMAC与驱动器的连接以及运动程序的编写,为后续项目开发做准备。
在上我们可以看到CK3M/CK3W系列运动控制器分为三部分:CPU单元、轴接口单元和电源单元,如下图所示:
CK3M、CK3W、CK3E这几款控制器的使用基本差不多。
其中CPU单元和电源单元是必须的,而对于轴接口单元我们可以根据需要来选择。配套的设备,兼容性肯定是好的,所以建议大家在使用的时候,如果没有特殊情况,尽可能的选择运动控制器和驱动器是同一厂家的配套产品。
博主使用的是以色列elmo的驱动器,因此本文主要介绍CK3M和elmo驱动器的连接。
CK3M主机与驱动器之间走EtherCAT总线,通过双绞网线连接到CK3M主机的EtherCAT接口。更多介绍请参考欧姆龙官网关于,有备份,官网找不到的话可以去网盘下载(提取码: ytjw)。
在学习笔记1中稍微提到过,这次对于结构树进行详细的说明。
备注:
- 对于PMAC脚本的编写,最常操作的是System和PMAC Script Language这两项,务必熟悉
- System中的硬件配置是能对设备顺利调试的前提
按1.1节连接好硬件后,我们接下来开始设置IDE中相应的配置。
PowerPMAC IDE在安装时,建议右键以管理员权限运行,安装在默认位置
Step3:初始化控制器,在“终端”窗格中,分别键入 $$$***
、save
、$$$
命令将控制器重置。
注意,程序下载到运动控制器后,如果使用save保存过,下次上电后会自动运行,为防止危险发生,建议此步操作断开EtherCAT总线
接下来设置CPU参数,双击结构树中CPU文件夹下的System,选择全局时钟,设置伺服频率(根据需要来),在本项目中使用的是1kHz,切记设置完后要点击右下角的接受,其他参数默认即可。
注意,此处由于没有连接PMAC,因此选项是灰色的。
设置完以上步骤后,在左下角终端中键入save
并回车保存参数到PMAC中。
Step4:加载驱动器xml配置文件,单击PowerPMAC IDE工具栏中的EtherCAT选项下的ESI管理器,点击添加按钮,找到驱动器所对应的 *.xml 文件,选择 打开 按钮,过程如下图所示。
选择分布式时钟,选择主站偏移,如下图所示:
Step6:扫描EtherCAT从站,右击添加的Master0,选择扫描EtherCAT网络,系统会自动添加设备服务器从站,以下图片是已经有主从站的项目中截取出来的。
注意,扫描完成后,需要确认从站数与电机数是否匹配,如不匹配,说明有几个驱动器之间的EtherCAT总线连接有问题,需要检查物理连接
由于手头没有机器,此选项只能建立连接后才能查看,此图截自官方文档
注意,在没有完成POD映射之前,不能对电机进行使能命令,没有轴设置的PDO将作为不确定值进行PDO通信,故可能会发生意外。
注意,每个Slave从站都需要配置
设置完PDO映射后,右击Master0选择加载映射到PowerPMAC.
Motor[x].PosSf
和Motor[x].Pos2Sf
来设置。 通常情况下,编码器计数单位为cts,假设电机减速比为100,编码器分辨率为1024,那么减速器输出一圈便是102400cts,即360°,要想在控制程序中直接指定的单位是度,那么可以在此设置电机位置单位为:1024*100/360 单位计数,选择 度,然后单击右下角 接受。对应的Motor[x].PosSf设置为Motor[x].PosSf = 1/(1024*100/360)
。 但是博主不建议大家使用,原因在于项目关闭后,每次重新打开项目都需要重新配置,如果忘记配置,那么可能在控制程序中指定的值便是错的,从而导致危险的发生。
要想实现单位的转换,可以在程序中实现,通过宏定义操作,如:#define cts2deg 1024*100/360
save
一下做好以上步骤,便可以进行实际设备调试了。
调试时,我们通常先用在线命令去对电机、ECAT等进行操作,对于在线命令的输入,默认位于IDE下方或左下方的Termainal(终端)窗口,如下图所示:
下面来介绍一下几个常用的命令。
程序复位: $$$
,即reset,如果想清楚PMAC中的数据缓存,可用此命令进行
初始化:$$$***
,
重启PMAC:reboot
或者断电重新上电
保存配置:save
通常,我们需要完全初始化并保存到闪存时一般按如下步骤进行操作
Step1:$$$***
Step2:save
Step3:$$$
使能ECAT网络:ECAT[0].Enable = 1
,使能EtherCAT网络0
关闭ECAT网络:ECAT[0].Enable = 0
停止和使能电机:#1..4j/
,使能1到4号电机,如果只使能一个电机则用#nj/
,其中n为电机序号
关闭电机:#1k
正向Jog:#1j+
反向Jog:#1j-
回零:#1hm
设置电机Jog速度:Motor[1].JogSpeed = 1000
,单位问题后续介绍,默认为32,如果电机运行速度很慢,则很有可能是默认值没有修改,或者最大Jog速度没有修改。
设置电机最大Jog速度:Motor[1].MaxSpeed = 2000
运行运动程序:&1b1r
或&1b1run
,意思是运行坐标系1下的b1运动程序,其中b1是运动程序的名字,在写程序时指定
电机模式设置:Slave_0_6060_0_Modeofoperation = 8
,前提是已经配置好PDO,将电机设置为位置循环模式
使用变量前,首先要搞清楚什么类型的变量能够满足我们的要求,因此变量的声明就显得很关键。
声明关键字 | 对应的变量类型 | 范围 | 精度 | 说明 |
---|---|---|---|---|
global | P变量 | 65536个可用 | 64位双精度浮点 | 可在PMAC的所有程序中全局访问,包括脚本和C,无论坐标系如何,通常在“全局定义”中声明。 |
csglobal | Q变量 | 8192个/坐标系 | 64位双精度浮点 | 表示在使用它的所有坐标系中具有相同名称的物理上不同的变量,通常在“全局定义”中声明 |
ptr | M变量 | 16384个可用 | // | 指向寄存器并返回寄存器值的指针变量,采用它所指向的寄存器的格式,可在所有程序中全局访问 |
local | L变量 | 8192个可用 | 64位双精度浮点 | 在程序启动时创建,可用于坐标系系统、PLC、运动程序、子程序、逆运动学以及在线命令中,在程序完成时销毁,即局部变量,只能在程序中声明,而不能声明为全局变量 |
其中,M的变量格式如下:
变量格式 | 说明 |
---|---|
s | 有符号短整型 |
i | 有符号整型 |
u | 无符号整型 |
f | short (32-bit)浮点数,不使用{start}或{width} |
d | long (64-bit)浮点数,不使用{start}或{width} |
对于ptr的索引来说,参数说明如下:
参数 | 说明 |
---|---|
{start} | 0到31(默认值为0,不限于1和4的倍数) |
{width} | 1到32(默认值为32,不限于1和4的倍数) |
对于全局变量声明文件,默认文件名称为global definitions.pmh
,如下图所示:
注意:
此文件可以自定义名称,博主建议全局变量可以分类放在不同的全局pmh文件,或者在同一个全局pmh文件中通过类似/******/
的分隔符进行分隔,以便于修改和查找。
/***************************** global类型 *****************************/global MyGlobal; // 通常在“全局定义”中声明global MyGlobalArray(10); // 定义一个具有10个元素的数组/***************************** csglobal类型 *****************************/csglobal MyCSGlobal, MyCSGlobalArray(15); // 通常在“全局定义”中声明//当在运动程序中使用这些变量时,所使用变量的实例取决于程序运行的坐标系。同一个变量名可以在多个坐标系中使用// 在终端中使用时,【&1 MyCSGlobal】即使用坐标系1下的MyCSGlobal变量// 如果需要在PLC中更改坐标系统号,按【 PLC[n].Ldata.Coord = m】的格式进行修改,其中m是坐标系序号/***************************** ptr类型 *****************************/// VariableName->*{format}[.{width}]ptr USHMPtr1->u.user:$4.0.8; // Sys.Udata[1], bits 0 to 7ptr USHMPtr2->u.user:$4.8.8; // Sys.Udata[1], bits 8 to 15ptr USHMPtr3->u.user:$4.16.8; // Sys.Udata[1], bits 16 to 23/***************************** lobal类型 *****************************/local index; // 只能在程序中声明,即在PLCs、Motion Programs、 Subprograms、 、Kinematics中
对于特殊数值的表示,在PMAC中遵循 IEEE-754 标准。
注意:
在PMAC中,如果一个数除以0,得到的虽然是无穷值,但PMAC是不报错的。
注意:
如sqrt(-1)
即可得到,PMAC同样不会报错,可以通过isnan()
函数来判断,该函数会返回一个布尔值,若temp = isnan(sqrt(-1)),则temp=1,即sqrt(-1)操作会产生nan值; 此值来源有两个:一是对负数开根号;二是物理上不存在于系统中的硬件的数据结构元素的值
与C/C++相同:
更多运算符请参考手册《Power PMAC Software Reference Manual》关于【Operators】的介绍,如下图所示:
脚本语言的语法,与C/C++语法基本相同:
while(Input1 == 0) { } // Pause here until Machine Input 1 goes highwhile(Input2 == 1) { Counter++; // Increment Counter while Input2 is 1}
if(Input1 == 0) // If Machine Input 1 is low{ Output1 = 0; // Set Output 1 low} else{ Output1 = 1; // Set Output 1 high}
switch(MachineState){ case 0: // action1 break; case 1: // action2 break; default: // action3 break;}
在一般程序中,全局变量及goto强制性跳转语句一般是尽量避免使用的,但是由于控制程序的特殊性,要求逻辑必须清楚,因此在这种情况下是可以使用的,但必须要保证逻辑的安全性,而全局变量在控制程序中的使用是为了不同模块程序之间的相互。
/* code */N1000: /* code */ // 此处即构成一个死循环goto 1000 /* code */
由于某些原因导致PMAC学习笔记长时间未更,在此感谢所有关注的朋友。发布笔记的初衷是为了帮助那些刚接触PMAC的人,避免像我刚开始一样迷茫,不知道该怎么去用这款产品。但分享经验不应该被道德绑架,希望大家都理性对待,每个人都有自己迫不得已的事情要做。也希望所有人都能参与技术共享的圈子,共同进步。
1. 仅为技术分享交流,码字不易,转载请说明出处,违者必究,谢谢合作!
2. 本文图片部分来源于Power PMAC手册,图片版权归欧姆龙所有。下节讲解:Power PMAC中运动程序的编写 —— 下