如何进行运动控制器数据与存储的应用
一、材料准备与控制器接线参考
材料准备:
1、电脑1台,安装ZDevelop3.01以上版本软件;
2、控制器1个;
3、24V直流电源1个;
4、总线驱动器+电机(或步进驱动器+电机)若干;
5、控制器接线端子若干;
6、网线若干;
7、连接线若干;
另:IO设备、扩展模板、触摸屏等根据需求选用


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


2、数据转换
不同类型数据之间的操作,会产生下列问题:
A.数据丢失:浮点型向整型转换时会丢失小数部分。
示例:VR(0)=10.314MODBUS_REG(0)=0MODBUS_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运行,执行凸轮表指令,得出波形如下图:
