文章:如何进行运动控制器数据与存储的应用?

所有者:TerryWang(呢称); 发布时间:2020-09-16 14:31:34; 更新时间:2020-09-16 14:51:49

阅读所需积分:0; 

简介:运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用等。今天,我们来讲解一下正运动技术运动控制器数据与存储的应用。教学视频一、材料准备与控制器接线参考材料准备:1、电脑1台,安装ZDevelop3.01以上版本软件2、控制器1个3、24V直流电源1个4、总线

之前正运动技术与大家分享了,运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用等。
今天,我们来讲解一下正运动技术运动控制器数据与存储的应用。

教学视频
一、材料准备与控制器接线参考

材料准备:

1、电脑1台,安装ZDevelop3.01以上版本软件

2、控制器1个

3、24V直流电源1个

4、总线驱动器+电机(或步进驱动器+电机)若干

5、控制器接线端子若干

6、网线若干

7、连接线若干

另:IO设备、扩展模板、触摸屏等根据需求选用

控制器接线参考

二、Basic编程数据定义
1、变量定义

变量是用户可以自定义的变量,变量用于暂时保存与外部设备的通信数据或任务内部处理需要的数据,换言之,它是用于保存带名称和数据类型等属性的数据,无需指定变量与存储器地址之间的分配。

1)变量定义指令:

分为全局变量(GLOBAL)、文件模块变量(DIM)、局部变量(LOCAL)三种。

全局变量可以在项目内的任意文件中使用;

文件模块变量只能在本程序文件内部使用;

局部变量主要用在SUB中,其他文件无法使用。

变量可以不经过定义直接赋值,此时的变量默认为文件模块变量。

2)示例:

GLOBAL  g_var2           '定义全局变量g_var2

DIM  VAR1                     '定义文件变量VAR1

SUB  aaa()

      LOCAL  v1      '定义局部变量V1

      v1=100

END SUB

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)           '定义全局数组

4、子函数定义

使用SUB指令定义子函数,子函数可以定义为文件SUB,或前面增加GLOBAL指令定义为全局使用的SUB过程,跨文件调用子函数必须定义为全局SUB过程。

示例:

SUB sub1()    '定义过程SUB1,只能在当前文件中使用

      ?1

      ...

END SUB

GLOBAL SUB g_sub2()       '定义全局过程g_sub2,可以在任意文件中使用

      ?2

      ...

END SUB

三、控制器内部寄存器

控制器的寄存器主要有TABLE、FLASH、VR、MODBUS寄存器。将ZDevelop软件与控制器连接后,可通过ZDevelop软件菜单栏“控制器”~“控制器状态”窗口查看该控制器各寄存器的空间大小,也可以通过在线命令功能在命令与输出窗口输入“?*max”来查看各寄存器的数量,不同的控制器存储容量大小不同。

1、TABLE数组

TABLE是控制器自带的一个超大数组,数据类型为32位浮点型(4系列及以上为64位浮点型),掉电不保存。

编写程序时,TABLE数组不需要再定义,可直接使用,索引下标从0开始。

ZBasic的某些指令可以直接读取TABLE内的值作为参数,TABLE使用时先将参数存储在TABLE的某个位置,再使用指令参数调用TABLE数据。比如CAM,CAMBOX,CONNFRAME,CONNREFRAME,MOVE_TURNABS,B_SPLINE,CAN,CRC16,DTSMOOTH,PITCHSET,HW_PSWITCH等指令。

示波器采样的参数存储在TABLE数组的末尾,因此在开发应用中要注意TABLE区域的分配与使用,不要与示波器采样的数据存储区域重合。

TABLE指令读写数据,示例:

TABLE(0) = 10            'table(0)赋值10

TABLE(10,100,200,300)     '批量赋值,table(10)赋值100,table(11)赋值200,table(12)赋值300

TSIZE指令可读取TABLE空间大小,还可修改TABLE空间大小(不能超出TABLE最大空间)示例

PRINT  TSIZE       '打印出控制器table大小

TSIZE=10000       '设置table的大小,不能超过控制器table最大size

TABLESTRING指令按照字符串格式打印TABLE里的数据示例

TABLE(100,68,58,92)

PRINT TABLESTRING(100,3)     '字符串格式打印数据,转换为ASCII码

打印结果:D:\

2、FLASH

FLASH具有掉电存储功能,读写次数限制为十万次左右,长期不上电也不会丢失数据。

一般用于存放较大的,不需要频繁读写的数据,比如加工的工艺文件。可以一个扇区或者几个扇区来保存一个加工的加工工艺文件。

读与写时要注意保证要操作的变量,数组等名称和次序高度一致,如果不一致会导致数据错乱。

FLASH使用时是按块编号,块数FLASH_SECTES指令查看,不同的控制器FLASH块数与块数据大小都不同,每块数据大小FLASH_SECTSIZE指令查看。

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      '读取次序与写入次序一致

