diff --git a/.gitignore b/.gitignore index 715a5c6..ef5a5a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ docs/_* build .idea/ +.history/ *.pyc diff --git a/urx/urrtmon.py b/urx/urrtmon.py index 096bbec..4131c88 100644 --- a/urx/urrtmon.py +++ b/urx/urrtmon.py @@ -1,8 +1,10 @@ ''' Module for implementing a UR controller real-time monitor over socket port 30003. Confer http://support.universal-robots.com/Technical/RealTimeClientInterface -Note: The packet lenght given in the web-page is 740. What is actually received from the controller is 692. It is assumed that the motor currents, the last group of 48 bytes, are not send. +Note: The packet lenght given in the web-page is 740. What is actually received from the controller is 692. +It is assumed that the motor currents, the last group of 48 bytes, are not send. Originally Written by Morten Lind +Parsing for Firmware 5.9 is added by Byeongdu Lee ''' import logging import socket @@ -31,6 +33,7 @@ class URRTMonitor(threading.Thread): rtstruct540 = struct.Struct('>d6d6d6d6d6d6d6d6d18d') rtstruct5_1 = struct.Struct('>d1d6d6d6d6d6d6d6d6d6d6d6d6d6d6d1d6d1d1d1d6d1d6d3d6d1d1d1d1d1d1d1d6d1d1d3d3d') + rtstruct5_9 = struct.Struct('>d6d6d6d6d6d6d6d6d6d6d6d6d6d6d1d6d1d1d1d6d1d6d3d6d1d1d1d1d1d1d1d6d1d1d3d3d1d') def __init__(self, urHost, urFirm=None): threading.Thread.__init__(self) @@ -56,6 +59,19 @@ class URRTMonitor(threading.Thread): self._main_voltage = None self._robot_voltage = None self._robot_current = None + self._qdTarget = None + self._qddTarget = None + self._iTarget = None + self._mTarget = None + self._qdActual = None + self._tcp_speed = None + self._tcp = None + self._robot_mode = None + self._joint_modes = None + self._digital_outputs = None + self._program_state = None + self._safety_status = None + self.__recvTime = 0 self._last_ctrl_ts = 0 # self._last_ts = 0 @@ -233,6 +249,8 @@ class URRTMonitor(threading.Thread): if self.urFirm is not None: if self.urFirm == 5.1: unp = self.rtstruct5_1.unpack(payload[:self.rtstruct5_1.size]) + if self.urFirm == 5.9: + unp = self.rtstruct5_9.unpack(payload[:self.rtstruct5_9.size]) else: if pkgsize >= 692: unp = self.rtstruct692.unpack(payload[:self.rtstruct692.size]) @@ -272,6 +290,20 @@ class URRTMonitor(threading.Thread): self._robot_voltage = unp[122] self._robot_current = unp[123] + if self.urFirm>= 5.9: + self._qdTarget = np.array(unp[7:13]) + self._qddTarget = np.array(unp[13:19]) + self._iTarget = np.array(unp[19:25]) + self._mTarget = np.array(unp[25:31]) + self._tcp_speed = np.array(unp[61:67]) + self._joint_current = np.array(unp[49:55]) + self._joint_voltage = np.array(unp[124:130]) + self._robot_mode = unp[94] + self._joint_modes = np.array(unp[95:101]) + self._digital_outputs = unp[130] + self._program_state = unp[131] + self._safety_status = unp[138] + if self._csys: with self._csys_lock: # might be a godd idea to remove dependancy on m3d @@ -337,14 +369,22 @@ class URRTMonitor(threading.Thread): ctrltimestamp=self._ctrlTimestamp, qActual=self._qActual, qTarget=self._qTarget, + qdActual=self._qdActual, + qdTarget=self._qdTarget, tcp=self._tcp, tcp_force=self._tcp_force, + tcp_speed=self._tcp_speed, joint_temperature=self._joint_temperature, joint_voltage=self._joint_voltage, joint_current=self._joint_current, + joint_modes=self._joint_modes, + robot_modes=self._robot_mode, main_voltage=self._main_voltage, robot_voltage=self._robot_voltage, - robot_current=self._robot_current) + robot_current=self._robot_current, + digital_outputs=self._digital_outputs, + program_state=self._program_state, + safety_status=self._safety_status) getALLData = get_all_data def stop(self): diff --git a/urx/urscript.py b/urx/urscript.py index a7d6cd7..2382cb3 100755 --- a/urx/urscript.py +++ b/urx/urscript.py @@ -142,6 +142,15 @@ class URScript(object): self.add_line_to_program(msg) self._sync() + def _socket_get_var2var(self, var, varout, socket_name, prefix = ''): + msg = "{}{} = socket_get_var(\"{}\",\"{}\")".format(prefix, varout, var, socket_name) + self.add_line_to_program(msg) + + def _socket_send_byte(self, byte, socket_name): + msg = "socket_send_byte(\"{}\",\"{}\")".format(str(byte), socket_name) # noqa + self.add_line_to_program(msg) + self._sync() + def _sync(self): msg = "sync()" self.add_line_to_program(msg)