|
'NAME=KEYENCE_ROBOT_VISION_SETUP
'PGN=1
'
' **********************************************************
' Keyence Robot Vision Setup Program
'
' This program is for setting up the robot vision system using
' Keyence乫s vision sensor.
' Please do not use it for purposes other than its original intended purpose.
' With regard to robot operation, please use the robot while following
' the precautions stated in the 乬User乫s Manual乭.
'
' Copyright (c) 2015 KEYENCE CORPORATION. All rights reserved.
'
' **********************************************************
' **** Command String ****
CLOSE GP0
CMD_NAME$ = "CRBT,"
' **** Result ****
RES_SUCCESS% = 0
RES_FAIL% = 1
RES_ERR_PARAM_RANGE_OVER% = 2
RES_ERR_MOVE_RANGE_OVER% = 2
RES_UNSUPPORTED% = 3
RES_DUMMY_NUM% = 0
' **** Operation ID ****
OPID_ECHO% = 1
OPID_GET_PRM% = 2
OPID_SET_PRM% = 3
OPID_CUR_POS% = 4
OPID_REL_MOVE% = 5
OPID_ABS_MOVE% = 6
OPID_GET_VER% = 7
OPID_GET_TOOL% = 8
OPID_CUR_POS_HP% = 9
OPID_REL_MOVE_HP% = 10
OPID_ABS_MOVE_HP% = 11
OPID_INVALID% = -1
' **** Number of Response Parameters ****
RES_PRM_NUM_ECHO% = 2
RES_PRM_NUM_GET_PRM% = 5
RES_PRM_NUM_SET_PRM% = 5
RES_PRM_NUM_CUR_POS% = 6
RES_PRM_NUM_REL_MOVE% = 6
RES_PRM_NUM_ABS_MOVE% = 6
RES_PRM_NUM_GET_VER% = 2
RES_PRM_NUM_GET_TOOL% = 6
' **** Command Parameter Index ****
RCV_ID_OPERATION% = 1
RCV_ID_REQUEST% = 2
RCV_ID_PARAM% = 3
RCV_POS_IDX_X% = RCV_ID_PARAM%
RCV_POS_IDX_Y% = RCV_POS_IDX_X% + 1
RCV_POS_IDX_Z% = RCV_POS_IDX_Y% + 1
RCV_POS_IDX_RX% = RCV_POS_IDX_Z% + 1
RCV_POS_IDX_RY% = RCV_POS_IDX_RX% + 1
RCV_POS_IDX_RZ% = RCV_POS_IDX_RY% + 1
RCV_POS_SMOOTH% = RCV_POS_IDX_RZ% + 1
RCV_POS_MOTION% = RCV_POS_SMOOTH% + 1
RCV_PRM_IDX_FMT% = RCV_ID_PARAM%
RCV_PRM_IDX_WORK% = RCV_PRM_IDX_FMT% + 1
RCV_PRM_IDX_TOOL% = RCV_PRM_IDX_WORK% + 1
RCV_PRM_IDX_SPD% = RCV_PRM_IDX_TOOL% + 1
RCV_PRM_IDX_ACC% = RCV_PRM_IDX_SPD% + 1
RCV_ECH_IDX_PRM1% = RCV_ID_PARAM%
RCV_ECH_IDX_PRM2% = RCV_ECH_IDX_PRM1% + 1
RCV_GET_TOOL_IDX_N% = RCV_ID_PARAM%
' **** Version ****
MAJOR_VER% = 2
MINOR_VER% = 1
DEV_VER% = 0
R_MAKER_ID% = 8
R_TYPE_ID% = 0
VERSION% = MAJOR_VER% * 1000000 + MINOR_VER% * 10000 + DEV_VER%
MAKERID% = R_MAKER_ID% * 10 + R_TYPE_ID%
' **** Format Information ****
FORMAT_DEFAULT% = 0
' **** Coeefficient ****
COEF_LENGTH = 1000
COEF_ANGLE = 10
COEF_ANGLE_HP = 1000
ROTATION_HALF_RANGE = 180
ROTATION_RANGE = 360
' **** Robot No. ****
ROBOT_NUMBER% = 1
' **** Parameter Range ****
KEY_VISION_NUM% = 10
WORK_MIN% = 0
WORK_MAX% = 9
WORK_OFF% = 0
TOOL_MIN% = 0
TOOL_MAX% = 9
TOOL_OFF% = 0
SPEED_MIN% = 1
SPEED_MAX% = 100
' **** Parameter ****
WorkNo% = 0
ToolNo% = 0
' **********************************************************
' * Function Main
' **********************************************************
MOTOR ON
SERVO ON
GOSUB *UtilInitParam
GOSUB *KeyConnect
WHILE(1)
OprtID% = OPID_INVALID% ' Operation ID
ReqID% = 0 ' Request ID
DIM CmdPrm%(20) ' Commad Parameters
ResPrmNum% = 0 ' Number of Response Parameters
PrmCnt% = 0
ChkSum% = 0
ResStatus% = MRES_SUCCESS%
GOSUB *KeyInterpretCmd
GOSUB *UtilCheckSum
IF ResStatus% = RES_SUCCESS% THEN
OprtID% = CmdPrm%(RCV_ID_OPERATION%)
ReqID% = CmdPrm%(RCV_ID_REQUEST%)
SELECT CASE OprtID%
CASE OPID_ECHO%
ResPrmNum% = RES_PRM_NUM_ECHO%
GOSUB *KeyEcho
CASE OPID_GET_PRM%
ResPrmNum% = RES_PRM_NUM_GET_PRM%
GOSUB *KeyGetRobotParam
CASE OPID_SET_PRM%
ResPrmNum% = RES_PRM_NUM_SET_PRM%
GOSUB *KeySetRobotParam
CASE OPID_CUR_POS%
ResPrmNum% = RES_PRM_NUM_CUR_POS%
GOSUB *KeyCurPos
CASE OPID_REL_MOVE%
ResPrmNum% = RES_PRM_NUM_REL_MOVE%
GOSUB *KeyRelMove
CASE OPID_ABS_MOVE%
ResPrmNum% = RES_PRM_NUM_ABS_MOVE%
GOSUB *KeyAbsMove
CASE OPID_GET_VER%
ResPrmNum% = RES_PRM_NUM_GET_VER%
GOSUB *KeyGetProgVer
CASE OPID_GET_TOOL%
ResPrmNum% = RES_PRM_NUM_GET_TOOL%
GOSUB *KeyGetToolData
CASE OPID_CUR_POS_HP%
ResPrmNum% = RES_PRM_NUM_CUR_POS%
GOSUB *KeyCurPosHiPrec
CASE OPID_REL_MOVE_HP%
ResPrmNum% = RES_PRM_NUM_REL_MOVE%
GOSUB *KeyRelMoveHiPrec
CASE OPID_ABS_MOVE_HP%
ResPrmNum% = RES_PRM_NUM_ABS_MOVE%
GOSUB *KeyAbsMoveHiPrec
CASE ELSE
GOSUB *UtilSendResError
END SELECT
ENDIF
WEND
GOSUB *KeyClose
HALT
' **********************************************************
' * Function KeyConnect
' **********************************************************
*KeyConnect:
'OFFLINE CMU
OPEN GP0
RETURN
' **********************************************************
' * Function KeyClose
' **********************************************************
*KeyClose:
'ONLINE CMU
CLOSE GP0
RETURN
' **********************************************************
' * Function KeyInterpretCmd
' **********************************************************
*KeyInterpretCmd:
PrmCnt% = 0
FOR C% = 1 TO 16
CmdPrm%(C%) = 0
NEXT C%
CALL *UtilRecvCmd(REF CmdStr$)
A$ = MID$(CmdStr$,1,5)
IF A$ <> CMD_NAME$ THEN
RETURN
ENDIF
CMDLEN% = LEN(CmdStr$)
B$ = ""
FOR C% = 6 TO CMDLEN%
A$ = MID$(CmdStr$, C%, 1)
Split% = 0
IF A$ = "," THEN
Split% = 1
ELSEIF C% = CMDLEN% THEN
B$ = B$ + A$
Split% = 1
ENDIF
IF Split% = 1 THEN
PrmCnt% = PrmCnt% + 1
CmdPrm%(PrmCnt%) = VAL(B$)
B$ = ""
IF PrmCnt% > 16 THEN EXIT FOR
ELSE
B$ = B$ + A$
ENDIF
NEXT C%
RETURN
' **********************************************************
' * Function KeyEcho
' **********************************************************
*KeyEcho:
GOSUB *UtilMakeResHeader
' *********************
ResStr$ = ResStr$ + "," + STR$(CmdPrm%(RCV_ECH_IDX_PRM1%)) + "," + STR$(CmdPrm%(RCV_ECH_IDX_PRM2%))
ChkSum% = ChkSum% + CmdPrm%(RCV_ECH_IDX_PRM1%) + CmdPrm%(RCV_ECH_IDX_PRM2%)
' *********************
ResStr$ = ResStr$ + "," + STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function KeyGetRobotParam
' **********************************************************
*KeyGetRobotParam:
GOSUB *UtilSendResRoboPrm
RETURN
' **********************************************************
' * Function KeySetRobotParam
' **********************************************************
*KeySetRobotParam:
ON ERROR GOTO *SetParamErrorProc
IF CmdPrm%(RCV_PRM_IDX_WORK%) < WORK_MIN% OR WORK_MAX% < CmdPrm%(RCV_PRM_IDX_WORK%) THEN
ResStatus% = RES_ERR_PARAM_RANGE_OVER%
ELSE
WorkNo% = CmdPrm%(RCV_PRM_IDX_WORK%)
GOSUB *UtilSetWorkNumber
ENDIF
IF CmdPrm%(RCV_PRM_IDX_TOOL%) < TOOL_MIN% OR TOOL_MAX% < CmdPrm%(RCV_PRM_IDX_TOOL%) THEN
ResStatus% = RES_ERR_PARAM_RANGE_OVER%
ELSE
ToolNo% = CmdPrm%(RCV_PRM_IDX_TOOL%)
GOSUB *UtilSetToolNumber
ENDIF
IF CmdPrm%(RCV_PRM_IDX_SPD%) < SPEED_MIN% OR SPEED_MAX% < CmdPrm%(RCV_PRM_IDX_SPD%) THEN
ResStatus% = RES_ERR_PARAM_RANGE_OVER%
ELSE
ASPEED[ROBOT_NUMBER%] CmdPrm%(RCV_PRM_IDX_SPD%)
ENDIF
' *********************
GOSUB *UtilSendResRoboPrm
ON ERROR GOTO 0
RETURN
' **********************************************************
' * Function KeyCurPos
' **********************************************************
*KeyCurPos:
GOSUB *UtilSendResPos
RETURN
' **********************************************************
' * Function KeyRelMove
' **********************************************************
*KeyRelMove:
ON ERROR GOTO *MoveErrorProc
IF CmdPrm%(RCV_POS_IDX_RX%) <> 0 OR CmdPrm%(RCV_POS_IDX_RY%) <> 0 THEN
ResStatus% = RES_ERR_MOVE_RANGE_OVER%
ELSE
MoveRetry% = 0
P99 = WHRXY[ROBOT_NUMBER%]
LOC1(P99) = LOC1(P99) + CmdPrm%(RCV_POS_IDX_X%) / COEF_LENGTH
LOC2(P99) = LOC2(P99) + CmdPrm%(RCV_POS_IDX_Y%) / COEF_LENGTH
LOC3(P99) = LOC3(P99) + CmdPrm%(RCV_POS_IDX_Z%) / COEF_LENGTH
LOC4(P99) = LOC4(P99) + CmdPrm%(RCV_POS_IDX_RZ%) / COEF_ANGLE
LOC5(P99) = 0
LOC6(P99) = 0
MOVE[ROBOT_NUMBER%] L, P99
MOVE[ROBOT_NUMBER%] P, P99
ENDIF
' *********************
GOSUB *UtilSendResPos
ON ERROR GOTO 0
RETURN
' **********************************************************
' * Function KeyAbsMove
' **********************************************************
*KeyAbsMove:
ON ERROR GOTO *MoveErrorProc
IF CmdPrm%(RCV_POS_IDX_RX%) <> 0 OR CmdPrm%(RCV_POS_IDX_RY%) <> 0 THEN
ResStatus% = RES_ERR_MOVE_RANGE_OVER%
ELSE
MoveRetry% = 0
P99 = WHRXY[ROBOT_NUMBER%]
LOC1(P99) = CmdPrm%(RCV_POS_IDX_X%) / COEF_LENGTH
LOC2(P99) = CmdPrm%(RCV_POS_IDX_Y%) / COEF_LENGTH
LOC3(P99) = CmdPrm%(RCV_POS_IDX_Z%) / COEF_LENGTH
Rz = CmdPrm%(RCV_POS_IDX_RZ%) / COEF_ANGLE
RzBase = LOC4(P99) - Rz + ROTATION_HALF_RANGE
RotOrgZ = RzBase / ROTATION_RANGE
IF RotOrgZ < 0 THEN RotOrgZ = RotOrgZ - 1
RotOrgZ = INT(RotOrgZ)
Rz = Rz + RotOrgZ * ROTATION_RANGE
LOC4(P99) = Rz
MOVE[ROBOT_NUMBER%] L, P99
MOVE[ROBOT_NUMBER%] P, P99
ENDIF
' *********************
GOSUB *UtilSendResPos
ON ERROR GOTO 0
RETURN
' **********************************************************
' * Function KeyGetProgVer
' **********************************************************
*KeyGetProgVer:
GOSUB *UtilMakeResHeader
' *********************
ResStr$ = ResStr$ + "," + STR$(VERSION%) + "," + STR$(MAKERID%)
ChkSum% = ChkSum% + VERSION% + MAKERID%
' *********************
ResStr$ = ResStr$ + "," + STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function KeyGetToolData
' **********************************************************
*KeyGetToolData:
GOSUB *UtilSendResToolData
RETURN
' **********************************************************
' * Function KeyCurPosHiPrec
' **********************************************************
*KeyCurPosHiPrec:
GOSUB *UtilSendResPosHiPrec
RETURN
' **********************************************************
' * Function KeyRelMoveHiPrec
' **********************************************************
*KeyRelMoveHiPrec:
ON ERROR GOTO *MoveErrorProc
IF CmdPrm%(RCV_POS_IDX_RX%) <> 0 OR CmdPrm%(RCV_POS_IDX_RY%) <> 0 THEN
ResStatus% = RES_ERR_MOVE_RANGE_OVER%
ELSE
MoveRetry% = 0
P99 = WHRXY[ROBOT_NUMBER%]
LOC1(P99) = LOC1(P99) + CmdPrm%(RCV_POS_IDX_X%) / COEF_LENGTH
LOC2(P99) = LOC2(P99) + CmdPrm%(RCV_POS_IDX_Y%) / COEF_LENGTH
LOC3(P99) = LOC3(P99) + CmdPrm%(RCV_POS_IDX_Z%) / COEF_LENGTH
LOC4(P99) = LOC4(P99) + CmdPrm%(RCV_POS_IDX_RZ%) / COEF_ANGLE_HP
LOC5(P99) = 0
LOC6(P99) = 0
MOVE[ROBOT_NUMBER%] L, P99
MOVE[ROBOT_NUMBER%] P, P99
ENDIF
' *********************
GOSUB *UtilSendResPosHiPrec
ON ERROR GOTO 0
RETURN
' **********************************************************
' * Function KeyAbsMoveHiPrec
' **********************************************************
*KeyAbsMoveHiPrec:
ON ERROR GOTO *MoveErrorProc
IF CmdPrm%(RCV_POS_IDX_RX%) <> 0 OR CmdPrm%(RCV_POS_IDX_RY%) <> 0 THEN
ResStatus% = RES_ERR_MOVE_RANGE_OVER%
ELSE
MoveRetry% = 0
P99 = WHRXY[ROBOT_NUMBER%]
LOC1(P99) = CmdPrm%(RCV_POS_IDX_X%) / COEF_LENGTH
LOC2(P99) = CmdPrm%(RCV_POS_IDX_Y%) / COEF_LENGTH
LOC3(P99) = CmdPrm%(RCV_POS_IDX_Z%) / COEF_LENGTH
Rz = CmdPrm%(RCV_POS_IDX_RZ%) / COEF_ANGLE_HP
RzBase = LOC4(P99) - Rz + ROTATION_HALF_RANGE
RotOrgZ = RzBase / ROTATION_RANGE
IF RotOrgZ < 0 THEN RotOrgZ = RotOrgZ - 1
RotOrgZ = INT(RotOrgZ)
Rz = Rz + RotOrgZ * ROTATION_RANGE
LOC4(P99) = Rz
MOVE[ROBOT_NUMBER%] L, P99
MOVE[ROBOT_NUMBER%] P, P99
ENDIF
' *********************
GOSUB *UtilSendResPosHiPrec
ON ERROR GOTO 0
RETURN
' **********************************************************
' ********************* Utility ************************
' **********************************************************
'**********************************************************
'* Function UtilInitParam
'**********************************************************
*UtilInitParam:
GOSUB *UtilSetWorkNumber
GOSUB *UtilSetToolNumber
RETURN
'**********************************************************
'* Function UtilSetWorkNumber
'**********************************************************
*UtilSetWorkNumber:
IF WorkNo% = WORK_OFF% THEN
SHIFT[ROBOT_NUMBER%] OFF
ELSE
SHIFT[ROBOT_NUMBER%] S[WorkNo%]
ENDIF
RETURN
'**********************************************************
'* Function UtilSetToolNumber
'**********************************************************
*UtilSetToolNumber:
SELECT CASE ToolNo%
CASE 0
CHANGE[ROBOT_NUMBER%] OFF
CASE 1
CHANGE[ROBOT_NUMBER%] H1
CASE 2
CHANGE[ROBOT_NUMBER%] H2
CASE 3
CHANGE[ROBOT_NUMBER%] H3
CASE 4
CHANGE[ROBOT_NUMBER%] H4
CASE 5
CHANGE[ROBOT_NUMBER%] H5
CASE 6
CHANGE[ROBOT_NUMBER%] H6
CASE 7
CHANGE[ROBOT_NUMBER%] H7
CASE 8
CHANGE[ROBOT_NUMBER%] H8
CASE 9
CHANGE[ROBOT_NUMBER%] H9
END SELECT
RETURN
' **********************************************************
' * Function UtilCheckSum
' **********************************************************
*UtilCheckSum:
ResStatus% = RES_SUCCESS%
IF PrmCnt% >= 1 THEN
ChkSum% = 0
FOR C% = 1 TO PrmCnt% - 1
ChkSum% = ChkSum% + CmdPrm%(C%)
NEXT C%
IF CmdPrm%(PrmCnt%) <> ChkSum% THEN
ResStatus% = RES_FAIL%
ENDIF
ELSE
ResStatus% = RES_FAIL%
ENDIF
RETURN
'**********************************************************
' * Function UtilMakeResHeader
'**********************************************************
*UtilMakeResHeader:
ResStr$ = CMD_NAME$ + STR$(OprtID%) + "," + STR$(ReqID%) + "," + STR$(ResStatus%)
ChkSum% = OprtID% + ReqID% + ResStatus%
RETURN
' **********************************************************
' * Function UtilSendResRoboPrm
' **********************************************************
*UtilSendResRoboPrm:
GOSUB *UtilMakeResHeader
' *********************
Wk% = WorkNo% MOD KEY_VISION_NUM%
Tl% = ToolNo% MOD KEY_VISION_NUM%
Spd% = ASPEED[ROBOT_NUMBER%]
Acl% = 100
ResStr$ = ResStr$ + "," + STR$(FORMAT_DEFAULT%) + "," + STR$(Wk%) + "," + STR$(Tl%) + "," + STR$(Spd%) +"," + STR$(Acl%)
ChkSum% = ChkSum% + FORMAT_DEFAULT% + Wk% + Tl% + Spd% + Acl%
' *********************
ResStr$ = ResStr$ + "," + STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function UtilSendResPos
' **********************************************************
*UtilSendResPos:
GOSUB *UtilMakeResHeader
' *********************
P99 = WHRXY[ROBOT_NUMBER%]
X% = LOC1(P99) * COEF_LENGTH
Y% = LOC2(P99) * COEF_LENGTH
Z% = LOC3(P99) * COEF_LENGTH
ResStr$ = ResStr$ + "," + STR$(X%) + "," + STR$(Y%) + "," + STR$(Z%)
ChkSum% = ChkSum% + X% + Y% + Z%
X% = 0
Y% = 0
Z% = LOC4(P99) * COEF_ANGLE
ResStr$ = ResStr$ + "," + STR$(X%) + "," + STR$(Y%) + "," + STR$(Z%)
ChkSum% = ChkSum% + X% + Y% + Z%
' *********************
ResStr$ = ResStr$ + "," + STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function UtilSendResError
' **********************************************************
*UtilSendResError:
ResStatus% = RES_FAIL%
GOSUB *UtilMakeResHeader
' *********************
IF ResPrmNum% >= 1 THEN
FOR C% = 1 TO ResPrmNum%
ResStr$ = ResStr$ + "," + STR$(RES_DUMMY_NUM%)
ChkSum% = ChkSum% + RES_DUMMY_NUM%
NEXT C%
ENDIF
' *********************
ResStr$ = ResStr$ + ","+ STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function UtilSendResToolData
' **********************************************************
*UtilSendResToolData:
ResStatus% = RES_UNSUPPORTED%
GOSUB *UtilMakeResHeader
' *********************
IF ResPrmNum% >= 1 THEN
FOR C% = 1 TO ResPrmNum%
ResStr$ = ResStr$ + "," + STR$(RES_DUMMY_NUM%)
ChkSum% = ChkSum% + RES_DUMMY_NUM%
NEXT C%
ENDIF
' *********************
ResStr$ = ResStr$ + ","+ STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function UtilSendResPosHiPrec
' **********************************************************
*UtilSendResPosHiPrec:
GOSUB *UtilMakeResHeader
' *********************
P99 = WHRXY[ROBOT_NUMBER%]
X% = LOC1(P99) * COEF_LENGTH
Y% = LOC2(P99) * COEF_LENGTH
Z% = LOC3(P99) * COEF_LENGTH
ResStr$ = ResStr$ + "," + STR$(X%) + "," + STR$(Y%) + "," + STR$(Z%)
ChkSum% = ChkSum% + X% + Y% + Z%
X% = 0
Y% = 0
Z% = LOC4(P99) * COEF_ANGLE_HP
ResStr$ = ResStr$ + "," + STR$(X%) + "," + STR$(Y%) + "," + STR$(Z%)
ChkSum% = ChkSum% + X% + Y% + Z%
' *********************
ResStr$ = ResStr$ + "," + STR$(ChkSum%)
' *********************
CALL *UtilSendRes(ResStr$)
RETURN
' **********************************************************
' * Function UtilRecvCmd
' **********************************************************
SUB *UtilRecvCmd(rcvStr$)
SEND GP0 TO rcvStr$
END SUB
' **********************************************************
' * Function UtilSendRes
' **********************************************************
SUB *UtilSendRes(sndStr$)
SEND sndStr$ TO GP0
END SUB
' **********************************************************
' * Function MoveErrorProc
' **********************************************************
*SetParamErrorProc:
RESUME NEXT
' **********************************************************
' * Function MoveErrorProc
' **********************************************************
*MoveErrorProc:
ErrCode% = ERR
IF &H20000 <= ErrCode% AND ErrCode% <= &H2FFFF THEN
IF MoveRetry% = 0 THEN
IF LOCF(P99) = 1 THEN
LOCF(P99) = 2
ELSE
LOCF(P99) = 1
ENDIF
MoveRetry% = 1
RESUME NEXT
ENDIF
ResStatus% = RES_ERR_MOVE_RANGE_OVER%
ELSE
ResStatus% = RES_FAIL%
ENDIF
RESUME NEXT
'
|
|