Class: ModBus::TCPServer

Inherits:
GServer
  • Object
show all
Includes:
Debug, Server
Defined in:
lib/rmodbus/tcp_server.rb

Overview

TCP server implementation

Examples:

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

Constant Summary

Constant Summary

Constants included from Server

Server::Funcs

Instance Attribute Summary

Attributes included from Server

#coils, #discrete_inputs, #holding_registers, #input_registers, #uid

Attributes included from Debug

#debug, #raise_exception_on_mismatch, #read_retries, #read_retry_timeout

Instance Method Summary (collapse)

Methods included from Server

#exec_req, #parse_read_func, #parse_write_coil_func, #parse_write_multiple_coils_func, #parse_write_multiple_registers_func, #parse_write_register_func

Methods included from Debug

#log, #logging_bytes

Constructor Details

- (TCPServer) initialize(port = 502, uid = 1, opts = {})

Init server

Parameters:

  • port (Integer) (defaults to: 502)

    listen port

  • uid (Integer) (defaults to: 1)

    slave device

  • opts (Hash) (defaults to: {})

    options of server

Options Hash (opts):

  • :host (String)

    host of server default '127.0.0.1'

  • :max_connection (Float, Integer)

    max of TCP connection with server default 4



36
37
38
39
40
41
# File 'lib/rmodbus/tcp_server.rb', line 36

def initialize(port = 502, uid = 1, opts = {})
	@uid = uid
    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

Instance Method Details

- (Object) serve(io)

Serve requests

Parameters:

  • io (TCPSocket)

    socket



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rmodbus/tcp_server.rb', line 45

def serve(io)
	while not stopped? 
		req = io.read(7)
		if req[2,2] == "\x00\x00" or req.getbyte(6) == @uid
        tr = req[0,2]
        len = req[4,2].unpack('n')[0]
        req = io.read(len - 1)
        log "Server RX (#{req.size} bytes): #{logging_bytes(req)}"

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

        resp = tr + "\0\0" + (pdu.size + 1).to_word + @uid.chr + pdu
        log "Server TX (#{resp.size} bytes): #{logging_bytes(resp)}"
        io.write resp
      end
	end
end