modbus-rtu 1.0.1

Standard Modbus RTU protocols
Documentation

modbus-rtu

Github Crates.io Docs.rs Build

This crate provides helpers for building and decoding standard Modbus RTU request and response packets.


Usage

Sending

First, construct the function you want to issue. The following example reads four input registers starting at address 0x1234.

use modbus_rtu::Function;

let starting_address: u16 = 0x1234;
let quantity: usize = 4;
let function = Function::ReadInputRegisters { starting_address, quantity };

Next, build the request with the target device information and timeout.

use modbus_rtu::{Function, Request};

...

let modbus_id: u8 = 1;
let timeout: std::time::Duration = std::time::Duration::from_millis(100);
let request = Request::new(1, &function, timeout);

Finally, convert the request into a Modbus RTU frame.

...

let packet: Box<[u8]> = request.to_bytes().expect("Failed to build request packet");

Sending the bytes to an actual device is not yet implemented in this crate.


Receiving

Receiving bytes from a physical device is also outside the scope of this crate. This example assumes you already obtained the raw response bytes.

With the original request available, attempt to decode the response bytes as shown below.

use modbus_rtu::Response;

...

let bytes: &[u8] = ... ; // user-implemented receive logic

let response = Response::from_bytes(&request, bytes).expect("Failed to analyze response packet");

match response {
    Response::Value(value) => {
        let _ = value[0];   // value at address 0x1234
        let _ = value[1];   // value at address 0x1235
        let _ = value[2];   // value at address 0x1236
        let _ = value[3];   // value at address 0x1237
    },
    Response::Exception(e) => {
        eprintln!("device responded with exception: {e}");
    },
    _ => unreachable!(),
}