urua 0.99.5002 → 0.99.5004
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.
- checksums.yaml +4 -4
- data/README.md +50 -10
- data/lib/urua.rb +80 -22
- data/server/devserver.conf +4 -4
- data/server/uruaserver.conf +1 -1
- metadata +56 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 94ce72efcb23082b842157f2e93e065493c5654785e3fd1e992967336552b814
|
|
4
|
+
data.tar.gz: d7d7b4dac9cedd7a849120b8f8d4fe9bc8bc73b07bac9225a787fd4d29e4d673
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f1dddcdd1e2bbd4d501b3c813d6f88d4914fbeb484aee42fffb2e8e907deb083f1eed95c681595196efb6ab87f0efb2deb946fee44f48f15417da8ea200ce494
|
|
7
|
+
data.tar.gz: d213ed840b83bb818d4b8dc49f46f0e6d560e916a2fe91418f3f020dc91ca2d758fd54fcba217c7521bae825f20e3d60d54ba74fc45faeefb1df206ebf45bc51
|
data/README.md
CHANGED
|
@@ -2,28 +2,68 @@
|
|
|
2
2
|
|
|
3
3
|
# URUA
|
|
4
4
|
|
|
5
|
-
OPC UA
|
|
5
|
+
A simple OPC UA server for Universal robots in ruby, which uses the ur-sock and opcua-smart library.
|
|
6
6
|
|
|
7
7
|
## Getting Started
|
|
8
8
|
|
|
9
|
-
A simple ruby server, which uses
|
|
9
|
+
A simple ruby server, which uses the ur-sock and opcua-smart library.
|
|
10
10
|
|
|
11
11
|
### Prerequisites & Intallation
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
For this server the OPC UA installation of the opcua-smart gem is required.
|
|
14
|
+
Please follow the instructions at https://github.com/etm/opcua-smart and install the opcua gem.
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
Additionally you have to install the URUA gem with:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
gem install urua
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
If you want to develop or extend the server, just use the following instruction
|
|
23
|
+
```
|
|
24
|
+
git clone https://github.com/fpauker/urua
|
|
25
|
+
git clone https://github.com/fpauker/ur-sock
|
|
26
|
+
git clone https://github.com/etm/opcua-smart
|
|
16
27
|
```
|
|
17
|
-
|
|
18
|
-
|
|
28
|
+
|
|
29
|
+
Just follow the install instructions of the 3 projects.
|
|
30
|
+
After installing all packages do
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
cd urua/server
|
|
19
34
|
```
|
|
35
|
+
in this directory the devserver.rb and the devserver.config are located.
|
|
36
|
+
|
|
37
|
+
### Starting the server
|
|
38
|
+
|
|
39
|
+
To start the server type in the following commands:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
cd urua/server
|
|
43
|
+
./uruaserver.rb start
|
|
44
|
+
```
|
|
45
|
+
or
|
|
46
|
+
```
|
|
47
|
+
cd urua/server
|
|
48
|
+
./devserver.rb start
|
|
49
|
+
```
|
|
50
|
+
to start the developing server.
|
|
51
|
+
|
|
20
52
|
|
|
21
53
|
## Adress space
|
|
22
54
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-

|
|
58
|
+

|
|
59
|
+

