ffi-snap7 0.1.3 → 0.2.0
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.
- data/lib/ffi-snap7.rb +1 -0
- data/lib/ffi-snap7/client/client.rb +9 -1
- data/lib/ffi-snap7/data_structures/data_block.rb +37 -0
- data/lib/ffi-snap7/data_structures/data_block_registry.rb +44 -0
- data/lib/ffi-snap7/data_structures/data_structures.rb +3 -0
- data/lib/ffi-snap7/data_structures/variable.rb +104 -0
- data/lib/ffi-snap7/version.rb +1 -1
- metadata +9 -5
data/lib/ffi-snap7.rb
CHANGED
@@ -5,17 +5,25 @@ module Snap7
|
|
5
5
|
class Client
|
6
6
|
|
7
7
|
def initialize
|
8
|
-
@cli
|
8
|
+
@cli = Snap7.cli_create
|
9
|
+
@connected = false
|
9
10
|
end
|
10
11
|
|
11
12
|
|
12
13
|
def connect(address, rack, slot)
|
13
14
|
check_rc Snap7.cli_connect_to(@cli, address, rack, slot)
|
15
|
+
@connected = true
|
14
16
|
end
|
15
17
|
|
16
18
|
|
17
19
|
def disconnect
|
18
20
|
Snap7.cli_disconnect @cli
|
21
|
+
@connected = false
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def connected?
|
26
|
+
@connected
|
19
27
|
end
|
20
28
|
|
21
29
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Snap7
|
2
|
+
|
3
|
+
class DataBlock
|
4
|
+
attr_reader :number, :variables
|
5
|
+
|
6
|
+
def initialize(db_addr)
|
7
|
+
@number = db_addr.scan(/\d+/).first.to_i
|
8
|
+
@variables = []
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def add_variable(var)
|
13
|
+
var.db = self
|
14
|
+
@variables << var
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def size
|
19
|
+
last_var = @variables.sort { |a,b| a.byte <=> b.byte }.last
|
20
|
+
last_var.byte + last_var.byte_size
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def decode(data)
|
25
|
+
@variables.map do |var|
|
26
|
+
{
|
27
|
+
:ident => var.ident,
|
28
|
+
:address => var.address,
|
29
|
+
:value => var.decode(data)
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Snap7
|
2
|
+
|
3
|
+
class DataBlockRegistry
|
4
|
+
attr_reader :dbs
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@dbs = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def add_variable(ident, address, data_type)
|
12
|
+
db_addr, _, var_addr = address.partition('.')
|
13
|
+
var = Snap7::Variable.new ident, var_addr, data_type
|
14
|
+
db(db_addr).add_variable var
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def find_variable(ident)
|
19
|
+
each do |db|
|
20
|
+
found_variable = db.variables.find { |var| var.ident == ident }
|
21
|
+
return found_variable if found_variable
|
22
|
+
end
|
23
|
+
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def db(db_addr)
|
29
|
+
@dbs[db_addr] ||= Snap7::DataBlock.new(db_addr)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def each(&block)
|
34
|
+
sorted_dbs.each &block
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def sorted_dbs
|
39
|
+
@dbs.values.sort { |a,b| a.number <=> b.number }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Snap7
|
2
|
+
|
3
|
+
class Variable
|
4
|
+
attr_reader :ident, :byte, :bit, :type
|
5
|
+
attr_accessor :db
|
6
|
+
|
7
|
+
|
8
|
+
def initialize(ident, address, type)
|
9
|
+
addr_parts = address.scan(/\d+/)
|
10
|
+
|
11
|
+
if address =~ /^DBX/
|
12
|
+
fail "Invalid bit address '#{address}'" unless addr_parts.size == 2
|
13
|
+
end
|
14
|
+
|
15
|
+
@ident = ident
|
16
|
+
@address = address
|
17
|
+
@byte = addr_parts.first.to_i
|
18
|
+
@bit = addr_parts.last.to_i if addr_parts.size == 2
|
19
|
+
@type = type
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def bit_size
|
24
|
+
case @address
|
25
|
+
when /^DBD/ # double (32 bit)
|
26
|
+
32
|
27
|
+
when /^DBW/ # word (16 bit)
|
28
|
+
16
|
29
|
+
when /^DBB/ # byte (8 bit)
|
30
|
+
8
|
31
|
+
when /^DBX/ # bit (1 bit)
|
32
|
+
1
|
33
|
+
else
|
34
|
+
fail "Invalid address '#{@address}' of variable #{@ident}. Cannot determine size."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def byte_size
|
40
|
+
@byte_size ||= (bit_size / 8.0).ceil
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def address
|
45
|
+
["DB#{db.number}", @address].compact.join('.')
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def decode(data)
|
50
|
+
var_data = data[byte, byte_size]
|
51
|
+
|
52
|
+
case @type
|
53
|
+
when :bool
|
54
|
+
var_data.first[@bit] > 0
|
55
|
+
|
56
|
+
when :int8
|
57
|
+
var_data.pack('C1').unpack('c').first
|
58
|
+
|
59
|
+
when :uint8
|
60
|
+
var_data.pack('C1').unpack('C').first
|
61
|
+
|
62
|
+
when :int16
|
63
|
+
var_data.reverse.pack('C2').unpack('s').first
|
64
|
+
|
65
|
+
when :uint16
|
66
|
+
var_data.reverse.pack('C2').unpack('S').first
|
67
|
+
|
68
|
+
when :int32
|
69
|
+
var_data.reverse.pack('C4').unpack('l').first
|
70
|
+
|
71
|
+
when :uint32
|
72
|
+
var_data.reverse.pack('C4').unpack('L').first
|
73
|
+
|
74
|
+
when :float32
|
75
|
+
var_data.reverse.pack('C4').unpack('f').first
|
76
|
+
|
77
|
+
else
|
78
|
+
fail "Invalid type '#{@type}' of variable #{@ident}. Cannot decode data."
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def encode(value)
|
84
|
+
case @type
|
85
|
+
when :int8, :uint8
|
86
|
+
[value]
|
87
|
+
|
88
|
+
when :int16, :uint16
|
89
|
+
[value].pack('s').unpack('C2').reverse
|
90
|
+
|
91
|
+
when :int32, :uint32
|
92
|
+
[value].pack('l').unpack('C4').reverse
|
93
|
+
|
94
|
+
when :float32
|
95
|
+
[value].pack('f').unpack('C4').reverse
|
96
|
+
|
97
|
+
else
|
98
|
+
fail "Invalid type '#{@type}' of variable #{@ident}. Cannot encode data."
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
data/lib/ffi-snap7/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-snap7
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andy Rohr
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2016-05
|
18
|
+
date: 2016-09-05 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -81,6 +81,10 @@ files:
|
|
81
81
|
- lib/ffi-snap7.rb
|
82
82
|
- lib/ffi-snap7/client/client.rb
|
83
83
|
- lib/ffi-snap7/client/wrapper.rb
|
84
|
+
- lib/ffi-snap7/data_structures/data_block.rb
|
85
|
+
- lib/ffi-snap7/data_structures/data_block_registry.rb
|
86
|
+
- lib/ffi-snap7/data_structures/data_structures.rb
|
87
|
+
- lib/ffi-snap7/data_structures/variable.rb
|
84
88
|
- lib/ffi-snap7/server/server.rb
|
85
89
|
- lib/ffi-snap7/server/wrapper.rb
|
86
90
|
- lib/ffi-snap7/version.rb
|