class ModBus::TCPServer

TCP server implementation @example

srv = TCPServer.new(10002, 1)
srv.coils = [1,0,1,1]
srv.discrete_inputs = [1,1,0,0]
srv.holding_registers = [1,2,3,4]
srv.input_registers = [1,2,3,4]
srv.debug = true
srv.start

Public Class Methods

new(port = 502, uid = 1, opts = {}) click to toggle source

Init server @param [Integer] port listen port @param [Integer] uid slave device @param [Hash] opts options of server @option opts [String] :host host of server default '127.0.0.1' @option opts [Float, Integer] :max_connection max of TCP connection with server default 4

Calls superclass method
# File lib/rmodbus/tcp_server.rb, line 27
          def initialize(port = 502, uid = 1, opts = {})
                  @uid = uid

warn "[WARNING] Please, use UID = 255. It will be fixed in the next release." if @uid != 0xff

opts[:host] = DEFAULT_HOST unless opts[:host]
opts[:max_connection] = 4 unless opts[:max_connection]
                  super(port, host = opts[:host], maxConnection = opts[:max_connection])
          end

Public Instance Methods

serve(io) click to toggle source

Serve requests @param [TCPSocket] io socket

# File lib/rmodbus/tcp_server.rb, line 39
def serve(io)
  while not stopped?
    header = io.read(7)
    tx_id = header[0,2]
    proto_id = header[2,2]
    len = header[4,2].unpack('n')[0]
    unit_id = header.getbyte(6)
    if proto_id == "\x00\x00"
      req = io.read(len - 1)
      if unit_id == @uid || unit_id == 0
        log "Server RX (#{req.size} bytes): #{logging_bytes(req)}"

        pdu = exec_req(req, @coils, @discrete_inputs, @holding_registers, @input_registers)

        resp = tx_id + "\0\0" + (pdu.size + 1).to_word + @uid.chr + pdu
        log "Server TX (#{resp.size} bytes): #{logging_bytes(resp)}"
        io.write resp
      else
        log "Ignored server RX (invalid unit ID #{unit_id}, #{req.size} bytes): #{logging_bytes(req)}"
      end
    end
  end
end