xarm-python-sdk 1.15.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- xarm/__init__.py +2 -0
- xarm/build_backend.py +17 -0
- xarm/core/__init__.py +2 -0
- xarm/core/comm/__init__.py +5 -0
- xarm/core/comm/base.py +303 -0
- xarm/core/comm/serial_port.py +44 -0
- xarm/core/comm/socket_port.py +150 -0
- xarm/core/comm/uxbus_cmd_protocol.py +100 -0
- xarm/core/config/__init__.py +0 -0
- xarm/core/config/x_code.py +1427 -0
- xarm/core/config/x_config.py +553 -0
- xarm/core/utils/__init__.py +3 -0
- xarm/core/utils/convert.py +124 -0
- xarm/core/utils/crc16.py +76 -0
- xarm/core/utils/debug_print.py +21 -0
- xarm/core/utils/log.py +98 -0
- xarm/core/version.py +1 -0
- xarm/core/wrapper/__init__.py +11 -0
- xarm/core/wrapper/uxbus_cmd.py +1457 -0
- xarm/core/wrapper/uxbus_cmd_ser.py +94 -0
- xarm/core/wrapper/uxbus_cmd_tcp.py +305 -0
- xarm/tools/__init__.py +0 -0
- xarm/tools/blockly/__init__.py +1 -0
- xarm/tools/blockly/_blockly_base.py +416 -0
- xarm/tools/blockly/_blockly_handler.py +1338 -0
- xarm/tools/blockly/_blockly_highlight.py +94 -0
- xarm/tools/blockly/_blockly_node.py +61 -0
- xarm/tools/blockly/_blockly_tool.py +480 -0
- xarm/tools/blockly_tool.py +1864 -0
- xarm/tools/gcode.py +90 -0
- xarm/tools/list_ports.py +39 -0
- xarm/tools/modbus_tcp.py +205 -0
- xarm/tools/threads.py +30 -0
- xarm/tools/utils.py +36 -0
- xarm/version.py +1 -0
- xarm/wrapper/__init__.py +1 -0
- xarm/wrapper/studio_api.py +34 -0
- xarm/wrapper/xarm_api.py +4416 -0
- xarm/x3/__init__.py +2 -0
- xarm/x3/base.py +2638 -0
- xarm/x3/base_board.py +198 -0
- xarm/x3/code.py +62 -0
- xarm/x3/decorator.py +104 -0
- xarm/x3/events.py +166 -0
- xarm/x3/ft_sensor.py +264 -0
- xarm/x3/gpio.py +457 -0
- xarm/x3/grammar_async.py +21 -0
- xarm/x3/grammar_coroutine.py +24 -0
- xarm/x3/gripper.py +830 -0
- xarm/x3/modbus_tcp.py +84 -0
- xarm/x3/parse.py +110 -0
- xarm/x3/record.py +216 -0
- xarm/x3/report.py +204 -0
- xarm/x3/robotiq.py +220 -0
- xarm/x3/servo.py +485 -0
- xarm/x3/studio.py +138 -0
- xarm/x3/track.py +424 -0
- xarm/x3/utils.py +43 -0
- xarm/x3/xarm.py +1928 -0
- xarm_python_sdk-1.15.2.dist-info/METADATA +103 -0
- xarm_python_sdk-1.15.2.dist-info/RECORD +63 -0
- xarm_python_sdk-1.15.2.dist-info/WHEEL +4 -0
- xarm_python_sdk-1.15.2.dist-info/licenses/LICENSE +27 -0
xarm/x3/track.py
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# __author: rock
|
|
3
|
+
# @time: 2021-07-19
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from ..core.config.x_config import XCONF
|
|
7
|
+
from ..core.utils.log import logger
|
|
8
|
+
from ..core.utils import convert
|
|
9
|
+
from .code import APIState
|
|
10
|
+
from .gpio import GPIO
|
|
11
|
+
from .decorator import xarm_is_connected, xarm_wait_until_not_pause, xarm_is_not_simulation_mode
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Track(GPIO):
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
super(Track, self).__init__()
|
|
18
|
+
self._linear_track_status = {
|
|
19
|
+
'pos': 0,
|
|
20
|
+
'status': 0,
|
|
21
|
+
'error': 0,
|
|
22
|
+
'is_enabled': 0,
|
|
23
|
+
'on_zero': 0,
|
|
24
|
+
'sci': 1,
|
|
25
|
+
'sco': [0, 0],
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def linear_track_status(self):
|
|
30
|
+
return self._linear_track_status
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def linear_track_error_code(self):
|
|
34
|
+
return self._linear_track_status['error']
|
|
35
|
+
|
|
36
|
+
@linear_track_error_code.setter
|
|
37
|
+
def linear_track_error_code(self, val):
|
|
38
|
+
self._linear_track_status['error'] = val
|
|
39
|
+
|
|
40
|
+
def _get_linear_track_registers(self, addr, number_of_registers=1):
|
|
41
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
42
|
+
if code != 0:
|
|
43
|
+
return code, []
|
|
44
|
+
ret = self.arm_cmd.track_modbus_r16s(addr, number_of_registers)
|
|
45
|
+
ret[0] = self._check_modbus_code(ret, length=5 + 2 * number_of_registers, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
46
|
+
return ret[0], ret[1:]
|
|
47
|
+
|
|
48
|
+
@xarm_is_connected(_type='get')
|
|
49
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
50
|
+
def get_linear_track_registers(self, addr=0x0A20, number_of_registers=8):
|
|
51
|
+
assert (addr == 0x0A20 and number_of_registers >= 2) \
|
|
52
|
+
or (0x0A22 <= addr <= 0x0A27 and number_of_registers >= 1), \
|
|
53
|
+
'parameters error, only support (addr == 0x0A20 and number_of_registers >= 2) ' \
|
|
54
|
+
'or (0x0A22 <= addr <= 0x0A27 and number_of_registers >= 1)'
|
|
55
|
+
code, data = self._get_linear_track_registers(addr, number_of_registers=number_of_registers)
|
|
56
|
+
if code == 0:
|
|
57
|
+
if addr == 0x0A20 and number_of_registers >= 2:
|
|
58
|
+
self._linear_track_status['pos'] = round(convert.bytes_to_long_big(data[4:8]) / 2000)
|
|
59
|
+
if 0x0A22 - number_of_registers < addr <= 0x0A22:
|
|
60
|
+
start_inx = (0x0A22 - addr) * 2 + 4
|
|
61
|
+
self._linear_track_status['status'] = convert.bytes_to_u16(data[start_inx:start_inx+2])
|
|
62
|
+
if 0x0A23 - number_of_registers < addr <= 0x0A23:
|
|
63
|
+
start_inx = (0x0A23 - addr) * 2 + 4
|
|
64
|
+
self._linear_track_status['error'] = convert.bytes_to_u16(data[start_inx:start_inx+2])
|
|
65
|
+
if 0x0A24 - number_of_registers < addr <= 0x0A24:
|
|
66
|
+
start_inx = (0x0A24 - addr) * 2 + 4
|
|
67
|
+
self._linear_track_status['is_enabled'] = convert.bytes_to_u16(data[start_inx:start_inx+2]) & 0x01
|
|
68
|
+
self.linear_track_is_enabled = self._linear_track_status['is_enabled'] == 1
|
|
69
|
+
if 0x0A25 - number_of_registers < addr <= 0x0A25:
|
|
70
|
+
start_inx = (0x0A25 - addr) * 2 + 4
|
|
71
|
+
self._linear_track_status['on_zero'] = convert.bytes_to_u16(data[start_inx:start_inx+2]) & 0x01
|
|
72
|
+
if 0x0A26 - number_of_registers < addr <= 0x0A26:
|
|
73
|
+
start_inx = (0x0A26 - addr) * 2 + 4
|
|
74
|
+
self._linear_track_status['sci'] = convert.bytes_to_u16(data[start_inx:start_inx+2]) >> 1 & 0x01
|
|
75
|
+
if 0x0A27 - number_of_registers < addr <= 0x0A27:
|
|
76
|
+
start_inx = (0x0A27 - addr) * 2 + 4
|
|
77
|
+
sco = convert.bytes_to_u16(data[start_inx:start_inx+2])
|
|
78
|
+
self._linear_track_status['sco'][0] = sco & 0x01
|
|
79
|
+
self._linear_track_status['sco'][1] = sco >> 1 & 0x01
|
|
80
|
+
return code, self._linear_track_status
|
|
81
|
+
|
|
82
|
+
def get_linear_track_pos(self):
|
|
83
|
+
code, _ = self.get_linear_track_registers(addr=0x0A20, number_of_registers=2)
|
|
84
|
+
return code, self._linear_track_status['pos']
|
|
85
|
+
|
|
86
|
+
def get_linear_track_status(self):
|
|
87
|
+
code, _ = self.get_linear_track_registers(addr=0x0A22, number_of_registers=1)
|
|
88
|
+
return code, self._linear_track_status['status']
|
|
89
|
+
|
|
90
|
+
def get_linear_track_error(self):
|
|
91
|
+
code, _ = self.get_linear_track_registers(addr=0x0A23, number_of_registers=1)
|
|
92
|
+
return code, self._linear_track_status['error']
|
|
93
|
+
|
|
94
|
+
def get_linear_track_is_enabled(self):
|
|
95
|
+
code, _ = self.get_linear_track_registers(addr=0x0A24, number_of_registers=1)
|
|
96
|
+
return code, self._linear_track_status['is_enabled']
|
|
97
|
+
|
|
98
|
+
def get_linear_track_on_zero(self):
|
|
99
|
+
code, _ = self.get_linear_track_registers(addr=0x0A25, number_of_registers=1)
|
|
100
|
+
return code, self._linear_track_status['on_zero']
|
|
101
|
+
|
|
102
|
+
def get_linear_track_sci(self):
|
|
103
|
+
code, _ = self.get_linear_track_registers(addr=0x0A26, number_of_registers=1)
|
|
104
|
+
return code, self._linear_track_status['sci']
|
|
105
|
+
|
|
106
|
+
def get_linear_track_sco(self):
|
|
107
|
+
code, _ = self.get_linear_track_registers(addr=0x0A27, number_of_registers=1)
|
|
108
|
+
return code, self._linear_track_status['sco']
|
|
109
|
+
|
|
110
|
+
@xarm_is_connected(_type='set')
|
|
111
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
112
|
+
def set_linear_track_enable(self, enable):
|
|
113
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
114
|
+
if code != 0:
|
|
115
|
+
return code
|
|
116
|
+
value = convert.u16_to_bytes(int(enable))
|
|
117
|
+
ret = self.arm_cmd.track_modbus_w16s(XCONF.ServoConf.CON_EN, value, 1)
|
|
118
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
119
|
+
# get_status: error, is_enable, on_zero
|
|
120
|
+
code2, status = self.get_linear_track_registers(addr=0x0A23, number_of_registers=3)
|
|
121
|
+
if ret[0] == 0 and self._linear_track_status['error'] == 0 and enable:
|
|
122
|
+
self.linear_track_is_enabled = self._linear_track_status['is_enabled'] == 1
|
|
123
|
+
else:
|
|
124
|
+
self.linear_track_is_enabled = False
|
|
125
|
+
self.log_api_info('API -> set_linear_track_enable(enable={}) -> code1={}, code2={}, err={}, enabled={}, zero={}'.format(
|
|
126
|
+
enable, ret[0], code2, status['error'], status['is_enabled'], status['on_zero']), code=ret[0])
|
|
127
|
+
return ret[0] if self.linear_track_error_code == 0 else APIState.LINEAR_TRACK_HAS_FAULT
|
|
128
|
+
|
|
129
|
+
@xarm_is_connected(_type='set')
|
|
130
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
131
|
+
def set_linear_track_back_origin(self, wait=True, **kwargs):
|
|
132
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
133
|
+
if code != 0:
|
|
134
|
+
return code
|
|
135
|
+
auto_enable = kwargs.get('auto_enable', True)
|
|
136
|
+
timeout = kwargs.get('timeout', 10)
|
|
137
|
+
ret = self.arm_cmd.track_modbus_r16s(XCONF.ServoConf.BACK_ORIGIN, 1, 0x06)
|
|
138
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
139
|
+
# get_status: error, is_enable, on_zero
|
|
140
|
+
code2, status = self.get_linear_track_registers(addr=0x0A23, number_of_registers=3)
|
|
141
|
+
self.log_api_info(
|
|
142
|
+
'API -> set_linear_track_back_origin() -> code1={}, code2={}, err={}, enabled={}, zero={}'.format(
|
|
143
|
+
ret[0], code2, status['error'], status['is_enabled'], status['on_zero']), code=ret[0])
|
|
144
|
+
if ret[0] == 0 and wait:
|
|
145
|
+
ret[0] = self.__wait_linear_track_back_origin(timeout)
|
|
146
|
+
if auto_enable:
|
|
147
|
+
ret[0] = self.set_linear_track_enable(True)
|
|
148
|
+
return ret[0] if self.linear_track_error_code == 0 else APIState.LINEAR_TRACK_HAS_FAULT
|
|
149
|
+
|
|
150
|
+
@xarm_is_connected(_type='set')
|
|
151
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
152
|
+
def set_linear_track_pos(self, pos, speed=None, wait=True, timeout=100, **kwargs):
|
|
153
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
154
|
+
if code != 0:
|
|
155
|
+
return code
|
|
156
|
+
auto_enable = kwargs.get('auto_enable', True)
|
|
157
|
+
# get_status: error, is_enable, on_zero
|
|
158
|
+
code, status = self.get_linear_track_registers(addr=0x0A23, number_of_registers=3)
|
|
159
|
+
if code == 0 and status['on_zero'] != 1:
|
|
160
|
+
logger.warn('linear track is not on zero, please set linear track back to origin')
|
|
161
|
+
return APIState.LINEAR_TRACK_NOT_INIT
|
|
162
|
+
if auto_enable and (code != 0 or status['is_enabled'] != 1):
|
|
163
|
+
self.set_linear_track_enable(auto_enable)
|
|
164
|
+
if speed is not None and self.linear_track_speed != speed:
|
|
165
|
+
self.set_linear_track_speed(speed)
|
|
166
|
+
value = convert.int32_to_bytes(int(pos * 2000), is_big_endian=True)
|
|
167
|
+
ret = self.arm_cmd.track_modbus_w16s(XCONF.ServoConf.TAGET_POS, value, 2)
|
|
168
|
+
self.get_linear_track_registers(addr=0x0A23, number_of_registers=3)
|
|
169
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
170
|
+
self.log_api_info('API -> set_linear_track_pos(pos={}) -> code={}, err={}, enabled={}, zero={}'.format(
|
|
171
|
+
pos, ret[0], self._linear_track_status['error'],
|
|
172
|
+
self._linear_track_status['is_enabled'], self._linear_track_status['on_zero']), code=ret[0])
|
|
173
|
+
if ret[0] == 0 and wait:
|
|
174
|
+
return self.__wait_linear_track_stop(timeout)
|
|
175
|
+
return ret[0] if self.linear_track_error_code == 0 else APIState.LINEAR_TRACK_HAS_FAULT
|
|
176
|
+
|
|
177
|
+
@xarm_is_connected(_type='set')
|
|
178
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
179
|
+
def set_linear_track_speed(self, speed):
|
|
180
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
181
|
+
if code != 0:
|
|
182
|
+
return code
|
|
183
|
+
value = convert.u16_to_bytes(int(speed*6.667))
|
|
184
|
+
ret = self.arm_cmd.track_modbus_w16s(XCONF.ServoConf.POS_SPD, value, 1)
|
|
185
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
186
|
+
if ret[0] == 0:
|
|
187
|
+
self.linear_track_speed = speed
|
|
188
|
+
self.log_api_info('API -> set_linear_track_speed(speed={}) -> code={}'.format(speed, ret[0]), code=ret[0])
|
|
189
|
+
return ret[0]
|
|
190
|
+
|
|
191
|
+
@xarm_is_connected(_type='set')
|
|
192
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
193
|
+
def set_linear_track_stop(self):
|
|
194
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
195
|
+
if code != 0:
|
|
196
|
+
return code
|
|
197
|
+
value = convert.u16_to_bytes(int(1))
|
|
198
|
+
ret = self.arm_cmd.track_modbus_w16s(XCONF.ServoConf.STOP_TRACK, value, 1)
|
|
199
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
200
|
+
# get_status: error, is_enable, on_zero
|
|
201
|
+
code2, status = self.get_linear_track_registers(addr=0x0A22, number_of_registers=2)
|
|
202
|
+
self.log_api_info('API -> set_linear_track_stop() -> code={}, code2={}, status={}, err={}'.format(
|
|
203
|
+
ret[0], code2, status['status'], status['error']), code=ret[0])
|
|
204
|
+
return ret[0]
|
|
205
|
+
|
|
206
|
+
@xarm_is_connected(_type='get')
|
|
207
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
208
|
+
def clean_linear_track_error(self):
|
|
209
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
210
|
+
if code != 0:
|
|
211
|
+
return code
|
|
212
|
+
value = convert.u16_to_bytes(int(1))
|
|
213
|
+
self.linear_track_error_code = 0
|
|
214
|
+
ret = self.arm_cmd.track_modbus_w16s(XCONF.ServoConf.RESET_ERR, value, 1)
|
|
215
|
+
_, err = self.get_linear_track_error()
|
|
216
|
+
self.log_api_info('API -> clean_linear_track_error -> code={}, code2={}, err={}'.format(ret[0], _, err),
|
|
217
|
+
code=ret[0])
|
|
218
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
219
|
+
return ret[0] if self.linear_track_error_code == 0 else APIState.LINEAR_TRACK_HAS_FAULT
|
|
220
|
+
|
|
221
|
+
def __wait_linear_track_stop(self, timeout=100):
|
|
222
|
+
failed_cnt = 0
|
|
223
|
+
if not timeout or not isinstance(timeout, (int, float)) or timeout <= 0:
|
|
224
|
+
timeout = 100
|
|
225
|
+
expired = time.monotonic() + timeout
|
|
226
|
+
code = APIState.WAIT_FINISH_TIMEOUT
|
|
227
|
+
while self.connected and time.monotonic() < expired:
|
|
228
|
+
_, status = self.get_linear_track_registers(addr=0x0A22, number_of_registers=5)
|
|
229
|
+
if _ == 0 and status['sci'] == 0:
|
|
230
|
+
return APIState.LINEAR_TRACK_SCI_IS_LOW
|
|
231
|
+
if _ == 0 and status['error'] != 0:
|
|
232
|
+
return APIState.LINEAR_TRACK_HAS_FAULT
|
|
233
|
+
failed_cnt = 0 if _ == 0 else failed_cnt + 1
|
|
234
|
+
if _ == 0 and (status['status'] & 0x01 == 0):
|
|
235
|
+
return 0
|
|
236
|
+
else:
|
|
237
|
+
if failed_cnt > 10:
|
|
238
|
+
return APIState.CHECK_FAILED
|
|
239
|
+
time.sleep(0.1)
|
|
240
|
+
return code
|
|
241
|
+
|
|
242
|
+
def __wait_linear_track_back_origin(self, timeout=10):
|
|
243
|
+
failed_cnt = 0
|
|
244
|
+
if not timeout or not isinstance(timeout, (int, float)) or timeout <= 0:
|
|
245
|
+
timeout = 10
|
|
246
|
+
expired = time.monotonic() + timeout
|
|
247
|
+
code = APIState.WAIT_FINISH_TIMEOUT
|
|
248
|
+
while self.connected and time.monotonic() < expired:
|
|
249
|
+
_, status = self.get_linear_track_registers(addr=0x0A22, number_of_registers=5)
|
|
250
|
+
if _ == 0 and status['sci'] == 0:
|
|
251
|
+
return APIState.LINEAR_TRACK_SCI_IS_LOW
|
|
252
|
+
if _ == 0 and status['error'] != 0:
|
|
253
|
+
return APIState.LINEAR_TRACK_HAS_FAULT
|
|
254
|
+
failed_cnt = 0 if _ == 0 else failed_cnt + 1
|
|
255
|
+
if _ == 0 and status['on_zero'] == 1:
|
|
256
|
+
return 0
|
|
257
|
+
else:
|
|
258
|
+
if failed_cnt > 10:
|
|
259
|
+
return APIState.CHECK_FAILED
|
|
260
|
+
time.sleep(0.1)
|
|
261
|
+
return code
|
|
262
|
+
|
|
263
|
+
@xarm_is_connected(_type='get')
|
|
264
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
265
|
+
def get_linear_track_version(self):
|
|
266
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
267
|
+
if code != 0:
|
|
268
|
+
return code, '*.*.*'
|
|
269
|
+
versions = ['*', '*', '*']
|
|
270
|
+
ret1 = self.arm_cmd.track_modbus_r16s(0x0801, 1)
|
|
271
|
+
ret2 = self.arm_cmd.track_modbus_r16s(0x0802, 1)
|
|
272
|
+
ret3 = self.arm_cmd.track_modbus_r16s(0x0803, 1)
|
|
273
|
+
ret1[0] = self._check_modbus_code(ret1, length=7, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
274
|
+
ret2[0] = self._check_modbus_code(ret2, length=7, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
275
|
+
ret3[0] = self._check_modbus_code(ret3, length=7, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
276
|
+
|
|
277
|
+
code = 0
|
|
278
|
+
|
|
279
|
+
if ret1[0] == 0:
|
|
280
|
+
versions[0] = convert.bytes_to_u16(ret1[5:7])
|
|
281
|
+
else:
|
|
282
|
+
code = ret1[0]
|
|
283
|
+
|
|
284
|
+
if ret2[0] == 0:
|
|
285
|
+
versions[1] = convert.bytes_to_u16(ret2[5:7])
|
|
286
|
+
else:
|
|
287
|
+
code = ret2[0]
|
|
288
|
+
|
|
289
|
+
if ret3[0] == 0:
|
|
290
|
+
versions[2] = convert.bytes_to_u16(ret3[5:7])
|
|
291
|
+
else:
|
|
292
|
+
code = ret3[0]
|
|
293
|
+
|
|
294
|
+
return code, '.'.join(map(str, versions))
|
|
295
|
+
|
|
296
|
+
@xarm_is_connected(_type='get')
|
|
297
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
298
|
+
def get_linear_track_sn(self):
|
|
299
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
300
|
+
if code != 0:
|
|
301
|
+
return code, None
|
|
302
|
+
rd_sn = ''
|
|
303
|
+
ret = [0, '']
|
|
304
|
+
for i in range(0, 14):
|
|
305
|
+
ret = self.arm_cmd.track_modbus_r16s(0x0B10 + i, 1)
|
|
306
|
+
ret[0] = self._check_modbus_code(ret, length=7, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
307
|
+
if chr(ret[-1]).isalnum():
|
|
308
|
+
rd_sn = ''.join([rd_sn, chr(ret[-1])])
|
|
309
|
+
else:
|
|
310
|
+
rd_sn = ''.join([rd_sn, '*'])
|
|
311
|
+
time.sleep(0.05)
|
|
312
|
+
return ret[0], rd_sn
|
|
313
|
+
|
|
314
|
+
@xarm_is_connected(_type='set')
|
|
315
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
316
|
+
def set_linear_track_sn(self, sn):
|
|
317
|
+
assert len(sn) >= 14, 'The length of SN is wrong'
|
|
318
|
+
code = self.checkset_modbus_baud(self._default_linear_track_baud, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
319
|
+
if code != 0:
|
|
320
|
+
return code
|
|
321
|
+
code = 0
|
|
322
|
+
if len(sn) == 14:
|
|
323
|
+
for i in range(0, 14):
|
|
324
|
+
value = convert.u16_to_bytes(ord(sn[i]))
|
|
325
|
+
ret = self.arm_cmd.track_modbus_w16s(0x1B10 + i, value, 1)
|
|
326
|
+
code = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
327
|
+
if code != 0:
|
|
328
|
+
break
|
|
329
|
+
time.sleep(0.05)
|
|
330
|
+
return code
|
|
331
|
+
|
|
332
|
+
def _set_linear_track_registers(self, addr, value, number_of_registers=1):
|
|
333
|
+
ret = self.arm_cmd.track_modbus_w16s(addr, value, number_of_registers)
|
|
334
|
+
ret[0] = self._check_modbus_code(ret, length=8, host_id=XCONF.LINEER_TRACK_HOST_ID)
|
|
335
|
+
return ret[0], ret[1:]
|
|
336
|
+
|
|
337
|
+
@xarm_is_connected(_type='set')
|
|
338
|
+
@xarm_is_not_simulation_mode(ret=(0, []))
|
|
339
|
+
def set_linear_track_default_parmas(self):
|
|
340
|
+
code_li = []
|
|
341
|
+
motro_type = convert.u16_to_bytes(610) # 电机类型
|
|
342
|
+
ret = self._set_linear_track_registers(0x1804, motro_type, 1)
|
|
343
|
+
code_li.append(ret[0])
|
|
344
|
+
time.sleep(0.05)
|
|
345
|
+
|
|
346
|
+
power_level = convert.u16_to_bytes(1) # 功率等级
|
|
347
|
+
ret = self._set_linear_track_registers(0x1901, power_level, 1)
|
|
348
|
+
code_li.append(ret[0])
|
|
349
|
+
time.sleep(0.05)
|
|
350
|
+
|
|
351
|
+
speed = convert.u16_to_bytes(5000) # 滑轨运行速度
|
|
352
|
+
ret = self._set_linear_track_registers(0x0303, speed, 1)
|
|
353
|
+
code_li.append(ret[0])
|
|
354
|
+
time.sleep(0.05)
|
|
355
|
+
|
|
356
|
+
toq_ref_flt = convert.u16_to_bytes(0)
|
|
357
|
+
ret = self._set_linear_track_registers(0x0501, toq_ref_flt, 1)
|
|
358
|
+
code_li.append(ret[0])
|
|
359
|
+
time.sleep(0.05)
|
|
360
|
+
|
|
361
|
+
position_gain = convert.u16_to_bytes(250) # 位置环增益
|
|
362
|
+
ret = self._set_linear_track_registers(0x1200, position_gain, 1)
|
|
363
|
+
code_li.append(ret[0])
|
|
364
|
+
time.sleep(0.05)
|
|
365
|
+
|
|
366
|
+
filter_times = convert.u16_to_bytes(5) # 位置环前滤波时间
|
|
367
|
+
speedz_kp = convert.u16_to_bytes(200) # 速度环增益
|
|
368
|
+
speed_ki = convert.u16_to_bytes(150) # 速度环积分
|
|
369
|
+
value = filter_times + speedz_kp + speed_ki
|
|
370
|
+
ret = self._set_linear_track_registers(0x1202, value, 3)
|
|
371
|
+
code_li.append(ret[0])
|
|
372
|
+
time.sleep(0.05)
|
|
373
|
+
|
|
374
|
+
acc_time = convert.u16_to_bytes(300) # 位置加速时间
|
|
375
|
+
dec_time = convert.u16_to_bytes(300) # 位置加速时间
|
|
376
|
+
smooth_time = convert.u16_to_bytes(10) # 位置平滑时间
|
|
377
|
+
value = acc_time + dec_time + smooth_time
|
|
378
|
+
ret = self._set_linear_track_registers(0x1300, value, 3)
|
|
379
|
+
code_li.append(ret[0])
|
|
380
|
+
time.sleep(0.05)
|
|
381
|
+
|
|
382
|
+
spd_ref_flt = convert.u16_to_bytes(160)
|
|
383
|
+
spd_fb_flt = convert.u16_to_bytes(160)
|
|
384
|
+
spd_limit = convert.u16_to_bytes(10000) # 运行速度限制
|
|
385
|
+
home_speed = convert.u16_to_bytes(1533) # 回零速度
|
|
386
|
+
value = spd_ref_flt + spd_fb_flt + spd_limit + home_speed
|
|
387
|
+
ret = self._set_linear_track_registers(0x1401, value, 4)
|
|
388
|
+
code_li.append(ret[0])
|
|
389
|
+
time.sleep(0.05)
|
|
390
|
+
|
|
391
|
+
current_kp = convert.u16_to_bytes(6000) # 电流增益
|
|
392
|
+
current_ki = convert.u16_to_bytes(1000) # 电流积分
|
|
393
|
+
value = current_kp + current_ki
|
|
394
|
+
ret = self._set_linear_track_registers(0x190C, value, 2)
|
|
395
|
+
code_li.append(ret[0])
|
|
396
|
+
time.sleep(0.05)
|
|
397
|
+
|
|
398
|
+
on_zero = convert.u16_to_bytes(0) # 是否回零默认值 0 --- 否 1 --- 是
|
|
399
|
+
tar_end = convert.u16_to_bytes(1000) # 定位完成范围
|
|
400
|
+
value = on_zero + tar_end
|
|
401
|
+
ret = self._set_linear_track_registers(0x1A0A, value, 2)
|
|
402
|
+
code_li.append(ret[0])
|
|
403
|
+
time.sleep(0.05)
|
|
404
|
+
|
|
405
|
+
angle_range = convert.u16_to_bytes(1800) # 上电校零两角度比较允许范围
|
|
406
|
+
is_stop = convert.u16_to_bytes(0) # 急停默认值 0 --- 没有急停 1 --- 急停
|
|
407
|
+
value = angle_range + is_stop
|
|
408
|
+
ret = self._set_linear_track_registers(0x1A0D, value, 2)
|
|
409
|
+
code_li.append(ret[0])
|
|
410
|
+
time.sleep(0.05)
|
|
411
|
+
|
|
412
|
+
is_on_zero = convert.u16_to_bytes(0) # 回零完成状态默认值 0 --- 没有回零完成 1 --- 回零完成
|
|
413
|
+
ret = self._set_linear_track_registers(0x1A25, is_on_zero, 1)
|
|
414
|
+
code_li.append(ret[0])
|
|
415
|
+
time.sleep(0.05)
|
|
416
|
+
|
|
417
|
+
for code in code_li:
|
|
418
|
+
if code != 0:
|
|
419
|
+
return code
|
|
420
|
+
|
|
421
|
+
return 0
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
|
xarm/x3/utils.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# !/usr/bin/env python3
|
|
2
|
+
# Software License Agreement (BSD License)
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2018, UFACTORY, Inc.
|
|
5
|
+
# All rights reserved.
|
|
6
|
+
#
|
|
7
|
+
# Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>
|
|
8
|
+
|
|
9
|
+
import time
|
|
10
|
+
import math
|
|
11
|
+
import functools
|
|
12
|
+
from ..core.utils.log import logger
|
|
13
|
+
from .code import APIState
|
|
14
|
+
from ..core.config.x_config import XCONF
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def compare_time(time1, time2):
|
|
18
|
+
try:
|
|
19
|
+
s_time = time.mktime(time.strptime(time1, '%Y-%m-%d'))
|
|
20
|
+
e_time = time.mktime(time.strptime(time2, '%Y-%m-%d'))
|
|
21
|
+
return int(s_time) - int(e_time) > 0
|
|
22
|
+
except:
|
|
23
|
+
return False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def compare_version(v1, v2):
|
|
27
|
+
for i in range(3):
|
|
28
|
+
if v1[i] > v2[i]:
|
|
29
|
+
return True
|
|
30
|
+
elif v1[i] < v2[i]:
|
|
31
|
+
return False
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def filter_invaild_number(num, ndigits=3, default=0.0):
|
|
36
|
+
if math.isnan(num) or math.isinf(num):
|
|
37
|
+
return round(default, 0) if ndigits < 0 else round(default, ndigits)
|
|
38
|
+
return round(num, 0) if ndigits < 0 else round(num, ndigits)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def to_radian(val, is_radian=False, default=0):
|
|
42
|
+
return default if val is None else float(val) if is_radian else math.radians(val)
|
|
43
|
+
|