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