urua 0.99.4446 → 0.99.5004

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13b068077cf454eb962ab28eef69da0dac61d227932426226ad41790cfb0bbf4
4
- data.tar.gz: '048aad779e7ce130c8044cfc3502ba8e6178cc6c9cad6db3f060e2832236deea'
3
+ metadata.gz: 94ce72efcb23082b842157f2e93e065493c5654785e3fd1e992967336552b814
4
+ data.tar.gz: d7d7b4dac9cedd7a849120b8f8d4fe9bc8bc73b07bac9225a787fd4d29e4d673
5
5
  SHA512:
6
- metadata.gz: d1ae2828b736176efffae4871c33e7264b58406e26aa0fb9bc70cf14e5f0849fa7a149822a404eefd2b2a04baa5a4d2cdefb86c929a12b7cebc415eae8146b9c
7
- data.tar.gz: 9225ca142e73f5a629a2bd27c1ba691c3ee03d78b012bbbd3298155e2ed809ea5dca212e34044be26b0ddd5fef5c1a9a461b6b0519e7e93400db1f00d8f70409
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 Server for Universal Robots
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 th ur-sock and opcua-smart library.
9
+ A simple ruby server, which uses the ur-sock and opcua-smart library.
10
10
 
11
11
  ### Prerequisites & Intallation
12
12
 
13
- To run the server we need the following packages:
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
- * ruby gems:
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
- gem install opcua
18
- gem install ur-sock
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
- ![Architecture](adressspace/ur1.png?raw=true | width=50)
24
- ![Architecture](adressspace/ur2.png?raw=true | width=50)
25
- ![Architecture](adressspace/ur3.png?raw=true | width=50)
26
- ![Architecture](adressspace/ur5.png?raw=true | width=50)
55
+ The server's adress space is shown in the pictures below.
56
+
57
+ ![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur1.png?raw=true)
58
+ ![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur2.png?raw=true)
59
+ ![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur3.png?raw=true)
60
+ ![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur5.png?raw=true)
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
 
