urua 0.99.5000 → 0.99.5005

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: bf7aa8a06159f78f2374cd771d0f2028963d7276d879df878e778e30e5076bfe
4
- data.tar.gz: 66b2c863d5b5c28f64dc953ce2826ced664c029e40213ebf3bb42b1dfe0f5450
3
+ metadata.gz: '08bfaa4aad14130da8b785c322c4c76509c5748dfab2fb73a19058da444f3842'
4
+ data.tar.gz: ed91abfd616678a80470132c374ba24034564a3615c2dddf9cda1fc3ae2f2493
5
5
  SHA512:
6
- metadata.gz: ef32386ec69bb1605ac242d0b849b02a6f2bb96b34f9c6284cd4441d39508b59759fb21846f5d21aa730ecb93e139191b20d4ab756a755da4d9716afb435d512
7
- data.tar.gz: cbf0db9abf68997f387141b7a26581f3139e992728de8550bffe10f7af1526f527fd5f280413090d7573ab5a7c3f7b2f6bc43d467181486275c2c5bf87510f59
6
+ metadata.gz: 372ed2f32db3566fda2636aa59bea36cec64734f2f1cda6f6e5e45f4467efe4ad436e9293dae732bdab0adf4bc2e875ece9a7c6fb62c8313a176edede19b7205
7
+ data.tar.gz: 26b653018bc518e8fc1d9303dad6a9d9e4844b7a11bd8b1a0f2f0ac02ee26cb3154c1120c9c7ec728ce9141c3b4f2b79fb6ad3207f26a19ac005cf42ced4bf01
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
 
