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