Class: Simatic::Plc

Inherits:
Object
  • Object
show all
Defined in:
lib/simatic/plc.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(address, args = {}) ⇒ Plc

Returns a new instance of Plc.



9
10
11
12
13
# File 'lib/simatic/plc.rb', line 9

def initialize address, args = {}
  @address = address
  @rack = args[:rack] || 0
  @slot = args[:slot] || 2 
end

Class Method Details

.exchange(address, args = {}, timeout = 500) {|plc| ... } ⇒ Object

Yields:

  • (plc)


15
16
17
18
19
20
21
# File 'lib/simatic/plc.rb', line 15

def self.exchange address, args = {}, timeout = 500
  plc = self.new address, args

  plc.connect timeout
  yield plc
  plc.disconnect
end

Instance Method Details

#connect(timeout = 500) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/simatic/plc.rb', line 71

def connect timeout = 500
  @socket = Socket.tcp @address, 102, connect_timeout: timeout / 1000.0

  setup = Sessions::SetupSession.new @rack, @slot
  @socket.send setup.make_request, 0
  setup.parse_response @socket.recv BUFFER_SIZE

  open = Sessions::OpenSession.new
  @socket.send open.make_request, 0
  open.parse_response @socket.recv BUFFER_SIZE

end

#disconnectObject



84
85
86
# File 'lib/simatic/plc.rb', line 84

def disconnect
  @socket.close
end

#read(*args) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/simatic/plc.rb', line 23

def read *args
  if @socket.nil?
    raise "Plc #{@address} is not connected"
  end

  read = Sessions::ReadSession.new
  memory_mappers = []
  args.each do |verbal|
    memory_mappers << MemoryMapper.new(verbal)
  end

  request = read.make_request memory_mappers
  @socket.send request, 0

  # debug_print request

  response =  @socket.recv BUFFER_SIZE

  # debug_print response

  result = read.parse_response response

  # Hash[result.map { |memory_mapper| [memory.verbal, memory.value] }]
end

#write(args) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/simatic/plc.rb', line 48

def write args
  if @socket.nil?
    raise "Plc #{@address} is not connected"
  end

  memory_mappers = []
  args.each do |verbal, value|
    memory_mappers << MemoryMapper.new(verbal, value: value)
  end

  write = Sessions::WriteSession.new
  request = write.make_request memory_mappers
  @socket.send request, 0

  # debug_print request

  response =  @socket.recv BUFFER_SIZE

  # debug_print response

  result = write.parse_response response
end