@@ -0,0 +1,94 @@
1
+ <?xml version="1.0"?>
2
+ <rtde_config>
3
+ <recipe key="speed">
4
+ <field name="speed_slider_mask" type="UINT32"/>
5
+ <field name="speed_slider_fraction" type="DOUBLE"/>
6
+ </recipe>
7
+
8
+ <recipe key="out">
9
+ <field name="timestamp" type="DOUBLE"/>
10
+ <field name="target_q" type="VECTOR6D"/>
11
+ <field name="target_qd" type="VECTOR6D"/>
12
+ <field name="target_qdd" type="VECTOR6D"/>
13
+ <field name="target_current" type="VECTOR6D"/>
14
+ <field name="target_moment" type="VECTOR6D"/>
15
+ <field name="actual_q" type="VECTOR6D"/>
16
+ <field name="actual_qd" type="VECTOR6D"/>
17
+ <field name="actual_current" type="VECTOR6D"/>
18
+ <field name="joint_control_output" type="VECTOR6D"/>
19
+ <field name="actual_TCP_pose" type="VECTOR6D"/>
20
+ <field name="actual_TCP_speed" type="VECTOR6D"/>
21
+ <field name="actual_TCP_force" type="VECTOR6D"/>
22
+ <field name="target_TCP_pose" type="VECTOR6D"/>
23
+ <field name="target_TCP_speed" type="VECTOR6D"/>
24
+ <field name="actual_digital_input_bits" type="UINT64"/>
25
+ <field name="joint_temperatures" type="VECTOR6D"/>
26
+ <field name="actual_execution_time" type="DOUBLE"/>
27
+ <field name="robot_mode" type="INT32"/>
28
+ <field name="joint_mode" type="VECTOR6INT32"/>
29
+ <field name="safety_mode" type="INT32"/>
30
+ <field name="actual_tool_accelerometer" type="VECTOR3D"/>
31
+ <field name="speed_scaling" type="DOUBLE"/>
32
+ <field name="target_speed_fraction" type="DOUBLE"/>
33
+ <field name="actual_momentum" type="DOUBLE"/>
34
+ <field name="actual_main_voltage" type="DOUBLE"/>
35
+ <field name="actual_robot_voltage" type="DOUBLE"/>
36
+ <field name="actual_robot_current" type="DOUBLE"/>
37
+ <field name="actual_joint_voltage" type="VECTOR6D"/>
38
+ <field name="actual_digital_output_bits" type="UINT64"/>
39
+ <field name="runtime_state" type="UINT32"/>
40
+
41
+ <!-- field name="output_bit_registers0_to_31" type="UINT32"/-->
42
+ <!-- field name="output_bit_registers32_to_63" type="UINT32"/-->
43
+
44
+ <!-- field name="output_int_register_0" type="INT32"/-->
45
+ <!-- field name="output_int_register_1" type="INT32"/-->
46
+ <!-- field name="output_int_register_2" type="INT32"/-->
47
+ <!-- field name="output_int_register_3" type="INT32"/-->
48
+ <!-- field name="output_int_register_4" type="INT32"/-->
49
+ <!-- field name="output_int_register_5" type="INT32"/-->
50
+ <!-- field name="output_int_register_6" type="INT32"/-->
51
+ <!-- field name="output_int_register_7" type="INT32"/-->
52
+ <!-- field name="output_int_register_8" type="INT32"/-->
53
+ <!-- field name="output_int_register_9" type="INT32"/-->
54
+ <!-- field name="output_int_register_10" type="INT32"/-->
55
+ <!-- field name="output_int_register_11" type="INT32"/-->
56
+ <!-- field name="output_int_register_12" type="INT32"/-->
57
+ <!-- field name="output_int_register_13" type="INT32"/-->
58
+ <!-- field name="output_int_register_14" type="INT32"/-->
59
+ <!-- field name="output_int_register_15" type="INT32"/-->
60
+ <!-- field name="output_int_register_16" type="INT32"/-->
61
+ <!-- field name="output_int_register_17" type="INT32"/-->
62
+ <!-- field name="output_int_register_18" type="INT32"/-->
63
+ <!-- field name="output_int_register_19" type="INT32"/-->
64
+ <!-- field name="output_int_register_20" type="INT32"/-->
65
+ <!-- field name="output_int_register_21" type="INT32"/-->
66
+ <!-- field name="output_int_register_22" type="INT32"/-->
67
+ <!-- field name="output_int_register_23" type="INT32"/-->
68
+
69
+ <!-- field name="output_double_register_0" type="DOUBLE"/-->
70
+ <!-- field name="output_double_register_1" type="DOUBLE"/-->
71
+ <!-- field name="output_double_register_2" type="DOUBLE"/-->
72
+ <!-- field name="output_double_register_3" type="DOUBLE"/-->
73
+ <!-- field name="output_double_register_4" type="DOUBLE"/-->
74
+ <!-- field name="output_double_register_5" type="DOUBLE"/-->
75
+ <!-- field name="output_double_register_6" type="DOUBLE"/-->
76
+ <!-- field name="output_double_register_7" type="DOUBLE"/-->
77
+ <!-- field name="output_double_register_8" type="DOUBLE"/-->
78
+ <!-- field name="output_double_register_9" type="DOUBLE"/-->
79
+ <!-- field name="output_double_register_10" type="DOUBLE"/-->
80
+ <!-- field name="output_double_register_11" type="DOUBLE"/-->
81
+ <!-- field name="output_double_register_12" type="DOUBLE"/-->
82
+ <!-- field name="output_double_register_13" type="DOUBLE"/-->
83
+ <!-- field name="output_double_register_14" type="DOUBLE"/-->
84
+ <!-- field name="output_double_register_15" type="DOUBLE"/-->
85
+ <!-- field name="output_double_register_16" type="DOUBLE"/-->
86
+ <!-- field name="output_double_register_17" type="DOUBLE"/-->
87
+ <!-- field name="output_double_register_18" type="DOUBLE"/-->
88
+ <!-- field name="output_double_register_19" type="DOUBLE"/-->
89
+ <!-- field name="output_double_register_20" type="DOUBLE"/-->
90
+ <!-- field name="output_double_register_21" type="DOUBLE"/-->
91
+ <!-- field name="output_double_register_22" type="DOUBLE"/-->
92
+ <!-- field name="output_double_register_23" type="DOUBLE"/-->
93
+ </recipe>
94
+ </rtde_config>
@@ -1,6 +1,10 @@
1
1
  require 'daemonite'
2
2
  require 'opcua/server'
3
- require 'ur-sock'
3
+ if $dev
4
+ require_relative '../../ur-sock/lib/ur-sock'
5
+ else
6
+ require 'ur-sock'
7
+ end
4
8
  require 'net/ssh'