data/lib/rtde.conf.xml ADDED
@@ -0,0 +1,118 @@
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
+ <recipe key="inbit">
8
+ <!--Only put Input Registers here which are used-->
9
+ <field name="input_bit_register_64" type="BOOL"/>
10
+ <field name="input_bit_register_65" type="BOOL"/>
11
+ </recipe>
12
+ <recipe key="inint">
13
+ <!--Only put Input Registers here which are used-->
14
+ <field name="input_int_register_0" type="INT32"/>
15
+ <field name="input_int_register_1" type="INT32"/>
16
+ <field name="input_int_register_2" type="INT32"/>
17
+ <field name="input_int_register_3" type="INT32"/>
18
+ <field name="input_int_register_4" type="INT32"/>
19
+ <field name="input_int_register_5" type="INT32"/>
20
+ <field name="input_int_register_6" type="INT32"/>
21
+ <field name="input_int_register_7" type="INT32"/>
22
+ <field name="input_int_register_8" type="INT32"/>
23
+ <field name="input_int_register_9" type="INT32"/>
24
+ </recipe>
25
+ <recipe key="indoub">
26
+ <!--Only put Input Registers here which are used-->
27
+ <field name="input_double_register_0" type="DOUBLE"/>
28
+ <field name="input_double_register_1" type="DOUBLE"/>
29
+ </recipe>
30
+ <recipe key="out">
31
+ <field name="timestamp" type="DOUBLE"/>
32
+ <field name="target_q" type="VECTOR6D"/>
33
+ <field name="target_qd" type="VECTOR6D"/>
34
+ <field name="target_qdd" type="VECTOR6D"/>
35
+ <field name="target_current" type="VECTOR6D"/>
36
+ <field name="target_moment" type="VECTOR6D"/>
37
+ <field name="actual_q" type="VECTOR6D"/>
38
+ <field name="actual_qd" type="VECTOR6D"/>
39
+ <field name="actual_current" type="VECTOR6D"/>
40
+ <field name="joint_control_output" type="VECTOR6D"/>
41
+ <field name="actual_TCP_pose" type="VECTOR6D"/>
42
+ <field name="actual_TCP_speed" type="VECTOR6D"/>
43
+ <field name="actual_TCP_force" type="VECTOR6D"/>
44
+ <field name="target_TCP_pose" type="VECTOR6D"/>
45
+ <field name="target_TCP_speed" type="VECTOR6D"/>
46
+ <field name="actual_digital_input_bits" type="UINT64"/>
47
+ <field name="joint_temperatures" type="VECTOR6D"/>
48
+ <field name="actual_execution_time" type="DOUBLE"/>
49
+ <field name="robot_mode" type="INT32"/>
50
+ <field name="joint_mode" type="VECTOR6INT32"/>
51
+ <field name="safety_mode" type="INT32"/>
52
+ <field name="actual_tool_accelerometer" type="VECTOR3D"/>
53
+ <field name="speed_scaling" type="DOUBLE"/>
54
+ <field name="target_speed_fraction" type="DOUBLE"/>
55
+ <field name="actual_momentum" type="DOUBLE"/>
56
+ <field name="actual_main_voltage" type="DOUBLE"/>
57
+ <field name="actual_robot_voltage" type="DOUBLE"/>
58
+ <field name="actual_robot_current" type="DOUBLE"/>
59
+ <field name="actual_joint_voltage" type="VECTOR6D"/>
60
+ <field name="actual_digital_output_bits" type="UINT64"/>
61
+ <field name="runtime_state" type="UINT32"/>
62
+ <field name="output_bit_register_64" type="BOOL"/>
63
+ <field name="target_speed_fraction" type="DOUBLE"/>
64
+
65
+ <!-- field name="output_bit_registers0_to_31" type="UINT32"/-->
66
+ <!-- field name="output_bit_registers32_to_63" type="UINT32"/-->
67
+
68
+ <!-- field name="output_int_register_0" type="INT32"/-->
69
+ <!-- field name="output_int_register_1" type="INT32"/-->
70
+ <!-- field name="output_int_register_2" type="INT32"/-->
71
+ <!-- field name="output_int_register_3" type="INT32"/-->
72
+ <!-- field name="output_int_register_4" type="INT32"/-->
73
+ <!-- field name="output_int_register_5" type="INT32"/-->
74
+ <!-- field name="output_int_register_6" type="INT32"/-->
75
+ <!-- field name="output_int_register_7" type="INT32"/-->
76
+ <!-- field name="output_int_register_8" type="INT32"/-->
77
+ <!-- field name="output_int_register_9" type="INT32"/-->
78
+ <!-- field name="output_int_register_10" type="INT32"/-->
79
+ <!-- field name="output_int_register_11" type="INT32"/-->
80
+ <!-- field name="output_int_register_12" type="INT32"/-->
81
+ <!-- field name="output_int_register_13" type="INT32"/-->
82
+ <!-- field name="output_int_register_14" type="INT32"/-->
83
+ <!-- field name="output_int_register_15" type="INT32"/-->
84
+ <!-- field name="output_int_register_16" type="INT32"/-->
85
+ <!-- field name="output_int_register_17" type="INT32"/-->
86
+ <!-- field name="output_int_register_18" type="INT32"/-->
87
+ <!-- field name="output_int_register_19" type="INT32"/-->
88
+ <!-- field name="output_int_register_20" type="INT32"/-->
89
+ <!-- field name="output_int_register_21" type="INT32"/-->
90
+ <!-- field name="output_int_register_22" type="INT32"/-->
91
+ <!-- field name="output_int_register_23" type="INT32"/-->
92
+
93
+ <!-- field name="output_double_register_0" type="DOUBLE"/-->
94
+ <!-- field name="output_double_register_1" type="DOUBLE"/-->
95
+ <!-- field name="output_double_register_2" type="DOUBLE"/-->
96
+ <!-- field name="output_double_register_3" type="DOUBLE"/-->
97
+ <!-- field name="output_double_register_4" type="DOUBLE"/-->
98
+ <!-- field name="output_double_register_5" type="DOUBLE"/-->
99
+ <!-- field name="output_double_register_6" type="DOUBLE"/-->
100
+ <!-- field name="output_double_register_7" type="DOUBLE"/-->
101
+ <!-- field name="output_double_register_8" type="DOUBLE"/-->
102
+ <!-- field name="output_double_register_9" type="DOUBLE"/-->
103
+ <!-- field name="output_double_register_10" type="DOUBLE"/-->
104
+ <!-- field name="output_double_register_11" type="DOUBLE"/-->
105
+ <!-- field name="output_double_register_12" type="DOUBLE"/-->
106
+ <!-- field name="output_double_register_13" type="DOUBLE"/-->
107
+ <!-- field name="output_double_register_14" type="DOUBLE"/-->
108
+ <!-- field name="output_double_register_15" type="DOUBLE"/-->
109
+ <!-- field name="output_double_register_16" type="DOUBLE"/-->
110
+ <!-- field name="output_double_register_17" type="DOUBLE"/-->
111
+ <!-- field name="output_double_register_18" type="DOUBLE"/-->
112
+ <!-- field name="output_double_register_19" type="DOUBLE"/-->
113
+ <!-- field name="output_double_register_20" type="DOUBLE"/-->
114
+ <!-- field name="output_double_register_21" type="DOUBLE"/-->
115
+ <!-- field name="output_double_register_22" type="DOUBLE"/-->
116
+ <!-- field name="output_double_register_23" type="DOUBLE"/-->
117
+ </recipe>
118
+ </rtde_config>
data/lib/urua.rb CHANGED
@@ -28,18 +28,35 @@ 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 to very slow
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)
41
45
  opts['speed']['speed_slider_mask'] = 1
