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,转载请注明出处!讨论可扫码加群:


