class Modbus::Server

Attributes

registers[R]

Public Class Methods

new(uri, handler) click to toggle source
# File lib/modbus/server.rb, line 12
def initialize(uri, handler)
  @uri       = URI uri
  @handler   = handler
  @registers = {}
end

Public Instance Methods

add_register(addr, handler = nil) click to toggle source
# File lib/modbus/server.rb, line 19
def add_register(addr, handler = nil)
  log.info "Adding register @ #{addr}"

  reg_addr, bit = addr.split('.')
  reg_addr = reg_addr.to_i

  register_class = bit ? BitRegister : WordRegister
  reg = get_register reg_addr, register_class
  reg.handler = handler

  value = bit ? false : 0
  update_register addr, value

  reg
end
client_connected(signature) click to toggle source
# File lib/modbus/server.rb, line 54
def client_connected(signature)
  log.info "client connected (signature #{signature})"
end
client_disconnected(signature) click to toggle source
# File lib/modbus/server.rb, line 59
def client_disconnected(signature)
  log.info "client disconnected (signature #{signature})"
end
read_registers(start_addr, reg_count) click to toggle source
# File lib/modbus/server.rb, line 64
def read_registers(start_addr, reg_count)
  (0..reg_count-1).map do |idx|
    addr = start_addr + idx
    read_register addr
  end
end
start() click to toggle source
# File lib/modbus/server.rb, line 49
def start
  EM.start_server @uri.host, @uri.port, Modbus::Connection::TCPServer, self
end
update_register(addr, value) click to toggle source
# File lib/modbus/server.rb, line 36
def update_register(addr, value)
  reg_addr, bit = addr.split('.')
  reg = @registers.fetch reg_addr.to_i

  case reg
  when WordRegister
    reg.update value
  when BitRegister
    reg.update bit.to_i, value
  end
end
write_registers(start_addr, reg_values) click to toggle source
# File lib/modbus/server.rb, line 72
def write_registers(start_addr, reg_values)
  reg_values.each_with_index do |value, idx|
    addr = start_addr + idx
    write_register addr, value
  end

  reg_values.size
end

Private Instance Methods

get_register(addr, klass) click to toggle source
# File lib/modbus/server.rb, line 90
def get_register(addr, klass)
  @registers[addr] ||= klass.new(addr)
end
log() click to toggle source
# File lib/modbus/server.rb, line 85
def log
  @handler.log
end
read_register(addr) click to toggle source
# File lib/modbus/server.rb, line 95
def read_register(addr)
  reg = @registers.fetch addr
  reg.value

rescue IndexError
  log.warn "read_register @ #{addr} failed (IllegalDataAddress)"
  fail IllegalDataAddress
rescue => e
  log.warn "read_register @ #{addr} failed. Error: #{e.message} (#{e.class}), Line: #{e.backtrace.first}"
end
write_register(addr, value) click to toggle source
# File lib/modbus/server.rb, line 107
def write_register(addr, value)
  reg = @registers.fetch addr
  reg.write value

rescue IndexError
  log.warn "write_register @ #{addr} failed (IllegalDataAddress)"
  fail IllegalDataAddress
rescue => e
  log.warn "write_register @ #{addr} failed. Error: #{e.message}, Line: #{e.backtrace.first}"
end