rmodbus 1.3.3 → 2.1.3
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 +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
data/lib/rmodbus.rb
CHANGED
@@ -1,24 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rmodbus/ext"
|
4
|
+
require "rmodbus/proxy"
|
5
|
+
require "rmodbus/version"
|
4
6
|
|
5
7
|
module ModBus
|
6
|
-
autoload :Errors,
|
7
|
-
autoload :Debug,
|
8
|
-
autoload :Options,
|
9
|
-
autoload :SP,
|
10
|
-
autoload :RTU,
|
11
|
-
autoload :TCP,
|
12
|
-
autoload :
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :RTUViaTCPSlave, 'rmodbus/rtu_via_tcp_slave'
|
22
|
-
autoload :RTUViaTCPClient, 'rmodbus/rtu_via_tcp_client'
|
23
|
-
autoload :RTUViaTCPServer, 'rmodbus/rtu_via_tcp_server'
|
8
|
+
autoload :Errors, "rmodbus/errors"
|
9
|
+
autoload :Debug, "rmodbus/debug"
|
10
|
+
autoload :Options, "rmodbus/options"
|
11
|
+
autoload :SP, "rmodbus/sp"
|
12
|
+
autoload :RTU, "rmodbus/rtu"
|
13
|
+
autoload :TCP, "rmodbus/tcp"
|
14
|
+
autoload :Client, "rmodbus/client"
|
15
|
+
autoload :Server, "rmodbus/server"
|
16
|
+
autoload :TCPSlave, "rmodbus/tcp_slave"
|
17
|
+
autoload :TCPClient, "rmodbus/tcp_client"
|
18
|
+
autoload :TCPServer, "rmodbus/tcp_server"
|
19
|
+
autoload :RTUSlave, "rmodbus/rtu_slave"
|
20
|
+
autoload :RTUClient, "rmodbus/rtu_client"
|
21
|
+
autoload :RTUServer, "rmodbus/rtu_server"
|
22
|
+
autoload :RTUViaTCPServer, "rmodbus/rtu_via_tcp_server"
|
24
23
|
end
|
metadata
CHANGED
@@ -1,115 +1,101 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmodbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3
|
4
|
+
version: 2.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- A.Timin, J. Sanders, K. Reynolds, F. Luizão
|
7
|
+
- A.Timin, J. Sanders, K. Reynolds, F. Luizão, C. Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '10.4'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '10.4'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
19
|
+
version: '2.2'
|
34
20
|
type: :development
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
26
|
+
version: '2.2'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
28
|
+
name: ccutrer-serialport
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '1.1'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
40
|
+
version: '1.1'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
42
|
+
name: gserver
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
47
|
+
version: '0.0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
54
|
+
version: '0.0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: rake
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
61
|
+
version: '13.0'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
68
|
+
version: '13.0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
70
|
+
name: rspec
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
73
|
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
75
|
+
version: '3.11'
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
82
|
+
version: '3.11'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
84
|
+
name: digest-crc
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
87
|
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
104
|
-
type: :
|
89
|
+
version: '0.1'
|
90
|
+
type: :runtime
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
96
|
+
version: '0.1'
|
111
97
|
description:
|
112
|
-
email:
|
98
|
+
email: cody@cutrer.us
|
113
99
|
executables: []
|
114
100
|
extensions: []
|
115
101
|
extra_rdoc_files:
|
@@ -118,15 +104,15 @@ extra_rdoc_files:
|
|
118
104
|
files:
|
119
105
|
- NEWS.md
|
120
106
|
- README.md
|
121
|
-
- Rakefile
|
122
107
|
- examples/perfomance_rtu.rb
|
123
108
|
- examples/perfomance_rtu_via_tcp.rb
|
124
109
|
- examples/perfomance_tcp.rb
|
125
|
-
- examples/
|
110
|
+
- examples/simple_xpca_gateway.rb
|
126
111
|
- examples/use_rtu_via_tcp_modbus.rb
|
127
112
|
- examples/use_tcp_modbus.rb
|
128
113
|
- lib/rmodbus.rb
|
129
114
|
- lib/rmodbus/client.rb
|
115
|
+
- lib/rmodbus/client/slave.rb
|
130
116
|
- lib/rmodbus/debug.rb
|
131
117
|
- lib/rmodbus/errors.rb
|
132
118
|
- lib/rmodbus/ext.rb
|
@@ -136,36 +122,22 @@ files:
|
|
136
122
|
- lib/rmodbus/rtu_client.rb
|
137
123
|
- lib/rmodbus/rtu_server.rb
|
138
124
|
- lib/rmodbus/rtu_slave.rb
|
139
|
-
- lib/rmodbus/rtu_via_tcp_client.rb
|
140
125
|
- lib/rmodbus/rtu_via_tcp_server.rb
|
141
|
-
- lib/rmodbus/rtu_via_tcp_slave.rb
|
142
126
|
- lib/rmodbus/server.rb
|
143
|
-
- lib/rmodbus/slave.rb
|
127
|
+
- lib/rmodbus/server/slave.rb
|
144
128
|
- lib/rmodbus/sp.rb
|
145
129
|
- lib/rmodbus/tcp.rb
|
146
130
|
- lib/rmodbus/tcp_client.rb
|
147
131
|
- lib/rmodbus/tcp_server.rb
|
148
132
|
- lib/rmodbus/tcp_slave.rb
|
149
133
|
- lib/rmodbus/version.rb
|
150
|
-
|
151
|
-
- spec/exception_spec.rb
|
152
|
-
- spec/ext_spec.rb
|
153
|
-
- spec/logging_spec.rb
|
154
|
-
- spec/proxy_spec.rb
|
155
|
-
- spec/read_rtu_response_spec.rb
|
156
|
-
- spec/response_mismach_spec.rb
|
157
|
-
- spec/rtu_client_spec.rb
|
158
|
-
- spec/rtu_server_spec.rb
|
159
|
-
- spec/rtu_via_tcp_client_spec.rb
|
160
|
-
- spec/rtu_via_tcp_server_spec.rb
|
161
|
-
- spec/slave_spec.rb
|
162
|
-
- spec/spec_helper.rb
|
163
|
-
- spec/tcp_client_spec.rb
|
164
|
-
- spec/tcp_server_spec.rb
|
165
|
-
homepage: http://www.rubydoc.info/github/rmodbus/rmodbus
|
134
|
+
homepage: https://github.com/rmodbus/rmodbus
|
166
135
|
licenses:
|
167
136
|
- BSD-3-Clause
|
168
|
-
metadata:
|
137
|
+
metadata:
|
138
|
+
changelog_uri: https://github.com/rmodbus/rmodbus/blob/main/NEWS.md
|
139
|
+
source_code_uri: https://github.com/rmodbus/rmodbus
|
140
|
+
rubygems_mfa_required: 'true'
|
169
141
|
post_install_message:
|
170
142
|
rdoc_options:
|
171
143
|
- "--title"
|
@@ -179,15 +151,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
151
|
requirements:
|
180
152
|
- - ">="
|
181
153
|
- !ruby/object:Gem::Version
|
182
|
-
version: '
|
154
|
+
version: '2.5'
|
183
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
156
|
requirements:
|
185
157
|
- - ">="
|
186
158
|
- !ruby/object:Gem::Version
|
187
159
|
version: '0'
|
188
160
|
requirements: []
|
189
|
-
|
190
|
-
rubygems_version: 2.6.11
|
161
|
+
rubygems_version: 3.5.11
|
191
162
|
signing_key:
|
192
163
|
specification_version: 4
|
193
164
|
summary: RModBus - free implementation of protocol ModBus
|
data/Rakefile
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
|
13
|
-
require 'rake'
|
14
|
-
require 'rspec/core'
|
15
|
-
require 'rspec/core/rake_task'
|
16
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
17
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
18
|
-
begin
|
19
|
-
require 'serialport'
|
20
|
-
rescue LoadError => e
|
21
|
-
spec.pattern.exclude("spec/rtu_client_spec.rb", "spec/rtu_server_spec.rb")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
task :default => :spec
|
26
|
-
|
27
|
-
task :pry do
|
28
|
-
sh "bundle exec pry -r ./lib/rmodbus.rb"
|
29
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
It's very simple example of implementation XPCA gateway (see http://www.xpca.org)
|
3
|
-
for communication with TCP ModBus devices
|
4
|
-
It receives REST requests (e.g http://127.0.0.1:4567/mb/127.0.0.1/8502/1/coils/6/17 )
|
5
|
-
and returns data in JSON format addr : data:
|
6
|
-
{"coils": {
|
7
|
-
"6":{
|
8
|
-
"value":0,
|
9
|
-
"timestamp":"2011-07-12 18:11:03 +0000",
|
10
|
-
"quality":"good"
|
11
|
-
},
|
12
|
-
"7":{
|
13
|
-
"value":0,
|
14
|
-
"timestamp":"2011-07-12 18:11:03 +0000",
|
15
|
-
"quality":"good"
|
16
|
-
}
|
17
|
-
...
|
18
|
-
}
|
19
|
-
|
20
|
-
This code requies gems: rmodbus, sinatra and json
|
21
|
-
2011 (c) Aleksey Timin
|
22
|
-
=end
|
23
|
-
|
24
|
-
require 'rubygems'
|
25
|
-
require 'rmodbus'
|
26
|
-
require 'sinatra'
|
27
|
-
require 'json'
|
28
|
-
|
29
|
-
# Launche TCP ModBus server for test
|
30
|
-
IP = '127.0.0.1'
|
31
|
-
PORT = 8502
|
32
|
-
|
33
|
-
@srv = ModBus::TCPServer.new(PORT,1)
|
34
|
-
|
35
|
-
@srv.holding_registers = Array.new(100) { |i| i = i + 1 }
|
36
|
-
@srv.input_registers = Array.new(100) { |i| i = i + 1 }
|
37
|
-
@srv.coils = Array.new(100) { |i| i = 0 }
|
38
|
-
@srv.discrete_inputs = Array.new(100) { |i| i = 0 }
|
39
|
-
|
40
|
-
@srv.start
|
41
|
-
|
42
|
-
|
43
|
-
# Calc a GET request
|
44
|
-
# @example
|
45
|
-
# http://127.0.0.1:4567/mb/127.0.0.1/8502/1/coils/6/17
|
46
|
-
#
|
47
|
-
# HTTP route: GET http://localhost/mb/:ip/:port/:slave/:dataplace/:firstaddr/:lastaddr
|
48
|
-
#
|
49
|
-
# :ip - ip addr of ModBus TCP Server
|
50
|
-
# :port - port of ModBUs TCP Server
|
51
|
-
# :slave - id of slave device
|
52
|
-
# :dataplace - valid values: coils, discrete_inputs, input_registers, holding_registers
|
53
|
-
# :firstaddr - first addr of registers(contacts)
|
54
|
-
# :lastaddr - last addr of registers(contacts)
|
55
|
-
get '/mb/:ip/:port/:slave/:dataplace/:firstaddr/:lastaddr' do
|
56
|
-
resp = {}
|
57
|
-
begin
|
58
|
-
data = []
|
59
|
-
ModBus::TCPClient.new(params[:ip].to_s, params[:port].to_i) do |cl|
|
60
|
-
cl.with_slave(params[:slave].to_i) do |slave|
|
61
|
-
slave.debug = true
|
62
|
-
dataplace = slave.send params[:dataplace]
|
63
|
-
data = dataplace[params[:firstaddr].to_i .. params[:lastaddr].to_i]
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
resp = { params[:dataplace] => {}}
|
68
|
-
data.each_with_index do |v,i|
|
69
|
-
resp[params[:dataplace]][params[:firstaddr].to_i + i] = {
|
70
|
-
:value => v,
|
71
|
-
:timestamp => Time.now.utc.strftime("%Y-%m-%d %H:%M:%S %z"),
|
72
|
-
:quality => "good"
|
73
|
-
}
|
74
|
-
end
|
75
|
-
rescue Exception => e
|
76
|
-
resp = { :error => {
|
77
|
-
:type => e.class,
|
78
|
-
:message => e.message }
|
79
|
-
}
|
80
|
-
end
|
81
|
-
|
82
|
-
content_type "application/json"
|
83
|
-
resp.to_json
|
84
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module ModBus
|
2
|
-
# RTU over TCP client implementation
|
3
|
-
# @example
|
4
|
-
# RTUViaTCPClient.connect('127.0.0.1', 10002) do |cl|
|
5
|
-
# cl.with_slave(uid) do |slave|
|
6
|
-
# slave.holding_registers[0..100]
|
7
|
-
# end
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# @see TCP#open_tcp_connection
|
11
|
-
# @see Client#initialize
|
12
|
-
class RTUViaTCPClient < Client
|
13
|
-
include RTU
|
14
|
-
include TCP
|
15
|
-
|
16
|
-
protected
|
17
|
-
# Open TCP\IP connection
|
18
|
-
def open_connection(ipaddr, port = 10002, opts = {})
|
19
|
-
io = open_tcp_connection(ipaddr, port, opts)
|
20
|
-
end
|
21
|
-
|
22
|
-
def get_slave(uid, io)
|
23
|
-
RTUViaTCPSlave.new(uid, io)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module ModBus
|
2
|
-
# RTU over TCP slave implementation
|
3
|
-
# @example
|
4
|
-
# RTUViaTCP.connect('127.0.0.1', 10002) do |cl|
|
5
|
-
# cl.with_slave(uid) do |slave|
|
6
|
-
# slave.holding_registers[0..100]
|
7
|
-
# end
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# @see RTUViaTCPClient#open_connection
|
11
|
-
# @see Client#with_slave
|
12
|
-
# @see Slave
|
13
|
-
class RTUViaTCPSlave < Slave
|
14
|
-
include RTU
|
15
|
-
|
16
|
-
private
|
17
|
-
# overide method for RTU implamentaion
|
18
|
-
# @see Slave#query
|
19
|
-
def send_pdu(pdu)
|
20
|
-
send_rtu_pdu(pdu)
|
21
|
-
end
|
22
|
-
|
23
|
-
# overide method for RTU implamentaion
|
24
|
-
# @see Slave#query
|
25
|
-
def read_pdu
|
26
|
-
read_rtu_pdu
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|