Power PMAC运动控制器 —— 学习笔记2
Power PMAC中运动程序的编写 —— 上
- 0. 说明
- 1. Power PMAC与驱动器的的连接
- 2. Power PMAC中Project的结构树介绍(重要!)
- 3. 硬件在控制器中的配置(重要!!)
- 4. 在线命令介绍
- 5. 参数和变量定义
- 5.1 变量声明的关键字
- 5.2 变量声明的示例
- 5.3 特殊数值的表示
- 6. 运算符的使用
- 7. 程序语法
- while
- if
- switch
- goto
- 8. 后记
- 声明
前记:
- 在编写程序之前,请务必先熟悉Project的结构树
- 硬件务必保证连接无误且稳定,这是程序能正常调试的前提
0. 说明
在《Power PMAC运动控制器 学习笔记1》中,有些许错误,在此更正一下,在文章末尾的画矩形的Demo中,所画图形并非方方正正的矩形的原因在于:Power PMAC中有一个状态位(Coord[x].NoBlend)是用来控制各运动点之间是否进行插补的,Coord[x].NoBlend
默认为0,即使能Move Blending,因此走出来的矩形并非理想形状,具体细节在后续博文中介绍。
本教程主要针对PMAC脚本语言进行讲解,如有机会再对C的编写进行详细介绍。在后续的系列中,主要分以下几部分进行讲解:
- Power PMAC中运动程序的编写
- Power PMAC中正逆运动学的实现
- Power PMAC中PLC程序及子程序的编写
- Power PMAC与上位机的Modbus通信
- 工程Demo讲解
本文主要概述一些基本知识,包括Power PMAC与驱动器的连接以及运动程序的编写,为后续项目开发做准备。
1. Power PMAC与驱动器的的连接
在 欧姆龙官网上我们可以看到CK3M/CK3W系列运动控制器分为三部分:CPU单元、轴接口单元和电源单元,如下图所示:
CK3M、CK3W、CK3E这几款控制器的使用基本差不多。
其中CPU单元和电源单元是必须的,而对于轴接口单元我们可以根据需要来选择。配套的设备,兼容性肯定是好的,所以建议大家在使用的时候,如果没有特殊情况,尽可能的选择运动控制器和驱动器是同一厂家的配套产品。
博主使用的是以色列elmo的驱动器,因此本文主要介绍CK3M和elmo驱动器的连接。
CK3M主机与驱动器之间走EtherCAT总线,通过双绞网线连接到CK3M主机的EtherCAT接口。更多介绍请参考欧姆龙官网关于 CK3M的CPU单元说明书, 网盘有备份,官网找不到的话可以去网盘下载(提取码: ytjw)。
2. Power PMAC中Project的结构树介绍(重要!)
在学习笔记1中稍微提到过,这次对于结构树进行详细的说明。
- System:主要包括一些硬件的配置
- CPU:设置全局时钟和通用CPU设置
- Hardware:显示检测到的硬件,如外接手柄等
- EtherCAT:ECAT主站及从站管理和设置
- Motors:允许添加和配置电机
- Coordinate Systems:允许配置坐标系统及其结构元素
- Encoder:维护要在构建和下载中使用的当前编码器表设置
- C Language:编辑和管理C语言编程文件
- Background Programs:包含需要运行的后台C程序和相关头文件
- CPLCs:包含所有后台PLC程序(bgcplc)
- Include:包含所有C程序都可以包含的头文件
- Libraries:用于在IDE中添加或开发公共库,用于所有C程序
- Realtime Routines:包含用户编写的伺服控制程序
- Configuration:包含一些配置文件,可以通过其来管理启动时应该先运行哪些文件以及在下载时运行哪些文件
- Documentation:用于存放通用说明文档
- Log:日志文件,存储下载项目后的调试信息
- PMAC Script Language:编辑和管理PMAC脚本语言
- Global Includes:包含任何脚本都可使用的全局变量以及配置信息,在脚本程序下载之前首先会下载它
- Kinematic Routines:用于存放正逆运动学子程序
- Libraries:可以存放任何脚本程序都可以使用的子程序
- Motion Programs:用于存放运动程序
- PLC Programs:用于存放PLC程序
备注:
- 对于PMAC脚本的编写,最常操作的是System和PMAC Script Language这两项,务必熟悉
- System中的硬件配置是能对设备顺利调试的前提
3. 硬件在控制器中的配置(重要!!)
按1.1节连接好硬件后,我们接下来开始设置IDE中相应的配置。
- Step1:连接CK3M主机,请参考上篇博文《Power PMAC运动控制器 —— 学习笔记1》,如果连接有问题,请检查物理连接和防火墙设置
PowerPMAC IDE在安装时,建议右键以管理员权限运行,安装在默认位置
- Step2:新建Project项目,点击IDE左上角“文件”按步骤进行新建
-
Step3:初始化控制器,在“终端”窗格中,分别键入
$$$***
、save
、$$$
命令将控制器重置。注意,程序下载到运动控制器后,如果使用save保存过,下次上电后会自动运行,为防止危险发生,建议此步操作断开EtherCAT总线
接下来设置CPU参数,双击结构树中CPU文件夹下的System,选择全局时钟,设置伺服频率(根据需要来),在本项目中使用的是1kHz,切记设置完后要点击右下角的接受,其他参数默认即可。
注意,此处由于没有连接PMAC,因此选项是灰色的。
设置完以上步骤后,在左下角终端中键入
save
并回车保存参数到PMAC中。
-
Step4:加载驱动器xml配置文件,单击PowerPMAC IDE工具栏中的EtherCAT选项下的ESI管理器,点击添加按钮,找到驱动器所对应的 *.xml 文件,选择 打开 按钮,过程如下图所示。
- Step5:添加EtherCAT主站,右击EtherCAT选择添加EtherCAT主站,默认添加为Master0
添加完成后,双击添加的Master0,选择循环周期。注意,循环周期必须根据控制器的伺服频率指定通信周期,由于伺服频率选择的是1kHz,因此此处设置了1000 us。
选择分布式时钟,选择主站偏移,如下图所示:
-
Step6:扫描EtherCAT从站,右击添加的Master0,选择扫描EtherCAT网络,系统会自动添加设备服务器从站,以下图片是已经有主从站的项目中截取出来的。
注意,扫描完成后,需要确认从站数与电机数是否匹配,如不匹配,说明有几个驱动器之间的EtherCAT总线连接有问题,需要检查物理连接
扫描完EtherCAT网络后,双击添加的Slave_xxxx服务器,选择分布式时钟,按下图进行设置:选择FreeRun,复写模式
按上图设置完成后,选择高级选项按钮,取消图中红框选项。
由于手头没有机器,此选项只能建立连接后才能查看,此图截自官方文档
- Step7:添加电机,并配置相应的PDO映射。右击Motors文件夹选择添加电机,有几个电机就添加几个,接下来配置电机与驱动器从站Slave_xxxx的连接,通过PDO映射完成。
注意,在没有完成POD映射之前,不能对电机进行使能命令,没有轴设置的PDO将作为不确定值进行PDO通信,故可能会发生意外。
右击从站Slave_xxxx选择属性,单击PDO映射(PDO Mapping)选项卡,对Inputs和Outputs进行设置,值得注意的是,如果此处设置不当,编码器反馈会出现问题,因此绝大多数问题是出在PDO映射上。
注意,每个Slave从站都需要配置
设置完PDO映射后,右击Master0选择加载映射到PowerPMAC.
- Step8:设置电机参数,双击Motors文件下的Motor1,出现如下图所示界面。主要设置的是放大器、编码器和硬件接口三项。
单击放大器,,将电机与Slave从站关联起来,配置好后点击接受按钮,如下图所示。
电机编码器选择EtherCAT反馈(根据实际情况进行选择),点击接受按钮。
检查硬件接口是否正确,然后点击接受按钮。
如果配置正确,在接口反馈窗口会出现如下曲线,此处是博主手绘的,参考一下即可。如果接口反馈无数据,是一条直线,则说明配置可能有问题,需要重复上述步骤。
对于用户单位窗口,可以设置电机单位的转换,也可在全局变量中通过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
- Step9:为保险起见,使用终端命令
save
一下
做好以上步骤,便可以进行实际设备调试了。
4. 在线命令介绍
调试时,我们通常先用在线命令去对电机、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,将电机设置为位置循环模式
对于其他命令,在后续程序中用到时再做讲解。
5. 参数和变量定义
使用变量前,首先要搞清楚什么类型的变量能够满足我们的要求,因此变量的声明就显得很关键。
5.1 变量声明的关键字
声明关键字 | 对应的变量类型 | 范围 | 精度 | 说明 |
---|---|---|---|---|
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文件中通过类似/******/
的分隔符进行分隔,以便于修改和查找。
5.2 变量声明的示例
/***************************** 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 7
ptr USHMPtr2->u.user:$4.8.8; // Sys.Udata[1], bits 8 to 15
ptr USHMPtr3->u.user:$4.16.8; // Sys.Udata[1], bits 16 to 23
/***************************** lobal类型 *****************************/
local index; // 只能在程序中声明,即在PLCs、Motion Programs、 Subprograms、 、Kinematics中
5.3 特殊数值的表示
对于特殊数值的表示,在PMAC中遵循 IEEE-754 标准。
- 正无穷:inf
- 负无穷:-inf
注意:
在PMAC中,如果一个数除以0,得到的虽然是无穷值,但PMAC是不报错的。
- 非值:nan
注意:
如sqrt(-1)
即可得到,PMAC同样不会报错,可以通过isnan()
函数来判断,该函数会返回一个布尔值,若temp = isnan(sqrt(-1)),则temp=1,即sqrt(-1)操作会产生nan值;
此值来源有两个:一是对负数开根号;二是物理上不存在于系统中的硬件的数据结构元素的值
- 负零:-0,此数存储按照IEEE-754标准
6. 运算符的使用
与C/C++相同:
- 算数运算符: + - * / %
- 位运算符:& | ^ ~ << >>
- 条件运算符:== != ~ !~ > < >= <=
- 逻辑运算符:&& || !
- 赋值运算符:= += -= *= /= %= &= |=
^= >>= <<= ++ - -
更多运算符请参考手册《Power PMAC Software Reference Manual》关于【Operators】的介绍,如下图所示:
7. 程序语法
脚本语言的语法,与C/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;
}
goto
在一般程序中,全局变量及goto强制性跳转语句一般是尽量避免使用的,但是由于控制程序的特殊性,要求逻辑必须清楚,因此在这种情况下是可以使用的,但必须要保证逻辑的安全性,而全局变量在控制程序中的使用是为了不同模块程序之间的相互。
/* code */
N1000:
/* code */
// 此处即构成一个死循环
goto 1000
/* code */
8. 后记
由于某些原因导致PMAC学习笔记长时间未更,在此感谢所有关注的朋友。发布笔记的初衷是为了帮助那些刚接触PMAC的人,避免像我刚开始一样迷茫,不知道该怎么去用这款产品。但分享经验不应该被道德绑架,希望大家都理性对待,每个人都有自己迫不得已的事情要做。也希望所有人都能参与技术共享的圈子,共同进步。
声明
1. 仅为技术分享交流,码字不易,转载请说明出处,违者必究,谢谢合作!
2. 本文图片部分来源于Power PMAC手册,图片版权归欧姆龙所有。
下节讲解:Power PMAC中运动程序的编写 —— 下
瞧你那熊楊: 零基础怎么学啊555555555,怎么网上教程都一步到位,没有详细教程
m0_74118033: 太强了,确实有用
Warren3876: 真的有用 我的天 文件都在里面 吓死了
I'm O.K.: \usr\local\dtlibs\libppmac\gplib.h(18,0): error : stdio.h 请问为啥我在点构建并下载所有程序之后报这个错
罗伯特祥: 直接上多线程叭