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)