rmodbus 1.3.3 → 2.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/NEWS.md +19 -0
- data/README.md +8 -8
- data/examples/perfomance_rtu.rb +55 -56
- data/examples/perfomance_rtu_via_tcp.rb +54 -55
- data/examples/perfomance_tcp.rb +54 -55
- data/examples/simple_xpca_gateway.rb +85 -0
- data/examples/use_rtu_via_tcp_modbus.rb +14 -11
- data/examples/use_tcp_modbus.rb +14 -11
- data/lib/rmodbus/client/slave.rb +333 -0
- data/lib/rmodbus/client.rb +15 -10
- data/lib/rmodbus/debug.rb +12 -15
- data/lib/rmodbus/errors.rb +26 -2
- data/lib/rmodbus/ext.rb +72 -51
- data/lib/rmodbus/options.rb +4 -1
- data/lib/rmodbus/proxy.rb +14 -9
- data/lib/rmodbus/rtu.rb +89 -125
- data/lib/rmodbus/rtu_client.rb +22 -2
- data/lib/rmodbus/rtu_server.rb +16 -12
- data/lib/rmodbus/rtu_slave.rb +26 -3
- data/lib/rmodbus/rtu_via_tcp_server.rb +12 -19
- data/lib/rmodbus/server/slave.rb +18 -0
- data/lib/rmodbus/server.rb +227 -84
- data/lib/rmodbus/sp.rb +10 -12
- data/lib/rmodbus/tcp.rb +9 -10
- data/lib/rmodbus/tcp_client.rb +3 -0
- data/lib/rmodbus/tcp_server.rb +41 -35
- data/lib/rmodbus/tcp_slave.rb +19 -18
- data/lib/rmodbus/version.rb +3 -2
- data/lib/rmodbus.rb +20 -21
- metadata +32 -61
- data/Rakefile +0 -29
- data/examples/simple-xpca-gateway.rb +0 -84
- data/lib/rmodbus/rtu_via_tcp_client.rb +0 -26
- data/lib/rmodbus/rtu_via_tcp_slave.rb +0 -29
- data/lib/rmodbus/slave.rb +0 -310
- data/spec/client_spec.rb +0 -88
- data/spec/exception_spec.rb +0 -119
- data/spec/ext_spec.rb +0 -52
- data/spec/logging_spec.rb +0 -89
- data/spec/proxy_spec.rb +0 -74
- data/spec/read_rtu_response_spec.rb +0 -92
- data/spec/response_mismach_spec.rb +0 -163
- data/spec/rtu_client_spec.rb +0 -86
- data/spec/rtu_server_spec.rb +0 -30
- data/spec/rtu_via_tcp_client_spec.rb +0 -76
- data/spec/rtu_via_tcp_server_spec.rb +0 -16
- data/spec/slave_spec.rb +0 -55
- data/spec/spec_helper.rb +0 -54
- data/spec/tcp_client_spec.rb +0 -88
- data/spec/tcp_server_spec.rb +0 -129
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 025a947981907584989c025378c6ea0650afc8d102a05431fc084d1e9da84e4b
|
4
|
+
data.tar.gz: d7f722ccf020d283e0cc83ece81f640ce85b1c323391b7ab67e8cfa970504536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf1c1cad9756deec4519ffb2f0a157d579a34c1f6a5189508e337432566997a6bfac5f1cd44ef58da8bf1805aa9b6d8dbe7d1efb5a64aa2c32a228191bfc4607
|
7
|
+
data.tar.gz: a2390510c7a066d7a5df9430dbc7d23706da4e5f0a8f3c9f5ccf7e410e53bdd6d1f88dc94bf1a7f9e301fd0aea323817e6a52879793595c1b6b091670998ffc4
|
data/NEWS.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
###2024-08-20 Release 2.1.1
|
2
|
+
|
3
|
+
1. [BREAKING] Servers now support publishing multiple slaves
|
4
|
+
2. [BREAKING] RTUViaTCPClient/RTUViaTCPSlave are gone. Please just use RTUClient directly
|
5
|
+
3. [BREAKING] Proxy collections no longer return an array when requesting a single item.
|
6
|
+
4. [BREAKING] to/from_32* use big endian order. if you want little endian order for the
|
7
|
+
constituent 16-bit registers, use `wordswap` before/after conversion as appropriate.
|
8
|
+
5. [BREAKING] to/from_32i works with _signed_ integers. If you want unsigned, use 32u
|
9
|
+
6. Don't time out waiting to read a response that will never come from broadcast commands
|
10
|
+
7. Don't send responses to broadcast commands as a server
|
11
|
+
8. Properly function as a server in an environment with multiple RTU slaves
|
12
|
+
9. Server now supports promiscuous mode to dump the conversation happening between a master and other slaves.
|
13
|
+
10. Add read/write multiple registers function (server and client)
|
14
|
+
11. Add mask write register function to server
|
15
|
+
12. Log to a logger object, not $stderr
|
16
|
+
13. Improve RTU read resiliency with partial reads
|
17
|
+
14. Callbacks in server to implement additional custom processing
|
18
|
+
15. Ability to use any IO (including a proxy you've set up) with RTUClient
|
19
|
+
|
1
20
|
###2017-03-30 Release 1.3.2
|
2
21
|
|
3
22
|
1. Fix Fixnum warning on Ruby 2.4
|
data/README.md
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
RModBus [![
|
1
|
+
RModBus [![Gem Version](https://badge.fury.io/rb/rmodbus.svg)](http://badge.fury.io/rb/rmodbus)
|
2
2
|
==========================
|
3
3
|
|
4
4
|
**RModBus** - free implementation of ModBus protocol in pure Ruby.
|
5
5
|
|
6
6
|
Features
|
7
7
|
---------------------------
|
8
|
-
- Ruby 2.
|
8
|
+
- Ruby 2.5+ and JRuby (without serial ModBus RTU)
|
9
9
|
- TCP, RTU, RTU over TCP protocols
|
10
10
|
- Client(master) and server(slave)
|
11
|
-
- 16, 32
|
11
|
+
- 16, 32-bit and floating point registers
|
12
12
|
|
13
|
-
|
13
|
+
Supported functions
|
14
14
|
---------------------------
|
15
15
|
* Read Coils (0x01)
|
16
16
|
* Read Discrete Inputs (0x02)
|
@@ -19,7 +19,7 @@ Support functions
|
|
19
19
|
* Write Single Coil (0x05)
|
20
20
|
* Write Single Register (0x06)
|
21
21
|
* Write Multiple Coils (0x0F)
|
22
|
-
* Write Multiple
|
22
|
+
* Write Multiple Registers (0x10)
|
23
23
|
* Mask Write register (0x16)
|
24
24
|
|
25
25
|
Installation
|
@@ -37,14 +37,14 @@ Or if you are using bundler, add to your Gemfile:
|
|
37
37
|
gem 'rmodbus'
|
38
38
|
```
|
39
39
|
|
40
|
-
If you want to use ModBus over serial, you will also need to install the 'serialport' gem.
|
40
|
+
If you want to use ModBus over serial, you will also need to install the 'ccutrer-serialport' gem.
|
41
41
|
If you are using bundler, add to your Gemfile:
|
42
42
|
|
43
43
|
```
|
44
|
-
gem 'serialport'
|
44
|
+
gem 'ccutrer-serialport'
|
45
45
|
```
|
46
46
|
|
47
|
-
If you want to use ModBus::TCPServer or ModBus::RTUViaTCPServer
|
47
|
+
If you want to use ModBus::TCPServer or ModBus::RTUViaTCPServer,
|
48
48
|
you will also need to install the 'gserver' gem. If you are using bundler, add to your Gemfile:
|
49
49
|
|
50
50
|
```
|
data/examples/perfomance_rtu.rb
CHANGED
@@ -1,56 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
BAUD = 9600
|
9
|
-
TIMES = 100
|
10
|
-
|
11
|
-
srv = RTUServer.new
|
12
|
-
srv.coils = [0,1]
|
13
|
-
srv.discrete_inputs = [1,0]
|
14
|
-
srv.holding_registers = [0,1,2,3,4,5,6,7,8,9]
|
15
|
-
srv.input_registers = [0,1,2,3,4,5,6,7,8,9]
|
16
|
-
srv.start
|
17
|
-
|
18
|
-
|
19
|
-
cl
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
cl.close
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
gem "rmodbus"
|
4
|
+
|
5
|
+
require "rmodbus"
|
6
|
+
require "benchmark"
|
7
|
+
|
8
|
+
BAUD = 9600
|
9
|
+
TIMES = 100
|
10
|
+
|
11
|
+
srv = ModBus::RTUServer.new "com3", BAUD
|
12
|
+
srv.coils = [0, 1] * 50
|
13
|
+
srv.discrete_inputs = [1, 0] * 50
|
14
|
+
srv.holding_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
15
|
+
srv.input_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
16
|
+
srv.start
|
17
|
+
|
18
|
+
cl = ModBus::RTUClient.new("com4", BAUD)
|
19
|
+
cl.with_slave(1) do |slave|
|
20
|
+
Benchmark.bmbm do |x|
|
21
|
+
x.report("Read coils") do
|
22
|
+
TIMES.times { slave.read_coils 0, 100 }
|
23
|
+
end
|
24
|
+
|
25
|
+
x.report("Read discrete inputs") do
|
26
|
+
TIMES.times { slave.read_discrete_inputs 0, 100 }
|
27
|
+
end
|
28
|
+
|
29
|
+
x.report("Read holding registers") do
|
30
|
+
TIMES.times { slave.read_holding_registers 0, 100 }
|
31
|
+
end
|
32
|
+
|
33
|
+
x.report("Read input registers") do
|
34
|
+
TIMES.times { slave.read_input_registers 0, 100 }
|
35
|
+
end
|
36
|
+
|
37
|
+
x.report("Write single coil") do
|
38
|
+
TIMES.times { slave.write_single_coil 0, 1 }
|
39
|
+
end
|
40
|
+
|
41
|
+
x.report("Write single register") do
|
42
|
+
TIMES.times { slave.write_single_register 100, 0xAAAA }
|
43
|
+
end
|
44
|
+
|
45
|
+
x.report("Write multiple coils") do
|
46
|
+
TIMES.times { slave.write_multiple_coils 0, [1, 0] * 50 }
|
47
|
+
end
|
48
|
+
|
49
|
+
x.report("Write multiple registers") do
|
50
|
+
TIMES.times { slave.write_multiple_registers 0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10 }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
srv.stop
|
55
|
+
cl.close
|
@@ -1,55 +1,54 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
TIMES = 1000
|
9
|
-
|
10
|
-
srv = ModBus::RTUViaTCPServer.new 1502
|
11
|
-
srv.coils = [0,1]
|
12
|
-
srv.discrete_inputs = [1,0]
|
13
|
-
srv.holding_registers = [0,1,2,3,4,5,6,7,8,9]
|
14
|
-
srv.input_registers = [0,1,2,3,4,5,6,7,8,9]
|
15
|
-
srv.start
|
16
|
-
|
17
|
-
|
18
|
-
cl
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
srv.stop
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
gem "rmodbus"
|
4
|
+
|
5
|
+
require "rmodbus"
|
6
|
+
require "benchmark"
|
7
|
+
|
8
|
+
TIMES = 1000
|
9
|
+
|
10
|
+
srv = ModBus::RTUViaTCPServer.new 1502
|
11
|
+
srv.coils = [0, 1] * 50
|
12
|
+
srv.discrete_inputs = [1, 0] * 50
|
13
|
+
srv.holding_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
14
|
+
srv.input_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
15
|
+
srv.start
|
16
|
+
|
17
|
+
cl = ModBus::RTUClient.new("127.0.0.1", 1502)
|
18
|
+
cl.with_slave(1) do |slave|
|
19
|
+
Benchmark.bmbm do |x|
|
20
|
+
x.report("Read coils") do
|
21
|
+
TIMES.times { slave.read_coils 0, 100 }
|
22
|
+
end
|
23
|
+
|
24
|
+
x.report("Read discrete inputs") do
|
25
|
+
TIMES.times { slave.read_discrete_inputs 0, 100 }
|
26
|
+
end
|
27
|
+
|
28
|
+
x.report("Read holding registers") do
|
29
|
+
TIMES.times { slave.read_holding_registers 0, 100 }
|
30
|
+
end
|
31
|
+
|
32
|
+
x.report("Read input registers") do
|
33
|
+
TIMES.times { slave.read_input_registers 0, 100 }
|
34
|
+
end
|
35
|
+
|
36
|
+
x.report("Write single coil") do
|
37
|
+
TIMES.times { slave.write_single_coil 0, 1 }
|
38
|
+
end
|
39
|
+
|
40
|
+
x.report("Write single register") do
|
41
|
+
TIMES.times { slave.write_single_register 100, 0xAAAA }
|
42
|
+
end
|
43
|
+
|
44
|
+
x.report("Write multiple coils") do
|
45
|
+
TIMES.times { slave.write_multiple_coils 0, [1, 0] * 50 }
|
46
|
+
end
|
47
|
+
|
48
|
+
x.report("Write multiple registers") do
|
49
|
+
TIMES.times { slave.write_multiple_registers 0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10 }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
cl.close
|
54
|
+
srv.stop
|
data/examples/perfomance_tcp.rb
CHANGED
@@ -1,55 +1,54 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
TIMES = 1000
|
9
|
-
|
10
|
-
srv = ModBus::TCPServer.new 1502
|
11
|
-
srv.coils = [0,1]
|
12
|
-
srv.discrete_inputs = [1,0]
|
13
|
-
srv.holding_registers = [0,1,2,3,4,5,6,7,8,9]
|
14
|
-
srv.input_registers = [0,1,2,3,4,5,6,7,8,9]
|
15
|
-
srv.start
|
16
|
-
|
17
|
-
|
18
|
-
cl
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
srv.stop
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
gem "rmodbus"
|
4
|
+
|
5
|
+
require "rmodbus"
|
6
|
+
require "benchmark"
|
7
|
+
|
8
|
+
TIMES = 1000
|
9
|
+
|
10
|
+
srv = ModBus::TCPServer.new 1502
|
11
|
+
srv.coils = [0, 1] * 50
|
12
|
+
srv.discrete_inputs = [1, 0] * 50
|
13
|
+
srv.holding_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
14
|
+
srv.input_registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10
|
15
|
+
srv.start
|
16
|
+
|
17
|
+
cl = ModBus::TCPClient.new("127.0.0.1", 1502)
|
18
|
+
cl.with_slave(1) do |slave|
|
19
|
+
Benchmark.bmbm do |x|
|
20
|
+
x.report("Read coils") do
|
21
|
+
TIMES.times { slave.read_coils 0, 100 }
|
22
|
+
end
|
23
|
+
|
24
|
+
x.report("Read discrete inputs") do
|
25
|
+
TIMES.times { slave.read_discrete_inputs 0, 100 }
|
26
|
+
end
|
27
|
+
|
28
|
+
x.report("Read holding registers") do
|
29
|
+
TIMES.times { slave.read_holding_registers 0, 100 }
|
30
|
+
end
|
31
|
+
|
32
|
+
x.report("Read input registers") do
|
33
|
+
TIMES.times { slave.read_input_registers 0, 100 }
|
34
|
+
end
|
35
|
+
|
36
|
+
x.report("Write single coil") do
|
37
|
+
TIMES.times { slave.write_single_coil 0, 1 }
|
38
|
+
end
|
39
|
+
|
40
|
+
x.report("Write single register") do
|
41
|
+
TIMES.times { slave.write_single_register 100, 0xAAAA }
|
42
|
+
end
|
43
|
+
|
44
|
+
x.report("Write multiple coils") do
|
45
|
+
TIMES.times { slave.write_multiple_coils 0, [1, 0] * 50 }
|
46
|
+
end
|
47
|
+
|
48
|
+
x.report("Write multiple registers") do
|
49
|
+
TIMES.times { slave.write_multiple_registers 0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] * 10 }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
cl.close
|
54
|
+
srv.stop
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# It's very simple example of implementation XPCA gateway (see http://www.xpca.org)
|
4
|
+
# for communication with TCP ModBus devices
|
5
|
+
# It receives REST requests (e.g http://127.0.0.1:4567/mb/127.0.0.1/8502/1/coils/6/17 )
|
6
|
+
# and returns data in JSON format addr : data:
|
7
|
+
# {"coils": {
|
8
|
+
# "6":{
|
9
|
+
# "value":0,
|
10
|
+
# "timestamp":"2011-07-12 18:11:03 +0000",
|
11
|
+
# "quality":"good"
|
12
|
+
# },
|
13
|
+
# "7":{
|
14
|
+
# "value":0,
|
15
|
+
# "timestamp":"2011-07-12 18:11:03 +0000",
|
16
|
+
# "quality":"good"
|
17
|
+
# }
|
18
|
+
# ...
|
19
|
+
# }
|
20
|
+
#
|
21
|
+
# This code requies gems: rmodbus, sinatra and json
|
22
|
+
# 2011 (c) Aleksey Timin
|
23
|
+
|
24
|
+
gem "rmodbus"
|
25
|
+
gem "sinatra"
|
26
|
+
|
27
|
+
require "rmodbus"
|
28
|
+
require "sinatra"
|
29
|
+
require "json"
|
30
|
+
|
31
|
+
# Launche TCP ModBus server for test
|
32
|
+
IP = "127.0.0.1"
|
33
|
+
PORT = 8502
|
34
|
+
|
35
|
+
@srv = ModBus::TCPServer.new(PORT, 1)
|
36
|
+
|
37
|
+
@srv.holding_registers = Array.new(100) { |i| i + 1 }
|
38
|
+
@srv.input_registers = Array.new(100) { |i| i + 1 }
|
39
|
+
@srv.coils = Array.new(100) { 0 }
|
40
|
+
@srv.discrete_inputs = Array.new(100) { 0 }
|
41
|
+
|
42
|
+
@srv.start
|
43
|
+
|
44
|
+
# Calc a GET request
|
45
|
+
# @example
|
46
|
+
# http://127.0.0.1:4567/mb/127.0.0.1/8502/1/coils/6/17
|
47
|
+
#
|
48
|
+
# HTTP route: GET http://localhost/mb/:ip/:port/:slave/:dataplace/:firstaddr/:lastaddr
|
49
|
+
#
|
50
|
+
# :ip - ip addr of ModBus TCP Server
|
51
|
+
# :port - port of ModBUs TCP Server
|
52
|
+
# :slave - id of slave device
|
53
|
+
# :dataplace - valid values: coils, discrete_inputs, input_registers, holding_registers
|
54
|
+
# :firstaddr - first addr of registers(contacts)
|
55
|
+
# :lastaddr - last addr of registers(contacts)
|
56
|
+
get "/mb/:ip/:port/:slave/:dataplace/:firstaddr/:lastaddr" do
|
57
|
+
resp = {}
|
58
|
+
begin
|
59
|
+
data = []
|
60
|
+
ModBus::TCPClient.new(params[:ip].to_s, params[:port].to_i) do |cl|
|
61
|
+
cl.with_slave(params[:slave].to_i) do |slave|
|
62
|
+
slave.debug = true
|
63
|
+
dataplace = slave.send params[:dataplace]
|
64
|
+
data = dataplace[params[:firstaddr].to_i..params[:lastaddr].to_i]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
resp = { params[:dataplace] => {} }
|
69
|
+
data.each_with_index do |v, i|
|
70
|
+
resp[params[:dataplace]][params[:firstaddr].to_i + i] = {
|
71
|
+
value: v,
|
72
|
+
timestamp: Time.now.utc.strftime("%Y-%m-%d %H:%M:%S %z"),
|
73
|
+
quality: "good"
|
74
|
+
}
|
75
|
+
end
|
76
|
+
rescue => e
|
77
|
+
resp = { error: {
|
78
|
+
type: e.class,
|
79
|
+
message: e.message
|
80
|
+
} }
|
81
|
+
end
|
82
|
+
|
83
|
+
content_type "application/json"
|
84
|
+
resp.to_json
|
85
|
+
end
|
@@ -1,21 +1,24 @@
|
|
1
|
-
|
2
|
-
require 'rmodbus'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
srv
|
3
|
+
gem "rmodbus"
|
4
|
+
|
5
|
+
require "rmodbus"
|
6
|
+
|
7
|
+
srv = ModBus::RTUViaTCPServer.new(10_002, 1)
|
8
|
+
srv.coils = [1, 0, 1, 1]
|
9
|
+
srv.discrete_inputs = [1, 1, 0, 0]
|
10
|
+
srv.holding_registers = [1, 2, 3, 4]
|
11
|
+
srv.input_registers = [1, 2, 3, 4]
|
9
12
|
srv.debug = true
|
10
13
|
srv.start
|
11
14
|
|
12
|
-
ModBus::
|
15
|
+
ModBus::RTUClient.connect("127.0.0.1", 10_002) do |cl|
|
13
16
|
cl.with_slave(1) do |slave|
|
14
17
|
slave.debug = true
|
15
18
|
regs = slave.holding_registers
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
puts regs[0..3]
|
20
|
+
regs[0..3] = [2, 0, 1, 1]
|
21
|
+
puts regs[0..3]
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
data/examples/use_tcp_modbus.rb
CHANGED
@@ -1,22 +1,25 @@
|
|
1
|
-
|
2
|
-
require 'rmodbus'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
srv
|
3
|
+
gem "rmodbus"
|
4
|
+
|
5
|
+
require "rmodbus"
|
6
|
+
|
7
|
+
srv = ModBus::TCPServer.new(8502, 1)
|
8
|
+
srv.coils = [1, 0, 1, 1]
|
9
|
+
srv.discrete_inputs = [1, 1, 0, 0]
|
10
|
+
srv.holding_registers = [1, 2, 3, 4]
|
11
|
+
srv.input_registers = [1, 2, 3, 4]
|
9
12
|
srv.debug = true
|
10
13
|
srv.audit = true
|
11
14
|
srv.start
|
12
15
|
|
13
|
-
ModBus::TCPClient.connect(
|
16
|
+
ModBus::TCPClient.connect("127.0.0.1", 8502) do |cl|
|
14
17
|
cl.with_slave(1) do |slave|
|
15
18
|
slave.debug = true
|
16
19
|
regs = slave.holding_registers
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
puts regs[0..3]
|
21
|
+
regs[0..3] = [2, 0, 1, 1]
|
22
|
+
puts regs[0..3]
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|