快速入门 | 篇六:如何进行运动控制器数据与存储的应用?

供稿:深圳市正运动技术有限公司

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

之前正运动技术与大家分享了,运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用等。


今天,我们来讲解一下正运动技术运动控制器数据与存储的应用。


image.png


教学视频


一、材料准备与控制器接线参考


材料准备:


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


2、控制器1个


3、24V直流电源1个


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


5、控制器接线端子若干


6、网线若干


7、连接线若干


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


image.png


控制器接线参考


二、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”来查看各寄存器的数量,不同的控制器存储容量大小不同。


image.png

image.png


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。


image.png


控制器中MODBUS字寄存器占用同一片系统变量空间,其中一个LONG占用两个REG地址,一个IEEE也占用两个REG地址,使用时要注意错开字寄存器编号地址。


image.png


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存储空间安排如下:


image.png


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、数据类型


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


image.png


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     '存储凸轮运动参数到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

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


image.png


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

发布时间:2020年9月7日 14:55  人气:   审核编辑(王静 )
更多内容请访问(深圳市正运动技术有限公司
相关链接

我有需求