class Simatic::Plc

Public Class Methods

exchange(address, args = {}) { |plc| ... } click to toggle source
# 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
new(address, args = {}) click to toggle source
# File lib/simatic/plc.rb, line 9
def initialize address, args = {}
  @address = address
  @rack = args[:rack] || 0
  @slot = args[:slot] || 2 
end

Public Instance Methods

connect(timeout = 500) click to toggle source
# 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
disconnect() click to toggle source
# File lib/simatic/plc.rb, line 84
def disconnect
  @socket.close
end
read(*args) click to toggle source
# 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) click to toggle source
# 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

Private Instance Methods

debug_print(raw) click to toggle source
# File lib/simatic/plc.rb, line 90
def debug_print raw
  puts '-'*80
  raw.bytes.each_with_index do |byte, i|
    ends = (i+1)%16 == 0 ? "\n" : ' '
    printf '%02X '+ ends, byte
  end
  puts ''
  puts '-'*80
end