'**********初始化模块*********
SETCOM(38400,8,1,0,0,4,2,1000) '出厂模式,MODBUS字寄存器和VR空间独立
ERRSWITCH = 3 '全部信息输出
RAPIDSTOP(2)
WAIT IDLE
BASE(0,1) '选定 X Y轴
DPOS=0,0
ATYPE=1,1
UNITS = 100,100
SPEED = 100,100
ACCEL = 1000,1000
DECEL = 1000,1000
SRAMP = 100,100
DIM run_state '运行状态
run_state = 0 '0 停止,1 运行,2 回零
MODBUS_REG(0) = run_state '显示运行状态
DIM radius,length '半径,长度
radius = 100 '缺省半径大小
length = 300 '缺省长度
'FLASH_READ 0,radius,length
MODBUS_IEEE(2) = radius '显示半径大小
MODBUS_IEEE(4) = length '显示长度
DIM home_done '回零完成的标志位 0 未回零,1 已回零
home_done = 0 '上电进入未回零状态
MODBUS_BIT(0) = 0 '启动 按钮复归
MODBUS_BIT(1) = 0 '停止 按钮复归
MODBUS_BIT(4) = 0 '回零 按钮复归
MODBUS_BIT(5) = 0 '保存数据 按钮复归
MODBUS_BIT(1000)=0 'X轴 回零标志为0
MODBUS_BIT(1001)=0 'Y轴 回零标志为0
STOPTASK 2
RUNTASK 2, guidetask '启动手动运行任务
'**********按键扫描模块*********
WHILE 1 '扫描触摸屏端按钮输入
IF MODBUS_BIT(0)= 1 THEN '启动按钮按下
MODBUS_BIT(0) = 0 '按钮复归
IF run_state = 0 THEN '待机停止状态
IF home_done = 0 THEN'未回零时不启动运动
TRACE "before move need home"
ELSEIF home_done = 1 THEN'已回零启动任务运行
TRACE "move start"
STOPTASK 1 '软件安全,停止任务0
RUNTASK 1, movetask '启动运行加工任务1
ENDIF
ENDIF
ELSEIF MODBUS_BIT(1) = 1 THEN '停止按钮按下
TRACE "move stop"
MODBUS_BIT(1) = 0 '按钮复归
RAPIDSTOP(2)
STOPTASK 1
RAPIDSTOP(2)
WAIT IDLE(0)
run_state = 0 '停止标志
MODBUS_REG(0) = run_state '显示状态
ENDIF
IF MODBUS_BIT(4) = 1 THEN '回零按钮按下
MODBUS_BIT(4) = 0 '回零复归
IF run_state= 0 THEN
stoptask 1
runtask 1,home_task '启动回零任务
ENDIF
ENDIF
'''保存数据处理
IF MODBUS_BIT(5) = 1 THEN '保存数据 按钮按下
MODBUS_BIT(5) = 0 '保存数据 按钮复归
PRINT "写入数据到FLASH"
radius = MODBUS_IEEE(2)
length = MODBUS_IEEE(4)
FLASH_WRITE 0,radius,length'往扇区0写入数据
ENDIF
WEND
END
'**********加工运动模块*********
movetask: '运行画圆弧+跑道的任务
run_state =1 '进入运行状态
MODBUS_REG(0) = run_state
radius = MODBUS_IEEE(2) '读取半径
length = MODBUS_IEEE(4) '读取长度
TRIGGER
BASE(0,1) '选定 X Y轴
MOVEABS(0,0)
MOVE(length,0) '从原点开始走跑道轨迹
MOVECIRC(0,radius*2,0,radius,0)
MOVE(-length,0)
MOVECIRC(0,-radius*2,0,-radius,0)
WAIT IDLE(0)
run_state = 0'进入待机状态
MODBUS_REG(0) = run_state
END
'**********回零任务*********
home_task:
TRACE "enter home task"
run_state = 2 '回零标志
MODBUS_REG(0) = run_state '显示状态
TRIGGER
BASE(0,1)
CANCEL(2) AXIS(0)'先轴0,轴1停止
CANCEL(2) AXIS(1)
WAIT IDLE(0)
WAIT IDLE(1)
MOVEABS(0) AXIS(0)'虚拟设备轴0的归零,实际轴使用DATUM回零
MOVEABS(0) AXIS(1)'虚拟设备轴1的归零
WAIT IDLE(0)
MODBUS_BIT(1000)=1'设置轴0已归零的标志
WAIT IDLE(1)
MODBUS_BIT(1001)=1'设置轴1已归零的标志
home_done = 1
TRACE "home task done"
run_state = 0 '回到待机状态
MODBUS_REG(0) = run_state
END
'**********手动运动*********
guidetask:
WHILE 1
IF run_state = 0 THEN '判断是否处于停止状态
BASE(0)
IF MODBUS_BIT(10) = 1 THEN '左
MODBUS_BIT(10) = 0
VMOVE(-1)
ELSEIF MODBUS_BIT(11) = 1 THEN '右
MODBUS_BIT(11) = 0
VMOVE(1)
ELSEIF MTYPE = 10 OR MTYPE = 11 THEN '非VMOVE运动
CANCEL(2)
ENDIF
BASE(1)
IF MODBUS_BIT(20) = 1 THEN '左
MODBUS_BIT(20) = 0
VMOVE(-1)
ELSEIF MODBUS_BIT(21) = 1 THEN '右
MODBUS_BIT(21) = 0
VMOVE(1)
ELSEIF MTYPE = 10 OR MTYPE = 11 THEN '非VMOVE运动
CANCEL(2)
ENDIF
ENDIF
DELAY(100)
WEND
END