Class: ModBus::TCPSlave

Inherits:
Client::Slave show all
Defined in:
lib/rmodbus/tcp_slave.rb

Overview

TCP slave implementation

Examples:

TCP.connect('127.0.0.1', 10002) do |cl|
  cl.with_slave(uid) do |slave|
    slave.holding_registers[0..100]
  end
end

See Also:

Constant Summary

Constants inherited from Client::Slave

Client::Slave::EXCEPTIONS

Instance Attribute Summary collapse

Attributes inherited from Client::Slave

#uid

Attributes included from Options

#raise_exception_on_mismatch, #read_retries, #read_retry_timeout

Attributes included from Debug

#logger, #raise_exception_on_mismatch, #read_retries, #read_retry_timeout

Instance Method Summary collapse

Methods inherited from Client::Slave

#check_response_mismatch, #coils, #discrete_inputs, #holding_registers, #input_registers, #mask_write_register, #query, #read_coil, #read_coils, #read_discrete_input, #read_discrete_inputs, #read_holding_register, #read_holding_registers, #read_input_register, #read_input_registers, #read_write_multiple_registers, #write_multiple_coils, #write_multiple_registers, #write_single_coil, #write_single_register

Methods included from Debug

#log, #logging_bytes

Constructor Details

#initialize(uid, io) ⇒ TCPSlave

Returns a new instance of TCPSlave.

See Also:

  • Slave::initialize


19
20
21
22
# File 'lib/rmodbus/tcp_slave.rb', line 19

def initialize(uid, io)
  @transaction = 0
  super
end

Instance Attribute Details

#transactionObject (readonly)

Returns the value of attribute transaction.



16
17
18
# File 'lib/rmodbus/tcp_slave.rb', line 16

def transaction
  @transaction
end

Instance Method Details

#read_pduObject (private)

overide method for RTU over TCP implamentaion

See Also:

  • Slave#query


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rmodbus/tcp_slave.rb', line 39

def read_pdu
  loop do
    header = @io.read(7)
    next unless header

    trn = header[0, 2].unpack1("n")
    len = header[4, 2].unpack1("n")
    msg = @io.read(len - 1)

    log "Rx (#{(header + msg).size} bytes): " + logging_bytes(header + msg)

    return msg if trn == @transaction

    log "Transaction number mismatch. A packet is ignored."
  end
end

#send_pdu(pdu) ⇒ Object (private)

overide method for RTU over TCP implamentaion

See Also:

  • Slave#query


28
29
30
31
32
33
34
35
# File 'lib/rmodbus/tcp_slave.rb', line 28

def send_pdu(pdu)
  @transaction = 0 if @transaction.next > 65_535
  @transaction += 1
  msg = "#{@transaction.to_word}\x00\x00#{(pdu.size + 1).to_word}#{@uid.chr}#{pdu}"
  @io.write msg

  log "Tx (#{msg.size} bytes): " + logging_bytes(msg)
end