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
|
@@ -0,0 +1,1457 @@
|
|
|
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: Jimy Zhang <jimy.zhang@ufactory.cc> <jimy92@163.com>
|
|
8
|
+
# Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>
|
|
9
|
+
|
|
10
|
+
import time
|
|
11
|
+
import math
|
|
12
|
+
import threading
|
|
13
|
+
import functools
|
|
14
|
+
from ..utils import convert
|
|
15
|
+
from ..config.x_config import XCONF
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def lock_require(func):
|
|
19
|
+
@functools.wraps(func)
|
|
20
|
+
def decorator(*args, **kwargs):
|
|
21
|
+
with args[0].lock:
|
|
22
|
+
return func(*args, **kwargs)
|
|
23
|
+
return decorator
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class UxbusCmd(object):
|
|
27
|
+
BAUDRATES = (4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600,
|
|
28
|
+
1000000, 1500000, 2000000, 2500000)
|
|
29
|
+
|
|
30
|
+
def __init__(self, set_feedback_key_tranid=None):
|
|
31
|
+
self._has_error = False
|
|
32
|
+
self._has_warn = False
|
|
33
|
+
self._state_is_ready = False
|
|
34
|
+
self._error_code = 0
|
|
35
|
+
self._warn_code = 0
|
|
36
|
+
self._cmd_num = 0
|
|
37
|
+
self._debug = False
|
|
38
|
+
self.lock = threading.Lock()
|
|
39
|
+
self._G_TOUT = XCONF.UxbusConf.GET_TIMEOUT / 1000
|
|
40
|
+
self._S_TOUT = XCONF.UxbusConf.SET_TIMEOUT / 1000
|
|
41
|
+
self._last_comm_time = time.monotonic()
|
|
42
|
+
self._last_modbus_comm_time = time.monotonic()
|
|
43
|
+
self._feedback_type = 0
|
|
44
|
+
self._set_feedback_key_tranid = set_feedback_key_tranid
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def last_comm_time(self):
|
|
48
|
+
return self._last_comm_time
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def state_is_ready(self):
|
|
52
|
+
return self._state_is_ready
|
|
53
|
+
|
|
54
|
+
def _get_trans_id(self):
|
|
55
|
+
return 0
|
|
56
|
+
|
|
57
|
+
def set_timeout(self, timeout):
|
|
58
|
+
try:
|
|
59
|
+
if isinstance(timeout, (tuple, list)):
|
|
60
|
+
if len(timeout) >= 2:
|
|
61
|
+
self._S_TOUT = timeout[0] if timeout[0] > 0 else self._S_TOUT
|
|
62
|
+
self._G_TOUT = timeout[1] if timeout[1] > 0 else self._G_TOUT
|
|
63
|
+
elif len(timeout) == 1:
|
|
64
|
+
self._S_TOUT = timeout[0] if timeout[0] > 0 else self._S_TOUT
|
|
65
|
+
self._G_TOUT = timeout[0] if timeout[0] > 0 else self._G_TOUT
|
|
66
|
+
elif isinstance(timeout, (int, float)):
|
|
67
|
+
self._S_TOUT = timeout if timeout > 0 else self._S_TOUT
|
|
68
|
+
self._G_TOUT = timeout if timeout > 0 else self._G_TOUT
|
|
69
|
+
except:
|
|
70
|
+
pass
|
|
71
|
+
return [self._S_TOUT, self._G_TOUT] if self._S_TOUT != self._G_TOUT else self._S_TOUT
|
|
72
|
+
|
|
73
|
+
def set_debug(self, debug):
|
|
74
|
+
self._debug = debug
|
|
75
|
+
|
|
76
|
+
def send_modbus_request(self, unit_id, pdu_data, pdu_len, prot_id=-1, t_id=None):
|
|
77
|
+
raise NotImplementedError
|
|
78
|
+
|
|
79
|
+
def recv_modbus_response(self, t_unit_id, t_trans_id, num, timeout, t_prot_id=-1, ret_raw=False):
|
|
80
|
+
raise NotImplementedError
|
|
81
|
+
|
|
82
|
+
@lock_require
|
|
83
|
+
def set_nu8(self, funcode, datas, num, timeout=None, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
|
|
84
|
+
need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
|
|
85
|
+
if feedback_key and need_set_fb:
|
|
86
|
+
self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
|
|
87
|
+
|
|
88
|
+
trans_id = self._get_trans_id()
|
|
89
|
+
if feedback_key and self._set_feedback_key_tranid:
|
|
90
|
+
self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
|
|
91
|
+
ret = self.send_modbus_request(funcode, datas, num)
|
|
92
|
+
if ret == -1:
|
|
93
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
94
|
+
ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT if timeout is None else timeout)
|
|
95
|
+
if feedback_key and need_set_fb:
|
|
96
|
+
self._set_feedback_type_no_lock(self._feedback_type)
|
|
97
|
+
return ret
|
|
98
|
+
|
|
99
|
+
@lock_require
|
|
100
|
+
def getset_nu8(self, funcode, datas, num_send, num_get):
|
|
101
|
+
ret = self.send_modbus_request(funcode, datas, num_send)
|
|
102
|
+
if ret == -1:
|
|
103
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
104
|
+
return self.recv_modbus_response(funcode, ret, num_get, self._S_TOUT)
|
|
105
|
+
|
|
106
|
+
@lock_require
|
|
107
|
+
def get_nu8(self, funcode, num):
|
|
108
|
+
ret = self.send_modbus_request(funcode, 0, 0)
|
|
109
|
+
if ret == -1:
|
|
110
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (num + 1)
|
|
111
|
+
return self.recv_modbus_response(funcode, ret, num, self._G_TOUT)
|
|
112
|
+
|
|
113
|
+
@lock_require
|
|
114
|
+
def set_nu16(self, funcode, datas, num, additional_bytes=None):
|
|
115
|
+
hexdata = convert.u16s_to_bytes(datas, num)
|
|
116
|
+
if additional_bytes is not None:
|
|
117
|
+
hexdata += additional_bytes
|
|
118
|
+
ret = self.send_modbus_request(funcode, hexdata, num * 2 + len(additional_bytes))
|
|
119
|
+
else:
|
|
120
|
+
ret = self.send_modbus_request(funcode, hexdata, num * 2)
|
|
121
|
+
if ret == -1:
|
|
122
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
123
|
+
ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
|
|
124
|
+
return ret
|
|
125
|
+
|
|
126
|
+
@lock_require
|
|
127
|
+
def get_nu16(self, funcode, num):
|
|
128
|
+
ret = self.send_modbus_request(funcode, 0, 0)
|
|
129
|
+
if ret == -1:
|
|
130
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (num * 2 + 1)
|
|
131
|
+
ret = self.recv_modbus_response(funcode, ret, num * 2, self._G_TOUT)
|
|
132
|
+
data = [0] * (1 + num)
|
|
133
|
+
data[0] = ret[0]
|
|
134
|
+
data[1:num] = convert.bytes_to_u16s(ret[1:num * 2 + 1], num)
|
|
135
|
+
return data
|
|
136
|
+
|
|
137
|
+
@lock_require
|
|
138
|
+
def set_nfp32(self, funcode, datas, num, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
|
|
139
|
+
need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
|
|
140
|
+
if feedback_key and need_set_fb:
|
|
141
|
+
self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
|
|
142
|
+
|
|
143
|
+
trans_id = self._get_trans_id()
|
|
144
|
+
if feedback_key and self._set_feedback_key_tranid:
|
|
145
|
+
self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
|
|
146
|
+
hexdata = convert.fp32s_to_bytes(datas, num)
|
|
147
|
+
ret = self.send_modbus_request(funcode, hexdata, num * 4)
|
|
148
|
+
if ret == -1:
|
|
149
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
150
|
+
ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
|
|
151
|
+
if feedback_key and need_set_fb:
|
|
152
|
+
self._set_feedback_type_no_lock(self._feedback_type)
|
|
153
|
+
return ret
|
|
154
|
+
|
|
155
|
+
@lock_require
|
|
156
|
+
def set_nfp32_with_bytes(self, funcode, datas, num, additional_bytes, rx_len=0, timeout=None, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
|
|
157
|
+
need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
|
|
158
|
+
if feedback_key and need_set_fb:
|
|
159
|
+
self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
|
|
160
|
+
|
|
161
|
+
trans_id = self._get_trans_id()
|
|
162
|
+
if feedback_key and self._set_feedback_key_tranid:
|
|
163
|
+
self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
|
|
164
|
+
hexdata = convert.fp32s_to_bytes(datas, num)
|
|
165
|
+
hexdata += additional_bytes
|
|
166
|
+
ret = self.send_modbus_request(funcode, hexdata, num * 4 + len(additional_bytes))
|
|
167
|
+
if ret == -1:
|
|
168
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
169
|
+
ret = self.recv_modbus_response(funcode, ret, rx_len, self._S_TOUT if timeout is None else timeout)
|
|
170
|
+
if feedback_key and need_set_fb:
|
|
171
|
+
self._set_feedback_type_no_lock(self._feedback_type)
|
|
172
|
+
return ret
|
|
173
|
+
|
|
174
|
+
@lock_require
|
|
175
|
+
def set_nint32(self, funcode, datas, num, feedback_key=None, feedback_type=XCONF.FeedbackType.MOTION_FINISH):
|
|
176
|
+
need_set_fb = feedback_type != 0 and (self._feedback_type & feedback_type) != feedback_type
|
|
177
|
+
if feedback_key and need_set_fb:
|
|
178
|
+
self._set_feedback_type_no_lock(self._feedback_type | feedback_type)
|
|
179
|
+
|
|
180
|
+
trans_id = self._get_trans_id()
|
|
181
|
+
if feedback_key and self._set_feedback_key_tranid:
|
|
182
|
+
self._set_feedback_key_tranid(feedback_key, trans_id, self._feedback_type)
|
|
183
|
+
hexdata = convert.int32s_to_bytes(datas, num)
|
|
184
|
+
ret = self.send_modbus_request(funcode, hexdata, num * 4)
|
|
185
|
+
if ret == -1:
|
|
186
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
187
|
+
ret = self.recv_modbus_response(funcode, ret, 0, self._S_TOUT)
|
|
188
|
+
if feedback_key and need_set_fb:
|
|
189
|
+
self._set_feedback_type_no_lock(self._feedback_type)
|
|
190
|
+
return ret
|
|
191
|
+
|
|
192
|
+
@lock_require
|
|
193
|
+
def get_nfp32(self, funcode, num, timeout=None):
|
|
194
|
+
ret = self.send_modbus_request(funcode, 0, 0)
|
|
195
|
+
if ret == -1:
|
|
196
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (num * 4 + 1)
|
|
197
|
+
ret = self.recv_modbus_response(funcode, ret, num * 4, timeout if timeout is not None else self._G_TOUT)
|
|
198
|
+
data = [0] * (1 + num)
|
|
199
|
+
data[0] = ret[0]
|
|
200
|
+
data[1:num+1] = convert.bytes_to_fp32s(ret[1:num * 4 + 1], num)
|
|
201
|
+
return data
|
|
202
|
+
|
|
203
|
+
@lock_require
|
|
204
|
+
def get_nfp32_with_datas(self, funcode, datas, num_send, num_get, timeout=None):
|
|
205
|
+
ret = self.send_modbus_request(funcode, datas, num_send)
|
|
206
|
+
if ret == -1:
|
|
207
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
208
|
+
ret = self.recv_modbus_response(funcode, ret, num_get * 4, timeout if timeout is not None else self._G_TOUT)
|
|
209
|
+
data = [0] * (1 + num_get)
|
|
210
|
+
data[0] = ret[0]
|
|
211
|
+
data[1:num_get + 1] = convert.bytes_to_fp32s(ret[1:num_get * 4 + 1], num_get)
|
|
212
|
+
return data
|
|
213
|
+
|
|
214
|
+
@lock_require
|
|
215
|
+
def swop_nfp32(self, funcode, datas, txn, rxn):
|
|
216
|
+
hexdata = convert.fp32s_to_bytes(datas, txn)
|
|
217
|
+
ret = self.send_modbus_request(funcode, hexdata, txn * 4)
|
|
218
|
+
if ret == -1:
|
|
219
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (rxn + 1)
|
|
220
|
+
ret = self.recv_modbus_response(funcode, ret, rxn * 4, self._G_TOUT)
|
|
221
|
+
data = [0] * (1 + rxn)
|
|
222
|
+
data[0] = ret[0]
|
|
223
|
+
data[1:rxn+1] = convert.bytes_to_fp32s(ret[1:rxn * 4 + 1], rxn)
|
|
224
|
+
return data
|
|
225
|
+
|
|
226
|
+
@lock_require
|
|
227
|
+
def is_nfp32(self, funcode, datas, txn):
|
|
228
|
+
hexdata = convert.fp32s_to_bytes(datas, txn)
|
|
229
|
+
ret = self.send_modbus_request(funcode, hexdata, txn * 4)
|
|
230
|
+
if ret == -1:
|
|
231
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * 2
|
|
232
|
+
return self.recv_modbus_response(funcode, ret, 1, self._G_TOUT)
|
|
233
|
+
|
|
234
|
+
def get_version(self):
|
|
235
|
+
return self.get_nu8(XCONF.UxbusReg.GET_VERSION, 40)
|
|
236
|
+
|
|
237
|
+
def get_robot_sn(self):
|
|
238
|
+
return self.get_nu8(XCONF.UxbusReg.GET_ROBOT_SN, 40)
|
|
239
|
+
|
|
240
|
+
def check_verification(self):
|
|
241
|
+
# txdata = signature, 175: signature length if use 14-character SN for plain text, do not miss '\n's
|
|
242
|
+
return self.get_nu8(XCONF.UxbusReg.CHECK_VERIFY, 1)
|
|
243
|
+
|
|
244
|
+
def system_control(self, value):
|
|
245
|
+
txdata = [value]
|
|
246
|
+
return self.set_nu8(XCONF.UxbusReg.SYSTEM_CONTROL, txdata, 1)
|
|
247
|
+
|
|
248
|
+
def set_record_traj(self, value):
|
|
249
|
+
txdata = [value]
|
|
250
|
+
return self.set_nu8(XCONF.UxbusReg.SET_TRAJ_RECORD, txdata, 1)
|
|
251
|
+
|
|
252
|
+
def playback_traj(self, value, spdx=1, feedback_key=None):
|
|
253
|
+
txdata = [value, spdx]
|
|
254
|
+
return self.set_nint32(XCONF.UxbusReg.PLAY_TRAJ, txdata, 2, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
|
|
255
|
+
|
|
256
|
+
def playback_traj_old(self, value):
|
|
257
|
+
txdata = [value]
|
|
258
|
+
return self.set_nint32(XCONF.UxbusReg.PLAY_TRAJ, txdata, 1)
|
|
259
|
+
|
|
260
|
+
def save_traj(self, filename, wait_time=2, feedback_key=None):
|
|
261
|
+
char_list = list(filename)
|
|
262
|
+
txdata = [ord(i) for i in char_list]
|
|
263
|
+
name_len = len(txdata)
|
|
264
|
+
if name_len > 80:
|
|
265
|
+
print("name length should not exceed 80 characters!")
|
|
266
|
+
return [XCONF.UxbusState.ERR_PARAM]
|
|
267
|
+
txdata = txdata + [0] * (81 - name_len)
|
|
268
|
+
|
|
269
|
+
ret = self.set_nu8(XCONF.UxbusReg.SAVE_TRAJ, txdata, 81, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
|
|
270
|
+
time.sleep(wait_time) # Must! or buffer would be flushed if set mode to pos_mode
|
|
271
|
+
return ret
|
|
272
|
+
|
|
273
|
+
def load_traj(self, filename, wait_time=2, feedback_key=None):
|
|
274
|
+
char_list = list(filename)
|
|
275
|
+
txdata = [ord(i) for i in char_list]
|
|
276
|
+
name_len = len(txdata)
|
|
277
|
+
if name_len > 80:
|
|
278
|
+
print("name length should not exceed 80 characters!")
|
|
279
|
+
return [XCONF.UxbusState.ERR_PARAM]
|
|
280
|
+
txdata = txdata + [0] * (81 - name_len)
|
|
281
|
+
|
|
282
|
+
ret = self.set_nu8(XCONF.UxbusReg.LOAD_TRAJ, txdata, 81, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.OTHER_FINISH)
|
|
283
|
+
if wait_time > 0:
|
|
284
|
+
time.sleep(wait_time) # Must! or buffer would be flushed if set mode to pos_mode
|
|
285
|
+
return ret
|
|
286
|
+
|
|
287
|
+
def get_traj_rw_status(self):
|
|
288
|
+
return self.get_nu8(XCONF.UxbusReg.GET_TRAJ_RW_STATUS, 1)
|
|
289
|
+
|
|
290
|
+
def set_reduced_mode(self, on_off):
|
|
291
|
+
txdata = [on_off]
|
|
292
|
+
return self.set_nu8(XCONF.UxbusReg.SET_REDUCED_MODE, txdata, 1)
|
|
293
|
+
|
|
294
|
+
def set_reduced_linespeed(self, lspd_mm):
|
|
295
|
+
txdata = [lspd_mm]
|
|
296
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_TRSV, txdata, 1)
|
|
297
|
+
|
|
298
|
+
def set_reduced_jointspeed(self, jspd_rad):
|
|
299
|
+
txdata = [jspd_rad]
|
|
300
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_P2PV, txdata, 1)
|
|
301
|
+
|
|
302
|
+
def get_reduced_mode(self):
|
|
303
|
+
return self.get_nu8(XCONF.UxbusReg.GET_REDUCED_MODE, 1)
|
|
304
|
+
|
|
305
|
+
def get_reduced_states(self, length=21):
|
|
306
|
+
ret = self.get_nu8(XCONF.UxbusReg.GET_REDUCED_STATE, length)
|
|
307
|
+
msg = [0] * 8
|
|
308
|
+
msg[0] = ret[0]
|
|
309
|
+
msg[1] = ret[1] # reduced_mode_is_on
|
|
310
|
+
msg[2] = convert.bytes_to_16s(ret[2:14], 6) # tcp_boundary
|
|
311
|
+
msg[3:5] = convert.bytes_to_fp32s(ret[14:22], 2) # tcp_speed, joint_speed
|
|
312
|
+
if length == 79:
|
|
313
|
+
msg[5] = convert.bytes_to_fp32s(ret[22:78], 14) # joint range
|
|
314
|
+
msg[6:8] = ret[78:80] # fense_is_on, collision_rebound
|
|
315
|
+
return msg
|
|
316
|
+
|
|
317
|
+
def set_xyz_limits(self, xyz_list):
|
|
318
|
+
return self.set_nint32(XCONF.UxbusReg.SET_LIMIT_XYZ, xyz_list, 6)
|
|
319
|
+
|
|
320
|
+
def set_timer(self, sec_later, timer_id, fun_code, param1=0, param2=0):
|
|
321
|
+
txdata = [sec_later, timer_id, fun_code, param1, param2]
|
|
322
|
+
return self.set_nint32(XCONF.UxbusReg.SET_TIMER, txdata, 5)
|
|
323
|
+
|
|
324
|
+
def cancel_timer(self, timer_id):
|
|
325
|
+
txdata = [timer_id]
|
|
326
|
+
return self.set_nint32(XCONF.UxbusReg.CANCEL_TIMER, txdata, 1)
|
|
327
|
+
|
|
328
|
+
def set_world_offset(self, pose_offset):
|
|
329
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_WORLD_OFFSET, pose_offset, 6)
|
|
330
|
+
|
|
331
|
+
def cnter_reset(self):
|
|
332
|
+
return self.set_nu8(XCONF.UxbusReg.CNTER_RESET, 0, 0)
|
|
333
|
+
|
|
334
|
+
def cnter_plus(self):
|
|
335
|
+
return self.set_nu8(XCONF.UxbusReg.CNTER_PLUS, 0, 0)
|
|
336
|
+
|
|
337
|
+
def set_reduced_jrange(self, jrange_rad):
|
|
338
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_REDUCED_JRANGE, jrange_rad, 14)
|
|
339
|
+
|
|
340
|
+
def set_fense_on(self, on_off):
|
|
341
|
+
txdata = [on_off]
|
|
342
|
+
return self.set_nu8(XCONF.UxbusReg.SET_FENSE_ON, txdata, 1)
|
|
343
|
+
|
|
344
|
+
def set_collis_reb(self, on_off):
|
|
345
|
+
txdata = [on_off]
|
|
346
|
+
return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_REB, txdata, 1)
|
|
347
|
+
|
|
348
|
+
def motion_en(self, axis_id, enable):
|
|
349
|
+
txdata = [axis_id, int(enable)]
|
|
350
|
+
return self.set_nu8(XCONF.UxbusReg.MOTION_EN, txdata, 2, timeout=self._S_TOUT if self._S_TOUT >= 5 else 5)
|
|
351
|
+
|
|
352
|
+
def set_state(self, value):
|
|
353
|
+
txdata = [value]
|
|
354
|
+
return self.set_nu8(XCONF.UxbusReg.SET_STATE, txdata, 1)
|
|
355
|
+
|
|
356
|
+
def get_state(self):
|
|
357
|
+
return self.get_nu8(XCONF.UxbusReg.GET_STATE, 1)
|
|
358
|
+
|
|
359
|
+
def get_cmdnum(self):
|
|
360
|
+
return self.get_nu16(XCONF.UxbusReg.GET_CMDNUM, 1)
|
|
361
|
+
|
|
362
|
+
def get_err_code(self):
|
|
363
|
+
return self.get_nu8(XCONF.UxbusReg.GET_ERROR, 2)
|
|
364
|
+
|
|
365
|
+
def get_hd_types(self):
|
|
366
|
+
return self.get_nu8(XCONF.UxbusReg.GET_HD_TYPES, 2)
|
|
367
|
+
|
|
368
|
+
def reload_dynamics(self):
|
|
369
|
+
return self.set_nu8(XCONF.UxbusReg.RELOAD_DYNAMICS, 0, 0)
|
|
370
|
+
|
|
371
|
+
def clean_err(self):
|
|
372
|
+
return self.set_nu8(XCONF.UxbusReg.CLEAN_ERR, 0, 0)
|
|
373
|
+
|
|
374
|
+
def clean_war(self):
|
|
375
|
+
return self.set_nu8(XCONF.UxbusReg.CLEAN_WAR, 0, 0)
|
|
376
|
+
|
|
377
|
+
def set_brake(self, axis_id, enable):
|
|
378
|
+
txdata = [axis_id, int(enable)]
|
|
379
|
+
return self.set_nu8(XCONF.UxbusReg.SET_BRAKE, txdata, 2)
|
|
380
|
+
|
|
381
|
+
def set_mode(self, mode, detection_param=-1):
|
|
382
|
+
if detection_param >= 0:
|
|
383
|
+
txdata = [mode, detection_param]
|
|
384
|
+
return self.set_nu8(XCONF.UxbusReg.SET_MODE, txdata, 2)
|
|
385
|
+
else:
|
|
386
|
+
txdata = [mode]
|
|
387
|
+
return self.set_nu8(XCONF.UxbusReg.SET_MODE, txdata, 1)
|
|
388
|
+
|
|
389
|
+
def set_report_tau_or_i(self, tau_or_i): # 0 for tau(default), 1 for i
|
|
390
|
+
txdata = [tau_or_i]
|
|
391
|
+
return self.set_nu8(XCONF.UxbusReg.REPORT_TAU_OR_I, txdata, 1)
|
|
392
|
+
|
|
393
|
+
def get_report_tau_or_i(self):
|
|
394
|
+
return self.get_nu8(XCONF.UxbusReg.GET_REPORT_TAU_OR_I, 1)
|
|
395
|
+
|
|
396
|
+
def set_cartesian_velo_continuous(self, on_off): # False for not continuous, True for continuous
|
|
397
|
+
txdata = [int(on_off)]
|
|
398
|
+
return self.set_nu8(XCONF.UxbusReg.SET_CARTV_CONTINUE, txdata, 1)
|
|
399
|
+
|
|
400
|
+
def set_allow_approx_motion(self, on_off):
|
|
401
|
+
txdata = [int(on_off)]
|
|
402
|
+
return self.set_nu8(XCONF.UxbusReg.SET_ALLOW_APPROX_MOTION, txdata, 1)
|
|
403
|
+
|
|
404
|
+
def get_allow_approx_motion(self):
|
|
405
|
+
return self.get_nu8(XCONF.UxbusReg.GET_ALLOW_APPROX_MOTION, 1)
|
|
406
|
+
|
|
407
|
+
def move_line(self, mvpose, mvvelo, mvacc, mvtime, only_check_type=0, motion_type=0):
|
|
408
|
+
txdata = [mvpose[i] for i in range(6)]
|
|
409
|
+
txdata += [mvvelo, mvacc, mvtime]
|
|
410
|
+
if only_check_type <= 0 and motion_type == 0:
|
|
411
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_LINE, txdata, 9)
|
|
412
|
+
else:
|
|
413
|
+
byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
|
|
414
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE, txdata, 9, byte_data, 3, timeout=10)
|
|
415
|
+
|
|
416
|
+
def move_line_common(self, mvpose, mvvelo, mvacc, mvtime, radius=-1, coord=0, is_axis_angle=False, only_check_type=0, motion_type=0, feedback_key=None):
|
|
417
|
+
"""
|
|
418
|
+
通用指令, 固件1.10.0开始支持
|
|
419
|
+
"""
|
|
420
|
+
txdata = [mvpose[i] for i in range(6)]
|
|
421
|
+
_radius = -1 if radius is None else radius
|
|
422
|
+
txdata += [mvvelo, mvacc, mvtime, _radius]
|
|
423
|
+
if motion_type == 0:
|
|
424
|
+
byte_data = bytes([coord, int(is_axis_angle), only_check_type])
|
|
425
|
+
else:
|
|
426
|
+
byte_data = bytes([coord, int(is_axis_angle), only_check_type, int(motion_type)])
|
|
427
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
428
|
+
|
|
429
|
+
def move_line_aa(self, mvpose, mvvelo, mvacc, mvtime, mvcoord, relative, only_check_type=0, motion_type=0):
|
|
430
|
+
float_data = [mvpose[i] for i in range(6)]
|
|
431
|
+
float_data += [mvvelo, mvacc, mvtime]
|
|
432
|
+
byte_data = bytes([mvcoord, relative])
|
|
433
|
+
if only_check_type <= 0 and motion_type == 0:
|
|
434
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_AA, float_data, 9, byte_data)
|
|
435
|
+
else:
|
|
436
|
+
byte_data += bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
|
|
437
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_AA, float_data, 9, byte_data, 3, timeout=10)
|
|
438
|
+
|
|
439
|
+
def move_servo_cart_aa(self, mvpose, mvvelo, mvacc, tool_coord, relative):
|
|
440
|
+
float_data = [mvpose[i] for i in range(6)]
|
|
441
|
+
float_data += [mvvelo, mvacc, tool_coord]
|
|
442
|
+
byte_data = bytes([relative])
|
|
443
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_SERVO_CART_AA, float_data, 9, byte_data)
|
|
444
|
+
|
|
445
|
+
def move_relative(self, pose, mvvelo, mvacc, mvtime, radius, is_joint_motion=False, is_angle_axis=False, only_check_type=0, motion_type=0, feedback_key=None):
|
|
446
|
+
float_data = [0] * 7
|
|
447
|
+
for i in range(min(7, len(pose))):
|
|
448
|
+
float_data[i] = pose[i]
|
|
449
|
+
float_data += [mvvelo, mvacc, mvtime, radius]
|
|
450
|
+
byte_data = bytes([int(is_joint_motion), int(is_angle_axis)])
|
|
451
|
+
if only_check_type <= 0 and motion_type == 0:
|
|
452
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_RELATIVE, float_data, 11, byte_data, feedback_key=feedback_key)
|
|
453
|
+
else:
|
|
454
|
+
byte_data += bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
|
|
455
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_RELATIVE, float_data, 11, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
456
|
+
|
|
457
|
+
def get_position_aa(self):
|
|
458
|
+
return self.get_nfp32(XCONF.UxbusReg.GET_TCP_POSE_AA, 6)
|
|
459
|
+
|
|
460
|
+
@lock_require
|
|
461
|
+
def get_pose_offset(self, pose1, pose2, orient_type_in=0, orient_type_out=0):
|
|
462
|
+
float_data = [pose1[i] for i in range(6)]
|
|
463
|
+
float_data += [pose2[j] for j in range(6)]
|
|
464
|
+
byte_data = bytes([orient_type_in, orient_type_out])
|
|
465
|
+
ret_fp_num = 6
|
|
466
|
+
funcode = XCONF.UxbusReg.CAL_POSE_OFFSET
|
|
467
|
+
hexdata = convert.fp32s_to_bytes(float_data, 12)
|
|
468
|
+
hexdata += byte_data
|
|
469
|
+
|
|
470
|
+
ret = self.send_modbus_request(funcode, hexdata, len(hexdata))
|
|
471
|
+
if ret == -1:
|
|
472
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (ret_fp_num * 4 + 1)
|
|
473
|
+
|
|
474
|
+
ret = self.recv_modbus_response(funcode, ret, ret_fp_num * 4, self._G_TOUT)
|
|
475
|
+
data = [0] * (1 + ret_fp_num)
|
|
476
|
+
data[0] = ret[0]
|
|
477
|
+
data[1:ret_fp_num+1] = convert.bytes_to_fp32s(ret[1:ret_fp_num * 4 + 1], ret_fp_num)
|
|
478
|
+
return data
|
|
479
|
+
|
|
480
|
+
def move_line_tool(self, mvpose, mvvelo, mvacc, mvtime, only_check_type=0, motion_type=0):
|
|
481
|
+
txdata = [mvpose[i] for i in range(6)]
|
|
482
|
+
txdata += [mvvelo, mvacc, mvtime]
|
|
483
|
+
if only_check_type <= 0 and motion_type == 0:
|
|
484
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_LINE_TOOL, txdata, 9)
|
|
485
|
+
else:
|
|
486
|
+
byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
|
|
487
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINE_TOOL, txdata, 9, byte_data, 3, timeout=10)
|
|
488
|
+
|
|
489
|
+
def move_lineb(self, mvpose, mvvelo, mvacc, mvtime, mvradii, only_check_type=0, motion_type=0):
|
|
490
|
+
txdata = [mvpose[i] for i in range(6)]
|
|
491
|
+
txdata += [mvvelo, mvacc, mvtime, mvradii]
|
|
492
|
+
if only_check_type <= 0 and motion_type == 0:
|
|
493
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_LINEB, txdata, 10)
|
|
494
|
+
else:
|
|
495
|
+
byte_data = bytes([only_check_type]) if motion_type == 0 else bytes([only_check_type, int(motion_type)])
|
|
496
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_LINEB, txdata, 10, byte_data, 3, timeout=10)
|
|
497
|
+
|
|
498
|
+
def move_joint(self, mvjoint, mvvelo, mvacc, mvtime, only_check_type=0, feedback_key=None):
|
|
499
|
+
txdata = [mvjoint[i] for i in range(7)]
|
|
500
|
+
txdata += [mvvelo, mvacc, mvtime]
|
|
501
|
+
if only_check_type <= 0:
|
|
502
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_JOINT, txdata, 10, feedback_key=feedback_key)
|
|
503
|
+
else:
|
|
504
|
+
byte_data = bytes([only_check_type])
|
|
505
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_JOINT, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
506
|
+
|
|
507
|
+
def move_jointb(self, mvjoint, mvvelo, mvacc, mvradii, only_check_type=0, feedback_key=None):
|
|
508
|
+
txdata = [mvjoint[i] for i in range(7)]
|
|
509
|
+
txdata += [mvvelo, mvacc, mvradii]
|
|
510
|
+
if only_check_type <= 0:
|
|
511
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_JOINTB, txdata, 10, feedback_key=feedback_key)
|
|
512
|
+
else:
|
|
513
|
+
byte_data = bytes([only_check_type])
|
|
514
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_JOINTB, txdata, 10, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
515
|
+
|
|
516
|
+
def move_gohome(self, mvvelo, mvacc, mvtime, only_check_type=0, feedback_key=None):
|
|
517
|
+
txdata = [mvvelo, mvacc, mvtime]
|
|
518
|
+
if only_check_type <= 0:
|
|
519
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_HOME, txdata, 3, feedback_key=feedback_key)
|
|
520
|
+
else:
|
|
521
|
+
byte_data = bytes([only_check_type])
|
|
522
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_HOME, txdata, 3, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
523
|
+
|
|
524
|
+
def move_servoj(self, mvjoint, mvvelo, mvacc, mvtime):
|
|
525
|
+
txdata = [mvjoint[i] for i in range(7)]
|
|
526
|
+
txdata += [mvvelo, mvacc, mvtime]
|
|
527
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_SERVOJ, txdata, 10)
|
|
528
|
+
|
|
529
|
+
def move_servo_cartesian(self, mvpose, mvvelo, mvacc, mvtime):
|
|
530
|
+
txdata = [mvpose[i] for i in range(6)]
|
|
531
|
+
txdata += [mvvelo, mvacc, mvtime]
|
|
532
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_SERVO_CART, txdata, 9)
|
|
533
|
+
|
|
534
|
+
# # This interface is no longer supported
|
|
535
|
+
# def set_servot(self, jnt_taus):
|
|
536
|
+
# txdata = [jnt_taus[i] for i in range(7)]
|
|
537
|
+
# return self.set_nfp32(XCONF.UxbusReg.SET_SERVOT, txdata, 7)
|
|
538
|
+
|
|
539
|
+
def get_joint_tau(self):
|
|
540
|
+
return self.get_nfp32(XCONF.UxbusReg.GET_JOINT_TAU, 7)
|
|
541
|
+
|
|
542
|
+
def set_safe_level(self, level):
|
|
543
|
+
txdata = [level]
|
|
544
|
+
return self.set_nu8(XCONF.UxbusReg.SET_SAFE_LEVEL, txdata, 1)
|
|
545
|
+
|
|
546
|
+
def get_safe_level(self):
|
|
547
|
+
return self.get_nu8(XCONF.UxbusReg.GET_SAFE_LEVEL, 1)
|
|
548
|
+
|
|
549
|
+
def sleep_instruction(self, sltime):
|
|
550
|
+
txdata = [sltime]
|
|
551
|
+
return self.set_nfp32(XCONF.UxbusReg.SLEEP_INSTT, txdata, 1)
|
|
552
|
+
|
|
553
|
+
def move_circle(self, pose1, pose2, mvvelo, mvacc, mvtime, percent, only_check_type=0):
|
|
554
|
+
txdata = [0] * 16
|
|
555
|
+
for i in range(6):
|
|
556
|
+
txdata[i] = pose1[i]
|
|
557
|
+
txdata[6 + i] = pose2[i]
|
|
558
|
+
txdata[12] = mvvelo
|
|
559
|
+
txdata[13] = mvacc
|
|
560
|
+
txdata[14] = mvtime
|
|
561
|
+
txdata[15] = percent
|
|
562
|
+
if only_check_type <= 0:
|
|
563
|
+
return self.set_nfp32(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16)
|
|
564
|
+
else:
|
|
565
|
+
byte_data = bytes([only_check_type])
|
|
566
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16, byte_data, 3, timeout=10)
|
|
567
|
+
|
|
568
|
+
def move_circle_common(self, pose1, pose2, mvvelo, mvacc, mvtime, percent, coord=0, is_axis_angle=False, only_check_type=0, feedback_key=None):
|
|
569
|
+
"""
|
|
570
|
+
通用指令, 固件1.10.0开始支持
|
|
571
|
+
"""
|
|
572
|
+
txdata = [0] * 16
|
|
573
|
+
for i in range(6):
|
|
574
|
+
txdata[i] = pose1[i]
|
|
575
|
+
txdata[6 + i] = pose2[i]
|
|
576
|
+
txdata[12] = mvvelo
|
|
577
|
+
txdata[13] = mvacc
|
|
578
|
+
txdata[14] = mvtime
|
|
579
|
+
txdata[15] = percent
|
|
580
|
+
byte_data = bytes([coord, int(is_axis_angle), only_check_type])
|
|
581
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.MOVE_CIRCLE, txdata, 16, byte_data, 3, timeout=10, feedback_key=feedback_key)
|
|
582
|
+
|
|
583
|
+
def set_tcp_jerk(self, jerk):
|
|
584
|
+
txdata = [jerk]
|
|
585
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_TCP_JERK, txdata, 1)
|
|
586
|
+
|
|
587
|
+
def set_tcp_maxacc(self, acc):
|
|
588
|
+
txdata = [acc]
|
|
589
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_TCP_MAXACC, txdata, 1)
|
|
590
|
+
|
|
591
|
+
def set_joint_jerk(self, jerk):
|
|
592
|
+
txdata = [jerk]
|
|
593
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_JOINT_JERK, txdata, 1)
|
|
594
|
+
|
|
595
|
+
def set_joint_maxacc(self, acc):
|
|
596
|
+
txdata = [acc]
|
|
597
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_JOINT_MAXACC, txdata, 1)
|
|
598
|
+
|
|
599
|
+
def set_tcp_offset(self, pose_offset):
|
|
600
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_TCP_OFFSET, pose_offset, 6)
|
|
601
|
+
|
|
602
|
+
def set_tcp_load(self, load_mass, load_com, feedback_key=None):
|
|
603
|
+
param_list = [load_mass]
|
|
604
|
+
param_list.extend(load_com)
|
|
605
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_LOAD_PARAM, param_list, 4, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.TRIGGER)
|
|
606
|
+
|
|
607
|
+
def set_collis_sens(self, value):
|
|
608
|
+
txdata = [value]
|
|
609
|
+
return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_SENS, txdata, 1)
|
|
610
|
+
|
|
611
|
+
def set_teach_sens(self, value):
|
|
612
|
+
txdata = [value]
|
|
613
|
+
return self.set_nu8(XCONF.UxbusReg.SET_TEACH_SENS, txdata, 1)
|
|
614
|
+
|
|
615
|
+
def set_gravity_dir(self, gravity_dir):
|
|
616
|
+
return self.set_nfp32(XCONF.UxbusReg.SET_GRAVITY_DIR, gravity_dir, 3)
|
|
617
|
+
|
|
618
|
+
def clean_conf(self):
|
|
619
|
+
return self.set_nu8(XCONF.UxbusReg.CLEAN_CONF, 0, 0)
|
|
620
|
+
|
|
621
|
+
def save_conf(self):
|
|
622
|
+
return self.set_nu8(XCONF.UxbusReg.SAVE_CONF, 0, 0)
|
|
623
|
+
|
|
624
|
+
def get_joint_pos(self):
|
|
625
|
+
return self.get_nfp32(XCONF.UxbusReg.GET_JOINT_POS, 7)
|
|
626
|
+
|
|
627
|
+
def get_joint_states(self, num=3):
|
|
628
|
+
return self.get_nfp32_with_datas(XCONF.UxbusReg.GET_JOINT_POS, [num], 1, 7 * num)
|
|
629
|
+
|
|
630
|
+
def get_tcp_pose(self):
|
|
631
|
+
return self.get_nfp32(XCONF.UxbusReg.GET_TCP_POSE, 6)
|
|
632
|
+
|
|
633
|
+
def get_ik(self, pose):
|
|
634
|
+
return self.swop_nfp32(XCONF.UxbusReg.GET_IK, pose, 6, 7)
|
|
635
|
+
|
|
636
|
+
def get_fk(self, angles):
|
|
637
|
+
return self.swop_nfp32(XCONF.UxbusReg.GET_FK, angles, 7, 6)
|
|
638
|
+
|
|
639
|
+
def is_joint_limit(self, joint):
|
|
640
|
+
return self.is_nfp32(XCONF.UxbusReg.IS_JOINT_LIMIT, joint, 7)
|
|
641
|
+
|
|
642
|
+
def is_tcp_limit(self, pose):
|
|
643
|
+
return self.is_nfp32(XCONF.UxbusReg.IS_TCP_LIMIT, pose, 6)
|
|
644
|
+
|
|
645
|
+
@lock_require
|
|
646
|
+
def gripper_addr_w16(self, addr, value):
|
|
647
|
+
return self.tgpio_addr_w16(addr, value, bid=XCONF.GRIPPER_ID)
|
|
648
|
+
|
|
649
|
+
@lock_require
|
|
650
|
+
def gripper_addr_r16(self, addr):
|
|
651
|
+
return self.tgpio_addr_r16(addr, bid=XCONF.GRIPPER_ID)
|
|
652
|
+
|
|
653
|
+
@lock_require
|
|
654
|
+
def gripper_addr_w32(self, addr, value):
|
|
655
|
+
return self.tgpio_addr_w32(addr, value, bid=XCONF.GRIPPER_ID)
|
|
656
|
+
|
|
657
|
+
@lock_require
|
|
658
|
+
def gripper_addr_r32(self, addr):
|
|
659
|
+
return self.tgpio_addr_r32(addr, bid=XCONF.GRIPPER_ID)
|
|
660
|
+
|
|
661
|
+
def gripper_set_en(self, value):
|
|
662
|
+
return self.gripper_addr_w16(XCONF.ServoConf.CON_EN, value)
|
|
663
|
+
|
|
664
|
+
def gripper_set_mode(self, value):
|
|
665
|
+
return self.gripper_addr_w16(XCONF.ServoConf.CON_MODE, value)
|
|
666
|
+
|
|
667
|
+
def gripper_set_zero(self):
|
|
668
|
+
return self.gripper_addr_w16(XCONF.ServoConf.MT_ZERO, 1)
|
|
669
|
+
|
|
670
|
+
def gripper_get_pos(self):
|
|
671
|
+
return self.gripper_addr_r32(XCONF.ServoConf.CURR_POS)
|
|
672
|
+
|
|
673
|
+
def gripper_set_pos(self, pulse):
|
|
674
|
+
return self.gripper_addr_w32(XCONF.ServoConf.TAGET_POS, pulse)
|
|
675
|
+
|
|
676
|
+
def gripper_set_posspd(self, speed):
|
|
677
|
+
return self.gripper_addr_w16(XCONF.ServoConf.POS_SPD, speed)
|
|
678
|
+
|
|
679
|
+
def gripper_get_errcode(self):
|
|
680
|
+
ret = self.get_nu8(XCONF.UxbusReg.TGPIO_ERR, 2)
|
|
681
|
+
return ret
|
|
682
|
+
|
|
683
|
+
def gripper_clean_err(self):
|
|
684
|
+
return self.gripper_addr_w16(XCONF.ServoConf.RESET_ERR, 1)
|
|
685
|
+
|
|
686
|
+
@lock_require
|
|
687
|
+
def tgpio_addr_w16(self, addr, value, bid=XCONF.TGPIO_HOST_ID, additional_bytes=None):
|
|
688
|
+
txdata = bytes([bid])
|
|
689
|
+
txdata += convert.u16_to_bytes(addr)
|
|
690
|
+
txdata += convert.fp32_to_bytes(value)
|
|
691
|
+
if additional_bytes is not None:
|
|
692
|
+
txdata += additional_bytes
|
|
693
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W16B, txdata, 7 + len(additional_bytes))
|
|
694
|
+
else:
|
|
695
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W16B, txdata, 7)
|
|
696
|
+
if ret == -1:
|
|
697
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
698
|
+
|
|
699
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_W16B, ret, 0, self._G_TOUT)
|
|
700
|
+
return ret
|
|
701
|
+
|
|
702
|
+
@lock_require
|
|
703
|
+
def tgpio_addr_r16(self, addr, bid=XCONF.TGPIO_HOST_ID, fmt='>l'):
|
|
704
|
+
txdata = bytes([bid])
|
|
705
|
+
txdata += convert.u16_to_bytes(addr)
|
|
706
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_R16B, txdata, 3)
|
|
707
|
+
if ret == -1:
|
|
708
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
709
|
+
|
|
710
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_R16B, ret, 4, self._G_TOUT)
|
|
711
|
+
return [ret[0], convert.bytes_to_num32(ret[1:5], fmt=fmt)]
|
|
712
|
+
|
|
713
|
+
@lock_require
|
|
714
|
+
def tgpio_addr_w32(self, addr, value, bid=XCONF.TGPIO_HOST_ID):
|
|
715
|
+
txdata = bytes([bid])
|
|
716
|
+
txdata += convert.u16_to_bytes(addr)
|
|
717
|
+
txdata += convert.fp32_to_bytes(value)
|
|
718
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_W32B, txdata, 7)
|
|
719
|
+
if ret == -1:
|
|
720
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
721
|
+
|
|
722
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_W32B, ret, 0, self._G_TOUT)
|
|
723
|
+
return ret
|
|
724
|
+
|
|
725
|
+
@lock_require
|
|
726
|
+
def tgpio_addr_r32(self, addr, bid=XCONF.TGPIO_HOST_ID, fmt='>l'):
|
|
727
|
+
txdata = bytes([bid])
|
|
728
|
+
txdata += convert.u16_to_bytes(addr)
|
|
729
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_R32B, txdata, 3)
|
|
730
|
+
if ret == -1:
|
|
731
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
732
|
+
|
|
733
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_R32B, ret, 4, self._G_TOUT)
|
|
734
|
+
return [ret[0], convert.bytes_to_num32(ret[1:5], fmt=fmt)]
|
|
735
|
+
|
|
736
|
+
def tgpio_get_digital(self):
|
|
737
|
+
ret = self.tgpio_addr_r16(XCONF.ServoConf.DIGITAL_IN)
|
|
738
|
+
value = [0] * 5
|
|
739
|
+
value[0] = ret[0]
|
|
740
|
+
value[1] = ret[1] & 0x0001
|
|
741
|
+
value[2] = (ret[1] & 0x0002) >> 1
|
|
742
|
+
value[3] = (ret[1] & 0x0004) >> 2
|
|
743
|
+
value[4] = (ret[1] & 0x0008) >> 3
|
|
744
|
+
return value
|
|
745
|
+
|
|
746
|
+
def tgpio_set_digital(self, ionum, value, sync=None):
|
|
747
|
+
tmp = 0
|
|
748
|
+
if ionum == 1:
|
|
749
|
+
tmp = tmp | 0x0100
|
|
750
|
+
if value:
|
|
751
|
+
tmp = tmp | 0x0001
|
|
752
|
+
elif ionum == 2:
|
|
753
|
+
tmp = tmp | 0x0200
|
|
754
|
+
if value:
|
|
755
|
+
tmp = tmp | 0x0002
|
|
756
|
+
elif ionum == 3:
|
|
757
|
+
tmp = tmp | 0x1000
|
|
758
|
+
if value:
|
|
759
|
+
tmp = tmp | 0x0010
|
|
760
|
+
elif ionum == 4:
|
|
761
|
+
tmp = tmp | 0x0400
|
|
762
|
+
if value:
|
|
763
|
+
tmp = tmp | 0x0004
|
|
764
|
+
elif ionum == 5:
|
|
765
|
+
tmp = tmp | 0x0800
|
|
766
|
+
if value:
|
|
767
|
+
tmp = tmp | 0x0008
|
|
768
|
+
else:
|
|
769
|
+
return [-1, -1]
|
|
770
|
+
if sync is not None:
|
|
771
|
+
return self.tgpio_addr_w16(XCONF.ServoConf.DIGITAL_OUT, tmp, additional_bytes=bytes([sync]))
|
|
772
|
+
else:
|
|
773
|
+
return self.tgpio_addr_w16(XCONF.ServoConf.DIGITAL_OUT, tmp)
|
|
774
|
+
|
|
775
|
+
def tgpio_get_analog1(self):
|
|
776
|
+
ret = self.tgpio_addr_r16(XCONF.ServoConf.ANALOG_IO1)
|
|
777
|
+
value = [0] * 2
|
|
778
|
+
value[0] = ret[0]
|
|
779
|
+
value[1] = ret[1] * 3.3 / 4095.0
|
|
780
|
+
return value
|
|
781
|
+
|
|
782
|
+
def tgpio_get_analog2(self):
|
|
783
|
+
ret = self.tgpio_addr_r16(XCONF.ServoConf.ANALOG_IO2)
|
|
784
|
+
value = [0] * 2
|
|
785
|
+
value[0] = ret[0]
|
|
786
|
+
value[1] = ret[1] * 3.3 / 4095.0
|
|
787
|
+
return value
|
|
788
|
+
|
|
789
|
+
def set_modbus_timeout(self, value, is_transparent_transmission=False):
|
|
790
|
+
txdata = [int(value)]
|
|
791
|
+
return self.set_nu16(XCONF.UxbusReg.TGPIO_COM_TIOUT if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MB_TIOUT, txdata, 1)
|
|
792
|
+
|
|
793
|
+
def set_modbus_baudrate(self, baudrate):
|
|
794
|
+
if baudrate not in self.BAUDRATES:
|
|
795
|
+
return [-1, -1]
|
|
796
|
+
ret = self.tgpio_addr_r16(XCONF.ServoConf.MODBUS_BAUDRATE & 0x0FFF)
|
|
797
|
+
if ret[0] == 0:
|
|
798
|
+
baud_val = self.BAUDRATES.index(baudrate)
|
|
799
|
+
if ret[1] != baud_val:
|
|
800
|
+
# self.tgpio_addr_w16(XCONF.ServoConf.MODBUS_BAUDRATE, baud_val)
|
|
801
|
+
self.tgpio_addr_w16(0x1A0B, baud_val)
|
|
802
|
+
time.sleep(0.3)
|
|
803
|
+
return self.tgpio_addr_w16(XCONF.ServoConf.SOFT_REBOOT, 1)
|
|
804
|
+
return ret[:2]
|
|
805
|
+
|
|
806
|
+
@lock_require
|
|
807
|
+
def tgpio_set_modbus(self, modbus_t, len_t, host_id=XCONF.TGPIO_HOST_ID, limit_sec=0.0, is_transparent_transmission=False):
|
|
808
|
+
txdata = bytes([host_id])
|
|
809
|
+
txdata += bytes(modbus_t)
|
|
810
|
+
if limit_sec > 0:
|
|
811
|
+
diff_time = time.monotonic() - self._last_modbus_comm_time
|
|
812
|
+
if diff_time < limit_sec:
|
|
813
|
+
time.sleep(limit_sec - diff_time)
|
|
814
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.TGPIO_COM_DATA if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MODBUS, txdata, len_t + 1)
|
|
815
|
+
if ret == -1:
|
|
816
|
+
self._last_modbus_comm_time = time.monotonic()
|
|
817
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
818
|
+
|
|
819
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.TGPIO_COM_DATA if is_transparent_transmission else XCONF.UxbusReg.TGPIO_MODBUS, ret, -1, self._G_TOUT)
|
|
820
|
+
self._last_modbus_comm_time = time.monotonic()
|
|
821
|
+
return ret
|
|
822
|
+
|
|
823
|
+
@lock_require
|
|
824
|
+
def tgpio_delay_set_digital(self, ionum, on_off, delay_sec):
|
|
825
|
+
txdata = bytes([ionum, on_off])
|
|
826
|
+
txdata += convert.fp32_to_bytes(delay_sec)
|
|
827
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.DELAYED_TGPIO_SET, txdata, 6)
|
|
828
|
+
if ret == -1:
|
|
829
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
830
|
+
return self.recv_modbus_response(XCONF.UxbusReg.DELAYED_TGPIO_SET, ret, 0, self._S_TOUT)
|
|
831
|
+
|
|
832
|
+
@lock_require
|
|
833
|
+
def cgpio_delay_set_digital(self, ionum, on_off, delay_sec):
|
|
834
|
+
txdata = bytes([ionum, on_off])
|
|
835
|
+
txdata += convert.fp32_to_bytes(delay_sec)
|
|
836
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.DELAYED_CGPIO_SET, txdata, 6)
|
|
837
|
+
if ret == -1:
|
|
838
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
839
|
+
return self.recv_modbus_response(XCONF.UxbusReg.DELAYED_CGPIO_SET, ret, 0, self._S_TOUT)
|
|
840
|
+
|
|
841
|
+
@lock_require
|
|
842
|
+
def cgpio_position_set_digital(self, ionum, on_off, xyz, tol_r):
|
|
843
|
+
txdata = bytes([ionum, on_off])
|
|
844
|
+
txdata += convert.fp32s_to_bytes(xyz, 3)
|
|
845
|
+
txdata += convert.fp32_to_bytes(tol_r)
|
|
846
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_CGPIO_SET, txdata, 18)
|
|
847
|
+
if ret == -1:
|
|
848
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
849
|
+
return self.recv_modbus_response(XCONF.UxbusReg.POSITION_CGPIO_SET, ret, 0, self._S_TOUT)
|
|
850
|
+
|
|
851
|
+
@lock_require
|
|
852
|
+
def tgpio_position_set_digital(self, ionum, on_off, xyz, tol_r):
|
|
853
|
+
txdata = bytes([ionum, on_off])
|
|
854
|
+
txdata += convert.fp32s_to_bytes(xyz, 3)
|
|
855
|
+
txdata += convert.fp32_to_bytes(tol_r)
|
|
856
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_TGPIO_SET, txdata, 18)
|
|
857
|
+
if ret == -1:
|
|
858
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
859
|
+
return self.recv_modbus_response(XCONF.UxbusReg.POSITION_TGPIO_SET, ret, 0, self._S_TOUT)
|
|
860
|
+
|
|
861
|
+
@lock_require
|
|
862
|
+
def cgpio_position_set_analog(self, ionum, value, xyz, tol_r):
|
|
863
|
+
txdata = bytes([ionum])
|
|
864
|
+
txdata += convert.u16_to_bytes(int(value / 10.0 * 4095.0))
|
|
865
|
+
txdata += convert.fp32s_to_bytes(xyz, 3)
|
|
866
|
+
txdata += convert.fp32_to_bytes(tol_r)
|
|
867
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.POSITION_CGPIO_SET_ANALOG, txdata, 19)
|
|
868
|
+
if ret == -1:
|
|
869
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
870
|
+
return self.recv_modbus_response(XCONF.UxbusReg.POSITION_CGPIO_SET_ANALOG, ret, 0, self._S_TOUT)
|
|
871
|
+
|
|
872
|
+
# io_type: 0 for CGPIO, 1 for TGPIO
|
|
873
|
+
def config_io_stop_reset(self, io_type, on_off):
|
|
874
|
+
txdata = [io_type, on_off]
|
|
875
|
+
return self.set_nu8(XCONF.UxbusReg.SET_IO_STOP_RESET, txdata, 2)
|
|
876
|
+
|
|
877
|
+
def gripper_modbus_w16s(self, addr, value, length):
|
|
878
|
+
txdata = bytes([XCONF.GRIPPER_ID])
|
|
879
|
+
txdata += bytes([0x10])
|
|
880
|
+
txdata += convert.u16_to_bytes(addr)
|
|
881
|
+
txdata += convert.u16_to_bytes(length)
|
|
882
|
+
txdata += bytes([length * 2])
|
|
883
|
+
txdata += value
|
|
884
|
+
ret = self.tgpio_set_modbus(txdata, length * 2 + 7)
|
|
885
|
+
return ret
|
|
886
|
+
|
|
887
|
+
def gripper_modbus_r16s(self, addr, length):
|
|
888
|
+
txdata = bytes([XCONF.GRIPPER_ID])
|
|
889
|
+
txdata += bytes([0x03])
|
|
890
|
+
txdata += convert.u16_to_bytes(addr)
|
|
891
|
+
txdata += convert.u16_to_bytes(length)
|
|
892
|
+
ret = self.tgpio_set_modbus(txdata, 6)
|
|
893
|
+
return ret
|
|
894
|
+
|
|
895
|
+
def gripper_modbus_set_en(self, value):
|
|
896
|
+
value = convert.u16_to_bytes(int(value))
|
|
897
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.CON_EN, value, 1)
|
|
898
|
+
|
|
899
|
+
def gripper_modbus_set_mode(self, value):
|
|
900
|
+
value = convert.u16_to_bytes(int(value))
|
|
901
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.CON_MODE, value, 1)
|
|
902
|
+
|
|
903
|
+
def gripper_modbus_set_zero(self):
|
|
904
|
+
value = convert.u16_to_bytes(int(1))
|
|
905
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.MT_ZERO, value, 1)
|
|
906
|
+
|
|
907
|
+
def gripper_modbus_get_pos(self):
|
|
908
|
+
ret = self.gripper_modbus_r16s(XCONF.ServoConf.CURR_POS, 2)
|
|
909
|
+
ret1 = [0] * 2
|
|
910
|
+
ret1[0] = ret[0]
|
|
911
|
+
if ret[0] in [0, XCONF.UxbusState.ERR_CODE, XCONF.UxbusState.WAR_CODE] and len(ret) == 9:
|
|
912
|
+
ret1[1] = convert.bytes_to_long_big(ret[5:9])
|
|
913
|
+
else:
|
|
914
|
+
if ret1[0] == 0:
|
|
915
|
+
ret1[0] = XCONF.UxbusState.ERR_LENG
|
|
916
|
+
# print('gripper_modbus_get_pos:', len(ret), ret)
|
|
917
|
+
# print(ret1, ret)
|
|
918
|
+
return ret1
|
|
919
|
+
|
|
920
|
+
def gripper_modbus_set_pos(self, pulse):
|
|
921
|
+
value = bytes([(int(pulse) >> 24) & 0xFF])
|
|
922
|
+
value += bytes([(int(pulse) >> 16) & 0xFF])
|
|
923
|
+
value += bytes([(int(pulse) >> 8) & 0xFF])
|
|
924
|
+
value += bytes([int(pulse) & 0xFF])
|
|
925
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.TAGET_POS, value, 2)
|
|
926
|
+
|
|
927
|
+
def gripper_modbus_set_posspd(self, speed):
|
|
928
|
+
speed = convert.u16_to_bytes(int(speed))
|
|
929
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.POS_SPD, speed, 1)
|
|
930
|
+
|
|
931
|
+
def gripper_modbus_get_errcode(self):
|
|
932
|
+
ret = self.gripper_modbus_r16s(XCONF.ServoConf.ERR_CODE, 1)
|
|
933
|
+
ret1 = [0] * 2
|
|
934
|
+
ret1[0] = ret[0]
|
|
935
|
+
if ret[0] in [0, XCONF.UxbusState.ERR_CODE, XCONF.UxbusState.WAR_CODE] and len(ret) == 7:
|
|
936
|
+
ret1[1] = convert.bytes_to_u16(ret[5:7])
|
|
937
|
+
else:
|
|
938
|
+
if ret1[0] == 0:
|
|
939
|
+
ret1[0] = XCONF.UxbusState.ERR_LENG
|
|
940
|
+
# print('gripper_modbus_get_errcode:', len(ret), ret)
|
|
941
|
+
# print(ret1, ret)
|
|
942
|
+
return ret1
|
|
943
|
+
|
|
944
|
+
def gripper_modbus_clean_err(self):
|
|
945
|
+
value = convert.u16_to_bytes(int(1))
|
|
946
|
+
return self.gripper_modbus_w16s(XCONF.ServoConf.RESET_ERR, value, 1)
|
|
947
|
+
|
|
948
|
+
def servo_set_zero(self, axis_id):
|
|
949
|
+
txdata = [int(axis_id)]
|
|
950
|
+
ret = self.set_nu8(XCONF.UxbusReg.SERVO_ZERO, txdata, 1)
|
|
951
|
+
return ret
|
|
952
|
+
|
|
953
|
+
def servo_get_dbmsg(self):
|
|
954
|
+
ret = self.get_nu8(XCONF.UxbusReg.SERVO_DBMSG, 16)
|
|
955
|
+
return ret
|
|
956
|
+
|
|
957
|
+
@lock_require
|
|
958
|
+
def servo_addr_w16(self, axis_id, addr, value):
|
|
959
|
+
txdata = bytes([axis_id])
|
|
960
|
+
txdata += convert.u16_to_bytes(addr)
|
|
961
|
+
txdata += convert.fp32_to_bytes(value)
|
|
962
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_W16B, txdata, 7)
|
|
963
|
+
if ret == -1:
|
|
964
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
965
|
+
|
|
966
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_W16B, ret, 0, self._G_TOUT)
|
|
967
|
+
return ret
|
|
968
|
+
|
|
969
|
+
@lock_require
|
|
970
|
+
def servo_addr_r16(self, axis_id, addr):
|
|
971
|
+
txdata = bytes([axis_id])
|
|
972
|
+
txdata += convert.u16_to_bytes(addr)
|
|
973
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R16B, txdata, 3)
|
|
974
|
+
if ret == -1:
|
|
975
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
976
|
+
|
|
977
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R16B, ret, 4, self._G_TOUT)
|
|
978
|
+
return [ret[0], convert.bytes_to_long_big(ret[1:5])]
|
|
979
|
+
# return [ret[0], convert.bytes_to_long_big(ret[1:5])[0]]
|
|
980
|
+
|
|
981
|
+
@lock_require
|
|
982
|
+
def servo_addr_w32(self, axis_id, addr, value):
|
|
983
|
+
txdata = bytes([axis_id])
|
|
984
|
+
txdata += convert.u16_to_bytes(addr)
|
|
985
|
+
txdata += convert.fp32_to_bytes(value)
|
|
986
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_W32B, txdata, 7)
|
|
987
|
+
if ret == -1:
|
|
988
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
989
|
+
|
|
990
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_W32B, ret, 0, self._G_TOUT)
|
|
991
|
+
return ret
|
|
992
|
+
|
|
993
|
+
@lock_require
|
|
994
|
+
def servo_addr_r32(self, axis, addr):
|
|
995
|
+
txdata = bytes([axis])
|
|
996
|
+
txdata += convert.u16_to_bytes(addr)
|
|
997
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R32B, txdata, 3)
|
|
998
|
+
if ret == -1:
|
|
999
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
1000
|
+
|
|
1001
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R32B, ret, 4, self._G_TOUT)
|
|
1002
|
+
return [ret[0], convert.bytes_to_long_big(ret[1:5])]
|
|
1003
|
+
# return [ret[0], convert.bytes_to_long_big(ret[1:5])[0]]
|
|
1004
|
+
|
|
1005
|
+
# -----------------------------------------------------
|
|
1006
|
+
# controler gpio
|
|
1007
|
+
# -----------------------------------------------------
|
|
1008
|
+
def cgpio_get_auxdigit(self):
|
|
1009
|
+
ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_DIGIT, 1)
|
|
1010
|
+
value = [0] * 2
|
|
1011
|
+
value[0] = ret[0]
|
|
1012
|
+
value[1] = ret[1]
|
|
1013
|
+
return value
|
|
1014
|
+
|
|
1015
|
+
def cgpio_get_analog1(self):
|
|
1016
|
+
ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_ANALOG1, 1)
|
|
1017
|
+
value = [0] * 2
|
|
1018
|
+
value[0] = ret[0]
|
|
1019
|
+
value[1] = ret[1] * 10.0 / 4095.0
|
|
1020
|
+
return value
|
|
1021
|
+
|
|
1022
|
+
def cgpio_get_analog2(self):
|
|
1023
|
+
ret = self.get_nu16(XCONF.UxbusReg.CGPIO_GET_ANALOG2, 1)
|
|
1024
|
+
value = [0] * 2
|
|
1025
|
+
value[0] = ret[0]
|
|
1026
|
+
value[1] = ret[1] * 10.0 / 4095.0
|
|
1027
|
+
return value
|
|
1028
|
+
|
|
1029
|
+
def cgpio_set_auxdigit(self, ionum, value, sync=None):
|
|
1030
|
+
tmp = [0] * 2
|
|
1031
|
+
if ionum > 7:
|
|
1032
|
+
tmp[1] = tmp[1] | (0x0100 << (ionum - 8))
|
|
1033
|
+
if value:
|
|
1034
|
+
tmp[1] = tmp[1] | (0x0001 << (ionum - 8))
|
|
1035
|
+
if sync is not None:
|
|
1036
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2, additional_bytes=bytes([sync]))
|
|
1037
|
+
else:
|
|
1038
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2)
|
|
1039
|
+
else:
|
|
1040
|
+
tmp[0] = tmp[0] | (0x0100 << ionum)
|
|
1041
|
+
if value:
|
|
1042
|
+
tmp[0] = tmp[0] | (0x0001 << ionum)
|
|
1043
|
+
if sync is not None:
|
|
1044
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 1, additional_bytes=bytes([sync]))
|
|
1045
|
+
else:
|
|
1046
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 1)
|
|
1047
|
+
# return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_DIGIT, tmp, 2 if ionum > 7 else 1)
|
|
1048
|
+
|
|
1049
|
+
def cgpio_set_analog1(self, value, sync=None):
|
|
1050
|
+
txdata = [int(value / 10.0 * 4095.0)]
|
|
1051
|
+
if sync is not None:
|
|
1052
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG1, txdata, 1, additional_bytes=bytes([sync]))
|
|
1053
|
+
else:
|
|
1054
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG1, txdata, 1)
|
|
1055
|
+
|
|
1056
|
+
def cgpio_set_analog2(self, value, sync=None):
|
|
1057
|
+
txdata = [int(value / 10.0 * 4095.0)]
|
|
1058
|
+
if sync is not None:
|
|
1059
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG2, txdata, 1, additional_bytes=bytes([sync]))
|
|
1060
|
+
else:
|
|
1061
|
+
return self.set_nu16(XCONF.UxbusReg.CGPIO_SET_ANALOG2, txdata, 1)
|
|
1062
|
+
|
|
1063
|
+
def cgpio_set_infun(self, num, fun):
|
|
1064
|
+
txdata = [int(num), int(fun)]
|
|
1065
|
+
return self.set_nu8(XCONF.UxbusReg.CGPIO_SET_IN_FUN, txdata, 2)
|
|
1066
|
+
|
|
1067
|
+
def cgpio_set_outfun(self, num, fun):
|
|
1068
|
+
txdata = [int(num), int(fun)]
|
|
1069
|
+
return self.set_nu8(XCONF.UxbusReg.CGPIO_SET_OUT_FUN, txdata, 2)
|
|
1070
|
+
|
|
1071
|
+
def cgpio_get_state(self):
|
|
1072
|
+
# ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, 34)
|
|
1073
|
+
# ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, 50)
|
|
1074
|
+
ret = self.get_nu8(XCONF.UxbusReg.CGPIO_GET_STATE, -1)
|
|
1075
|
+
msg = [0] * 13
|
|
1076
|
+
msg[0] = ret[0]
|
|
1077
|
+
msg[1] = ret[1]
|
|
1078
|
+
msg[2] = ret[2]
|
|
1079
|
+
|
|
1080
|
+
msg[3:11] = convert.bytes_to_u16s(ret[3:19], 8)
|
|
1081
|
+
msg[7] = msg[7] / 4095.0 * 10.0
|
|
1082
|
+
msg[8] = msg[8] / 4095.0 * 10.0
|
|
1083
|
+
msg[9] = msg[9] / 4095.0 * 10.0
|
|
1084
|
+
msg[10] = msg[10] / 4095.0 * 10.0
|
|
1085
|
+
msg[11] = ret[19:27]
|
|
1086
|
+
msg[12] = ret[27:35]
|
|
1087
|
+
if len(ret) >= 50:
|
|
1088
|
+
msg[11] = ret[19:27] + ret[35:43]
|
|
1089
|
+
msg[12] = ret[27:35] + ret[43:51]
|
|
1090
|
+
return msg
|
|
1091
|
+
|
|
1092
|
+
def set_self_collision_detection(self, on_off):
|
|
1093
|
+
txdata = [on_off]
|
|
1094
|
+
return self.set_nu8(XCONF.UxbusReg.SET_SELF_COLLIS_CHECK, txdata, 1)
|
|
1095
|
+
|
|
1096
|
+
def set_collision_tool_model(self, tool_type, params):
|
|
1097
|
+
if len(params) > 0:
|
|
1098
|
+
byte_data = bytes([tool_type])
|
|
1099
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.SET_COLLIS_TOOL, params, len(params), byte_data)
|
|
1100
|
+
else:
|
|
1101
|
+
txdata = [tool_type]
|
|
1102
|
+
return self.set_nu8(XCONF.UxbusReg.SET_COLLIS_TOOL, txdata, 1)
|
|
1103
|
+
|
|
1104
|
+
def set_simulation_robot(self, on_off):
|
|
1105
|
+
txdata = [int(on_off)]
|
|
1106
|
+
return self.set_nu8(XCONF.UxbusReg.SET_SIMULATION_ROBOT, txdata, 1)
|
|
1107
|
+
|
|
1108
|
+
def get_power_board_version(self):
|
|
1109
|
+
return self.get_nu8(XCONF.UxbusReg.GET_PWR_VERSION, 6)
|
|
1110
|
+
|
|
1111
|
+
def get_movement(self):
|
|
1112
|
+
return self.get_nu8(XCONF.UxbusReg.GET_MOVEMENT, 1)
|
|
1113
|
+
|
|
1114
|
+
def vc_set_jointv(self, jnt_v, jnt_sync, duration=-1):
|
|
1115
|
+
additional_bytes = bytes([jnt_sync])
|
|
1116
|
+
if duration >= 0:
|
|
1117
|
+
additional_bytes += convert.fp32_to_bytes(duration)
|
|
1118
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.VC_SET_JOINTV, jnt_v, 7, additional_bytes)
|
|
1119
|
+
|
|
1120
|
+
def vc_set_linev(self, line_v, coord, duration=-1):
|
|
1121
|
+
additional_bytes = bytes([coord])
|
|
1122
|
+
if duration >= 0:
|
|
1123
|
+
additional_bytes += convert.fp32_to_bytes(duration)
|
|
1124
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.VC_SET_CARTV, line_v, 6, additional_bytes)
|
|
1125
|
+
|
|
1126
|
+
def iden_load(self, iden_type, num_get, timeout=500, estimated_mass=0):
|
|
1127
|
+
txdata = bytes([iden_type])
|
|
1128
|
+
if estimated_mass > 0:
|
|
1129
|
+
txdata += convert.fp32_to_bytes(estimated_mass)
|
|
1130
|
+
return self.get_nfp32_with_datas(XCONF.UxbusReg.IDEN_LOAD, txdata, 5 if estimated_mass > 0 else 1, num_get, timeout=timeout)
|
|
1131
|
+
|
|
1132
|
+
def iden_joint_friction(self, sn, timeout=500):
|
|
1133
|
+
txdata = [ord(i) for i in list(sn)]
|
|
1134
|
+
return self.get_nfp32_with_datas(XCONF.UxbusReg.IDEN_FRIC, txdata, 14, 1, timeout=timeout)
|
|
1135
|
+
|
|
1136
|
+
@lock_require
|
|
1137
|
+
def set_impedance(self, coord, c_axis, M, K, B):
|
|
1138
|
+
txdata = bytes([coord])
|
|
1139
|
+
txdata += bytes(c_axis[:6])
|
|
1140
|
+
txdata += convert.fp32s_to_bytes(M, 6)
|
|
1141
|
+
txdata += convert.fp32s_to_bytes(K, 6)
|
|
1142
|
+
txdata += convert.fp32s_to_bytes(B, 6)
|
|
1143
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CONFIG, txdata, 79)
|
|
1144
|
+
if ret == -1:
|
|
1145
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1146
|
+
return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CONFIG, ret, 0, self._S_TOUT)
|
|
1147
|
+
|
|
1148
|
+
@lock_require
|
|
1149
|
+
def set_impedance_mbk(self, M, K, B):
|
|
1150
|
+
txdata = convert.fp32s_to_bytes(M, 6)
|
|
1151
|
+
txdata += convert.fp32s_to_bytes(K, 6)
|
|
1152
|
+
txdata += convert.fp32s_to_bytes(B, 6)
|
|
1153
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CTRL_MBK, txdata, 72)
|
|
1154
|
+
if ret == -1:
|
|
1155
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1156
|
+
return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CTRL_MBK, ret, 0, self._S_TOUT)
|
|
1157
|
+
|
|
1158
|
+
@lock_require
|
|
1159
|
+
def set_impedance_config(self, coord, c_axis):
|
|
1160
|
+
txdata = bytes([coord])
|
|
1161
|
+
txdata += bytes(c_axis[:6])
|
|
1162
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.IMPEDANCE_CTRL_CONFIG, txdata, 7)
|
|
1163
|
+
if ret == -1:
|
|
1164
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1165
|
+
return self.recv_modbus_response(XCONF.UxbusReg.IMPEDANCE_CTRL_CONFIG, ret, 0, self._S_TOUT)
|
|
1166
|
+
|
|
1167
|
+
@lock_require
|
|
1168
|
+
def config_force_control(self, coord, c_axis, f_ref, limits):
|
|
1169
|
+
txdata = bytes([coord])
|
|
1170
|
+
txdata += bytes(c_axis[:6])
|
|
1171
|
+
txdata += convert.fp32s_to_bytes(f_ref, 6)
|
|
1172
|
+
txdata += convert.fp32s_to_bytes(limits, 6)
|
|
1173
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.FORCE_CTRL_CONFIG, txdata, 55)
|
|
1174
|
+
if ret == -1:
|
|
1175
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1176
|
+
return self.recv_modbus_response(XCONF.UxbusReg.FORCE_CTRL_CONFIG, ret, 0, self._S_TOUT)
|
|
1177
|
+
|
|
1178
|
+
@lock_require
|
|
1179
|
+
def set_force_control_pid(self, kp, ki, kd, xe_limit):
|
|
1180
|
+
txdata = convert.fp32s_to_bytes(kp, 6)
|
|
1181
|
+
txdata += convert.fp32s_to_bytes(ki, 6)
|
|
1182
|
+
txdata += convert.fp32s_to_bytes(kd, 6)
|
|
1183
|
+
txdata += convert.fp32s_to_bytes(xe_limit, 6)
|
|
1184
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.FORCE_CTRL_PID, txdata, 96)
|
|
1185
|
+
if ret == -1:
|
|
1186
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1187
|
+
return self.recv_modbus_response(XCONF.UxbusReg.FORCE_CTRL_PID, ret, 0, self._S_TOUT)
|
|
1188
|
+
|
|
1189
|
+
def ft_sensor_set_zero(self):
|
|
1190
|
+
return self.set_nu8(XCONF.UxbusReg.FTSENSOR_SET_ZERO, 0, 0)
|
|
1191
|
+
# return self.getset_nu8(XCONF.UxbusReg.FTSENSOR_SET_ZERO, [], 0, 1)
|
|
1192
|
+
|
|
1193
|
+
def ft_sensor_iden_load(self):
|
|
1194
|
+
return self.iden_load(0, 10)
|
|
1195
|
+
|
|
1196
|
+
def ft_sensor_cali_load(self, iden_result_list):
|
|
1197
|
+
return self.set_nfp32(XCONF.UxbusReg.FTSENSOR_CALI_LOAD_OFFSET, iden_result_list, 10)
|
|
1198
|
+
|
|
1199
|
+
def ft_sensor_enable(self, on_off):
|
|
1200
|
+
txdata = [on_off]
|
|
1201
|
+
return self.set_nu8(XCONF.UxbusReg.FTSENSOR_ENABLE, txdata, 1)
|
|
1202
|
+
|
|
1203
|
+
def ft_sensor_app_set(self, app_code):
|
|
1204
|
+
txdata = [app_code]
|
|
1205
|
+
return self.set_nu8(XCONF.UxbusReg.FTSENSOR_SET_APP, txdata, 1)
|
|
1206
|
+
|
|
1207
|
+
def ft_sensor_app_get(self):
|
|
1208
|
+
return self.get_nu8(XCONF.UxbusReg.FTSENSOR_GET_APP, 1)
|
|
1209
|
+
|
|
1210
|
+
def ft_sensor_get_data(self, is_new=True):
|
|
1211
|
+
return self.get_nfp32(XCONF.UxbusReg.FTSENSOR_GET_DATA if is_new else XCONF.UxbusReg.FTSENSOR_GET_DATA_OLD, 6)
|
|
1212
|
+
|
|
1213
|
+
def ft_sensor_get_config(self):
|
|
1214
|
+
ret = self.get_nu8(XCONF.UxbusReg.FTSENSOR_GET_CONFIG, 280)
|
|
1215
|
+
if ret[0] in [0, 1, 2]:
|
|
1216
|
+
ft_app_status = ret[1]
|
|
1217
|
+
ft_started = ret[2]
|
|
1218
|
+
ft_type = ret[3]
|
|
1219
|
+
ft_id = ret[4]
|
|
1220
|
+
ft_freq = convert.bytes_to_u16(ret[5:7])
|
|
1221
|
+
ft_mass = convert.bytes_to_fp32(ret[7:11])
|
|
1222
|
+
ft_dir_bias = convert.bytes_to_fp32(ret[11:15])
|
|
1223
|
+
ft_centroid = convert.bytes_to_fp32s(ret[15:27], 3)
|
|
1224
|
+
ft_zero = convert.bytes_to_fp32s(ret[27:51], 6)
|
|
1225
|
+
|
|
1226
|
+
imp_coord = ret[51]
|
|
1227
|
+
imp_c_axis = ret[52:58]
|
|
1228
|
+
M = convert.bytes_to_fp32s(ret[58:82], 6)
|
|
1229
|
+
K = convert.bytes_to_fp32s(ret[82:106], 6)
|
|
1230
|
+
B = convert.bytes_to_fp32s(ret[106:130], 6)
|
|
1231
|
+
|
|
1232
|
+
fc_coord = ret[130]
|
|
1233
|
+
fc_c_axis = ret[131:137]
|
|
1234
|
+
force_ref = convert.bytes_to_fp32s(ret[137:161], 6)
|
|
1235
|
+
limits = convert.bytes_to_fp32s(ret[161:185], 6)
|
|
1236
|
+
kp = convert.bytes_to_fp32s(ret[185:209], 6)
|
|
1237
|
+
ki = convert.bytes_to_fp32s(ret[209:233], 6)
|
|
1238
|
+
kd = convert.bytes_to_fp32s(ret[233:257], 6)
|
|
1239
|
+
xe_limit = convert.bytes_to_fp32s(ret[257:281], 6)
|
|
1240
|
+
return [
|
|
1241
|
+
ret[0],
|
|
1242
|
+
ft_app_status, ft_started, ft_type, ft_id, ft_freq,
|
|
1243
|
+
ft_mass, ft_dir_bias, ft_centroid, ft_zero,
|
|
1244
|
+
imp_coord, imp_c_axis, M, K, B,
|
|
1245
|
+
fc_coord, fc_c_axis, force_ref, limits,
|
|
1246
|
+
kp, ki, kd, xe_limit
|
|
1247
|
+
]
|
|
1248
|
+
return ret
|
|
1249
|
+
|
|
1250
|
+
# def ft_sensor_get_error(self):
|
|
1251
|
+
# ret = self.servo_addr_r16(8, 0x0010)
|
|
1252
|
+
# if ret[0] in [0, 1, 2] and len(ret) > 1 and ret[1] == 27:
|
|
1253
|
+
# ret[0] = 0
|
|
1254
|
+
# return ret
|
|
1255
|
+
|
|
1256
|
+
@lock_require
|
|
1257
|
+
def ft_sensor_get_error(self):
|
|
1258
|
+
txdata = bytes([8])
|
|
1259
|
+
txdata += convert.u16_to_bytes(0x0010)
|
|
1260
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_R16B, txdata, 3)
|
|
1261
|
+
if ret == -1:
|
|
1262
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
1263
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_R16B, ret, 4, self._G_TOUT)
|
|
1264
|
+
if ret[0] in [0, 1, 2]:
|
|
1265
|
+
if convert.bytes_to_long_big(ret[1:5]) == 27:
|
|
1266
|
+
return [ret[0], 0]
|
|
1267
|
+
else:
|
|
1268
|
+
return [ret[0], ret[3]]
|
|
1269
|
+
return [ret[0], 0]
|
|
1270
|
+
|
|
1271
|
+
def cali_tcp_pose(self, four_pnts):
|
|
1272
|
+
txdata = []
|
|
1273
|
+
for k in range(4):
|
|
1274
|
+
txdata += [four_pnts[k][i] for i in range(6)]
|
|
1275
|
+
return self.swop_nfp32(XCONF.UxbusReg.CALI_TCP_POSE, txdata, 24, 3)
|
|
1276
|
+
|
|
1277
|
+
# default: mode: x+ then y+; trust_ind: trust x+ dir
|
|
1278
|
+
def cali_user_orient(self, three_pnts, mode=0, trust_ind=0):
|
|
1279
|
+
txdata = []
|
|
1280
|
+
for k in range(3):
|
|
1281
|
+
txdata += [three_pnts[k][i] for i in range(6)]
|
|
1282
|
+
byte_data = bytes([mode, trust_ind])
|
|
1283
|
+
rxn = 3
|
|
1284
|
+
ret = self.set_nfp32_with_bytes(XCONF.UxbusReg.CALI_WRLD_ORIENT, txdata, 18, byte_data, rxn * 4)
|
|
1285
|
+
data = [0] * (1 + rxn)
|
|
1286
|
+
data[0] = ret[0]
|
|
1287
|
+
data[1:rxn+1] = convert.bytes_to_fp32s(ret[1:rxn * 4 + 1], rxn)
|
|
1288
|
+
return data
|
|
1289
|
+
|
|
1290
|
+
def cali_tcp_orient(self, rpy_be, rpy_bt):
|
|
1291
|
+
txdata = [rpy_be[i] for i in range(3)]
|
|
1292
|
+
txdata += [rpy_bt[i] for i in range(3)]
|
|
1293
|
+
return self.swop_nfp32(XCONF.UxbusReg.CALI_TCP_ORIENT, txdata, 6, 3)
|
|
1294
|
+
|
|
1295
|
+
def cali_user_pos(self, rpy_ub, pos_b_uorg):
|
|
1296
|
+
txdata = [rpy_ub[i] for i in range(3)]
|
|
1297
|
+
txdata += [pos_b_uorg[i] for i in range(3)]
|
|
1298
|
+
return self.swop_nfp32(XCONF.UxbusReg.CALI_WRLD_POSE, txdata, 6, 3)
|
|
1299
|
+
|
|
1300
|
+
def get_tcp_rotation_radius(self, value):
|
|
1301
|
+
txdata = [value]
|
|
1302
|
+
data = [0] * 2
|
|
1303
|
+
ret = self.getset_nu8(XCONF.UxbusReg.GET_TCP_ROTATION_RADIUS, txdata, 1, 4)
|
|
1304
|
+
data[0] = ret[0]
|
|
1305
|
+
data[1] = convert.bytes_to_fp32s(ret[1:], 1)
|
|
1306
|
+
return data
|
|
1307
|
+
|
|
1308
|
+
def get_max_joint_velocity(self, eveloc, joint_pos):
|
|
1309
|
+
txdata = [eveloc]
|
|
1310
|
+
txdata += [joint_pos[i] for i in range(7)]
|
|
1311
|
+
return self.swop_nfp32(XCONF.UxbusReg.GET_MAX_JOINT_VELOCITY, txdata, 8, 1)
|
|
1312
|
+
|
|
1313
|
+
def track_modbus_w16s(self, addr, value, length):
|
|
1314
|
+
txdata = bytes([XCONF.TRACK_ID])
|
|
1315
|
+
txdata += bytes([0x10])
|
|
1316
|
+
txdata += convert.u16_to_bytes(addr)
|
|
1317
|
+
txdata += convert.u16_to_bytes(length)
|
|
1318
|
+
txdata += bytes([length * 2])
|
|
1319
|
+
txdata += value
|
|
1320
|
+
ret = self.tgpio_set_modbus(txdata, length * 2 + 7, host_id=XCONF.LINEER_TRACK_HOST_ID, limit_sec=0.001)
|
|
1321
|
+
return ret
|
|
1322
|
+
|
|
1323
|
+
def track_modbus_r16s(self, addr, length, fcode=0x03):
|
|
1324
|
+
txdata = bytes([XCONF.TRACK_ID])
|
|
1325
|
+
txdata += bytes([fcode])
|
|
1326
|
+
txdata += convert.u16_to_bytes(addr)
|
|
1327
|
+
txdata += convert.u16_to_bytes(length)
|
|
1328
|
+
ret = self.tgpio_set_modbus(txdata, 6, host_id=XCONF.LINEER_TRACK_HOST_ID, limit_sec=0.001)
|
|
1329
|
+
return ret
|
|
1330
|
+
|
|
1331
|
+
def iden_tcp_load(self, estimated_mass=0):
|
|
1332
|
+
return self.iden_load(1, 4, timeout=300, estimated_mass=estimated_mass)
|
|
1333
|
+
|
|
1334
|
+
@lock_require
|
|
1335
|
+
def servo_error_addr_r32(self, axis, addr):
|
|
1336
|
+
txdata = bytes([axis])
|
|
1337
|
+
txdata += convert.u16_to_bytes(addr)
|
|
1338
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SERVO_ERROR, txdata, 3)
|
|
1339
|
+
if ret == -1:
|
|
1340
|
+
return [XCONF.UxbusState.ERR_NOTTCP] * (7 + 1)
|
|
1341
|
+
|
|
1342
|
+
ret = self.recv_modbus_response(XCONF.UxbusReg.SERVO_ERROR, ret, 4, self._G_TOUT)
|
|
1343
|
+
return [ret[0], convert.bytes_to_long_big(ret[1:5])]
|
|
1344
|
+
|
|
1345
|
+
def get_dh_params(self):
|
|
1346
|
+
return self.get_nfp32(XCONF.UxbusReg.GET_DH, 28)
|
|
1347
|
+
|
|
1348
|
+
def set_dh_params(self, dh_params, flag=0):
|
|
1349
|
+
if len(dh_params) < 28:
|
|
1350
|
+
dh_params.extend([0] * 28 - len(dh_params))
|
|
1351
|
+
byte_data = bytes([flag])
|
|
1352
|
+
return self.set_nfp32_with_bytes(XCONF.UxbusReg.SET_DH, dh_params, 28, byte_data, 1, timeout=10)
|
|
1353
|
+
|
|
1354
|
+
def _set_feedback_type_no_lock(self, feedback_type):
|
|
1355
|
+
ret = self.send_modbus_request(XCONF.UxbusReg.SET_FEEDBACK_TYPE, [feedback_type], 1)
|
|
1356
|
+
if ret == -1:
|
|
1357
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1358
|
+
return self.recv_modbus_response(XCONF.UxbusReg.SET_FEEDBACK_TYPE, ret, 0, self._S_TOUT)
|
|
1359
|
+
|
|
1360
|
+
@lock_require
|
|
1361
|
+
def set_feedback_type(self, feedback_type):
|
|
1362
|
+
ret = self._set_feedback_type_no_lock(feedback_type)
|
|
1363
|
+
if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
|
|
1364
|
+
self._feedback_type = feedback_type
|
|
1365
|
+
return ret
|
|
1366
|
+
|
|
1367
|
+
def check_feedback(self, feedback_key=None):
|
|
1368
|
+
ret = self.set_nu8(XCONF.UxbusReg.FEEDBACK_CHECK, [], 0, feedback_key=feedback_key, feedback_type=XCONF.FeedbackType.MOTION_FINISH)
|
|
1369
|
+
return ret
|
|
1370
|
+
|
|
1371
|
+
@lock_require
|
|
1372
|
+
def send_hex_cmd(self, datas, timeout=10):
|
|
1373
|
+
if len(datas) < 7:
|
|
1374
|
+
# datas length error
|
|
1375
|
+
return [-2]
|
|
1376
|
+
trans_id = int('{}{}'.format(datas[0], datas[1]), base=16)
|
|
1377
|
+
prot_id = int('{}{}'.format(datas[2], datas[3]), base=16)
|
|
1378
|
+
if prot_id not in [0, 2, 3]:
|
|
1379
|
+
# protocol_identifier error, only support 0/2/3,
|
|
1380
|
+
# 0: standard modbus protocol
|
|
1381
|
+
# 2: private modbus protocol
|
|
1382
|
+
# 3: private modbus protocol (with heart beat)
|
|
1383
|
+
return [-3]
|
|
1384
|
+
length = int('{}{}'.format(datas[4], datas[5]), base=16)
|
|
1385
|
+
if length != len(datas) - 6:
|
|
1386
|
+
# protocol length data error
|
|
1387
|
+
return [-4]
|
|
1388
|
+
unit_id = int('{}'.format(datas[6]), base=16)
|
|
1389
|
+
pdu_data = bytes.fromhex('{}'.format(''.join(map(str, datas[7:]))))
|
|
1390
|
+
ret = self.send_modbus_request(unit_id, pdu_data, len(pdu_data), prot_id=prot_id, t_id=trans_id)
|
|
1391
|
+
if ret == -1:
|
|
1392
|
+
return [XCONF.UxbusState.ERR_NOTTCP]
|
|
1393
|
+
return self.recv_modbus_response(unit_id, ret, -1, timeout, t_prot_id=prot_id, ret_raw=True)
|
|
1394
|
+
|
|
1395
|
+
def set_common_param(self, param_type, param_val):
|
|
1396
|
+
txdata = bytes([param_type])
|
|
1397
|
+
if param_type == 1:
|
|
1398
|
+
txdata += convert.fp32_to_bytes(param_val)
|
|
1399
|
+
elif param_type == 12 or param_type == 14:
|
|
1400
|
+
txdata += convert.fp32s_to_bytes(param_val, 6)
|
|
1401
|
+
else:
|
|
1402
|
+
# 2/3/6/11/13
|
|
1403
|
+
txdata += convert.int32_to_bytes(param_val)
|
|
1404
|
+
return self.set_nu8(XCONF.UxbusReg.SET_COMMON_PARAM, txdata, len(txdata))
|
|
1405
|
+
|
|
1406
|
+
def get_common_param(self, param_type):
|
|
1407
|
+
txdata = bytes([param_type])
|
|
1408
|
+
ret = self.getset_nu8(XCONF.UxbusReg.GET_COMMON_PARAM, txdata, 1, -1)
|
|
1409
|
+
data = [0] * 2
|
|
1410
|
+
data[0] = ret[0]
|
|
1411
|
+
if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
|
|
1412
|
+
if param_type == 1:
|
|
1413
|
+
data[1] = convert.bytes_to_fp32(ret[1:])
|
|
1414
|
+
elif param_type == 12 or param_type == 14:
|
|
1415
|
+
data[1] = convert.bytes_to_fp32s(ret[1:], 6)
|
|
1416
|
+
else:
|
|
1417
|
+
# 2/3/6/11/13
|
|
1418
|
+
data[1] = convert.bytes_to_u32(ret[1:])
|
|
1419
|
+
return data
|
|
1420
|
+
|
|
1421
|
+
def get_common_info(self, param_type):
|
|
1422
|
+
txdata = bytes([param_type])
|
|
1423
|
+
ret = self.getset_nu8(XCONF.UxbusReg.GET_COMMON_INFO, txdata, 1, -1)
|
|
1424
|
+
data = [0] * 2
|
|
1425
|
+
data[0] = ret[0]
|
|
1426
|
+
if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
|
|
1427
|
+
if param_type == 1 or param_type == 2:
|
|
1428
|
+
data[1] = ret[1]
|
|
1429
|
+
elif param_type == 50:
|
|
1430
|
+
data[1] = convert.bytes_to_fp32(ret[1:])
|
|
1431
|
+
elif param_type in [101, 107]:
|
|
1432
|
+
data[1] = ret[1]
|
|
1433
|
+
data.append(convert.bytes_to_fp32(ret[2:6]))
|
|
1434
|
+
data.append(convert.bytes_to_fp32(ret[6:10]))
|
|
1435
|
+
elif param_type in [102, 104]:
|
|
1436
|
+
data[1] = ret[1]
|
|
1437
|
+
data.append(convert.bytes_to_fp32(ret[2:]))
|
|
1438
|
+
elif param_type == 105:
|
|
1439
|
+
data[1] = convert.bytes_to_fp32(ret[1:])
|
|
1440
|
+
data.append(convert.bytes_to_fp32(ret[5:]))
|
|
1441
|
+
elif param_type in [103, 106]:
|
|
1442
|
+
data[1] = ret[1]
|
|
1443
|
+
data.extend(convert.bytes_to_fp32s(ret[2:], 7))
|
|
1444
|
+
else:
|
|
1445
|
+
data[0] = XCONF.UxbusState.ERR_PARAM
|
|
1446
|
+
return data
|
|
1447
|
+
|
|
1448
|
+
def get_traj_speeding(self, rate):
|
|
1449
|
+
txdata = bytes([rate])
|
|
1450
|
+
ret = self.getset_nu8(XCONF.UxbusReg.GET_TRAJ_SPEEDING, txdata, 1, -1)
|
|
1451
|
+
data = [0] * 4
|
|
1452
|
+
data[0] = ret[0]
|
|
1453
|
+
if ret[0] != XCONF.UxbusState.ERR_NOTTCP:
|
|
1454
|
+
data[1] = convert.bytes_to_int32(ret[1:5])
|
|
1455
|
+
data[2] = convert.bytes_to_int32(ret[5:9])
|
|
1456
|
+
data[3] = round(math.degrees(convert.bytes_to_fp32(ret[9:])),3)
|
|
1457
|
+
return data
|