PLC控制Epson机器人取放料、标定等功能,机器人端的框架代码

PLC控制机器人,一般首选“远程以太网”方式。

发送go, jump等指令时,需要把xyzu位置信息首先以字符串方式放置于内存区,再合成一条指令发送出去。

这种方式要占用大量内存地址,你还得把字符串翻译成16进制数,基本上是要累死人的节奏。


勇哥提供的机器人端的框架代码,各位可以参考一下:


#define MAX_IN_RANGE 1
Global Preserve Double g_dSafeHeighZ
'Vision Parameter
Global Preserve Boolean g_bApplyVision
Global Preserve Boolean g_bCcdHadCalibrated
Global Preserve Boolean g_bVisionValid
Global Preserve Double g_dPosVisionX
Global Preserve Double g_dPosVisionY
Global Preserve Double g_dPosVisionA
'Commnuication Command Word
Global Preserve Long g_nCommandID

Function Main
	Reset
	If Motor = Off Then
		Motor On
	EndIf
	Power Low      '调试阶段务必低功率
	'Power High
	'Speed 20
	Speed 50
	'Speed 80
	'Speed 100
	Accel 100, 100
	SpeedS 200
	AccelS 200
	VxCalLoad "CCD_Cab.caa"
	'Vision Variable
	g_bVisionValid = False
	g_dPosVisionX = 0.0
	g_dPosVisionY = 0.0
	g_dPosVisionA = 0.0
	g_nCommandID = -1
	MemOff OutMoveDone
Fend

Function BgMain
	Do
		Wait 0.1
		MemOutW 0, CtrlInfo(1) And &HFFFF
	
		If Motor = On Then
			MemOn MemIoMotorOn
		Else
			MemOff MemIoMotorOn
		EndIf

		If AtHome = True Then
			MemOn MemIoAtHome
		Else
			MemOff MemIoAtHome
		EndIf
		
		If InPos = True Then
			MemOn MemIoInPos
		Else
			MemOff MemIoInPos
		EndIf
		
		If TeachOn = True Then
			MemOn MemIoTeach
		Else
			MemOff MemIoTeach
		EndIf
		
		If Power = 1 Then
			MemOn MemIoPower
		Else
			MemOff MemIoPower
		EndIf

		If MCalComplete = True Then
			MemOn MemIoMCal
		Else
			MemOff MemIoMCal
		EndIf
	Loop
Fend

'所有的子程序都通过此程序调用
Function Main1
	Print "Begin"
	Print g_nCommandID
	Time
	MemOff OutMoveDone
	MemOff OutMoveFail
	If Motor = Off Then
		Exit Function
	EndIf
'	Wait MemSw(PCChkMoveDoneOK) = On Or MemSw(PCAutoMode) = Off, 1
	Wait 0.1
	
	Integer nTargetPoint
	'Robot Move to Target Point
	If (g_nCommandID >= 10 And g_nCommandID < 1000) Then
		nTargetPoint = g_nCommandID
		Call Go_TargetPointPos(nTargetPoint)
	EndIf
	''''''''''''''''''''''''''''''''
	g_nCommandID = 0
	Print "End"
	Time
	Wait .2
Fend


'Calibrate the top Camera
Function Main2
	MemOff OutMoveDone
	MemOff OutMoveFail
	Tool 0
	Arm 0
	Wait .2
	Integer i
	Double d(8)
	VxCalib 1, 4, P(210:218), P(200:208), P220, P221
	If (VxCalInfo(1, 1) = True) Then
		g_bCcdHadCalibrated = True
		For i = 0 To 7
			d(i) = VxCalInfo(1, i + 2)
		Next i
		Print "Top Camera Calibration result:"
		Print "X Avg Error(mm):", d(0)
		Print "X Max Error(mm):", d(1)
		Print "X Ratio(mm/pixel):", d(2)
		Print "X Bias(deg):", d(3)
		Print "Y Avg Error(mm):", d(4)
		Print "Y Max Error(mm):", d(5)
		Print "Y Ratio(mm/pixel):", d(6)
		Print "Y Bias(deg):", d(7)
		VxCalSave "CCD_Cab.caa"
		VxCalLoad "CCD_Cab.caa"
		MemOn OutMoveDone
	Else
		g_bCcdHadCalibrated = False
		MemOn OutMoveFail
		Print "Failed to Calibrate the Bottom Camera"
	EndIf
	Wait .3