5
9
  require 'net/scp'
6
10
 
@@ -24,13 +28,17 @@ module URUA
24
28
  opts['dash'] = UR::Dash.new(opts['ipadress']).connect rescue nil
25
29
  end #}}}
26
30
 
31
+ def self::start_psi(opts)
32
+ opts['psi'] = UR::Psi.new(opts['ipadress']).connect rescue nil
33
+ end
34
+
27
35
  def self::start_rtde(opts) #{{{
28
36
  ### Loading config file
29
37
  conf = UR::XMLConfigFile.new opts['rtde_config']
30
38
  output_names, output_types = conf.get_recipe opts['rtde_config_recipe_base']
31
-
32
39
  opts['rtde'] = UR::Rtde.new(opts['ipadress']).connect
33
- ### Set Speed to very slow
40
+
41
+ ### Set Speed
34
42
  if opts['rtde_config_recipe_speed']
35
43
  speed_names, speed_types = conf.get_recipe opts['rtde_config_recipe_speed']
36
44
  opts['speed'] = opts['rtde'].send_input_setup(speed_names, speed_types)
@@ -52,22 +60,34 @@ module URUA
52
60
  begin
53
61
  yield
54
62
  rescue UR::Dash::Reconnect => e
63
+ puts e.message
55
64
  tries += 1
56
65
  if tries < 2
57
66
  URUA::start_dash opts
58
67
  retry
59
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
60
76
  end
61
77
  end #}}}
62
78
 
63
79
  def self::ssh_start(opts) #{{{
64
- opts['ssh'] = opts['password'] ? Net::SSH.start(opts['ipadress'], opts['username'], password: opts['password']) : Net::SSH.start(opts['ipadress'], opts['username'])
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
65
85
  end #}}}
66
86
 
67
87
  def self::download_program(opts,name) #{{{
68
88
  counter = 0
69
89
  begin
70
- opts['ssh'].scp.download File.join(opts['url'],name)
90
+ opts['ssh'].scp.download! File.join(opts['url'],name)
71
91
  rescue => e
72
92
  counter += 1
73
93
  URUA::ssh_start opts
@@ -98,9 +118,14 @@ module URUA
98
118
  progs
99
119
  end #}}}
100
120
 
121
+ def self::robotprogram_running?(opts)
122
+ opts['ps'].value == 'Playing'
123
+ end
124
+
101
125
  def self::implementation_startup(opts) #{{{
102
126
  opts['rtde_config'] ||= File.join(__dir__,'rtde.conf.xml')
103
127
  opts['rtde_config_recipe_base'] ||= 'out'
128
+ opts['rtde_config_recipe_speed'] ||= 'speed'
104
129
 
105
130
  Proc.new do
106
131
  on startup do |opts|
@@ -109,6 +134,7 @@ module URUA
109
134
  opts['dash'] = nil
110
135
  opts['rtde'] = nil
111
136
  opts['programs'] = nil
137
+ opts['psi'] = nil
112
138
 
113
139
  # ProgramFile
114
140
  opts['pf'] = opts['server'].types.add_object_type(:ProgramFile).tap{ |p|
@@ -119,10 +145,20 @@ module URUA
119
145
  end
120
146
  end
121
147
  p.add_method :StartProgram do |node|
122
- a = node.id.to_s.split('/')
123
- URUA::protect_reconnect_run(opts) do
124
- opts['dash'].load_program(a[-2])
125
- opts['dash'].start_program
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
126
162
  end
127
163
  end
128
164
  }
