50 """Converts a pose target to a string""" 51 if reference
is not None:
54 return (
'(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)' % (x,y,z,r,p,w))
57 """Contverts a joint target to a string""" 58 return '(%s)' % (
','.join(format(ji,
".5f")
for ji
in angles))
63 """Robot post object""" 65 MAX_LINES_X_PROG = 95000
74 PROGRAM_NAME =
'unknown' 86 def __init__(self, robotpost=None, robotname=None, robot_axes = 6, **kwargs):
93 robotnamelist = robotname.split(
' ')
94 if len(robotnamelist) > 1:
99 for k,v
in kwargs.items():
100 if k ==
'lines_x_prog':
103 def ProgStart(self, progname, generate_sub_program=False):
104 if self.
nPROGS > 0
and not generate_sub_program:
109 m = re.search(
r'\d+$', progname)
117 self.
RunMessage(
'Program %s' % progname,
True)
125 def ProgSave(self, folder, progname, ask_user = False, show_result = False):
128 progname_base = progname
130 filesave =
getSaveFile(folder, progname,
'Save program as...')
131 if filesave
is not None:
132 filesave = filesave.name
137 filesave =
'%s/%s.%03i' % (folder, progname, self.
PROG_ID)
145 mainprog =
'\' Main program %s calls %i subprograms\n' % (self.
PROGRAM_NAME, self.
nPROGS)
146 for i
in range(self.
nPROGS):
147 fsavei = (
'%s/%s.%03i' % (folder, progname_base, self.
PROG_ID+i+1))
149 mainprog +=
'CALLP [%03i]\n' % (self.
PROG_ID+i+1)
150 fid = open(fsavei,
"w")
151 fid.write(self.
PROGS[i])
154 mainprog = mainprog +
'END\n' 155 fid = open(filesave,
"w")
159 print(
'SAVED: %s\n' % filesave)
163 fid = open(filesave,
"w")
166 print(
'SAVED: %s\n' % filesave)
171 if type(show_result)
is str:
175 p = subprocess.Popen([show_result, file])
176 elif type(show_result)
is list:
178 p = subprocess.Popen(show_result + [filesave])
182 os.startfile(filesave)
183 if len(self.
LOG) > 0:
184 mbox(
'Program generation LOG:\n\n' + self.
LOG)
188 """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". 189 The connection parameters must be provided in the robot connection menu of RoboDK""" 192 def MoveJ(self, pose, joints, conf_RLF=None):
193 """Add a joint movement""" 197 def MoveL(self, pose, joints, conf_RLF=None):
198 """Add a linear movement""" 205 def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None):
206 """Add a circular movement""" 210 def setFrame(self, pose, frame_id=None, frame_name=None):
211 """Change the robot reference frame""" 212 self.
RunMessage(
'Using the reference frame:',
True)
214 self.
RunMessage(
'(using all targets with respect to the robot reference)',
True)
224 def setTool(self, pose, tool_id=None, tool_name=None):
225 """Change the robot TCP""" 227 if tool_id
is None or tool_id < 0:
250 """Pause the robot program""" 254 self.
addline(
'PAUSE %.3f' % (time_ms*0.001))
257 """Changes the robot speed (in mm/s)""" 261 """Changes the robot speed (in mm/s)""" 262 self.
addlog(
'setAcceleration not defined')
265 """Changes the robot joint speed (in deg/s)""" 266 self.
addlog(
'setSpeedJoints not defined')
269 """Changes the robot joint acceleration (in deg/s2)""" 270 self.
addlog(
'setAccelerationJoints not defined')
273 """Changes the zone data approach (makes the movement more smooth)""" 277 """Sets a variable (output) to a given value""" 279 if type(io_var) != str:
280 io_var =
'[%02i]' % int(io_var)
281 if type(io_value) != str:
289 self.
addline(
'%s %s' % (setreset, io_var))
291 def waitDI(self, io_var, io_value, timeout_ms=-1):
292 """Waits for an input io_var to attain a given value io_value. Optionally, a timeout can be provided.""" 294 if type(io_var) != str:
295 io_var =
'[%02i]' % (int(io_var))
296 if type(io_value) != str:
303 self.
addline(
'%s %s' % (waitij, io_var))
309 def RunCode(self, code, is_function_call = False):
310 """Adds code or a function call""" 312 self.
RunMessage(
'Call program %s:' % code,
True)
322 """Add a joint movement""" 326 self.
addline(
'REM "' + message +
'"')
330 """Add a program line""" 340 self.
PROG += self.
TAB + newline +
'\n' 344 """Add a log message""" 345 self.
LOG = self.
LOG + newline +
'\n' 350 [x,y,z,r,p,w] = xyzrpw
360 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]])
363 """Test the post with a basic program""" 365 robot =
RobotPost(
'Nachi program',
'Generic Nachi Robot')
367 robot.ProgStart(
"Program")
368 robot.RunMessage(
"Program generated by RoboDK",
True)
369 robot.setFrame(
Pose([807.766544, -963.699898, 41.478944, 0, 0, 0]))
370 robot.setTool(
Pose([62.5, -108.253175, 100, -60, 90, 0]))
371 robot.MoveJ(
Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
372 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
373 robot.MoveL(
Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122] )
374 robot.RunMessage(
"Setting air valve 1 on")
375 robot.RunCode(
"TCP_On",
True)
377 robot.MoveL(
Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
378 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
379 robot.MoveL(
Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403] )
380 robot.RunMessage(
"Setting air valve off")
381 robot.RunCode(
"TCP_Off(55)",
True)
383 robot.MoveL(
Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
384 robot.MoveL(
Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403] )
385 robot.MoveL(
Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532] )
386 robot.ProgFinish(
"Program")
389 for i
in range(len(robot.PROGS)):
390 print(robot.PROGS[i])
393 if len(robot.LOG) > 0:
394 mbox(
'Program generation LOG:\n\n' + robot.LOG)
396 input(
"Press Enter to close...")
398 if __name__ ==
"__main__":
399 """Function to call when the module is executed by itself: test"""
def RunMessage(self, message, iscomment=False)
def setDO(self, io_var, io_value)
def ProgStart(self, progname, generate_sub_program=False)
def waitDI(self, io_var, io_value, timeout_ms=-1)
def setSpeed(self, speed_mms)
def setFrame(self, pose, frame_id=None, frame_name=None)
def MoveJ(self, pose, joints, conf_RLF=None)
def RunCode(self, code, is_function_call=False)
def name_2_id(str_name_id)
def setSpeedJoints(self, speed_degs)
def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None)
def MoveL(self, pose, joints, conf_RLF=None)
def UploadFTP(program, robot_ip, remote_path, ftp_user, ftp_pass)
def setAccelerationJoints(self, accel_degss)
def setTool(self, pose, tool_id=None, tool_name=None)
def addlog(self, newline)
def mbox(msg, b1='OK', b2='Cancel', frame=True, t=False, entry=None)
def pose_2_str(pose, joints=None, reference=None)
def ProgSave(self, folder, progname, ask_user=False, show_result=False)
def setAcceleration(self, accel_mmss)
def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass)
def __init__(self, robotpost=None, robotname=None, robot_axes=6, kwargs)
def setZoneData(self, zone_mm)
def getSaveFile(strdir='C:\\', strfile='file.txt', strtitle='Save file as ...')
def addline(self, newline)
def ProgFinish(self, progname)