Fend

'Go Pick Position
Function Main3
	MemOff OutMoveDone
	MemOff OutMoveFail
	Tool 0
	Arm 0
    Double dCamera, dAngle, dX, dY, dZ
	P29 = ptPick
	If (g_bApplyVision And g_bCcdHadCalibrated And g_bVisionValid) Then
		'拍照时的机械手坐标
		dCamera = PAgl(ptPickGrab, 1) + PAgl(ptPickGrab, 2) '相机角度=第一关节角度+第二关节角度
		dAngle = dCamera - g_dPosVisionA
		dAngle = 0
		'相机坐标
		Print "Joint Angle=", dCamera
		Print "Vision Angle=", g_dPosVisionA
		Print "Total Angle=", dAngle
		P0 = XY(g_dPosVisionX, g_dPosVisionY, 0, dAngle)
		'通过校定的数据和相机坐标计算出抓取的位置P2
		P2 = VxTrans(1, P0, ptPickGrab)
		Print "Pick's Grab Pos(mm):", ptPickGrab
		Print "Pick's Vision Pos(pixel):", P0
		Print "Pick's Trans Pos(mm):", P2
		'切换到TOP相机的工具:3
		dX = (CX(ptBaseHeadPutU1) - CX(ptBaseHeadPutU0)) / 2
		dY = (CY(ptBaseHeadPutU1) - CY(ptBaseHeadPutU0)) / 2
		P3 = XY(dX, dY, 0, 0) /L
		TLSet 3, P3
		Print "Tool3 Pos:", TLSet(3)
		'目标位置
		dZ = CZ(ptPick)
		dAngle = CU(ptPick)
		If dAngle > 180 Then
			dAngle = dAngle - 360
		EndIf
		If dAngle < -180 Then
			dAngle = dAngle + 360
		EndIf
		dAngle = 0
		P29 = P2 :Z(dZ) :U(dAngle) /L
		Print "Target Pos:", P29
		'切换工具
		Tool 3
	EndIf
	'J1手臂控制
	Double dAngleTarget
	dAngleTarget = PAgl(P29, 1)
	If (J1Flag(P29) = 0) Then
		If (dAngleTarget < 90) Then
			J1Flag P29, 1
		EndIf
	Else
		If (dAngleTarget < 90) Then
			J1Flag P29, 0
		EndIf
	EndIf
	If Abs(CX(Here) - CX(P29)) > MAX_IN_RANGE Or Abs(CY(Here) - CY(P29)) > MAX_IN_RANGE Then
		Jump P29 LimZ g_dSafeHeighZ
	Else
		Go P29
		Wait .2
	EndIf
	'输出运动完成信号
	If Abs(CX(Here) - CX(P29)) < 0.02 And Abs(CY(Here) - CY(P29)) < 0.02 And Abs(CZ(Here) - CZ(P29)) < 0.02 And Abs(CU(Here) - CU(P29)) < 0.02 Then
		MemOn OutMoveDone
	Else
		MemOn OutMoveFail
	EndIf
	Tool 0
Fend


