function main()
end
Ctrl+s 保存文件,用数字或者字母命名文件名,将后缀名改为.AR,机械手才可识别文件
1.local 定义局部变量
定义输入信号,输出信号,报警信号,点位定义,
--输入信号
local Input_pause = 8 --暂停信号
local Input_Release_Clamp_L = 4 --左夹紧气缸到位输入端口4
local Input_Up_Down_L = 1 --左上下气缸到位输入端口1
local Input_Release_Clamp_M = 5 --中夹紧气缸到位输入端口5
local Input_Up_Down_M = 2 --中上下气缸到位输入端口2
local Input_Release_Clamp_R = 6 --右夹紧气缸到位输入端口6
local Input_Up_Down_R = 3 --右上下气缸到位输入端口3
--输出信号
--气缸
local Output_Release_Clamp_L = 4 --左夹紧气缸输出端口4
local Output_Up_Down_L = 1 --左上下气缸输出端口1
local Output_Release_Clamp_M = 5 --中夹紧气缸输出端口5
local Output_Up_Down_M = 2 --中上下气缸输出端口2
local Output_Release_Clamp_R = 6 --右夹紧气缸输出端口6
local Output_Up_Down_R = 3 --右上下气缸输出端口3
--报警
local Output_Release_Clamp_L_alarm = 10 --夹紧气缸没到位报警输出端口10
local Output_Up_Down_alarm_L = 7 --上下气缸没到位报警输出端口7
local Output_Release_Clamp_M_alarm = 11 --夹紧气缸没到位报警输出端口11
local Output_Up_Down_M_alarm = 8 --上下气缸没到位报警输出端口8
local Output_Release_Clamp_R_alarm = 12 --夹紧气缸没到位报警输出端口12
local Output_Up_Down_R_alarm = 9 --上下气缸没到位报警输出端口9
2.IO初始化,点位初始化
--点位定义
local waitLoc = p1 --等待点
local putLoc = p2 --安全及放料点
--输出IO初始化
for i=1,20 do
DO(i,OFF)
end
--点位初始化
MovP(waitLoc,"Spd=100 CP=100")
print("点位初始化完成,等待上位机拍照")
3.主程序
--[[视觉CM0协议:
上位机收到: NO,0,0,0; 给机械手发点位
The Message is nil.Please Send again! 点位格式错误
in position 动作到位完成
自动点位格式:
auto,350,-50,60;auto,360,-60,70;auto,370,-70,80;(逗号分隔,分号分组)
手动气缸格式:
manual,1,0,0;打开左上下气缸
manual,2,0,0;打开中上下气缸
manual,3,0,0;打开右上下气缸
manual,4,0,0;打开左夹紧气缸
manual,5,0,0;打开中夹紧气缸
manual,6,0,0;打开右夹紧气缸
manual,7,0,0;关闭左上下气缸
manual,8,0,0;关闭中上下气缸
manual,9,0,0;关闭右上下气缸
manual,10,0,0;关闭左夹紧气缸
manual,11,0,0;关闭中夹紧气缸
manual,12,0,0;关闭右夹紧气缸
手动点位格式:
manual,7,0,0;移动到等待位上方
manual,8,0,0;移动到放置位上方--]]
function main()
MotOn() --伺服所有轴上电使能
CCDclr("CAM0") --清除网络托管
while 1 do
--MArchP(A,B,C,D, "Acc=20 Dec=20 Spd=100 ZsAcc=20 ZsSpd=80 ZsDec=20 ZeAcc=20 ZeSpd=80 ZeDec=20 Stop= 0 I=0 In=10 ON/ OFF”)
--[[MovP(waitLoc+Z(-30),"Spd=100 CP=100")
MovP(waitLoc,"Spd=100 CP=100")--]]
--[[ MArchP(waitLoc,0,10,5,"CP=100 Acc=20 Dec=20 Spd=100") --移动到等待位,运动过程中检测到输入信号IN8打开,则停止--]]
CCDsent("CAM0","NO,0,0,0;") --采用网络触发方式触发相机拍照
Delay(10) --延时10ms
local catchLoc = {x=0,y=0,z=0,c=0,h=0} --定义抓取位
print("开始接收视觉 CAM0 的数据")
local n,data,err=CCDrecv("CAM0") --接收视觉 CAM0 的数据
local time1=systime() --获取当前的系统时钟
if data == nil then --如果数据为空
print("data == nil")
CCDsent("CAM0","The Message is nil.Please Send again!")
elseif data ~= nil then --如果数据不为空
print("data ~= nil")
if data[1].NO == "auto" then --如果接收到的数据第一位是auto,进入自动模式
print("enter auto")
for i=1,n do --循环n次
print(i,data[i].NO,data[i][1],data[i][2],data[i][3]) --打印每组数据
if data[i][1]~=0 or data[i][2]~=0 then --判断数据不同时为零
catchLoc.x=data[i][1] --数据 data[i][1]赋值给 catchLoc.x
catchLoc.y=data[i][2] --数据 data[i][2]赋值给 catchLoc.y
catchLoc.z=-10
catchLoc.c=data[i][3] --数据 data[i][3]赋值给 catchLoc.c
Delay(100)
print("到第",i,"个点位了")
MovP(catchLoc,"Spd=100 CP=100")
MovP(catchLoc+Z(-30),"Spd=100 CP=100")
MovP(catchLoc,"Spd=100 CP=100")
--[[MArchP(catchLoc,0,10,5,"CP=100 Acc=20 Dec=20 Spd=100") --运动到点 catchLoc,运动过程中检测到输入信号IN8打开,则停止 --]]
DO(0+i,ON) --气缸往下
Delay(100)
print("输入端:",i)
Pause()
--WDI(10,ON,"Time=1000") --感应器亮 检测到输入信号IN10打开再执行下一行,若检测不到,等待一秒后跳出
if DI(0+i) == OFF then --如果上下气缸没到位
DO(6+i,ON) --上下气缸没到位报警
CCDsent("CAM0","Cylinder not in place")
Pause() --执行该指令后程序暂停执行,按启动键后程序继续运行
end
DO(3+i,ON) --气缸夹紧
Delay(100)
print("输入端:",i+3)
Pause()
--WDI(11,ON,"Time=1000") --感应器亮 检测到输入信号IN15打开再执行下一行,若检测不到,等待一秒后跳出
if DI(3+i) == OFF then
DO(6+i,ON) --夹紧气缸没到位报警
Pause() --执行该指令后程序暂停执行,按启动键后程序继续运行
end
end
end
MovP(putLoc,"Spd=100 CP=100")
MovP(putLoc+Z(-30),"Spd=100 CP=100")
MovP(putLoc,"Spd=100 CP=100")
--[[MArchP(putLoc,0,10,5,"CP=100 Acc=20 Dec=20 Spd=100")--]]
MovP(waitLoc,"Spd=100 CP=100")
MovP(waitLoc+Z(-30),"Spd=100 CP=100")
MovP(waitLoc,"Spd=100 CP=100")
CCDsent("CAM0","in position")
local time2 = systime()-time1 --获取程序运行的时间
print(time2)
elseif data[1].NO == "manual" then --如果接收到的数据第一位是manual,进入手动模式
print("enter manual")
if data[1][1] == 1 then --如果接收到的数据第二位是1
DO(1,ON)
print("DO(1,ON)") --打开左上下气缸
elseif data[1][1] == 2 then
DO(2,ON)
print("DO(2,ON)") --打开中上下气缸
elseif data[1][1] == 3 then
DO(3,ON)
print("DO(3,ON)") --打开右上下气缸
elseif data[1][1] == 4 then
DO(4,ON)
print("DO(4,ON)") --打开左夹紧气缸
elseif data[1][1] == 5 then
DO(5,ON)
print("DO(5,ON)") --打开中夹紧气缸
elseif data[1][1] == 6 then
DO(6,ON)
print("DO(6,ON)") --关闭右夹紧气缸
elseif data[1][1] == 7 then
DO(1,OFF)
print("DO(1,OFF)") --关闭左上下气缸
elseif data[1][1] == 8 then
DO(2,OFF)
print("DO(2,OFF)") --关闭中上下气缸
elseif data[1][1] == 9 then
DO(3,OFF)
print("DO(3,OFF)") --关闭右上下气缸
elseif data[1][1] == 10 then
DO(4,OFF)
print("DO(4,OFF)") --关闭左夹紧气缸
elseif data[1][1] == 11 then
DO(5,OFF)
print("DO(5,OFF)") --关闭中夹紧气缸
elseif data[1][1] == 12 then
DO(6,OFF)
print("DO(6,OFF)") --关闭右夹紧气缸
elseif data[1][1] == 7 then --如果接收到的数据第二位是7
MovP(waitLoc,"Spd=100 CP=100")
print("移动到等待位上方")
elseif data[1][1] == 8 then --如果接收到的数据第二位是8
MovP(putLoc,"Spd=100 CP=100")
print("移动到放置位上方")
else
print("err") --打印错误
end
else
print("o")
end
elseif err~=0 then
print("网线断开或 IP 配置错误或网络超时")
end
end
end
手动模式,点击小黄人,视觉,配置,打开