@@ -145,7 +181,7 @@ module URUA
145
181
  rt = opts['server'].types.add_object_type(:RobotType).tap { |r|
146
182
  r.add_variables :SerialNumber, :RobotModel
147
183
  r.add_object(:State, opts['server'].types.folder).tap{ |s|
148
- s.add_variables :CurrentProgram, :RobotMode, :RobotState, :JointMode, :SafetyMode, :ToolMode, :ProgramState, :SpeedScaling, :Remote
184
+ s.add_variables :CurrentProgram, :RobotMode, :RobotState, :JointMode, :SafetyMode, :ToolMode, :ProgramState, :SpeedScaling, :Remote, :OperationalMode
149
185
  s.add_variable_rw :Override
150
186
  }
151
187
  r.add_object(:SafetyBoard, opts['server'].types.folder).tap{ |r|
@@ -168,8 +204,10 @@ module URUA
168
204
  end
169
205
  end
170
206
  r.add_method :StartProgram do
171
- URUA::protect_reconnect_run(opts) do
172
- nil unless opts['dash'].start_program
207
+ unless URUA::robotprogram_running?(opts)
208
+ URUA::protect_reconnect_run(opts) do
209
+ nil unless opts['dash'].start_program
210
+ end
173
211
  end
174
212
  end
175
213
  r.add_method :StopProgram do
@@ -182,6 +220,13 @@ module URUA
182
220
  opts['dash'].pause_program
183
221
  end
184
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
185
230
  r.add_method :PowerOn do
186
231
  if opts['rm'].value.to_s != 'Running'
187
232
  Thread.new do
@@ -228,7 +273,7 @@ module URUA
228
273
  }
229
274
  ### populating the adress space
230
275
  ### Robot object
231
- robot = opts['server'].objects.manifest(:UR10e, rt)
276
+ robot = opts['server'].objects.manifest(File.basename(opts['namespace']), rt)
232
277
 
233
278
  opts['sn'] = robot.find(:SerialNumber)
234
279
  opts['model'] = robot.find(:RobotModel)
@@ -251,6 +296,7 @@ module URUA
251
296
  opts['ov'] = st.find(:Override)
252
297
  opts['ss'] = st.find(:SpeedScaling)
253
298
  opts['mo'] = st.find(:Remote)
299
+ opts['op'] = st.find(:OperationalMode)
254
300
 
255
301
  ### Axes
256
302
  axes = robot.manifest(:Axes, ax)
@@ -286,6 +332,7 @@ module URUA
286
332
  ### Connecting to universal robot
287
333
  URUA::start_rtde opts
288
334
  URUA::start_dash opts
335
+ URUA::start_psi opts
289
336
 
290
337
  ### Manifest programs
291
338
  opts['programs'] = robot.find(:Programs)
@@ -293,7 +340,7 @@ module URUA
293
340
  opts['progs'] = []
294
341
  opts['semaphore'] = Mutex.new
295
342
  ### check if interfaces are ok
296
- raise if !opts['dash'] || !opts['rtde'] ##### TODO, don't return, raise
343
+ raise if !opts['dash'] || !opts['rtde'] || !opts['psi']
297
344
 
298
345
  # Functionality for threading in loop
299
346
  opts['doit_state'] = Time.now.to_i
@@ -303,6 +350,17 @@ module URUA
303
350
  # Serious comment (we do the obvious stuff)
304
351
  opts['sn'].value = opts['dash'].get_serial_number
305
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
306
364
  rescue => e
307
365
  puts e.message
308
366
  puts e.backtrace
@@ -322,6 +380,7 @@ module URUA
322
380
  opts['rs'].value = opts['dash'].get_program_state
323
381
  # update remote control state from dashboard server
324
382
  opts['mo'].value = opts['dash'].is_in_remote_control
383
+ opts['op'].value = opts['dash'].get_operational_mode
325
384
  end
326
385
 
327
386
  if Time.now.to_i - 10 > opts['doit_progs']
@@ -332,14 +391,12 @@ module URUA
332
391
  # check every 10 seconds for new programs
333
392
  progs = URUA::get_robot_programs(opts)
334
393
  delete = opts['progs'] - progs
335
- # puts 'Missing Nodes: ' + delete.to_s
336
394
  delete.each do |d|
337
395
  d = d[0..-5]
338
396
  opts['prognodes'][d].delete!
339
397
  opts['prognodes'].delete(d)
340
398
  end
341
399
  add = progs - opts['progs']
342
- # puts 'New nodes: ' + add.to_s
343
400
  add.each do |a|
344
401
  a = a[0..-5]
345
402
  opts['prognodes'][a] = opts['programs'].manifest(a, opts['pf'])
@@ -377,10 +434,14 @@ module URUA
377
434
  URUA::split_vector6_data(data['actual_qd'],opts['as'], opts['asa']) # Actual TCP Speed
378
435
  URUA::split_vector6_data(data['actual_qd'],opts['af'], opts['afa']) # Actual TCP Force
379
436
 
437
+ ######TODO Fix Write Values that opc ua does not overwrite the speed slider mask of manual changes
380
438
  # Write values
381
439
  if opts['rtde_config_recipe_speed']
382
- opts['speed']['speed_slider_fraction'] = opts['ov'].value / 100.0
383
- opts['rtde'].send(opts['speed'])
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']
384
445
  end
385
446
  else
386
447
  if Time.now.to_i - 10 > opts['doit_rtde']
@@ -388,18 +449,21 @@ module URUA
388
449
  URUA::start_rtde opts
389
450
  end
390
451
  end
391
-
392
452
  rescue Errno::ECONNREFUSED => e
393
- puts 'ECONNREFUSED:'
453
+ print 'ECONNREFUSED: '
394
454
  puts e.message
395
455
  rescue UR::Dash::Reconnect => e
396
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
397
463
  rescue => e
398
- unless opts['dash']
399
- URUA::start_dash opts
400
- end
401
- p e.message
402
- p e.backtrace
464
+ puts e.message
465
+ puts e.backtrace
466
+ raise
403
467
  end
404
468
  end
405
469
  end #}}}
@@ -0,0 +1,17 @@
1
+ ### OPC UA specific config
2
+ ### --------------------------------------------------------------------------
3
+ namespace: https://centurio.work/urwst51
4
+
5
+ ### UR specific config
6
+ ### --------------------------------------------------------------------------
7
+ ipadress: 131.130.37.204
8
+ username: root
9
+ certificate: /home/paukerf87/Projects/urua/server/devserver.rsa
10
+ url: /programs
11
+
12
+ ### UR simulation specific config
13
+ ### --------------------------------------------------------------------------
14
+ ### if no password, password has to entered when server is started
15
+ # ipadress: localhost
16
+ # username: myusername
17
+ # url: /home/myusername/somedirectory/ursim-current/programs.UR10
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/ruby
2
+ $dev = true
3
+ require_relative '../lib/urua'
4
+ ### add stuff if necessary
5
+
6
+ Thread.abort_on_exception=true
7
+
8
+ Daemonite.new do |opts|
9
+ ### add or replace building blocks if necessary
10
+ use URUA::implementation_startup(opts)
11
+ use URUA::implementation_run
12
+ use URUA::implementation_exit
13
+ end.loop!
@@ -1,6 +1,6 @@
1
1
  ### OPC UA specific config
2
2
  ### --------------------------------------------------------------------------
3
- namespace: https://centurio.work/ur10evva
3
+ namespace: https://centurio.work/ur10
4
4
 
5
5
  ### UR specific config
6
6
  ### --------------------------------------------------------------------------
data/tools/urua CHANGED
@@ -43,7 +43,7 @@ if command == 'scaffold'
43
43
  dir = File.join(__dir__,'..','server')
44
44
  FileUtils.cp(File.join(dir,'uruaserver.rb'),'.')
45
45
  Dir[File.join(dir,'*')].each do |f|
46
- unless File.exist?(File.join(__dir__,File.basename(f)))
46
+ unless File.exist?(File.join(__dir__,File.basename(f))) || f =~ /\/dev/
47
47
  FileUtils.cp(f,'.')
48
48
  end
49
49
  end
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.4446
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-05-30 00:00:00.000000000 Z
12
+ date: 2020-09-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: opcua
@@ -29,16 +29,16 @@ dependencies:
29
29
  name: ur-sock
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0.4444'
34
+ version: '1.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.4444'
41
+ version: '1.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: daemonite
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -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,8 +56,73 @@ 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'
76
+ - !ruby/object:Gem::Dependency
77
+ name: net-scp
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
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'
56
124
  description: OPC UA Server for Universal Robots. See https://github.com/fpauker/urua
57
- email: juergen.mangler@gmail.com
125
+ email: florian.pauker@gmail.com
58
126
  executables:
59
127
  - urua
60
128
  extensions: []
@@ -65,11 +133,14 @@ files:
65
133
  - LICENSE
66
134
  - README.md
67
135
  - Rakefile
136
+ - lib/rtde.conf.xml
68
137
  - lib/urua.rb
138
+ - server/devserver.conf
139
+ - server/devserver.rb
69
140
  - server/uruaserver.conf
70
141
  - server/uruaserver.rb
71
142
  - tools/urua
72
- homepage: http://cpee.org/
143
+ homepage: https://github.com/fpauker/urua
73
144
  licenses:
74
145
  - GPL-3.0
75
146
  metadata: {}