42
- opts['ov'].value = opts['speed']['speed_slider_fraction'].to_i
46
+ end
47
+
48
+ ### Set register
49
+ if opts['rtde_config_recipe_inbit']
50
+ bit_names, bit_types = conf.get_recipe opts['rtde_config_recipe_inbit']
51
+ opts['inbit'] = opts['rtde'].send_input_setup(bit_names,bit_types)
52
+ end
53
+ if opts['rtde_config_recipe_inint']
54
+ int_names, int_types = conf.get_recipe opts['rtde_config_recipe_inint']
55
+ opts['inint'] = opts['rtde'].send_input_setup(int_names,int_types)
56
+ end
57
+ if opts['rtde_config_recipe_indoub']
58
+ doub_names, doub_types = conf.get_recipe opts['rtde_config_recipe_indoub']
59
+ opts['indoub'] = opts['rtde'].send_input_setup(doub_names,doub_types)
43
60
  end
44
61
 
45
62
  ### Setup output
@@ -49,6 +66,17 @@ module URUA
49
66
  if not opts['rtde'].send_start
50
67
  puts 'Unable to start synchronization'
51
68
  end
69
+
70
+ ###Initialize all inputs
71
+ bit_names.each do |i|
72
+ opts['inbit'][i] = false
73
+ end
74
+ int_names.each do |i|
75
+ opts['inint'][i] = 0
76
+ end
77
+ doub_names.each do |i|
78
+ opts['indoub'][i] = 0.0
79
+ end
52
80
  end #}}}
53
81
 
54
82
  def self::protect_reconnect_run(opts) #{{{
@@ -56,22 +84,34 @@ module URUA
56
84
  begin
57
85
  yield
58
86
  rescue UR::Dash::Reconnect => e
87
+ puts e.message
59
88
  tries += 1
60
89
  if tries < 2
61
90
  URUA::start_dash opts
62
91
  retry
63
92
  end
93
+ rescue UR::Psi::Reconnect => e
94
+ puts e.message
95
+ tries += 1
96
+ if tries < 2
97
+ URUA::start_psi opts
98
+ retry
99
+ end
64
100
  end
65
101
  end #}}}
66
102
 
67
103
  def self::ssh_start(opts) #{{{
68
- opts['ssh'] = opts['password'] ? Net::SSH.start(opts['ipadress'], opts['username'], password: opts['password']) : Net::SSH.start(opts['ipadress'], opts['username'])
104
+ if opts['certificate']
105
+ opts['ssh'] = Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'], :keys => [ opts['certificate'] ])
106
+ else
107
+ opts['ssh'] = opts['password'] ? Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'], password: opts['password']) : Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'])
108
+ end
69
109
  end #}}}
70
110
 
71
111
  def self::download_program(opts,name) #{{{
72
112
  counter = 0
73
113
  begin
74
- opts['ssh'].scp.download File.join(opts['url'],name)
114
+ opts['ssh'].scp.download! File.join(opts['url'],name)
75
115
  rescue => e
76
116
  counter += 1
77
117
  URUA::ssh_start opts
@@ -102,9 +142,19 @@ module URUA
102
142
  progs
103
143
  end #}}}
104
144
 
145
+ def self::robotprogram_running?(opts)
146
+ opts['ps'].value == 'Playing'
147
+ end
148
+
105
149
  def self::implementation_startup(opts) #{{{
150
+ opts['sshport'] || 22
151
+
106
152
  opts['rtde_config'] ||= File.join(__dir__,'rtde.conf.xml')
107
153
  opts['rtde_config_recipe_base'] ||= 'out'
