45 """Get a safe program name""" 47 for c
in r'-[]/\;,><&*:%=+@!#^()|?^':
48 progname = progname.replace(c,
'')
50 if len(progname) <= 0:
53 if progname[0].isdigit():
54 progname =
'P' + progname
56 if len(progname) > max_chars:
57 progname = progname[:max_chars]
71 """Robot post object defined for Motoman robots""" 73 MAX_LINES_X_PROG = 2000
75 INCLUDE_SUB_PROGRAMS =
True 86 PULSES_X_DEG = [1,1,1,1,1,1]
103 PROG_NAME =
'unknown' 104 PROG_NAME_CURRENT =
'unknown' 114 AXES_TYPE = [
'R','R','R','R','R','R'] # Important: This is usually set up by RoboDK automatically. Otherwise, override the __init__ procedure. 120 HAS_TURNTABLE =
False 127 LAST_CONFDATA = [
None,
None,
None,
None]
129 def __init__(self, robotpost=None, robotname=None, robot_axes = 6, **kwargs):
136 for k,v
in kwargs.items():
137 if k ==
'lines_x_prog':
141 if k ==
'pulses_x_deg':
155 progname_i = progname
160 print(
"Can't split %s: Two or more programs are split into smaller programs" % progname)
162 raise Exception(
"Only one program at a time can be split into smaller programs")
190 header +=
'/JOB' +
'\n' 191 header +=
'//NAME %s' % progname +
'\n' 192 header +=
'//POS' +
'\n' 198 datestr = time.strftime(
"%Y/%m/%d %H:%M")
201 header_ins +=
'//INST' +
'\n' 202 header_ins +=
'///DATE %s' % datestr +
'\n' 204 header_ins +=
'///COMM Generated using RoboDK\n' 205 header_ins +=
'///ATTR SC,RW' +
'\n' 207 header_ins +=
'///GROUP1 RB1' +
'\n' 212 self.
PROG.insert(0, header_ins)
213 self.
PROG.append(
'END')
229 def progsave(self, folder, progname, ask_user = False, show_result = False):
231 if not folder.endswith(
'/'):
232 folder = folder +
'/' 233 progname = progname +
'.' + self.
PROG_EXT 235 filesave =
getSaveFile(folder, progname,
'Save program as...')
236 if filesave
is not None:
237 filesave = filesave.name
241 filesave = folder + progname
242 fid = open(filesave,
"w")
244 for line
in self.
PROG:
248 print(
'SAVED: %s\n' % filesave)
253 if type(show_result)
is str:
256 p = subprocess.Popen([show_result, filesave])
257 elif type(show_result)
is list:
259 p = subprocess.Popen(show_result + [filesave])
263 os.startfile(filesave)
269 def ProgSave(self, folder, progname, ask_user = False, show_result = False):
275 print(
"Warning: ProgFinish was not called properly")
294 self.
progsave(folder, progname_last, ask_user, show_result)
312 self.
progsave(folder, progname, ask_user, show_result)
315 print(
"Warning! Program has not been properly finished")
316 self.
progsave(folder, progname, ask_user, show_result)
318 if show_result
and len(self.
LOG) > 0:
319 mbox(
'Program generation LOG:\n\n' + self.
LOG)
322 """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". 323 The connection parameters must be provided in the robot connection menu of RoboDK""" 326 def MoveJ(self, pose, joints, conf_RLF=None):
327 """Add a joint movement""" 333 def MoveL(self, pose, joints, conf_RLF=None):
334 """Add a linear movement""" 349 def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None):
350 """Add a circular movement""" 366 """Change the robot reference frame""" 371 if frame_id
is None or frame_id < 0:
378 self.
RunMessage(
'%.1f,%.1f,%.1f,%.1f,%.1f,%.1f' % (xyzwpr[0], xyzwpr[1], xyzwpr[2], xyzwpr[3], xyzwpr[4], xyzwpr[5]),
True)
381 """Change the robot TCP""" 383 if tool_id
is None or tool_id < 0:
389 self.
RunMessage(
'%.1f,%.1f,%.1f,%.1f,%.1f,%.1f' % (xyzwpr[0], xyzwpr[1], xyzwpr[2], xyzwpr[3], xyzwpr[4], xyzwpr[5]),
True)
392 """Pause the robot program""" 396 self.
addline(
'DELAY %.2fs' % (time_ms*0.001))
399 """Changes the robot speed (in mm/s)""" 400 speed_m_min = speed_mms * 60.0 * 0.001
401 speed = max(0.01,min(speed_m_min,120.0))
405 """Changes the robot acceleration (in mm/s2)""" 406 self.
addlog(
'Set acceleration not defined')
409 """Changes the robot joint speed (in deg/s)""" 410 speedj = max(0.01,min(speed,100.0))
414 """Changes the robot joint acceleration (in deg/s2)""" 415 self.
addlog(
'Set acceleration not defined')
418 """Changes the zone data approach (makes the movement more smooth)""" 422 self.
STR_PL =
' R=%i' % round(zone_mm)
425 """Sets a variable (output) to a given value""" 426 if type(io_var) != str:
427 io_var =
'o1#%04d' % io_var
428 if type(io_value) != str:
436 self.
addline(
'OUT %s = %s' % (io_var, io_value))
438 def waitDI(self, io_var, io_value, timeout_ms=-1):
439 """Waits for an input io_var to attain a given value io_value. Optionally, a timeout can be provided.""" 440 if type(io_var) != str:
441 io_var =
'I1#%04d' % io_var
442 if type(io_value) != str:
451 self.
addline(
'WAIT_IP %s=%s' % (io_var, io_value))
454 self.
addline(
'WAIT_IP %s=%s T=%.2f' % (io_var, io_value, timeout_ms*0.001))
457 def RunCode(self, code, is_function_call = False):
458 """Adds code or a function call""" 465 code.replace(
' ',
'_')
466 self.
addline(
'CALL %s' % (code))
473 """Add a joint movement""" 475 for i
in range(0,len(message), 29):
476 i2 = min(i + 29, len(message))
477 self.
addline(
";%s" % message[i:i2])
480 for i
in range(0,len(message), 25):
481 i2 = min(i + 25, len(message))
482 self.
addline(
'MSG "%s"' % message[i:i2])
491 """Add a program line""" 497 self.
PROG.append(newline)
500 """Add a line at the end of the program (used for targets)""" 504 """Add a log message""" 507 self.
LOG = self.
LOG + newline +
'\n' 564 for i
in range(len(joints)):
565 str_pulses.append(
'%i' % round(joints[i] * self.
PULSES_X_DEG[i]))
581 turnJ4 = (joints[3]+180)//360
582 turnJ6 = (joints[5]+180)//360
583 turnJ1 = (joints[0]+180)//360
584 turns = [turnJ4, turnJ6, turnJ1]
586 confdata =
'%i,%i,%i,%i,%i,%i,0,0' % tuple(conf_RLF[:3] + turns[:3])
590 self.
addline_targets(
'C%05i=' % cid +
'%.3f,%.3f,%.3f,%.2f,%.2f,%.2f' % tuple(xyzwpr))
596 [x,y,z,r,p,w] = xyzrpw
606 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]])
609 """Test the post with a basic program""" 611 robot =
RobotPost(
'Motomantest',
'Motoman robot', 6)
613 robot.ProgStart(
"Program")
614 robot.RunMessage(
"Program generated by RoboDK",
True)
615 robot.setFrame(
Pose([807.766544, -963.699898, 41.478944, 0, 0, 0]),
None, 0)
616 robot.setTool(
Pose([62.5, -108.253175, 100, -60, 90, 0]),
None, 0)
617 robot.MoveJ(
Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
618 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
619 robot.MoveL(
Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122] )
620 robot.RunMessage(
"Setting air valve 1 on")
621 robot.RunCode(
"TCP_On",
True)
623 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
624 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
625 robot.MoveL(
Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403] )
626 robot.RunMessage(
"Setting air valve off")
627 robot.RunCode(
"TCP_Off",
True)
629 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
630 robot.MoveL(
Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403] )
631 robot.MoveL(
Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532] )
632 robot.ProgFinish(
"Program")
635 robot.PROG = robot.PROG_LIST.pop()
636 for line
in robot.PROG:
639 if len(robot.LOG) > 0:
640 mbox(
'Program generation LOG:\n\n' + robot.LOG)
642 input(
"Press Enter to close...")
644 if __name__ ==
"__main__":
645 """Function to call when the module is executed by itself: test""" def waitDI(self, io_var, io_value, timeout_ms=-1)
def add_target_cartesian(self, pose, joints, conf_RLF)
def ProgStart(self, progname, new_page=False)
def MoveJ(self, pose, joints, conf_RLF=None)
def add_target_joints(self, joints)
def setSpeedJoints(self, speed_degs)
def setFrame(self, pose, frame_id, frame_name)
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 addline_targets(self, newline)
def Pose_2_Panasonic(pose)
def UploadFTP(program, robot_ip, remote_path, ftp_user, ftp_pass)
def addlog(self, newline)
def setAcceleration(self, accel_mmss)
def setDO(self, io_var, io_value)
def __init__(self, robotpost=None, robotname=None, robot_axes=6, kwargs)
def RunMessage(self, message, iscomment=False)
def get_safe_name(progname, max_chars=7)
def mbox(msg, b1='OK', b2='Cancel', frame=True, t=False, entry=None)
def MoveL(self, pose, joints, conf_RLF=None)
def page_size_control(self)
def progsave(self, folder, progname, ask_user=False, show_result=False)
def ProgFinish(self, progname, new_page=False)
def setZoneData(self, zone_mm)
def RunCode(self, code, is_function_call=False)
def ProgSave(self, folder, progname, ask_user=False, show_result=False)
def setCartesian(self, confdata)
def setAccelerationJoints(self, accel_degss)
def getSaveFile(strdir='C:\\', strfile='file.txt', strtitle='Save file as ...')
def setTool(self, pose, tool_id, tool_name)
bool INCLUDE_SUB_PROGRAMS
def addline(self, newline, movetype=' ')