The value of Zmotion is to bring customers more success!
XPLC006E功能简介
0
XPLC006E是正运动运动控制器推出的一款多轴经济型EtherCAT总线运动控制器,XPLC系列运动控制器可应用于各种需要脱机或联机运行的场合。
XPLC006E自带6个电机轴,最多12轴运动控制(含虚拟轴数),支持12轴直线插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等功能。
XPLC006E支持多任务同时运行,同时可以在PC上直接仿真运行,编程方式多种可选,支持ZDevelop软件的Basic/PLC梯形图/HMI组态和常用上位机软件编程。
XPLC006E只支持EtherCAT总线轴,不支持脉冲轴和编码器轴。采用EtherCAT总线与驱动器通讯,1ms的刷新周期。
XPLC006E支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、VB、matlab、Qt、Linux、.Net、iMAC、Python、 ROS等接口。
→此款产品有XPLC004E、XPLC006E、XPLC008E三个不同轴数的型号可选。
2
2
XPLC864E功能简介
XPLC864E在XPLC006E的功能基础上做了升级(即上节介绍的XPLC006E的功能都支持),部分资源空间优于XPLC006E,使用方法基本一致,不同之处在于XPLC864E,硬件支持32点输入、32点输出、2个ADC、2个DAC,支持脉冲轴和总线轴混合使用,总实轴轴数为8,除了带EtherCAT接口之外,输出口硬件上可配置为8个轴的脉冲方向信号输出,另带两路编码器输入,可由输入口配置
XPLC864E支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、VB、matlab、Qt、Linux、.Net、iMAC、Python、 ROS等接口。
2
2
XPLC系列经济型EtherCAT总线运动控制器支持多种编程方式,支持使用正运动技术自主研发的ZDevelop开发环境的Basic语言和PLC梯形图,上一节讲解了多任务运行的优势,本节内容主要讲解控制器的数据存储。
数据存储可以利用控制器自带的寄存器和自定义参数。控制器寄存器主要有TABLE、MODBUS、VR寄存器,提供FLASH块存储,寄存器特点与使用方法参见下文。
将ZDevelop软件与控制器连接后,可通过ZDevelop软件“控制器”-“控制器状态”查看该控制器各寄存器的空间大小,也可以通过在线命令和输出窗口输入“?*max”来查看各寄存器的数量,不同的控制器存储空间大小不同。
TABLE寄存器
TABLE是控制器自带的一个超大数组,数据类型为32位浮点型(4系列及以上为64位浮点数),掉电不保存。编写程序时,TABLE数组不需要再定义,可直接使用,索引下标从0开始,支持批量赋值和批量读取。
ZBasic的某些指令可以直接读取TABLE内的值作为参数,比如CAM,CAMBOX,CONNFRAME,CONNREFRAME,MOVE_TURNABS,B_SPLINE,CAN,CRC16,DTSMOOTH,PITCHSET,HW_PSWITCH等指令。
示波器不开启连续采样的参数也存储在TABLE里(开启连续采样之后与TABLE无关)。因此在开发应用中要注意多个TABLE区域的分配与使用,不要与示波器采样的数据存储区域重合。
1.TABLE指令读写数据。
TABLE(0) = 10 'TABLE(0)赋值10 TABLE(10,100,200,300) '批量赋值,TABLE(10)赋值100,TABLE(11)赋值200,TABLE(12)赋值300
2.TSIZE指令可读取TABLE空间大小,还可修改TABLE空间大小(不能超出TABLE最大空间)。
PRINT TSIZE '打印出控制器TABLE大小 TSIZE=10000 '设置TABLE的大小,不能超过控制器TABLE最大SIZE
3.TABLESTRING指令按照字符串格式打印TABLE里的数据。
TABLE(100,68,58,92) PRINT TABLESTRING(100,3) '字符串格式打印数据,转换为ASCII码
→打印结果:D:\
4.TABLE作为参数传递时用法大致相同,先将数据存储到TABLE,再使用指令调用TABLE的数据。
(1)以CAM凸轮指令为例
CAM(start point, end point, table multiplier, distance)
start point:起始点TABLE编号,存储第一个点的位置
end point:结束点TABLE编号
table multiplier:位置乘以这个比例,一般设为脉冲当量值
distance:参考运动的距离
(2)电子凸轮使用方法示例
TABLE(10,0,80,75,40,50,20,50,30,65,0) 'TABLE从10开始存数据,TABLE(10)赋值0,TABLE(11)赋值80 CAM(10,17,100,500) '运动轨迹为TABLE(10)到TABLE(17)
(3)查看TABLE内数据的方式有2种
第一种:在在线命令行输入?*TABLE(10,8)查询TABLE(10)开始,依次8个数据。
第二种:在寄存器中查看DT(TABLE)数据,起始编号从10开始,个数8个。
MODBUS寄存器
MODBUS寄存器符合MODBUS标准通讯协议,分为位寄存器和字寄存器两类,支持MODBUS标准协议的第三方设备都能与控制器通讯,数据通过MODBUS寄存器传递。(MODBUS寄存器的数据掉电不保存,支持批量写入和读取)
⊙位寄存器:MODBUS_BIT,触摸屏一般称为MODBUS_0X,布尔型。
⊙字寄存器:MODBUS_REG、MODBUS_LONG、MODBUS_IEEE、MODBUS_STRING,触摸屏一般叫MODBUS_4X,类型如下图。
控制器中MODBUS字寄存器占用同一个变量空间,其中一个LONG占用两个REG地址,一个IEEE也占用两个REG地址,使用时要注意错开字寄存器编号地址。
⊙MODBUS_LONG(0)占用MODBUS_REG(0)与MODBUS_REG(1)两个REG地址。
⊙MODBUS_LONG(1)占用MODBUS_REG(1)与MODBUS_REG(2)两个REG地址。
⊙MODBUS_IEEE(0)占用MODBUS_REG(0)与MODBUS_REG(1)两个REG地址。
⊙MODBUS_IEEE(1)占用MODBUS_REG(1)与MODBUS_REG(2)两个REG地址。
所以要注意MODBUS_REG,MODBUS_LONG,MODBUS_IEEE地址在用户应用程序中不能重叠。4X空间示意图如下图所示:
例程:
MODBUS_REG(0)=0 '初始化置0 MODBUS_REG(1)=0 '初始化置0 MODBUS_LONG(0)=70000 'modbus_long赋值70000,modbus_reg范围-32768~32767 ?MODBUS_REG(0),MODBUS_REG(1)'打印出reg(0)为4464,reg(1)为1,long(0)=reg(1)*2^16+reg(0)
在串口设置(SETCOM参数)过程中,寄存器选择为VR时,此时一个VR映射到一个MODBUS_REG,其中VR是32位浮点型,MODBUS_REG是16位有符号整数型,从VR传递数据给MODBUS_REG会丢失小数部分,当VR数据超过正负15位时,MODBUS_REG数据会改变;MODBUS_REG传递数据给VR不会有问题,见如下例程,更多信息参见SETCOM指令。
例程:
VR(0)=0 '初始化VR(0)和MODBUS_REG(0)为0 MODBUS_REG(0)=0 SETCOM(38400, 8,1,0,0,4,0) '设置VR映射到MODBUS_REG VR(0)=100.345 '设置VR(0)=100.345 ?MODBUS_REG(0) '打印结果为100,VR已经映射到REG,但是REG是整型,所以小数部分丢失 MODBUS_REG(0)=200 'REG(0)设为200 ?VR(0) '打印结果为200,REG变化也会改变VR
当使用MODBUS协议与其他设备通讯时,就需要将数据放在MODBUS寄存器内进行传递,比如与触摸屏通讯。不进行MODBUS通讯时,亦可将MODBUS寄存器作为控制器本地数组使用。
控制器直接从MODBUS_BIT地址10000开始与输入IN口对应,20000与输出OUT口对应(注意读取的IO是原始的状态,INVERT_IN反转输入指令不起作用),30000与PLC编程的S寄存器对应。
MODBUS_IEEE地址10000开始对应轴DPOS区间,11000开始对应轴MPOS区间,12000开始对应轴VP_SPEED区间;MODBUS_REG的13000开始对应模拟量DA输出区间,14000开始对应模拟量AD输入区间。
MODBUS_BIT地址 | 意义 |
0~7999 | 用户自定义使用 |
8000~8099 | PLC编程的特殊M寄存器 |
8100~8199 | 轴0-99的IDLE标志 |
8200~8299 | 轴0-99的BUFFER剩余标志 |
10000~14095 | 对应输入IN口 |
20000~24095 | 对应输出OUT口 |
30000~34095 | 对应PLC编程的S寄存器 |
MODBUS字寄存器地址 | 意义 |
0~7999 | 用户自定义使用,可混用MODBUS_REG、MODBUS_IEEE、MODBUS_LONG |
8000~8099 | PLC编程的特殊D寄存器 |
10000~10198 | 对应各轴DPOS,读写用MODBUS_IEEE |
11000~11198 | 对应各轴MPOS,读写用MODBUS_IEEE |
12000~12198 | 对应各轴VPSPEED,读用MODBUS_IEEE |
13000~13127 | 模拟量输出AOUT,读写用MODBUS_REG |
14000~14255 | 模拟量输入AIN,读用MODBUS_REG |
VR寄存器
VR寄存器具有掉电存储功能,可无限次读写,但数据空间较小,XPLC006E系列控制器有1024个地址,最新系列控制器的VR空间为8000,用于保存需要不断修改的数据,例如轴参数、坐标等,数据类型为32位浮点型。(4系列及以上为64位浮点数)
可使用VR_INT强制保存为整型,VRSTRING强制保存为字符串。VR、VR_INT、VRSTRING共用一个空间,地址空间是重叠的,VR和VR_INT读写方法相同,VRSTRING保存ASCII码,一个字符占用一个VR。
VR的掉电保存原理是控制器内部有缺电存储器,但数据容量较小,所以数据量较大的或需要长久保存的数据最好写到FLASH块或导出到U盘。
VR寄存器还可用于RTEX控制器传递读写数据,DRIVE_WRITE参数写入,DRIVE_READ参数读取,具体使用方法参见第十六章总线相关的RTEX总线指令。
使用CLEAR指令清除VR内的全部数据,CLEAR_BIT指令将VR某个位置0,READ_BIT指令读取VR寄存器的某个位数据,SET_BIT指令将VR某个位置1。
例一:VR使用方法
VR(0) = 10.58 '赋值 aaa = VR(0) '读取
例二:VR寄存器数据相互转换
VR(100)=10.12 VR_INT(100)=VR(100) '数据转换?VR_INT(100) '打印结果:10,浮点数转换成整数,丢失小数位
例三:VRSTRING存储字符串
VRSTRING(0,4) = "abc" '从VR(0)开始保存字符串 PRINT VRSTRING(0,4) '打印结果:abc
FLASH寄存器
严格来讲,FLASH不是寄存器,但它与寄存器密切相关,用于存储重要数据。
FLASH具有掉电存储功能,读写次数限制为十万次,长期不上电也不会丢失数据。一般用于存放较大的,不需要频繁读写的数据,比如加工的工艺文件。
读与写时要注意保证要操作的变量,数组等名称和次序高度一致,如果不一致会导致数据错乱。
FLASH使用时是按块编号,使用按块存储变量或数组等数据,读取同样需要按块读取,块数FLASH_SECTES指令查看,不同的控制器FLASH块数与块数据大小都不同,每块的大小FLASH_SECTSIZE指令查看。
可以在在线命令行查看,某个型号控制器的存储空间查看如下图,显示的是FLASH块数和FLASH总空间大小。
→CAN通讯设置的参数,IP地址、APP_PASS、LOCK密码等系统参数存储到FLASH。
注意:FLASH在读取之前先要写入,否则会提示警报WARN。
FLASH使用方法:
GLOBAL VAR '变量定义 GLOBAL ARRAY1(200) '数组定义DIM ARRAY2(100)
⊙数据存储到FLASH块:把VAR,ARRAY1,ARRAY2数据依次写入FLASH块1
FLASH_WRITE 1,VAR,ARRAY1,ARRAY2
⊙FLASH块数据读取:把FLASH块1的数据依次读入VAR,ARRAY1,ARRAY2
FLASH_READ 1,VAR,ARRAY1,ARRAY2 '读取次序与写入次序一致
自定义参数
变量是用户可以自定义的参数,变量用于暂时保存与外部设备的通信数据或任务内部处理需要的数据,换言之,它是用于保存带名称和数据类型等属性的数据,无需指定变量与存储器地址之间的分配。
变量定义指令:分为全局变量(GLOBAL)、文件模块变量(DIM)、局部变量(LOCAL)三种,使用不同的指令定义的变量作用范围不同,范围说明如下。
⊙全局变量(GLOBAL):可以在项目内的任意文件中使用。
⊙文件模块变量(DIM):只能在本程序文件内部使用。
⊙局部变量(LOCAL):主要用在SUB中,其他文件无法使用。
变量可以不经过定义直接赋值,此时的变量默认为文件模块变量,变量的定义语句需要写在程序开头,保证上电后先执行,否者可能会发生变量无法正常使用的现象。
示例:
GLOBAL g_var2 '定义全局变量g_var2 DIM VAR1 '定义文件变量VAR1 SUB aaa() LOCAL v1 '定义局部变量V1 v1=100 ENDSUB
2.常量定义
变量的值因代入该变量的数据而异。与之相对的固定不变的值为常数,常量的值一经定义不能再修改,只可读取。
CONST定义常量,一次只能定义一个,且定义与赋值必须在一行。常量可定义为全局常量GLOBAL CONST,全局常量可以在任意文件中使用,不存在LOCAL CONST的写法。常数与变量不同,不是保存在存储器中的信息。
示例:
CONST MAX_VALUE = 100000 '定义文件常量 GLOBAL CONST MAX_AXIS=6 '定义全局常量
3.数组定义
数组指定是指将相同属性的数据集中后对其进行统一定义,并对数据个数进行指定。构成数组的各数据称为“元素”。
数组定义相关指令为GLOBAL、DIM,不支持LOCAL定义。数组定义时注意数组空间大小的指定,不能使用超出定义范围的空间,否则程序报错数组空间超限。
示例:
DIM array1(15) '定义文件数组,可使用的数组空间编号为0~14,共15个空间 GLOBAL array2(10) '定义全局数组,可使用的数组空间编号为0~9,共10个空间
数据类型
数据类型是指对变量或寄存器表示的值的形式和范围进行特定的规定。声明该变量时,数据类型的大小根据存储器内的数据范围大小而定,存储器内的数据范围越大,可表示的值的范围就越大。(指令的输入或输出变量的数据类型由指令确定)
自定义变量的数据类型属于动态类型,将整数赋值给变量时,变量就是整型;将浮点数赋值给变量,变量就是浮点型。
自定义数组的数据类型分为单精度浮点数和双精度浮点数,参照下文浮点数相关说明。
1.单精度浮点数32位,如下图所示。
数据格式属于单精度浮点数的有:VR、MODBUS_IEEE、TABLE及自定义数组与变量。(ZMC3系列及之前的控制器)
2.双精度浮点数64位,如下图所示。
数据格式属于双精度浮点数的有:TABLE及自定义数组与变量。(ZMC4系列及之后的控制器)
3.常用寄存器数据类型表。
寄存器类型 | 数据类型 | 取值范围 |
MODBUS_BIT | 布尔型 | 0或1 |
MODBUS_REG | 16位整型 | -32768到32767 |
MODBUS_LONG | 32位整型 | -2147483648到2147483647 |
VR_INT | ||
MODBUS_IEEE | 32位浮点型 | -3.4028235E+38到-1.401298E-45 |
VR | ||
href="#_TABLE_--_系统缺省数组_1" TABLE,自定义数组,变量(ZMC3系列及之前) | ||
TABLE,自定义数组,变量(ZMC4系列及之后) | 64位浮点型 | 1.7E-308到1.7E+308 |
VRSTRING | 字符 | 一个字符占一个VR |
MODBUS_STRING | 字符 | 一个字符占8位 |
TABLESTRING | 字符 | 一个字符占一个TABLE |
所有数据所需的存储器容量与各数据的总数据大小(容量值)不一致,原因在于,分配至存储器的数据的开头位置自动配置至各数据类型的“校准值(边界值)”倍数位置,各数据类型之间会产生空白。即使数据类型的种类相同,整体占用的数据大小仍会因数据类型的顺序而异。
注意:不同类型数据之间的操作要注意数据类型,类型不匹配会导致数据丢失。
参考例程
1.例程代码。
'急停,清空运动缓冲区,等待轴0运动空闲
RAPIDSTOP(2)
WAIT IDLE(0)
'函数调用模块
ConstInit '常量初始化
GlobalInit '变量初始化
AxesInit '轴参数初始化
read_flash '读flash块
CalcCamTable '存储凸轮运动参数到table
WHILE 1 'while循环扫描
'启动5组凸轮曲线的运行任务
IF MODBUS_BIT(0)=on THEN '条件判断
MODBUS_BIT(0)=0 '复位,使IF条件满足只执行一次
STOPTASK 1
RUNTASK 1,Motion1_job '启动任务1
ELSEIF MODBUS_BIT(1)=on THEN
MODBUS_BIT(1)=0
RAPIDSTOP(2)
STOPTASK 1 '停止任务1
RAPIDSTOP(2)
'往flash块写入数据
ELSEIF MODBUS_BIT(2)=on THEN
MODBUS_BIT(2)=0
PRINT "写入数据"
distance(0)=10
velocity(0)=200
ms_do(0)=0.3
distance(1)=-10
velocity(1)=200
ms_do(1)=0.4
distance(2)=20
velocity(2)=200
ms_do(2)=0.5
distance(3)=-20
velocity(3)=200
ms_do(3)=0.6
distance(4)=10
velocity(4)=200
ms_do(4)=0.8
write_flash() ' 调用函数,将数组数据写入flash块
ENDIF
WEND
END
'以任务1运行
Motion1_job:
TRIGGER ' 触发示波器采样
BASE(0)
DPOS=0
FOR i=0 to 4
m=distance(i) ' 代表距离的倍数
t=ms_do(i) ' 运行时间
SPEED=velocity(i) ' 运行速度
CAM(0,1000,m,SPEED*t)
WAIT IDLE
next
END
GLOBAL SUB CalcCamTable() '凸轮参数存储到table
num_p=1000 '变量不定义直接赋值,自动为文件模块变量
scale=500
FOR p=0 TO num_p
TABLE(p,((-SIN(PI*2*p/num_p)/(PI*2))+p/num_p)*scale)
NEXT
END SUB
GLOBAL SUB write_flash() '写flash块子程序
FLASH_WRITE flashnum,distance,velocity,ms_do
PRINT "写入flash完成"
END SUB
GLOBAL SUB read_flash() '读flash块子程序
FLASH_READ flashnum,distance,velocity,ms_do
PRINT "读取flash完成"
END SUB
GLOBAL SUB ConstInit() '全局Const定义
GLOBAL const AxesNum=3 '定义总轴数
END SUB
GLOBAL SUB GlobalInit() '全局变量初始化
GLOBAL flashnum 'flash块编号
flashnum=1 '选择编号1
'定义数组,distance 距离,velocity 速度,time_do 时间
GLOBAL distance(5),velocity(5),ms_do(5)
'清空数组
FOR i=0 TO 4
distance(i)=0
velocity(i)=0
ms_do(i)=0
NEXT
END SUB
GLOBAL SUB AxesInit() '轴参数的初始化
'批量初始化轴参数
FOR i=0 TO AxesNum-1
BASE (i)
DPOS(i)=0
ATYPE(i)=1
UNITS(i)=500
SPEED(i)=100
ACCEL(i)=1000
DECEL(i)=1000
SRAMP(i)=10
'将轴参数存储到modbus寄存器
MODBUS_IEEE(10+i*10)=UNITS(i)
MODBUS_IEEE(12+i*10)=SPEED(i)
MODBUS_IEEE(14+i*10)=ACCEL(i)
MODBUS_IEEE(16+i*10)=DECEL(i)
MODBUS_IEEE(18+i*10)=SRAMP(i)
NEXT
END SUB
2.示波器采样运动波形。
本次,正运动技术经济型EtherCAT运动控制器(六):数据储存,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。