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.
@@ -12,3 +12,4 @@ end
12
12
  require 'ffi-snap7/version'
13
13
  require 'ffi-snap7/client/client'
14
14
  require 'ffi-snap7/server/server'
15
+ require 'ffi-snap7/data_structures/data_structures'
@@ -5,17 +5,25 @@ module Snap7
5
5
  class Client
6
6
 
7
7
  def initialize
8
- @cli = Snap7.cli_create
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,3 @@
1
+ require 'ffi-snap7/data_structures/variable'
2
+ require 'ffi-snap7/data_structures/data_block'
3
+ require 'ffi-snap7/data_structures/data_block_registry'
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Snap7
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
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: 29
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 3
10
- version: 0.1.3
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-11 00:00:00 Z
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