154
+ opts['rtde_config_recipe_speed'] ||= 'speed'
155
+ opts['rtde_config_recipe_inbit'] ||= 'inbit'
156
+ opts['rtde_config_recipe_inint'] ||= 'inint'
157
+ opts['rtde_config_recipe_indoub'] ||= 'indoub'
108
158
 
109
159
  Proc.new do
110
160
  on startup do |opts|
@@ -113,6 +163,7 @@ module URUA
113
163
  opts['dash'] = nil
114
164
  opts['rtde'] = nil
115
165
  opts['programs'] = nil
166
+ opts['psi'] = nil
116
167
 
117
168
  # ProgramFile
118
169
  opts['pf'] = opts['server'].types.add_object_type(:ProgramFile).tap{ |p|
@@ -123,10 +174,20 @@ module URUA
123
174
  end
124
175
  end
125
176
  p.add_method :StartProgram do |node|
126
- a = node.id.to_s.split('/')
127
- URUA::protect_reconnect_run(opts) do
128
- opts['dash'].load_program(a[-2])
129
- opts['dash'].start_program
177
+ unless URUA::robotprogram_running?(opts)
178
+ a = node.id.to_s.split('/')
179
+ URUA::protect_reconnect_run(opts) do
180
+ opts['dash'].load_program(a[-2])
181
+ opts['dash'].start_program
182
+ end
183
+ end
184
+ end
185
+ p.add_method :StartAsUrScript do |node|
186
+ unless URUA::robotprogram_running?(opts)
187
+ a = node.id.to_s.split('/')
188
+ URUA::protect_reconnect_run(opts) do
189
+ opts['psi'].execute_ur_script(URUA::download_program(opts, a[-2]+".script"))
190
+ end
130
191
  end
131
192
  end
132
193
  }
@@ -144,17 +205,76 @@ module URUA
144
205
  a.add_object(:ActualVoltage, opts['server'].types.folder).tap { |p| URUA::add_axis_concept p, :AxisVoltage }
145
206
  a.add_object(:ActualMomentum, opts['server'].types.folder).tap { |p| p.add_variable :AxisMomentum }
146
207
  }
208
+ # RegitsterType
209
+ reg = opts['server'].types.add_object_type(:RegType).tap {|r|
210
+ r.add_object(:Inputs, opts['server'].types.folder).tap {|i|
211
+ i.add_object(:Bitregister, opts['server'].types.folder).tap {|b|
212
+ 64.upto(127) do |z|
213
+ b.add_variable_rw :"Bit#{z}" do |node,value,external|
214
+ if external
215
+ opts['inbit']["input_bit_register_" + z.to_s] = value
216
+ opts['rtde'].send(opts['inbit'])
217
+ end
218
+ end
219
+ end
220
+ }
221
+ i.add_object(:Intregister, opts['server'].types.folder).tap {|b|
222
+ 0.upto(47) do |z|
223
+ b.add_variable_rw :"Int#{z}" do |node,value,external|
224
+ if external
225
+ opts['inint']["input_int_register_" + z.to_s] = value.to_i
226
+ opts['rtde'].send(opts['inint'])
227
+ end
228
+ end
229
+ end
230
+ }
231
+ i.add_object(:Doubleregister, opts['server'].types.folder).tap {|b|
232
+ 0.upto(47) do |z|
233
+ b.add_variable_rw :"Double#{z}" do |node,value,external|
234
+ if external
235
+ opts['indoub']["input_double_register_" + z.to_s] = value.to_f
236
+ opts['rtde'].send(opts['indoub'])
237
+ end
238
+ end
239
+ end
240
+ }
241
+ }
242
+ r.add_object(:Outputs, opts['server'].types.folder).tap {|o|
243
+ o.add_object(:Bitregister, opts['server'].types.folder).tap {|b|
244
+ 64.upto(127) do |z|
245
+ b.add_variable :"Bit#{z}"
246
+ end
247
+ }
248
+ o.add_object(:Intregister, opts['server'].types.folder).tap {|b|
249
+ 0.upto(47) do |z|
250
+ b.add_variable :"Int#{z}"
251
+ end
252
+ }
253
+ o.add_object(:Doubleregister, opts['server'].types.folder).tap {|b|
254
+ 0.upto(47) do |z|
255
+ b.add_variable :"Double#{z}"
256
+ end
257
+ }
258
+ }
259
+ }
260
+
147
261
 