|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
It offers several features combining 3 different interfaces of the Universal robot. It uses the
|
|
63
|
+
|
|
64
|
+
* Primary Secondary Interface for direct execution of UR scripts
|
|
65
|
+
* Dashboard server for orchestration functions e.g. starting/stopping a program
|
|
66
|
+
* RTDE interface for getting the robot states
|
|
27
67
|
|
|
28
68
|
## Contributing
|
|
29
69
|
|
data/lib/urua.rb
CHANGED
|
@@ -28,13 +28,17 @@ module URUA
|
|
|
28
28
|
opts['dash'] = UR::Dash.new(opts['ipadress']).connect rescue nil
|
|
29
29
|
end #}}}
|
|
30
30
|
|
|
31
|
+
def self::start_psi(opts)
|
|
32
|
+
opts['psi'] = UR::Psi.new(opts['ipadress']).connect rescue nil
|
|
33
|
+
end
|
|
34
|
+
|
|
31
35
|
def self::start_rtde(opts) #{{{
|
|
32
36
|
### Loading config file
|
|
33
37
|
conf = UR::XMLConfigFile.new opts['rtde_config']
|
|
34
38
|
output_names, output_types = conf.get_recipe opts['rtde_config_recipe_base']
|
|
35
39
|
opts['rtde'] = UR::Rtde.new(opts['ipadress']).connect
|
|
36
40
|
|
|
37
|
-
### Set Speed
|
|
41
|
+
### Set Speed
|
|
38
42
|
if opts['rtde_config_recipe_speed']
|
|
39
43
|
speed_names, speed_types = conf.get_recipe opts['rtde_config_recipe_speed']
|
|
40
44
|
opts['speed'] = opts['rtde'].send_input_setup(speed_names, speed_types)
|
|
@@ -56,22 +60,34 @@ module URUA
|
|
|
56
60
|
begin
|
|
57
61
|
yield
|
|
58
62
|
rescue UR::Dash::Reconnect => e
|
|
63
|
+
puts e.message
|
|
59
64
|
tries += 1
|
|
60
65
|
if tries < 2
|
|
61
66
|
URUA::start_dash opts
|
|
62
67
|
retry
|
|
63
68
|
end
|
|
69
|
+
rescue UR::Psi::Reconnect => e
|
|
70
|
+
puts e.message
|
|
71
|
+
tries += 1
|
|
72
|
+
if tries < 2
|
|
73
|
+
URUA::start_psi opts
|
|
74
|
+
retry
|
|
75
|
+
end
|
|
64
76
|
end
|
|
65
77
|
end #}}}
|
|
66
78
|
|
|
67
79
|
def self::ssh_start(opts) #{{{
|
|
68
|
-
|
|
80
|
+
if opts['certificate']
|
|
81
|
+
opts['ssh'] = Net::SSH.start(opts['ipadress'], opts['username'], :keys => [ opts['certificate'] ])
|
|
82
|
+
else
|
|
83
|
+
opts['ssh'] = opts['password'] ? Net::SSH.start(opts['ipadress'], opts['username'], password: opts['password']) : Net::SSH.start(opts['ipadress'], opts['username'])
|
|
84
|
+
end
|
|
69
85
|
end #}}}
|
|
70
86
|
|
|
71
87
|
def self::download_program(opts,name) #{{{
|
|
72
88
|
counter = 0
|
|
73
89
|
begin
|
|
74
|
-
opts['ssh'].scp.download File.join(opts['url'],name)
|
|
90
|
+
opts['ssh'].scp.download! File.join(opts['url'],name)
|
|
75
91
|
rescue => e
|
|
76
92
|
counter += 1
|
|
77
93
|
URUA::ssh_start opts
|
|
@@ -102,9 +118,14 @@ module URUA
|
|
|
102
118
|
progs
|
|
103
119
|
end #}}}
|
|
104
120
|
|
|
121
|
+
def self::robotprogram_running?(opts)
|
|
122
|
+
opts['ps'].value == 'Playing'
|
|
123
|
+
end
|
|
124
|
+
|
|
105
125
|
def self::implementation_startup(opts) #{{{
|
|
106
126
|
opts['rtde_config'] ||= File.join(__dir__,'rtde.conf.xml')
|
|
107
127
|
opts['rtde_config_recipe_base'] ||= 'out'
|
|
128
|
+
opts['rtde_config_recipe_speed'] ||= 'speed'
|
|
108
129
|
|
|
109
130
|
Proc.new do
|
|
110
131
|
on startup do |opts|
|
|
@@ -113,6 +134,7 @@ module URUA
|
|
|
113
134
|
opts['dash'] = nil
|
|
114
135
|
opts['rtde'] = nil
|
|
115
136
|
opts['programs'] = nil
|
|
137
|
+
opts['psi'] = nil
|
|
116
138
|
|
|
117
139
|
# ProgramFile
|
|
118
140
|
opts['pf'] = opts['server'].types.add_object_type(:ProgramFile).tap{ |p|
|
|
@@ -123,10 +145,20 @@ module URUA
|
|
|
123
145
|
end
|
|
124
146
|
end
|
|
125
147
|
p.add_method :StartProgram do |node|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
opts
|
|
129
|
-
|
|
148
|
+
unless URUA::robotprogram_running?(opts)
|
|
149
|
+
a = node.id.to_s.split('/')
|
|
150
|
+
URUA::protect_reconnect_run(opts) do
|
|
151
|
+
opts['dash'].load_program(a[-2])
|
|
152
|
+
opts['dash'].start_program
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
p.add_method :StartAsUrScript do |node|
|
|
157
|
+
unless URUA::robotprogram_running?(opts)
|
|
158
|
+
a = node.id.to_s.split('/')
|
|
159
|
+
URUA::protect_reconnect_run(opts) do
|
|
160
|
+
opts['psi'].execute_ur_script(URUA::download_program(opts, a[-2]+".script"))
|
|
161
|
+
end
|
|
130
162
|
end
|
|
131
163
|
end
|
|
132
164
|
}
|
|
@@ -172,8 +204,10 @@ module URUA
|
|
|
172
204
|
end
|
|
173
205
|
end
|
|
174
206
|
r.add_method :StartProgram do
|
|
175
|
-
URUA::
|
|
176
|
-
|
|
207
|
+
unless URUA::robotprogram_running?(opts)
|
|
208
|
+
URUA::protect_reconnect_run(opts) do
|
|
209
|
+
nil unless opts['dash'].start_program
|
|
210
|
+
end
|
|
177
211
|
end
|
|
178
212
|
end
|
|
179
213
|
r.add_method :StopProgram do
|
|
@@ -186,6 +220,13 @@ module URUA
|
|
|
186
220
|
opts['dash'].pause_program
|
|
187
221
|
end
|
|
188
222
|
end
|
|
223
|
+
r.add_method :RunUrScript, content: OPCUA::TYPES::STRING do |node, content|
|
|
224
|
+
unless URUA::robotprogram_running?(opts)
|
|
225
|
+
URUA::protect_reconnect_run(opts) do
|
|
226
|
+
opts['psi'].execute_ur_script(content)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
189
230
|
r.add_method :PowerOn do
|
|
190
231
|
if opts['rm'].value.to_s != 'Running'
|
|
191
232
|
Thread.new do
|
|
@@ -232,7 +273,7 @@ module URUA
|
|
|
232
273
|
}
|
|
233
274
|
### populating the adress space
|
|
234
275
|
### Robot object
|
|
235
|
-
robot = opts['server'].objects.manifest(
|
|
276
|
+
robot = opts['server'].objects.manifest(File.basename(opts['namespace']), rt)
|
|
236
277
|
|
|
237
278
|
opts['sn'] = robot.find(:SerialNumber)
|
|
238
279
|
opts['model'] = robot.find(:RobotModel)
|
|
@@ -291,6 +332,7 @@ module URUA
|
|
|
291
332
|
### Connecting to universal robot
|
|
292
333
|
URUA::start_rtde opts
|
|
293
334
|
URUA::start_dash opts
|
|
335
|
+
URUA::start_psi opts
|
|
294
336
|
|
|
295
337
|
### Manifest programs
|
|
296
338
|
opts['programs'] = robot.find(:Programs)
|
|
@@ -298,7 +340,7 @@ module URUA
|
|
|
298
340
|
opts['progs'] = []
|
|
299
341
|
opts['semaphore'] = Mutex.new
|
|
300
342
|
### check if interfaces are ok
|
|
301
|
-
raise if !opts['dash'] || !opts['rtde']
|
|
343
|
+
raise if !opts['dash'] || !opts['rtde'] || !opts['psi']
|
|
302
344
|
|
|
303
345
|
# Functionality for threading in loop
|
|
304
346
|
opts['doit_state'] = Time.now.to_i
|
|
@@ -308,6 +350,17 @@ module URUA
|
|
|
308
350
|
# Serious comment (we do the obvious stuff)
|
|
309
351
|
opts['sn'].value = opts['dash'].get_serial_number
|
|
310
352
|
opts['model'].value = opts['dash'].get_robot_model
|
|
353
|
+
rescue Errno::ECONNREFUSED => e
|
|
354
|
+
print 'ECONNREFUSED: '
|
|
355
|
+
puts e.message
|
|
356
|
+
rescue UR::Dash::Reconnect => e
|
|
357
|
+
URUA::start_dash opts
|
|
358
|
+
puts e.message
|
|
359
|
+
puts e.backtrace
|
|
360
|
+
rescue UR::Psi::Reconnect => e
|
|
361
|
+
URUA::start_psi opts
|
|
362
|
+
puts e.message
|
|
363
|
+
puts e.backtrace
|
|
311
364
|
rescue => e
|
|
312
365
|
puts e.message
|
|
313
366
|
puts e.backtrace
|
|
@@ -338,14 +391,12 @@ module URUA
|
|
|
338
391
|
# check every 10 seconds for new programs
|
|
339
392
|
progs = URUA::get_robot_programs(opts)
|
|
340
393
|
delete = opts['progs'] - progs
|
|
341
|
-
# puts 'Missing Nodes: ' + delete.to_s
|
|
342
394
|
delete.each do |d|
|
|
343
395
|
d = d[0..-5]
|
|
344
396
|
opts['prognodes'][d].delete!
|
|
345
397
|
opts['prognodes'].delete(d)
|
|
346
398
|
end
|
|
347
399
|
add = progs - opts['progs']
|
|
348
|
-
# puts 'New nodes: ' + add.to_s
|
|
349
400
|
add.each do |a|
|
|
350
401
|
a = a[0..-5]
|
|
351
402
|
opts['prognodes'][a] = opts['programs'].manifest(a, opts['pf'])
|
|
@@ -383,10 +434,14 @@ module URUA
|
|
|
383
434
|
URUA::split_vector6_data(data['actual_qd'],opts['as'], opts['asa']) # Actual TCP Speed
|
|
384
435
|
URUA::split_vector6_data(data['actual_qd'],opts['af'], opts['afa']) # Actual TCP Force
|
|
385
436
|
|
|
437
|
+
######TODO Fix Write Values that opc ua does not overwrite the speed slider mask of manual changes
|
|
386
438
|
# Write values
|
|
387
439
|
if opts['rtde_config_recipe_speed']
|
|
388
|
-
opts['
|
|
389
|
-
opts['
|
|
440
|
+
#if opts['ov'] != opts['ovold']
|
|
441
|
+
# if opts['ov'] == data['target_speed_fraction']
|
|
442
|
+
#opts['speed']['speed_slider_fraction'] = opts['ov'].value / 100.0
|
|
443
|
+
#opts['rtde'].send(opts['speed'])
|
|
444
|
+
opts['ovold'] = data['target_speed_fraction']
|
|
390
445
|
end
|
|
391
446
|
else
|
|
392
447
|
if Time.now.to_i - 10 > opts['doit_rtde']
|
|
@@ -394,18 +449,21 @@ module URUA
|
|
|
394
449
|
URUA::start_rtde opts
|
|
395
450
|
end
|
|
396
451
|
end
|
|
397
|
-
|
|
398
452
|
rescue Errno::ECONNREFUSED => e
|
|
399
|
-
|
|
453
|
+
print 'ECONNREFUSED: '
|
|
400
454
|
puts e.message
|
|
401
455
|
rescue UR::Dash::Reconnect => e
|
|
402
456
|
URUA::start_dash opts
|
|
457
|
+
puts e.message
|
|
458
|
+
puts e.backtrace
|
|
459
|
+
rescue UR::Psi::Reconnect => e
|
|
460
|
+
URUA::start_psi opts
|
|
461
|
+
puts e.message
|
|
462
|
+
puts e.backtrace
|
|
403
463
|
rescue => e
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
p e.message
|
|
408
|
-
p e.backtrace
|
|
464
|
+
puts e.message
|
|
465
|
+
puts e.backtrace
|
|
466
|
+
raise
|
|
409
467
|
end
|
|
410
468
|
end
|
|
411
469
|
end #}}}
|
data/server/devserver.conf
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
### OPC UA specific config
|
|
2
2
|
### --------------------------------------------------------------------------
|
|
3
|
-
namespace: https://centurio.work/
|
|
3
|
+
namespace: https://centurio.work/urwst51
|
|
4
4
|
|
|
5
5
|
### UR specific config
|
|
6
6
|
### --------------------------------------------------------------------------
|
|
7
|
-
ipadress:
|
|
8
|
-
username:
|
|
9
|
-
|
|
7
|
+
ipadress: 131.130.37.204
|
|
8
|
+
username: root
|
|
9
|
+
certificate: /home/paukerf87/Projects/urua/server/devserver.rsa
|
|
10
10
|
url: /programs
|
|
11
11
|
|
|
12
12
|
### UR simulation specific config
|
data/server/uruaserver.conf
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
### OPC UA specific config
|
|
2
2
|
### --------------------------------------------------------------------------
|
|
3
|
-
namespace: https://centurio.work/
|
|
3
|
+
namespace: https://centurio.work/ur10
|
|
4
4
|
|
|
5
5
|
### UR specific config
|
|
6
6
|
### --------------------------------------------------------------------------
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: urua
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.99.
|
|
4
|
+
version: 0.99.5004
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Florian Pauker
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: tools
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2020-
|
|
12
|
+
date: 2020-09-01 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: opcua
|
|
@@ -46,6 +46,9 @@ dependencies:
|
|
|
46
46
|
- - "~>"
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
48
|
version: '0.5'
|
|
49
|
+
- - ">="
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: 0.5.9
|
|
49
52
|
type: :runtime
|
|
50
53
|
prerelease: false
|
|
51
54
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -53,6 +56,23 @@ dependencies:
|
|
|
53
56
|
- - "~>"
|
|
54
57
|
- !ruby/object:Gem::Version
|
|
55
58
|
version: '0.5'
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.5.9
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: net-ssh
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '5.2'
|
|
69
|
+
type: :runtime
|
|
70
|
+
prerelease: false
|
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '5.2'
|
|
56
76
|
- !ruby/object:Gem::Dependency
|
|
57
77
|
name: net-scp
|
|
58
78
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -67,6 +87,40 @@ dependencies:
|
|
|
67
87
|
- - "~>"
|
|
68
88
|
- !ruby/object:Gem::Version
|
|
69
89
|
version: '3.0'
|
|
90
|
+
- !ruby/object:Gem::Dependency
|
|
91
|
+
name: ed25519
|
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '1'
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: '1.2'
|
|
100
|
+
type: :runtime
|
|
101
|
+
prerelease: false
|
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - "~>"
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '1'
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.2'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: bcrypt_pbkdf
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '1'
|
|
117
|
+
type: :runtime
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '1'
|
|
70
124
|
description: OPC UA Server for Universal Robots. See https://github.com/fpauker/urua
|
|
71
125
|
email: florian.pauker@gmail.com
|
|
72
126
|
executables:
|