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=' ')