148
262
  # RobotObjectType
149
263
  rt = opts['server'].types.add_object_type(:RobotType).tap { |r|
150
264
  r.add_variables :SerialNumber, :RobotModel
151
265
  r.add_object(:State, opts['server'].types.folder).tap{ |s|
152
266
  s.add_variables :CurrentProgram, :RobotMode, :RobotState, :JointMode, :SafetyMode, :ToolMode, :ProgramState, :SpeedScaling, :Remote, :OperationalMode
153
- s.add_variable_rw :Override
267
+ s.add_variable_rw :Override do |node,value,external|
268
+ if external
269
+ opts['speed']['speed_slider_fraction'] = value / 100.0
270
+ opts['rtde'].send(opts['speed'])
271
+ end
272
+ end
154
273
  }
155
274
  r.add_object(:SafetyBoard, opts['server'].types.folder).tap{ |r|
156
275
  r.add_variables :MainVoltage, :RobotVoltage, :RobotCurrent
157
276
  }
277
+
158
278
  r.add_object(:Programs, opts['server'].types.folder).tap{ |p|
159
279
  p.add_object :Program, opts['pf'], OPCUA::OPTIONAL
160
280
  p.add_variable :Programs
@@ -172,8 +292,10 @@ module URUA
172
292
  end
173
293
  end
174
294
  r.add_method :StartProgram do
175
- URUA::protect_reconnect_run(opts) do
176
- nil unless opts['dash'].start_program
295
+ unless URUA::robotprogram_running?(opts)
296
+ URUA::protect_reconnect_run(opts) do
297
+ nil unless opts['dash'].start_program
298
+ end
177
299
  end
178
300
  end
179
301
  r.add_method :StopProgram do
@@ -186,6 +308,13 @@ module URUA
186
308
  opts['dash'].pause_program
187
309
  end
188
310
  end
311
+ r.add_method :RunUrScript, content: OPCUA::TYPES::STRING do |node, content|
312
+ unless URUA::robotprogram_running?(opts)
313
+ URUA::protect_reconnect_run(opts) do
314
+ opts['psi'].execute_ur_script(content)
315
+ end
316
+ end
317
+ end
189
318
  r.add_method :PowerOn do
190
319
  if opts['rm'].value.to_s != 'Running'
191
320
  Thread.new do
@@ -232,7 +361,7 @@ module URUA
232
361
  }
233
362
  ### populating the adress space
234
363
  ### Robot object
235
- robot = opts['server'].objects.manifest(:UR10e, rt)
364
+ robot = opts['server'].objects.manifest(File.basename(opts['namespace']), rt)
236
365
 
237
366
  opts['sn'] = robot.find(:SerialNumber)
238
367
  opts['model'] = robot.find(:RobotModel)
@@ -257,6 +386,50 @@ module URUA
257
386
  opts['mo'] = st.find(:Remote)
258
387
  opts['op'] = st.find(:OperationalMode)
259
388
 
389
+ ### register
390
+ register = robot.manifest(:Register, reg)
391
+ inputs = register.find :Inputs
392
+ ibitreg = inputs.find :Bitregister
393
+ opts['b_bits'] = 64.upto(127).map{|b|
394
+ ib = ibitreg.find :"Bit#{b}"
395
+ ib.value = false
396
+ ib
397
+ }
398
+ iintreg = inputs.find :Intregister
399
+ opts['i_int'] = 0.upto(47).map{|b|
400
+ ii = iintreg.find :"Int#{b}"
401
+ ii.value = 0
402
+ ii
403
+ }
404
+ #extend it with other registers
405
+ idoubreg = inputs.find :Doubleregister
406
+ opts['i_doub'] = 0.upto(47).map{|b|
407
+ id = idoubreg.find :"Double#{b}"
408
+ id.value = 0.0
409
+ id
410
+ }
411
+ #Output register
412
+ outputs = register.find :Outputs
413
+ obitreg = outputs.find :Bitregister
414
+ opts['o_bit'] = 64.upto(127).map{|b|
415
+ ob = obitreg.find :"Bit#{b}"
416
+ ob.value = false
417
+ ob
418
+ }
419
+ ointreg = outputs.find :Intregister
420
+ opts['o_int'] = 0.upto(47).map{|b|
421
+ oi = ointreg.find :"Int#{b}"
422
+ oi.value = 0
423
+ oi
424
+ }
425
+
426
+ odoubreg = outputs.find :Doubleregister
427
+ opts['o_doub'] = 0.upto(47).map{|b|
428
+ od = odoubreg.find :"Double#{b}"
429
+ od.value = 0.0
430
+ od
431
+ }
432
+
260
433
  ### Axes
261
434
  axes = robot.manifest(:Axes, ax)
262
435
  aapf, avelf, acurf, avolf, amomf = axes.find :ActualPositions, :ActualVelocities, :ActualCurrents, :ActualVoltage, :ActualMomentum
@@ -288,9 +461,12 @@ module URUA
288
461
  opts['af'] = aff.find :TCPForce
289
462
  opts['afa'] = aff.find :Axis1, :Axis2, :Axis3, :Axis4, :Axis5, :Axis6
290
463
 
464
+ ### Register
465
+
291
466
  ### Connecting to universal robot
292
467
  URUA::start_rtde opts
293
468
  URUA::start_dash opts
469
+ URUA::start_psi opts
294
470
 
295
471
  ### Manifest programs
296
472
  opts['programs'] = robot.find(:Programs)
@@ -298,7 +474,7 @@ module URUA
298
474
  opts['progs'] = []
299
475
  opts['semaphore'] = Mutex.new
300
476
  ### check if interfaces are ok
301
- raise if !opts['dash'] || !opts['rtde'] ##### TODO, don't return, raise
477
+ raise if !opts['dash'] || !opts['rtde'] || !opts['psi']
302
478
 
303
479
  # Functionality for threading in loop
304
480
  opts['doit_state'] = Time.now.to_i
@@ -308,6 +484,17 @@ module URUA
308
484
  # Serious comment (we do the obvious stuff)
309
485
  opts['sn'].value = opts['dash'].get_serial_number
310
486
  opts['model'].value = opts['dash'].get_robot_model
487
+ rescue Errno::ECONNREFUSED => e
488
+ print 'ECONNREFUSED: '
489
+ puts e.message
490
+ rescue UR::Dash::Reconnect => e
491
+ URUA::start_dash opts
492
+ puts e.message
493
+ puts e.backtrace
494
+ rescue UR::Psi::Reconnect => e
495
+ URUA::start_psi opts
496
+ puts e.message
497
+ puts e.backtrace
311
498
  rescue => e
312
499
  puts e.message
313
500
  puts e.backtrace
@@ -338,14 +525,12 @@ module URUA
338
525
  # check every 10 seconds for new programs
339
526
  progs = URUA::get_robot_programs(opts)
340
527
  delete = opts['progs'] - progs
341
- # puts 'Missing Nodes: ' + delete.to_s
342
528
  delete.each do |d|
343
529
  d = d[0..-5]
344
530
  opts['prognodes'][d].delete!
345
531
  opts['prognodes'].delete(d)
346
532
  end
347
533
  add = progs - opts['progs']
348
- # puts 'New nodes: ' + add.to_s
349
534
  add.each do |a|
350
535
  a = a[0..-5]
351
536
  opts['prognodes'][a] = opts['programs'].manifest(a, opts['pf'])
@@ -365,6 +550,13 @@ module URUA
365
550
  opts['rc'].value = data['actual_robot_current']
366
551
  opts['ss'].value = data['speed_scaling']
367
552
 
553
+ #register
554
+
555
+ #bitregister
556
+ # 64.upto(127).map{|r|
557
+ # opts[]
558
+ # }
559
+
368
560
  # State objects
369
561
  opts['rm'].value = UR::Rtde::ROBOTMODE[data['robot_mode']]
370
562
  opts['sm'].value = UR::Rtde::SAFETYMODE[data['safety_mode']]
@@ -383,29 +575,32 @@ module URUA
383
575
  URUA::split_vector6_data(data['actual_qd'],opts['as'], opts['asa']) # Actual TCP Speed
384
576
  URUA::split_vector6_data(data['actual_qd'],opts['af'], opts['afa']) # Actual TCP Force
385
577
 
386
- # Write values
387
- if opts['rtde_config_recipe_speed']
388
- opts['speed']['speed_slider_fraction'] = opts['ov'].value / 100.0
389
- opts['rtde'].send(opts['speed'])
578
+ #speed slider or override
579
+ if opts['ov'].value != (data['target_speed_fraction'] * 100).to_i
580
+ opts['ov'].value = (data['target_speed_fraction'] * 100).to_i
390
581
  end
582
+
391
583
  else
392
584
  if Time.now.to_i - 10 > opts['doit_rtde']
393
585
  opts['doit_rtde'] = Time.now.to_i
394
586
  URUA::start_rtde opts
395
587
  end
396
588
  end
397
-
398
589
  rescue Errno::ECONNREFUSED => e
399
- puts 'ECONNREFUSED:'
590
+ print 'ECONNREFUSED: '
400
591
  puts e.message
401
592
  rescue UR::Dash::Reconnect => e
402
593
  URUA::start_dash opts
594
+ puts e.message
595
+ puts e.backtrace
596
+ rescue UR::Psi::Reconnect => e
597
+ URUA::start_psi opts
598
+ puts e.message
599
+ puts e.backtrace
403
600
  rescue => e
404
- unless opts['dash']
405
- URUA::start_dash opts
406
- end
407
- p e.message
408
- p e.backtrace
601
+ puts e.message
602
+ puts e.backtrace
603
+ raise
409
604
  end
410
605
  end
411
606
  end #}}}
@@ -1,17 +1,18 @@
1
1
  ### OPC UA specific config
2
2
  ### --------------------------------------------------------------------------
3
- namespace: https://centurio.work/ur10evva
3
+ namespace: https://centurio.work/urwst51
4
4
 
5
5
  ### UR specific config
6
6
  ### --------------------------------------------------------------------------
7
- ipadress: 192.168.1.26
7
+ ipadress: 192.168.1.25
8
+ sshport: 22
8
9
  username: ur
9
- password: easybot
10
+ certificate: /home/mangler/Projects/urua/server/devserver.rsa
10
11
  url: /programs
11
12
 
12
13
  ### UR simulation specific config
13
14
  ### --------------------------------------------------------------------------
14
15
  ### if no password, password has to entered when server is started
15
- # ipadress: localhost
16
- # username: myusername
16
+ # ipadress: 192.168.1.25
17
+ # username: ur
17
18
  # url: /home/myusername/somedirectory/ursim-current/programs.UR10
@@ -0,0 +1,49 @@
1
+ -----BEGIN OPENSSH PRIVATE KEY-----
2
+ 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
49
+ -----END OPENSSH PRIVATE KEY-----
@@ -1,10 +1,11 @@
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
  ### --------------------------------------------------------------------------
7
7
  ipadress: 10.0.31.22
8
+ sshport: 22
8
9
  username: root
9
10
  password: easybot
10
11
  url: /programs
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,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urua
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.99.5000
4
+ version: 0.99.5005
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Pauker
8
8
  - Juergen eTM Mangler
9
- autorequire:
9
+ autorequire:
10
10
  bindir: tools
11
11
  cert_chain: []
12
- date: 2020-06-05 00:00:00.000000000 Z
12
+ date: 2021-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: opcua
@@ -29,14 +29,14 @@ 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
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
41
  version: '1.0'
42
42
  - !ruby/object:Gem::Dependency
@@ -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,71 @@ 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
125
  email: florian.pauker@gmail.com
58
126
  executables:
@@ -65,9 +133,11 @@ files:
65
133
  - LICENSE
66
134
  - README.md
67
135
  - Rakefile
136
+ - lib/rtde.conf.xml
68
137
  - lib/urua.rb
69
138
  - server/devserver.conf
70
139
  - server/devserver.rb
140
+ - server/devserver.rsa
71
141
  - server/uruaserver.conf
72
142
  - server/uruaserver.rb
73
143
  - tools/urua
@@ -75,7 +145,7 @@ homepage: https://github.com/fpauker/urua
75
145
  licenses:
76
146
  - GPL-3.0
77
147
  metadata: {}
78
- post_install_message:
148
+ post_install_message:
79
149
  rdoc_options: []
80
150
  require_paths:
81
151
  - lib
@@ -90,8 +160,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
160
  - !ruby/object:Gem::Version
91
161
  version: '0'
92
162
  requirements: []
93
- rubygems_version: 3.1.2
94
- signing_key:
163
+ rubygems_version: 3.2.22
164
+ signing_key:
95
165
  specification_version: 4
96
166
  summary: OPC UA Server for Universal Robots
97
167
  test_files: []