3、VR寄存器

VR寄存器具有掉电存储功能,可无限次读写,但数据容量较小,一般只有1024或者更少,用于保存需要不断修改的数据,例如轴参数、坐标等。

VR的掉电保存原理是控制器内部有铁电存储器,但数据容量较小,所以数据量较大的或需要长久保存的数据最好写到FLASH块或导出到U盘。

VR存储数据类型为32位浮点型(4系列及以上为64位浮点数),使用VR_INT强制保存为32位整型,VRSTRING强制保存为字符串,保存的是ASCII码,一个字符占用一个VR。

VR、VR_INT,VRSTRING共用一个空间。寄存器读写方法相同。

VR使用方法:

VR(0) = 10.58                 '赋值

aaa = VR(0)                     '读取

4、MODBUS寄存器

MODBUS通讯的数据使用MODBUS寄存器存储,控制器的MODBUS寄存器符合MODBUS标准通讯协议,分为位寄存器和字寄存器两类。

位寄存器:MODBUS_BIT,触摸屏一般称为MODBUS_0X,布尔型

字寄存器:包含MODBUS_REG(16位整型)、MODBUS_LONG(32位整型)、MODBUS_IEEE(32位浮点型)、MODBUS_STRING(8位字节型),触摸屏一般叫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地址在用户应用程序中不能重叠。

控制器的MODBUS存储空间安排如下:

MODBUS指令

MODBUS通讯需要将数据放在MODBUS寄存器内进行传递。

有专门的MODBUS通讯指令对MODBUS寄存器的数据进行读写与寄存器之间的数据传递。

MODBUS读/写语法格式相同,如下所示:

MODBUSM_REGGET (startreg, num, local_reg)

      startreg:对端的寄存器起始编号,从0开始

      num:寄存器个数

      local_reg:从本地系统MODBUS寄存器中取值,起始编号

示例:

MODBUSM_REGGET(0,10,0)   '把本地位寄存器0~9复制到通讯对端的寄存器0~9

MODBUS指令如下,指令详细用法参见Basic手册:

MODBUS_BIT -- 位寄存器

MODBUS_IEEE -- 字寄存器-32位浮点型

MODBUS_LONG -- 字寄存器-32位整型

MODBUS_REG -- 字寄存器-16位整型

MODBUS_STRING -- 字寄存器-字节

MODBUSM_DES -- modbus通讯连接

MODBUSM_DES2 -- 控制器间网口通讯

MODBUSM_STATE -- modbus通讯状态

MODBUSM_REGSET -- 写对端保持寄存器

MODBUSM_REGGET -- 读对端保持寄存器

MODBUSM_3XGET -- 读对端输入寄存器

MODBUSM_BITSET -- 写对端线圈

MODBUSM_BITGET -- 读对端线圈

MODBUSM_1XGET -- 读对端离散输入

四、数据类型与数据转换
1、数据类型

常用寄存器存储的数据类型和每个数据存储单元的取值范围如下表所示:

2、数据转换

不同类型数据之间的操作,会产生下列问题:

A.数据丢失:浮点型向整型转换时会丢失小数部分。

示例:
VR(0)=10.314
MODBUS_REG(0)=0
MODBUS_REG(0)=VR(0)
?MODBUS_REG(0)       '结果为10
B.强制转换:整型存储到浮点型寄存器后会变成浮点型,再使用整型操作数据可能会不正确。
C单精度数据只有7位有效数值,在计算的过程中如果有长期累加的数值,建议使用4系列控制器。

五、Basic演示例程

以下是Basic演示例程及示波器演示图。

'急停,清空运动缓冲区,等待轴0运动空闲RAPIDSTOP(2)WAIT IDLE(0)'函数调用模块ConstInit        '常量初始化GlobalInit       '变量初始化AxesInit         '轴参数初始化read_flash       '读flash块CalcCamTable     '存储凸轮运动参数到tableWHILE 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 WENDEND'以任务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        nextENDGLOBAL 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)        NEXTEND SUBGLOBAL SUB write_flash()    '写flash块子程序        FLASH_WRITE flashnum,distance,velocity,ms_do        PRINT "写入flash完成"   END SUBGLOBAL SUB read_flash()    '读flash块子程序        FLASH_READ flashnum,distance,velocity,ms_do        PRINT "读取flash完成" END SUBGLOBAL SUB ConstInit()            '全局Const定义        GLOBAL const AxesNum=3    '定义总轴数END SUBGLOBAL 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        NEXTEND SUBGLOBAL 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

 任务1运行,执行凸轮表指令,得出波形如下图:

今天,正运动技术运动控制器数据与存储的应用分享到这里,更多精彩内容,请关注我们的公众号。

本文由正运动小助手原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

伺服与运动控制

https://mp.weixin.qq.com/s/kMWAi7_s114456qAbXwJ7w