View Source Modbux.Rtu.Slave (Modbux v0.3.11)

API for a Modbus RTU Slave device.

Summary

Functions

Returns a specification to start this module under a supervisor.

Gets the current state of the Slave DB.

Callback implementation for GenServer.init/1.

Send a raw frame through the serial port.

Updates the state of the Slave DB.

Starts a Modbus RTU Slave process.

Gets the Slave state.

Functions

Returns a specification to start this module under a supervisor.

See Supervisor.

@spec get_db(atom() | pid() | {atom(), any()} | {:via, atom(), any()}) :: any()

Gets the current state of the Slave DB.

Callback implementation for GenServer.init/1.

@spec raw_write(atom() | pid() | {atom(), any()} | {:via, atom(), any()}, any()) ::
  any()

Send a raw frame through the serial port.

@spec request(atom() | pid() | {atom(), any()} | {:via, atom(), any()}, any()) ::
  any()

Updates the state of the Slave DB.

cmd is a 4 elements tuple, as follows:

  • {:rc, slave, address, count} read count coils.
  • {:ri, slave, address, count} read count inputs.
  • {:rhr, slave, address, count} read count holding registers.
  • {:rir, slave, address, count} read count input registers.
  • {:fc, slave, address, value} force single coil.
  • {:phr, slave, address, value} preset single holding register.
  • {:fc, slave, address, values} force multiple coils.
  • {:phr, slave, address, values} preset multiple holding registers.
@spec start_link(keyword()) :: :ignore | {:error, any()} | {:ok, pid()}

Starts a Modbus RTU Slave process.

The following options are available:

  • tty - defines the serial port to spawn the Slave.
  • gen_opts - defines extra options for the Genserver OTP configuration.
  • uart_opts - defines extra options for the UART configuration (defaults:
    [speed: 115200, rx_framing_timeout: 1000]).
  • model - defines the DB initial state.
  • active - (true or false) enable/disable DB updates notifications (mailbox).

The messages (when active mode is true) have the following form:

{:modbus_rtu, {:slave_request, payload}}

or

{:modbus_rtu, {:slave_error, payload, reason}}

The following are some reasons:

  • :ecrc - corrupted message (invalid crc).
  • :einval - invalid function.
  • :eaddr - invalid memory address requested.

Model (DB)

The model or data base (DB) defines the slave memory map, the DB is defined by the following syntax:

%{slave_id => %{{memory_type, address_number} => value}}

where:

  • slave_id - specifies a unique unit address from 1 to 247.
  • memory_type - specifies the memory between:
    • :c - Discrete Output Coils.
    • :i - Discrete Input Contacts.
    • :ir - Analog Input Registers.
    • :hr - Analog Output Registers.
  • address_number - specifies the memory address.
  • value - the current value from that memory.

Example

model = %{80 => %{{:c, 20818} => 0, {:hr, 20818} => 0}}
Modbux.Tcp.Server.start_link(model: model, port: 2000)
@spec state(atom() | pid() | {atom(), any()} | {:via, atom(), any()}) :: any()

Gets the Slave state.

@spec stop(atom() | pid() | {atom(), any()} | {:via, atom(), any()}) :: :ok