55 PDAT_ACT = {VEL 50,ACC 100,APO_DIST 10} 57 FDAT_ACT = {TOOL_NO 0,BASE_NO 0,IPO_FRAME #BASE} 63 ;FOLD SET DEFAULT SPEED 70 ;FOLD PTP FIRST POSITION 72 PDAT_ACT = {VEL 50,ACC 100,APO_DIST 10} 73 FDAT_ACT = {TOOL_NO 0,BASE_NO 0,IPO_FRAME #BASE} 78 PTP $AXIS_ACT ; skip BCO quickly 83 """Converts a pose target to a string""" 87 return (
'X %.3f,Y %.3f,Z %.3f,A %.3f,B %.3f,C %.3f' % (x,y,z,w,p,r))
95 for i
in range(njoints-6):
96 extaxes = extaxes + (
',E%i %.5f' % (i+1, joints[i+6]))
100 """Prints a joint target""" 102 data = [
'A1',
'A2',
'A3',
'A4',
'A5',
'A6',
'E1',
'E2',
'E3',
'E4',
'E5',
'E6']
103 for i
in range(len(angles)):
104 str = str + (
'%s %.5f,' % (data[i], angles[i]))
113 strconf = strconf +
'1' 115 strconf = strconf +
'0' 118 strconf = strconf +
'1' 120 strconf = strconf +
'0' 123 strconf = strconf +
'1' 125 strconf = strconf +
'0' 127 return "'B%s'" % strconf
134 for i
in range(len(joints)):
136 strturn =
'1' + strturn
138 strturn =
'0' + strturn
139 return "'B%s'" % strturn
145 """Robot post object""" 152 PROG_NAME =
'unknown' 172 def __init__(self, robotpost=None, robotname=None, robot_axes = 6, **kwargs):
181 self.
addline(
'DEF %s ( )' % progname)
191 def ProgSave(self, folder, progname, ask_user = False, show_result = False):
192 progname = progname +
'.' + self.
PROG_EXT 194 filesave =
getSaveFile(folder, progname,
'Save program as...')
195 if filesave
is not None:
196 filesave = filesave.name
200 filesave = folder +
'/' + progname
201 fid = open(filesave,
"w")
202 fid.write(
"&ACCESS RVP\n")
203 fid.write(
"&REL 1\n")
204 fid.write(
"&COMMENT Generated by RoboDK\n")
205 fid.write(
"&PARAM TEMPLATE = C:\\KRC\\Roboter\\Template\\vorgabe\n")
206 fid.write(
"&PARAM EDITMASK = *\n")
209 print(
'SAVED: %s\n' % filesave)
210 filesave_dat = filesave[:-3] +
'dat' 211 fid2 = open(filesave_dat,
"w")
212 fid2.write(
"&ACCESS RVP\n")
213 fid2.write(
"&REL 1\n")
214 fid2.write(
"&COMMENT Generated by RoboDK\n")
215 fid2.write(
"&PARAM TEMPLATE = C:\\KRC\\Roboter\\Template\\vorgabe\n")
216 fid2.write(
"&PARAM EDITMASK = *\n")
217 fid2.write(
'DEFDAT %s\n\n' % self.
PROG_NAME)
219 fid2.write(
'\nENDDAT\n\n')
221 print(
'SAVED: %s\n' % filesave_dat)
225 if type(show_result)
is str:
228 p = subprocess.Popen([show_result, filesave_dat, filesave])
229 elif type(show_result)
is list:
231 p = subprocess.Popen(show_result + [filesave])
235 os.startfile(filesave)
236 os.startfile(filesave_dat)
237 if len(self.
LOG) > 0:
238 mbox(
'Program generation LOG:\n\n' + self.
LOG)
241 """Send a program to the robot using the provided parameters. This method is executed right after ProgSave if we selected the option "Send Program to Robot". 242 The connection parameters must be provided in the robot connection menu of RoboDK""" 245 def MoveJ(self, pose, joints, conf_RLF=None):
246 """Add a joint movement""" 263 self.
addline(
';FOLD PTP P%s %sVel=%.0f %% PDAT%s Tool[%i] Base[%i];%%{PE}%%R 8.3.42,%%MKUKATPBASIS,%%CMOVE,%%VPTP,%%P 1:PTP, 2:P%s, 3:%s, 5:%.0f, 7:PDAT%s' % (vname, str_cont, self.
VEL_PTP, vname, self.
TOOL_ID, self.
BASE_ID, vname, str_cdis, self.
VEL_PTP, vname))
264 self.
addline(
'$BWDSTART=FALSE')
265 self.
addline(
'PDAT_ACT=PPDAT%s' % vname)
266 self.
addline(
'FDAT_ACT=FP%s' % vname)
276 self.
addDAT(
'DECL FDAT FP%s={TOOL_NO %i,BASE_NO %i,IPO_FRAME #BASE,POINT2[] " ",TQ_STATE FALSE}' % (vname, self.
TOOL_ID, self.
BASE_ID))
277 self.
addDAT(
'DECL PDAT PPDAT%s={VEL %.3f,ACC 100.000,APO_DIST %.3f,GEAR_JERK 50.0000,EXAX_IGN 0}' % (vname, self.
VEL_PTP, max(self.
APO_VALUE,1)))
279 def MoveL(self, pose, joints, conf_RLF=None):
280 """Add a linear movement""" 297 self.
addline(
';FOLD LIN P%s %sVel=%.0f m/s CPDAT%s Tool[%i] Base[%i];%%{PE}%%R 8.3.42,%%MKUKATPBASIS,%%CMOVE,%%VLIN,%%P 1:LIN, 2:P%s, 3:%s, 5:%.0f, 7:CPDAT%s' % (vname, str_cont, self.
speed_ms, vname, self.
TOOL_ID, self.
BASE_ID, vname, str_cdis, self.
speed_ms, vname))
298 self.
addline(
'$BWDSTART=FALSE')
299 self.
addline(
'LDAT_ACT=LCPDAT%s' % vname)
300 self.
addline(
'FDAT_ACT=FP%s' % vname)
311 self.
addDAT(
'DECL FDAT FP%s={TOOL_NO %i,BASE_NO %i,IPO_FRAME #BASE,POINT2[] " ",TQ_STATE FALSE}' % (vname, self.
TOOL_ID, self.
BASE_ID))
312 self.
addDAT(
'DECL LDAT LCPDAT%s={VEL %.5f,ACC 100.000,APO_DIST %.3f,APO_FAC 50.0000,AXIS_VEL 100.000,AXIS_ACC 100.000,ORI_TYP #VAR,CIRC_TYP #BASE,JERK_FAC 50.0000,GEAR_JERK 50.0000,EXAX_IGN 0}' % (vname, self.
speed_ms, max(self.
APO_VALUE,1)))
314 def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None):
315 """Add a circular movement""" 318 def setFrame(self, pose, frame_id=None, frame_name=None):
319 """Change the robot reference frame""" 320 if frame_name
is not None and frame_name.endswith(
"Base"):
324 elif frame_id
is not None and frame_id >= 0:
331 def setTool(self, pose, tool_id=None, tool_name=None):
332 """Change the robot TCP""" 333 if tool_id
is not None and tool_id >= 0:
342 """Pause the robot program""" 346 self.
addline(
'WAIT SEC %.3f' % (time_ms*0.001))
349 """Changes the robot speed (in mm/s)""" 354 """Changes the current robot acceleration""" 359 """Changes the robot joint speed (in deg/s)""" 361 self.
addline(
'$VEL.ORI1 = %.5f' % speed_degs)
362 self.
addline(
'$VEL.ORI2 = %.5f' % speed_degs)
365 """Changes the robot joint acceleration (in deg/s2)""" 367 self.
addline(
'$ACC.ORI1 = %.5f' % accel_degss)
368 self.
addline(
'$ACC.ORI2 = %.5f' % accel_degss)
371 """Changes the zone data approach (makes the movement more smooth)""" 374 self.
addline(
'$APO.CPTP = %.3f' % zone_mm)
375 self.
addline(
'$APO.CDIS = %.3f' % zone_mm)
383 """Sets a variable (output) to a given value""" 384 if type(io_var) != str:
385 io_var =
'$OUT[%s]' % str(io_var)
386 if type(io_value) != str:
393 self.
addline(
'%s=%s' % (io_var, io_value))
395 def waitDI(self, io_var, io_value, timeout_ms=-1):
396 """Waits for an input io_var to attain a given value io_value. Optionally, a timeout can be provided.""" 397 if type(io_var) != str:
398 io_var =
'$IN[%s]' % str(io_var)
399 if type(io_value) != str:
407 self.
addline(
'WAIT FOR (%s==%s)' % (io_var, io_value))
410 self.
addline(
'$TIMER_STOP[1]=TRUE')
411 self.
addline(
'$TIMER_FLAG[1]=FALSE')
412 self.
addline(
'$TIMER[1]=%.3f' % (float(timeout_ms)*0.001))
413 self.
addline(
'$TIMER_STOP[1]=FALSE')
414 self.
addline(
'WAIT FOR (%s==%s OR $TIMER_FLAG[1])' % (io_var, io_value))
415 self.
addline(
'$TIMER_STOP[1]=TRUE')
416 self.
addline(
'IF $TIMER_FLAG[1]== TRUE THEN')
417 self.
addline(
' HALT ; Timed out!')
418 self.
addline(
' GOTO START_TIMER')
421 def RunCode(self, code, is_function_call = False):
422 """Adds code or a function call""" 424 code.replace(
' ',
'_')
425 if not code.endswith(
')'):
432 """Add a joint movement""" 436 self.
addline(
'Wait for StrClear($LOOP_MSG[])')
437 self.
addline(
'$LOOP_CONT = TRUE')
438 self.
addline(
'$LOOP_MSG[] = "%s"' % message)
442 """Add a program line""" 443 self.
PROG = self.
PROG + newline +
'\n' 449 """Add a log message""" 450 self.
LOG = self.
LOG + newline +
'\n' 455 [x,y,z,r,p,w] = xyzrpw
465 return Mat([[cb*ca, ca*sc*sb - cc*sa, sc*sa + cc*ca*sb, x],[cb*sa, cc*ca + sc*sb*sa, cc*sb*sa - ca*sc, y],[-sb, cb*sc, cc*cb, z],[0,0,0,1]])
468 """Test the post with a basic program""" 470 robot =
RobotPost(
'Kuka_custom',
'Generic Kuka')
472 robot.ProgStart(
"Program")
473 robot.RunMessage(
"Program generated by RoboDK",
True)
474 robot.setFrame(
Pose([807.766544, -963.699898, 41.478944, 0, 0, 0]))
475 robot.setTool(
Pose([62.5, -108.253175, 100, -60, 90, 0]))
476 robot.MoveJ(
Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
477 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
478 robot.MoveL(
Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122] )
479 robot.RunMessage(
"Setting air valve 1 on")
480 robot.RunCode(
"TCP_On",
True)
482 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
483 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
484 robot.MoveL(
Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403] )
485 robot.RunMessage(
"Setting air valve off")
486 robot.RunCode(
"TCP_Off",
True)
488 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
489 robot.MoveL(
Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403] )
490 robot.MoveL(
Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532] )
491 robot.ProgFinish(
"Program")
494 if len(robot.LOG) > 0:
495 mbox(
'Program generation LOG:\n\n' + robot.LOG)
497 input(
"Press Enter to close...")
499 if __name__ ==
"__main__":
500 """Function to call when the module is executed by itself: test"""
def joints_2_turn_str(joints)
def RunMessage(self, message, iscomment=False)
def addDAT(self, newline)
def MoveL(self, pose, joints, conf_RLF=None)
def MoveJ(self, pose, joints, conf_RLF=None)
def setAcceleration(self, accel_mmss)
def addlog(self, newline)
def UploadFTP(program, robot_ip, remote_path, ftp_user, ftp_pass)
def __init__(self, robotpost=None, robotname=None, robot_axes=6, kwargs)
def pose_2_str_ext(pose, joints)
def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass)
def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None)
def setSpeed(self, speed_mms)
def ProgFinish(self, progname)
def setSpeedJoints(self, speed_degs)
def setAccelerationJoints(self, accel_degss)
def mbox(msg, b1='OK', b2='Cancel', frame=True, t=False, entry=None)
def setZoneData(self, zone_mm)
def ProgStart(self, progname)
def RunCode(self, code, is_function_call=False)
def setTool(self, pose, tool_id=None, tool_name=None)
def ProgSave(self, folder, progname, ask_user=False, show_result=False)
def addline(self, newline)
def waitDI(self, io_var, io_value, timeout_ms=-1)
def getSaveFile(strdir='C:\\', strfile='file.txt', strtitle='Save file as ...')
def setFrame(self, pose, frame_id=None, frame_name=None)
def setDO(self, io_var, io_value)