'Go Put Position
Function Main4
	MemOff OutMoveDone
	MemOff OutMoveFail
	Tool 0
	Arm 0
	Double dCamera, dAngle, dX, dY, dZ
	P49 = ptPut
	If (g_bApplyVision And g_bCcdHadCalibrated And g_bVisionValid) Then
		'拍照时的机械手坐标P28
		dCamera = PAgl(ptPutGrab, 1) + PAgl(ptPutGrab, 2) '相机角度=第一关节角度+第二关节角度
		dAngle = -dCamera - g_dPosVisionA
		dAngle = 0
		'相机坐标
		Print "Joint Angle=", dCamera
		Print "Vision Angle=", g_dPosVisionA
		Print "Total Angle", dAngle
		P0 = XY(g_dPosVisionX, g_dPosVisionY, 0, dAngle) /L
		'通过校准的数据和相机坐标计算出抓取的位置P2
		P2 = VxTrans(1, P0, ptPutGrab)
		Print "Put Grab Pos(mm):", ptPutGrab
		Print "Put Vision(Pixel):", P0
		Print "Put Trans Pos:", P2
		'切换到TOP相机的工具:3
		dX = (CX(ptBaseHeadPutU1) - CX(ptBaseHeadPutU0)) / 2
		dY = (CY(ptBaseHeadPutU1) - CY(ptBaseHeadPutU0)) / 2
		P3 = XY(dX, dY, 0, 0) /L
		TLSet 3, P3
		Print "Tool3 Pos:", TLSet(3)
		'目标位置
		dZ = CZ(ptPut)
		dAngle = CU(ptPut)
		If dAngle > 180 Then
			dAngle = dAngle - 360
		EndIf
		If dAngle < -180 Then
			dAngle = dAngle + 360
		EndIf
		P49 = P2 :Z(dZ) :U(dAngle)
		Print "Put Target2 Pos:", P49
		'切换工具
		Tool 3
	EndIf
	'J1手臂控制
	Double dAngleTarget
	dAngleTarget = PAgl(P49, 1)
	If (J1Flag(P49) = 0) Then
		If (dAngleTarget < 90) Then
			J1Flag P49, 1
		EndIf
	Else
		If (dAngleTarget < 90) Then
			J1Flag P49, 0
		EndIf
	EndIf
	If Abs(CX(Here) - CX(P49)) > MAX_IN_RANGE Or Abs(CY(Here) - CY(P49)) > MAX_IN_RANGE Then
		Jump P49 LimZ g_dSafeHeighZ
	Else
		Go P49
		Wait .2
	EndIf
	'输出运动完成信号
	If Abs(CX(Here) - CX(P49)) < 0.02 And Abs(CY(Here) - CY(P49)) < 0.02 And Abs(CZ(Here) - CZ(P49)) < 0.02 And Abs(CU(Here) - CU(P49)) < 0.02 Then
		MemOn OutMoveDone
	Else
		MemOn OutMoveFail
	EndIf
	Tool 0
Fend

Function Main7
	MemOff OutMoveDone
	MemOff OutMoveFail
	If CZ(Here) >= g_dSafeHeighZ Then
		Wait .2
	Else
		Go Here :Z(g_dSafeHeighZ)
	EndIf
	'输出运动完成信号
	If (Abs(CZ(Here) - g_dSafeHeighZ) < 0.02) Then
		MemOn OutMoveDone
	Else
		MemOn OutMoveFail
	EndIf
Fend

'Move Robot Move to Target Point:nIndex
Function Go_TargetPointPos(nIndex As Integer)
	Tool 0
	Arm 0
	P8 = P(nIndex)
	Print P8
	'J1手臂控制
	Double dAngleTarget
	dAngleTarget = PAgl(P8, 1)
	If (J1Flag(P8) = 0) Then
		If (dAngleTarget < 90) Then
			J1Flag P8, 1
		EndIf
	Else
		If (dAngleTarget < 90) Then
			J1Flag P8, 0
		EndIf
	EndIf
	If Abs(CX(Here) - CX(P8)) > MAX_IN_RANGE Or Abs(CY(Here) - CY(P8)) > MAX_IN_RANGE Then
		Jump P8 LimZ g_dSafeHeighZ
	Else
		Go P8
		Wait .2
	EndIf
	'输出运动完成信号
	If Abs(CX(Here) - CX(P8)) < 0.02 And Abs(CY(Here) - CY(P8)) < 0.02 And Abs(CZ(Here) - CZ(P8)) < 0.02 And Abs(CU(Here) - CU(P8)) < 0.02 Then
		MemOn OutMoveDone
	Else
		MemOn OutMoveFail
	EndIf
Fend


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864