51 """Converts a pose target to a string""" 53 return (
'(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)' % (x,y,z,w,p,r))
56 """Contverts a joint target to a string""" 57 return 'J(%s)' % (
','.join(format(ji,
".5f")
for ji
in angles))
62 """Robot post object""" 64 MAX_LINES_X_PROG = 1e9
88 AXES_TYPE = [
'R','R','R','R','R','R'] # Important: This is usually set up by RoboDK automatically. Otherwise, override the __init__ procedure. 96 def __init__(self, robotpost=None, robotname=None, robot_axes = 6, **kwargs):
103 for k,v
in kwargs.items():
104 if k ==
'lines_x_prog':
121 self.
addline(
'PROGRAM %s' % progname)
123 self.
addline(
'PROGRAM %s' % progname)
130 self.
addline(
"' End of program %s" % progname)
132 def ProgSave(self, folder, progname, ask_user = False, show_result = False):
133 progname = progname +
'.' + self.
PROG_EXT 135 filesave =
getSaveFile(folder, progname,
'Save program as...')
136 if filesave
is not None:
137 filesave = filesave.name
141 filesave = folder +
'/' + progname
142 fid = open(filesave,
"w")
145 print(
'SAVED: %s\n' % filesave)
150 if type(show_result)
is str:
153 p = subprocess.Popen([show_result, filesave])
154 elif type(show_result)
is list:
156 p = subprocess.Popen(show_result + [filesave])
160 os.startfile(filesave)
161 if len(self.
LOG) > 0:
162 mbox(
'Program generation LOG:\n\n' + self.
LOG)
165 """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". 166 The connection parameters must be provided in the robot connection menu of RoboDK""" 169 def MoveJ(self, pose, joints, conf_RLF=None):
170 """Add a joint movement""" 175 var_str =
'Pos%i' % self.
P_ID 177 self.
addline(
'MOVE P, %s %s' % (self.
PASS, var_str))
181 def MoveL(self, pose, joints, conf_RLF=None):
182 """Add a linear movement""" 187 var_str =
'Pos%i' % self.
P_ID 189 self.
addline(
'MOVE L, %s %s' % (self.
PASS, var_str))
192 var_str =
'Pos%i' % self.
P_ID 194 self.
addline(
'MOVE L, %s %s' % (self.
PASS, var_str))
201 def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None):
202 """Add a circular movement""" 207 var_str1 =
'Pos%i' % self.
P_ID 210 var_str2 =
'Pos%i' % self.
P_ID 212 self.
addline(
'MOVE C, %s,%s %s' % (var_str1, self.
PASS, var_str2))
216 def setFrame(self, pose, frame_id=None, frame_name=None):
217 """Change the robot reference frame""" 218 if frame_id
is not None and frame_id > 0:
223 def setTool(self, pose, tool_id=None, tool_name=None):
224 """Change the robot TCP""" 225 if tool_id
is not None and tool_id > 0:
231 """Pause the robot program""" 233 self.
addline(
'HOLD "Program Paused"')
235 self.
addline(
'DELAY %.3f' % time_ms)
238 """Changes the robot speed (in mm/s)""" 240 self.
SPEED = max(min(speed_mms/2000.0, 100),1)
241 self.
addline(
"' set speed to %.1f mm per sec" % speed_mms)
245 """Changes the robot acceleration (in mm/s2)""" 252 """Changes the robot joint speed (in deg/s)""" 257 """Changes the robot joint acceleration (in deg/s2)""" 262 """Changes the zone data approach (makes the movement more smooth)""" 273 """Sets a variable (output) to a given value""" 274 if type(io_var) != str:
275 io_var =
'IO[%s]' % str(io_var)
276 if type(io_value) != str:
283 self.
addline(
'OUT %s = %s' % (io_var, io_value))
285 def waitDI(self, io_var, io_value, timeout_ms=-1):
286 """Waits for an input io_var to attain a given value io_value. Optionally, a timeout can be provided.""" 287 if type(io_var) != str:
288 io_var =
'IO[%s]' % str(io_var)
289 if type(io_value) != str:
297 self.
addline(
'WAIT %s = %s' % (io_var, io_value))
299 self.
addline(
'WAIT %s = %s, %.0f' % (io_var, io_value, timeout_ms))
301 def RunCode(self, code, is_function_call = False):
302 """Adds code or a function call""" 304 code.replace(
' ',
'_')
305 if code.find(
'(') < 0:
312 """Add a joint movement""" 316 self.
addline(
'PRINTMSG "%s", 0, "Message"' % message)
320 """Add a program line""" 324 """Add a log message""" 325 self.
LOG = self.
LOG + newline +
'\n' 330 [x,y,z,r,p,w] = xyzrpw
340 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]])
343 """Test the post with a basic program""" 345 robot =
RobotPost(
'Vplus_custom',
'Generic Adept Robot')
347 robot.ProgStart(
"Program")
348 robot.RunMessage(
"Program generated by RoboDK",
True)
349 robot.setFrame(
Pose([807.766544, -963.699898, 41.478944, 0, 0, 0]))
350 robot.setTool(
Pose([62.5, -108.253175, 100, -60, 90, 0]))
351 robot.MoveJ(
Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
352 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
353 robot.MoveL(
Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122] )
354 robot.RunMessage(
"Setting air valve 1 on")
355 robot.RunCode(
"TCP_On",
True)
357 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
358 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
359 robot.MoveL(
Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403] )
360 robot.RunMessage(
"Setting air valve off")
361 robot.RunCode(
"TCP_Off(55)",
True)
363 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
364 robot.MoveL(
Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403] )
365 robot.MoveL(
Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532] )
366 robot.ProgFinish(
"Program")
368 print(robot.PROG.replace(
'%PROGDEFS%\n', robot.HEADER_DEFINE))
369 if len(robot.LOG) > 0:
370 mbox(
'Program generation LOG:\n\n' + robot.LOG)
372 input(
"Press Enter to close...")
374 if __name__ ==
"__main__":
375 """Function to call when the module is executed by itself: test"""
def MoveL(self, pose, joints, conf_RLF=None)
def setAcceleration(self, accel_mmss)
def addlog(self, newline)
def ProgFinish(self, progname)
def UploadFTP(program, robot_ip, remote_path, ftp_user, ftp_pass)
def ProgStart(self, progname)
def ProgSave(self, folder, progname, ask_user=False, show_result=False)
def setSpeed(self, speed_mms)
def mbox(msg, b1='OK', b2='Cancel', frame=True, t=False, entry=None)
def setSpeedJoints(self, speed_degs)
def setTool(self, pose, tool_id=None, tool_name=None)
def setAccelerationJoints(self, accel_degss)
def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None)
def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass)
def MoveJ(self, pose, joints, conf_RLF=None)
def setDO(self, io_var, io_value)
def __init__(self, robotpost=None, robotname=None, robot_axes=6, kwargs)
def getSaveFile(strdir='C:\\', strfile='file.txt', strtitle='Save file as ...')
def addline(self, newline)
def setFrame(self, pose, frame_id=None, frame_name=None)
def RunCode(self, code, is_function_call=False)
def setZoneData(self, zone_mm)
def waitDI(self, io_var, io_value, timeout_ms=-1)
def RunMessage(self, message, iscomment=False)