https://github.com/mitigate-dev/opcua-client-ruby
Incomplete OPC-UA client library for Ruby
https://github.com/mitigate-dev/opcua-client-ruby
Last synced: 5 months ago
JSON representation
Incomplete OPC-UA client library for Ruby
- Host: GitHub
- URL: https://github.com/mitigate-dev/opcua-client-ruby
- Owner: mitigate-dev
- License: mit
- Created: 2019-03-26T11:29:32.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-02-15T13:31:15.000Z (over 3 years ago)
- Last Synced: 2025-10-08T01:25:16.775Z (9 months ago)
- Language: C
- Homepage:
- Size: 377 KB
- Stars: 5
- Watchers: 7
- Forks: 6
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# opcua-client-ruby
Incomplete OPC-UA client library for Ruby. Wraps open62541: .

## Installation
Add it to your Gemfile:
```ruby
gem 'opcua_client'
```
## Basic usage
Use `start` helper to automatically close connections:
```ruby
require 'opcua_client'
OPCUAClient.start("opc.tcp://127.0.0.1:4840") do |client|
# write to ns=2;s=1
client.write_int16(2, "1", 888)
puts client.read_int16(2, "1")
end
```
Or handle connections manually:
```ruby
require 'opcua_client'
client = OPCUAClient::Client.new
begin
client.connect("opc.tcp://127.0.0.1:4840")
# write to ns=2;s=1
client.write_int16(2, "1", 888)
puts client.read_int16(2, "1")
client.multi_write_int16(2, (1..10).map{|x| "action_#{x}"}, (1..10).map{|x| x * 10}) # 10x writes
client.multi_write_int32(2, (1..10).map{|x| "amount_#{x}"}, (1..10).map{|x| x * 10 + 1}) # 10x writes
ensure
client.disconnect
end
```
### Available methods - connection:
* ```client.connect(String url)``` - raises OPCUAClient::Error if unsuccessful
* ```client.disconnect => Fixnum``` - returns status
### Available methods - reads and writes:
All methods raise OPCUAClient::Error if unsuccessful.
* ```client.read_int16(Fixnum ns, String name) => Fixnum```
* ```client.read_uint16(Fixnum ns, String name) => Fixnum```
* ```client.read_int32(Fixnum ns, String name) => Fixnum```
* ```client.read_uint32(Fixnum ns, String name) => Fixnum```
* ```client.read_float(Fixnum ns, String name) => Float```
* ```client.read_boolean(Fixnum ns, String name) => true/false```
* ```client.write_int16(Fixnum ns, String name, Fixnum value)```
* ```client.write_uint16(Fixnum ns, String name, Fixnum value)```
* ```client.write_int32(Fixnum ns, String name, Fixnum value)```
* ```client.write_uint32(Fixnum ns, String name, Fixnum value)```
* ```client.write_float(Fixnum ns, String name, Float value)```
* ```client.write_boolean(Fixnum ns, String name, bool value)```
* ```client.multi_write_int16(Fixnum ns, Array[String] names, Array[Fixnum] values)```
* ```client.multi_write_uint16(Fixnum ns, Array[String] names, Array[Fixnum] values)```
* ```client.multi_write_int32(Fixnum ns, Array[String] names, Array[Fixnum] values)```
* ```client.multi_write_uint32(Fixnum ns, Array[String] names, Array[Fixnum] values)```
* ```client.multi_write_float(Fixnum ns, Array[String] names, Array[Float] values)```
* ```client.multi_write_boolean(Fixnum ns, Array[String] names, Array[bool] values)```
### Available methods - misc:
* ```client.state => Fixnum``` - client internal state
* ```client.human_state => String``` - human readable client internal state
* ```OPCUAClient::Client.human_status_code(Fixnum status) => String``` - returns human status for status
## Subscriptions and monitoring
```ruby
cli = OPCUAClient::Client.new
cli.after_session_created do |cli|
subscription_id = cli.create_subscription
ns_index = 1
node_name = "the.answer"
cli.add_monitored_item(subscription_id, ns_index, node_name)
end
cli.after_data_changed do |subscription_id, monitor_id, server_time, source_time, new_value|
puts("data changed: " + [subscription_id, monitor_id, server_time, source_time, new_value].inspect)
end
cli.connect("opc.tcp://127.0.0.1:4840")
loop do
cli.connect("opc.tcp://127.0.0.1:4840") # no-op if connected
cli.run_mon_cycle
sleep(0.2)
end
```
### Available methods:
* ```client.create_subscription => Fixnum``` - nil if error
* ```client.add_monitored_item(Fixnum subscription, Fixnum ns, String name) => Fixnum``` - nil if error
* ```client.run_mon_cycle``` - returns status
* ```client.run_mon_cycle!``` - raises OPCUAClient::Error if unsuccessful
### Available callbacks:
* ```after_session_created```
* ```after_data_changed```
## Contribute
### Set up
```console
bundle
```
### Build and start dummy OPCUA server
```bash
make -C tools/server/ clean all # clean+all
tools/server/server # run
```
### Try out changes
```console
$ bin/rake compile
$ bin/console
pry> client = OPCUAClient::Client.new
pry> client.connect("opc.tcp://127.0.0.1:4840")
pry> client.read_uint32(5, "uint32b")
pry> client.read_uint16(5, "uint16b")
pry> client.read_bool(5, "true_var")
```
### Test it
```console
$ bin/rake compile
$ bin/rake spec
```