爱普生(EPSON)机器人程序框架
PLC与爱普生机器人通信程序
1.FINS_TCP
①通信初始化(Function FINS_TCP_Init):
a)设定最终握手指令
b)设定FINS/TCP头代码
c)FINS读、写指令
d)FINSSET RST 指令
e)软元件区域
''' <summary>
''' 通信初始化
''' </summary>
''' <param name='KV_IP$'PLC IP地址/param>
''' <param name='KV_PORT'PLC 端口号/param>
Function FINS_TCP_Init(nIP$ As String, nPORT As Integer)
String nLastIP$(0)
Integer LastIP
' 握手指令
HANDS_HEAD$ = '46494E530000000C0000000000000000' '固定握手格式
HANDS_ADDR$ = '0000000F' '源(当前pc)网络节点
HANDS_CMD$ = HANDS_HEAD$ + HANDS_ADDR$ ' HANDS_HEAD + HANDS_ADDR '最终握手指令
'FINS/TCP头代码
FINS_TCP_HEADER$ = '46494E53' 'HEADER
FINS_TCP_CMD$ = '00000002' '命令
FINS_TCP_ERROR$ = '00000000'
'FINS Frame
FINS_ICF$ = '80' '发送数据时ICF=80
FINS_RSV$ = '00' 'RSV固定为00
FINS_GCT$ = '02' 'GCT固定为02
FINS_DNA$ = '00' '为目标网络号(PLC网络号)
' FINS_DA1$ = '0A' 'DA1为目标节点号
FINS_DA2$ = '00' 'DA2为目标单元号
FINS_SNA$ = '00' 'SNA为源网络号
FINS_SA1$ = Right$(HANDS_ADDR$, 2) 'SA1为源节点号
FINS_SA2$ = '00' 'SA2为源单元号
FINS_SID$ = '00' 'SID设置00
'FINS读指令
FINS_Read$ = '0101'
'FINS写指令
FINS_write$ = '0102'
'FINS SET RST 指令
FINS_SET_RST$ = '2301'
'软元件区域
FINS_REG_D$ = '82'
FINS_READ_IO$ = '30'
FINS_WRITE_IO$ = 'B0'
FINS_WR$ = '31'
Print nIP$ + ':', nPORT, '开始连接TCP服务端'
SetNet #202, nIP$, nPORT, CR, NONE, 0
CloseNet #202 '重连
Wait 0.1
OpenNet #202 As Client
WaitNet #202
Print nIP$ + ':', nPORT, 'FINS/TCP建立连接成功'
FINS_ClientOK = True
ParseStr nIP$, nLastIP$(), '.'
LastIP = Val(nLastIP$(3))
FINS_DA1$ = Hex$(LastIP)
If Len(FINS_DA1$) = 1 Then
FINS_DA1$ = '0' + FINS_DA1$
EndIf
Fend
①通信初始化(Function FINS_TCP_Init):
a)先打印“开始连接TCP服务端”窗口
b)然后设置通讯地址格式,如图(c)所示
c)然后关掉端口,0.1s后再打开端口
d)当连接成功后,打印'FINS/TCP建立连接成功'窗口
功能:FINS/TCP建立通信连接,并通过打印窗口,验证是否连接成功
提示:相关常用的通讯指令如图(b)所示
②PLC与Robot的通信线程 (FINS_Task):
a)先是调用FINS_TCP_Init函数,让其通信初始化
b)0.1s后,机器人发送数据
c)再0.1s后,机器人接收PLC数据
d)数据传输完毕后,最后循环执行中间一大段程序内容
功能:数据传送,数据交流
''' <summary>
''' PLC与Robot的通信线程
''' </summary>
Function FINS_Task
Integer x, Redata(0)
Call FINS_TCP_Init(FINS_IP$, FINS_PORT)
Wait 0.1
FINS_Send(HANDS_CMD$)
Wait 0.1
Call FINS_ReceivePLCData
WriteDFlag = False
ReadWFlag = True
Do
If FINS_HANDSOK = True Then
If ReadDFlag = True Then
Call FINS_ReadDM '读取PLC的DM数据(读取D200-D399 100个32位数据)
Call Hand_WriteHere '发送机器人当前坐标
Select True
Case WR(8)
Call Hand_WritePoint '将选择点读出至HMI
Case WR(10)
Call Hand_RecordPoint '将指定坐标写入PLC和点数据
Case WR(11)
Call Hand_RecordHere '将当前坐标写入PLC和点数据
Send
ElseIf ReadWFlag = True Then
Call FINS_ReadWR '读取PLC的WR数据(读取W10.0-W19.15 160个状态)
EndIf
If WriteWFlag = True Then '判断是否需要写W地址
Call FINS_WriteBatchCoils('WR', FINSWR_FIRST + FINS_WRStart, FINS_WRNum, FINS_WState)
Do
'Wait 0.02
If ChkNet(202) > 0 Then
x = ChkNet(202)
Redim Redata(x - 1)
ReadBin #202, Redata(), x
FINS_Write_OK = True
MemOn 0
WriteWFlag = False
Exit Do
Else
FINS_Write_OK = False
EndIf
Loop
EndIf
If WriteDFlag = True Then '判断是否需要写D地址
If Oport(DO_ROBOT_ALARM) = True Then
Call FINS_SendErr '发送错误代码
EndIf
EndIf
If WR(200) = True Then
Call FINS_SendDM
EndIf
EndIf
Loop
Fend
③将数据写读到PLC的D、W中(FINS_Task):
a)如果写D寄存器标志位为True时,调用写数据寄存器函数FunctionFINS_WriteBatchWords(),将机器人当前坐标和HMI指定点坐标写到PLC 的D40-D47的中
b)如果写W标志位为True时,调用传递写PLCW命令函Function FINS_Write_PLCW()函数,将W状态写入PLC中
c)当握手成功且没有写D、W的标志位时,根据需求进行D、W地址的读取
功能:主要判断条件,将数据写或读到PLC的D、W中
''' <summary>
''' PLC与Robot的通信线程
''' </summary>
Function FINS_Task
Integer x, Redata(0)
Call FINS_TCP_Init(FINS_IP$, FINS_PORT)
Wait 0.1
FINS_Send(HANDS_CMD$)
Wait 0.1
Call FINS_ReceivePLCData
WriteDFlag = False
ReadWFlag = True
Do
If FINS_HANDSOK = True Then
If ReadDFlag = True Then
Call FINS_ReadDM '读取PLC的DM数据(读取D200-D399 100个32位数据)
Call Hand_WriteHere '发送机器人当前坐标
Select True
Case WR(8)
Call Hand_WritePoint '将选择点读出至HMI
Case WR(10)
Call Hand_RecordPoint '将指定坐标写入PLC和点数据
Case WR(11)
Call Hand_RecordHere '将当前坐标写入PLC和点数据
Send
ElseIf ReadWFlag = True Then
Call FINS_ReadWR '读取PLC的WR数据(读取W10.0-W19.15 160个状态)
EndIf
If WriteWFlag = True Then '判断是否需要写W地址
Call FINS_WriteBatchCoils('WR', FINSWR_FIRST + FINS_WRStart, FINS_WRNum, FINS_WState)
Do
'Wait 0.02
If ChkNet(202) > 0 Then
x = ChkNet(202)
Redim Redata(x - 1)
ReadBin #202, Redata(), x
FINS_Write_OK = True
MemOn 0
WriteWFlag = False
Exit Do
Else
FINS_Write_OK = False
EndIf
Loop
EndIf
If WriteDFlag = True Then '判断是否需要写D地址
If Oport(DO_ROBOT_ALARM) = True Then
Call FINS_SendErr '发送错误代码
EndIf
EndIf
If WR(200) = True Then
Call FINS_SendDM
EndIf
EndIf
Loop
Fend
④写数据寄存器(Function FINS_WriteBatchWords):
''' <summary>
''' 描述: 写数据寄存器
''' </summary>
''' <param name='regName'>寄存器名称</param>
''' <param name='startNo'>首地址</param>
''' <param name='total'>个数</param>
'''<param name='nWriteData'>要发送的数据</param>
Function FINS_WriteBatchWords(regName$ As String, startNo As Integer, total As Integer, ByRef nWriteData() As Int32)
String ss$
String sValue$
Integer ii
String name$
Int32 v
MemOff 1
' check reg name
If (regName$ = 'D') Then
name$ = FINS_REG_D$
EndIf
For ii = 0 To total - 1
v = nWriteData(ii)
ss$ = Hex$(v)
ss$ = Trim$(ss$)
FINS_CompZero(ss$, 8)
ss$ = ZeroReStr$
ss$ = Right$(ss$, 8)
sValue$ = sValue$ + Mid$(ss$, 5, 4) + Mid$(ss$, 1, 4)
Next ii
total = total * 2
' Set values
FINS_BatchValues(False, FINS_write$, name$, startNo, total, sValue$)
'WriteDFlag = False
Fend
⑤写PLC W命令(FINS_Write_PLCW()):
⑥判断是否写入成功(FINS_Task):
a)如果ChkNet(202)> 0,即字符数大于0,即通信成功
b)然后把接受到的字符数赋值到x中,方便建立一维数组
c)变量Redata[x-1]
d)接着从#202端口将数组Redata[x-1]中x个元素全部读取到机器人中
e)最后,把写入标志位置为True,并退出循环f)如果通信不成功,就不退出死循环,直到通信成功为止
功能:当把机器数据写入PLC后,通过读取PLC数据,判断是否写入成功,如果读取到,即写入成功,如果没有,即写入失败
If WriteWFlag = True Then '判断是否需要写W地址
Call FINS_WriteBatchCoils('WR', FINSWR_FIRST + FINS_WRStart, FINS_WRNum, FINS_WState)
Do
'Wait 0.02
If ChkNet(202) > 0 Then
x = ChkNet(202)
Redim Redata(x - 1)
ReadBin #202, Redata(), x
FINS_Write_OK = True
MemOn 0
WriteWFlag = False
Exit Do
Else
FINS_Write_OK = False
EndIf
Loop
EndIf
⑦读取D、W数据(FINS_Task):
a)如果写D,W标志位都为False,并且通信握手标志位位True时,读取数据
b)如果读D寄存器标志位为True时,把D寄存器数据读到机器人中,如果读W为True时,把W数据读到机器人中
c)然后判断读取数据是否成功,如果读取数据成功标志位为False,然后执行机器人接受数据函数指令,继续通信。如果读取数据成功标志位为True,就退出循环。
功能:主要读取PLC的D寄存器数据,W状态
2.机器人与CCD通信CCD_TCP_IP
①触发拍照(CCD_Task):
a)调用函数,建立与CCD通信
b)将触发相机拍照的字符串设定为“TR”
(可更改为其他,需与相机协商好)
c)调用函数,接受相机的数据
d)如果CCDTrigger = True,即接收到触发信号时,将CCD_infor$(“TR”)字符串传入端口201,关掉触发信号,打印”触发拍照’窗口
e)循环(c)、(d)过程
功能:接收数据,执行触发拍照
'------------------------------------------------------------------------------------
' 定义变量类型
Global Real aX, aY, aU '相机传送的X,Y,U数据
Global String CCD_Infor$ '触发相机拍照的字符串
Global Boolean Sys_EOrM '空跑标志
Global Boolean CCDTrigger '触发相机拍照
Global Boolean CCD_ClientOK_FLAG '相机连接成功标志
Global Boolean CCD_DONE_FLAG, CCD_PASS_FLAG '相机拍照完成标志,相机拍照合格标志
Global String CCD_IP$
Global Integer CCD_PORT
'------------------------------------------------------------------------------------
''' <summary>
''' CCD通讯主循环,可在此处修改连接的服务器的IP地址
''' 向服务器发送字符串
''' 获取纠偏数据
''' </summary>
Function CCD_Task
Call CCD_TCP_Init(CCD_IP$, CCD_PORT) 'PC端/智能相机IP地址
Do
Call CCD_TCP_ReceiveData '接收数据
If CCDTrigger = True Then '如果接收到触发拍照的信号,执行触发拍照
Print #201, CCD_Infor$
CCDTrigger = False
Print '触发拍照'
EndIf
Loop
Fend
②机器人与CCD通信链接(CCD_TCP_Init)
3.关闭CCD与机器人的通信链
功能:机器人与CCD通信
''' <summary>
''' 建立CCD通信链接
''' </summary>
Function CCD_TCP_Init(nIP$ As String, nPORT As Integer)
Print nIP$ + ':', nPORT, '开始连接TCP服务端'
SetNet #201, nIP$, nPORT, CRLF, NONE, 0
CloseNet #201 '重连
Wait 0.1
OpenNet #201 As Client '作为客户端建立连接
WaitNet #201
Print nIP$ + ':', nPORT, 'TCP/IP建立连接成功'
CCD_ClientOK_FLAG = True
Fend
''' <summary>
''' 关闭CCD与机器人的通信链接
''' </summary>
Function CCD_TCP_Disconnect
CloseNet #201
Fend
③机器人接收CCD的数据(CCD_TCP_ReceiveData):
a)先判断端口状态,如果如果缓冲字符数量大于0,则机器人从201端口读入一行数据。如果小于0,打印出“通讯端口异常'字样
b)分离数据到数组mReceiveArr$()中
c)赋于ReCount为mReceiveArr$下标的最大值
d)如果满足电芯OK条件,则把接收到数据赋到点PBELT(以便后续跑点使用)
e)如果满足电芯NG条件,则打印“拍照NG”字样,合格标志CCD_PASS_FLAG置为FALSE
''' <summary>
''' CCD---> ROBOT返回数据
''' </summary>
Function CCD_TCP_ReceiveData
String Receivestr$, mReceiveArr$(0)
Integer i, j, k, ReCount
If ChkNet(201) > 0 Then '检查接收缓存区的数据,如果大于0就证明收到数据
Line Input #201, Receivestr$
ParseStr Receivestr$, mReceiveArr$(), ',' '分离数据,以','为分格符将数据拆到数组里
ReCount = UBound(mReceiveArr$) '取mReceiveArr数组下标最大值
'假设相机传过来的数据格式为“Cell,OK,x,y,u”
If ReCount = 4 And mReceiveArr$(0) = 'Cell' And mReceiveArr$(1) = 'OK' Then
aX = Val(mReceiveArr$(2))
aY = Val(mReceiveArr$(3))
aU = Val(mReceiveArr$(4))
CX(PCCDSend) = aX; CY(PCCDSend) = aY; CU(PCCDSend) = aU '将接收到的数据赋给点位
Print '收到的数据:', Receivestr$
CCD_DONE_FLAG = True 'CCD拍照完成标志
CCD_PASS_FLAG = True 'CCD拍照合格标志
' Off DO_BELTCCD_AW '拉带拍照允许
' On DO_BELTCCD_DONE '拉带拍照完成
ElseIf ReCount = 4 And mReceiveArr$(0) = 'Cell' And mReceiveArr$(1) = 'NG' Then
CCD_DONE_FLAG = True 'CCD拍照完成标志
CCD_PASS_FLAG = False 'CCD拍照不合格标志
' Off DO_BELTCCD_AW '拉带拍照允许
' On DO_BELTCCD_OK '拉带拍照完成
Print '拍照NG'
EndIf
ElseIf ChkNet(201) < 0 Then
Print '通讯端口异常'
EndIf
Fend
④定位相机CCD XY标定(CCD_XY_calibration):
a)设置x,y方向偏移的距离nX,xYb)通过九点标定法进行XY标定用
''' <summary>
''' 定位相机CCD XY标定
''' </summary>
Function CCD_XY_calibration
Int32 nX, nY, xyCali_Count
String nRobot$, mes$
nX = 2
nY = 2
Print '开始进行XY标定'
For xyCali_Count = 0 To 8
Select xyCali_Count
Case 0
Jump PXYCali_Start LimZ ROBOT_LIMZ
Case 1
PXYCali = PXYCali_Start +X(nX * 1)
Go PXYCali
Case 2
PXYCali = PXYCali_Start +X(nX * 2)
Go PXYCali
Case 3
PXYCali = PXYCali_Start +X(nX * 2) +Y(nY * 1)
Go PXYCali
Case 4
PXYCali = PXYCali_Start +X(nX * 1) +Y(nY * 1)
Go PXYCali
Case 5
PXYCali = PXYCali_Start +Y(nY * 1)
Go PXYCali
Case 6
PXYCali = PXYCali_Start +Y(nY * 2)
Go PXYCali
Case 7
PXYCali = PXYCali_Start +X(nX * 1) +Y(nY * 2)
Go PXYCali
Case 8
PXYCali = PXYCali_Start +X(nX * 2) +Y(nY * 2)
Go PXYCali
Send
Print xyCali_Count + 1, ':', CX(Here), CY(Here), CU(Here) '打印当前坐标,格式:X,Y,U
Pause '暂停,等待相机拍照,按继续可恢复运行
Next
Print '标定结束'
' FINS_Write_PLC_WCmd('1.00', False)
' Wait 0.5
Fend
⑤定位相机CCD U标定(CCD_U_calibration):
a)设置每次标定的旋转角度nUb)更改For循环的最大值可设定标定次数
功能:进行相机的标定
''' <summary>
''' 定位相机CCD U标定
''' </summary>
Function CCD_U_calibration
Int32 nU, uCali_Count
String nRobot$, mes$
nU = 8
Print '开始进行U标定'
For uCali_Count = 0 To 4
If uCali_Count = 0 Then
Jump PUCali_Start LimZ ROBOT_LIMZ '到标定起始点
Else
PUCali = PUCali_Start +U(nU * uCali_Count)
Go PUCali
EndIf
Print uCali_Count + 1, ':', CX(Here), CY(Here), CU(Here) '打印当前坐标,格式:X,Y,U
Pause '暂停,等待相机拍照,按继续可恢复运行
Next
Print '标定结束'
' FINS_Write_PLC_WCmd('1.00', False)
' Wait 0.5
Fend
3.机器人初始化
①机器人初始化(Sys_InitRobot):
a)设置初始化动作速度,如图(a)
b)添加项目需要的IO及标志位,如图(b)
c)添加初始点位及初始变量,如图(c)
功能:初始化一系列设置,对机器人添加相关的初始量
''' <summary>
''' Robot初始化
''' 机器人初始化包含对机器人速度、IO状态以及标志位的初始化。
''' 注:当机器人未与触摸屏通讯时,会缺失很多点位及变量,需在初始化中给其赋值。
''' </summary>
Function Sys_InitRobot
Reset
If Motor = Off Then '如果伺服没有ON则打开伺服
Motor On '打开伺服
EndIf
SLock 1, 2, 3, 4
'设定初始化动作的速度
Power High '设定运动功率为高功率
Speed 20 '定义Jump、go等PTP运动速度,单位为百分比,最大为100
Accel 15, 15 '定义Jump、go等PTP运动的加速度和减速度,单位为百分比,最大为100
SpeedS 500 '定义Move、Arc、Arc3等CP运动速度,单位为mm/s2,最大为2000
AccelS 500, 500 '定义Move、Arc、Arc3等CP运动的加速度和减速度,单位为MM/S2,最大为25000
'此处添加需要初始化的IO代码及标志位----------
StartFlag = False '系统启动标志 系统在执行整机复位时机器人执行一次初始化
'--------------------------------------------
'此处添加需要赋值的点位及变量----------------
ROBOT_LIMZ = -0
②加载HMI配方参数(Sys_InitRobot):
a)调用函数,加载HMI配方参数(离线调试时,需要把此函数注释掉)
b)建立矩阵c)如果手臂为左手就左手运动,如果手臂为右手就右手运动,避免撞机d)Move PSAFE初始化时到避让位
功能:加载HMI参数
' Call Sys_SetSystemParameter '加载HMI配方参数(离线调试时请注释掉此句)
' Move PSafeHome '初始化时到避让位,请走直线 因为GO/JUMP指令轨迹不可控
On DO_INIT_OK
Wait 0.2
Off DO_INIT_OK
SavePoints 'robot1.pts' '调试时为了方便本地设置点位注释掉改段程序(正常生产时需要去掉注释,在触摸屏重新输入点位)
Fend
''' <summary>
''' 系统参数设置
''' </summary>
Function Sys_SetSystemParameter
Integer P_Num
Wait 0.5
Robot_Speed = DM(15) /100 '机器人自动速度百分比
Robot_Accel = DM(16) /100 '机器人自动加减速百分比
Tray_Hang = DM(22) '矩阵行数
Tray_Lie = DM(23) '矩阵列数
'通过HMI给各点位赋值----------------------------------------------------------
For P_Num = 0 To 13
CX(P(P_Num)) = DM(30 + P_Num * 5 + 0) / 1000
CY(P(P_Num)) = DM(30 + P_Num * 5 + 1) / 1000
CZ(P(P_Num)) = DM(30 + P_Num * 5 + 2) / 1000
CU(P(P_Num)) = DM(30 + P_Num * 5 + 3) / 1000
If DM(30 + P_Num * 5 + 4) = 2 Then
Hand P(P_Num), Lefty
Else
Hand P(P_Num), Righty
EndIf
Next
Pallet 0, PTray1, PTray2, PTray3, Tray_Hang, Tray_Lie '建立Tray盘
'------------------------------------------------------------------------------
Fend
③手动控制(Sys_HandModelTask):
a)与PLC地址统一后,可做到在触摸屏完成机器人的示教,包括向XYZU四个方向的正负向移动,以及手臂姿势的切换
b)可在触摸屏上选择需要实现的功能,如示教点位、手动移动,相机标定等
功能:在触摸屏手动控制x,y,z,u方向的位移
''' <summary>
''' Robot手动控制
''' </summary>
Function Sys_HandModelTask
Integer HandSpeed
Integer gToHMI_Hand
If Motor = Off Then '如果伺服没有ON则打开伺服
Motor On '打开伺服
EndIf
If WR(14) = False Then
HandSpeed = 3
Else
HandSpeed = 20
EndIf
Power High '设定运动功率为高功率
Speed HandSpeed '定义Jump、go等PTP运动速度,单位为百分比,最大为100
Accel 50, 50 '定义Jump、go等PTP运动的加速度和减速度,单位为百分比,最大为100
SpeedS 500 '定义Move、Arc、Arc3等CP运动速度,单位为mm/s2,最大为2000
AccelS 500, 500 '定义Move、Arc、Arc3等CP运动的加速度和减速度,单位为MM/S2,最大为25000
Int32 i, j
'''--------------------------------------------------------------------------------
''' 以下为手动功能选择-------------------------------------------------------------
'运动到HMI指定的配方点位(点位执行)
If WR(9) = True Then
gToHMIX_Robot = DM(30 + DM(4) * 5 + 0) /1000 '获取HMI上设置的P点X方向坐标
gToHMIY_Robot = DM(30 + DM(4) * 5 + 1) /1000 '获取HMI上设置的P点Y方向坐标
gToHMIZ_Robot = DM(30 + DM(4) * 5 + 2) /1000 '获取HMI上设置的P点Z方向坐标
gToHMIU_Robot = DM(30 + DM(4) * 5 + 3) /1000 '获取HMI上设置的P点U方向坐标
gToHMI_Hand = DM(30 + DM(4) * 5 + 4)
If gToHMI_Hand = 2 Then
Jump XY(gToHMIX_Robot, gToHMIY_Robot, gToHMIZ_Robot, gToHMIU_Robot) /L LimZ ROBOT_LIMZ
ElseIf gToHMI_Hand = 1 Then
Jump XY(gToHMIX_Robot, gToHMIY_Robot, gToHMIZ_Robot, gToHMIU_Robot) /R LimZ ROBOT_LIMZ
EndIf
EndIf
Function Hand_Move_Inc
If WR(0) = True Then 'X方向上的点位运动
If WR(15) = False Then
Go Here +X(DM(0) * 0.001) /L CP
Else
Go Here +X(DM(0) * 0.001) /R CP
EndIf
EndIf
If WR(1) = True Then
If WR(15) = False Then
Go Here -X(DM(0) * 0.001) /L CP
Else
Go Here -X(DM(0) * 0.001) /R CP
EndIf
EndIf
If WR(2) = True Then 'Y方向上的点位运动
If WR(15) = False Then
Go Here +Y(DM(1) * 0.001) /L CP
Else
Go Here +Y(DM(1) * 0.001) /R CP
EndIf
EndIf
If WR(3) = True Then
If WR(15) = False Then
Go Here -Y(DM(1) * 0.001) /L CP
Else
Go Here -Y(DM(1) * 0.001) /R CP
EndIf
EndIf
If WR(4) = True Then 'Z方向上的点位运动
If WR(15) = False Then
Go Here +Z(DM(2) * 0.001) /L CP
Else
Go Here +Z(DM(2) * 0.001) /R CP
EndIf
EndIf
If WR(5) = True Then
If WR(15) = False Then
Go Here -Z(DM(2) * 0.001) /L CP
Else
Go Here -Z(DM(2) * 0.001) /R CP
EndIf
EndIf
If WR(6) = True Then 'U方向上的点位运动
If WR(15) = False Then
Go Here +U(DM(3) * 0.001) /L CP
Else
Go Here +U(DM(3) * 0.001) /R CP
EndIf
EndIf
If WR(7) = True Then
If WR(15) = False Then
Go Here -U(DM(3) * 0.001) /L CP
Else
Go Here -U(DM(3) * 0.001) /R CP
EndIf
EndIf
Fend
4.主函数
①(main):
a)打开plc通信线程与CCD通信线程
b)0.5s后,调用程序,使机器人初始化
c)如果通信链接建立成功标志为True时,获取系统运行状态
d)如果工作模式为False时,调用手动系统程序。如果工作模式为Trued)时,调用自动系统程序
e)配置CCD连接参数
注意:若调试状态,根据需要,可注释掉通讯等功能
功能:获取手动系统程序或自动系统程序
Function main
'''配置PLC连接参数-----------------------------------------------------
FINS_IP$ = '192.168.1.10' 'PLC的IP地址
FINS_PORT = 9600 'PLC端口号
FINSDR_FIRST = 200 'D读写首地址
FINSWR_FIRST = 10 'W读写首地址
Xqt FINS_Task, NoPause '开启PLC通信线程
'''--------------------------------------------------------------------
'''配置CCD连接参数-----------------------------------------------------
CCD_IP$ = '192.168.1.11' 'CCD的IP地址
CCD_PORT = 9600 'CCD端口号
CCD_Infor$ = 'TR' '设定触发拍照的字符串
' Xqt CCD_Task, NoPause '开启CCD通信线程
'''--------------------------------------------------------------------
'''机器人初始化--------------------------------------------------------
Wait 0.5
If FINS_ClientOK = True Then
Call Sys_InitRobot '请自定义初始化内容
EndIf
'''--------------------------------------------------------------------
'''根据运行状态选择手动/自动-------------------------------------------
Do
If FINS_ClientOK = True Then
gSysRunMode = WR(200) '获取系统运行状态
If gSysRunMode = False Then '系统手动
Call Sys_HandModelTask
ElseIf gSysRunMode = True Then '系统自动
Call Sys_AutoModelTask
EndIf
EndIf
Loop
'''--------------------------------------------------------------------
Fend
②自动逻辑控制(Sys_AutoModelTask):
a)当和PLC完成通讯且触摸屏地址设置完成后,自动运行的速度可在触摸屏上更改。否则,需自行给Robot_Speed和Robot_Accel赋值。
b)在空白处,根据项目需求,添加自动运行时的逻辑
功能:进行自动控制的设置
'''<summary> Robot自动逻辑控制
'''注:
'''------------------------------------------------------------------------------------------
''| 1.自动运行逻辑不用写死循环(一个动作完成后回到上层继续判断手/自动)
''|------------------------------------------------------------------------------------------
''| 2.机器人发送W状态给PLC时使用的格式为:
''| FINS_Write_PLC_WCmd([字地址],[位地址],[状态]) 例:FINS_Write_PLC_WCmd(3, 0, True)
''| Wait MemSw(0) = On Wait MemSw(0) = On
''| 注意不能多线程同时发送;重要信号(影响逻辑)需用IO传递,用通讯传递可能会出现未知问题
''|------------------------------------------------------------------------------------------
''| 3.若要减少过安全点的停顿及缩短动作用时,参考 EG_Move 函数中的CP指令和JUMP指令优化参数
''|------------------------------------------------------------------------------------------
''| 4.若要实现在搬运料过程中物品掉落(破真空)时报警的功能,参考 EG_Till 函数
''|------------------------------------------------------------------------------------------
''| 5.发送错误代码的写法:
''| WriteDFlag = True
''| WriteErr(0) = 自定义的错误代码
''| On DO_ROBOT_ALARM; Wait 0.1 '输出报警IO
'''------------------------------------------------------------------------------------------
''' </summary>
Function Sys_AutoModelTask
Integer ia
If StartFlag = False Then '设定自动运行的速度(只设置一次)
Power High '设定运动功率为高功率
' Speed 100 * Robot_Speed '定义Jump、go等PTP运动速度,单位为百分比,最大为100
' Accel 100 * Robot_Accel, 100 * Robot_Accel '定义Junp、go等PTP运动加速度,单位为百分比,最大为120
StartFlag = True
EndIf
'以下为机器人自动运行时的逻辑-----------------------------------
Do
WriteDM(0) = 1 + ia
WriteDM(1) = 100 + ia
ia = ia + 1
Wait 0.5
Loop
Go Here :Z(CZ(P(1)))
'---------------------------------------------------------------
Fend
5.基本指令的集合
a)线程调用和普通的调用(eg_Call_Xqt)
b)点位指定及偏移(Functioneg_Point)
c)运动指令用法(Function eg_Move)
d)矩阵用法(Functioneg_Juzhen)
e)IO的判断和使用(Functioneg_IO)
f)条件判断If_Else和分支选择Select_Case的用法(条件判断If_Else和分支选择Select_Case的用法)
g)DO...LOOP循环和For...Next循环地区别(Function eg_Xunhuan)
h)其余常用指令示例(Function eg_Other):
1.计时器 2.等待命令 3.打印 4.定义自由曲线
作用:方便考使用