Crate tokio_modbus[−][src]
Expand description
A pure Rust Modbus library based on tokio.
Modbus is based on a master/slave model. To avoid confusions with the tokio terminology the master is called client and the slave is called server in this library.
Features
- pure Rust library
- async (non-blocking)
- sync (blocking)
- Modbus TCP
- Modbus RTU
- Client & Server
- Open Source (MIT/Apache-2.0)
Installation
Add this to your Cargo.toml
:
[dependencies]
tokio-modbus = "*"
If you like to use Modbus TCP only:
[dependencies]
tokio-modbus = { version = "*", default-features = false, features = ["tcp"] }
If you like to use Modbus RTU only:
[dependencies]
tokio-modbus = { version = "*", default-features = false, features = ["rtu"] }
If you like to build a TCP server:
[dependencies]
tokio-modbus = { version = "*", default-features = false, features = ["tcp", "server"] }
Examples
TCP client
#[tokio::main(flavor = "current_thread")]
pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
use std::future::Future;
use tokio::runtime::Runtime;
use tokio_modbus::prelude::*;
let socket_addr = "192.168.0.222:502".parse().unwrap();
let mut ctx = tcp::connect(socket_addr).await?;
let data = ctx.read_input_registers(0x1000, 7).await?;
println!("Response is '{:?}'", data);
Ok(())
}
Sync TCP client
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
use tokio_modbus::prelude::*;
let socket_addr = "192.168.0.222:502".parse()?;
let mut client = client::sync::tcp::connect(socket_addr)?;
let data = client.read_input_registers(0x1000, 7)?;
println!("Response is '{:?}'", data);
Ok(())
}
RTU client
#[tokio::main(flavor = "current_thread")]
pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
use tokio_serial::SerialStream;
use tokio_modbus::prelude::*;
let tty_path = "/dev/ttyUSB0";
let slave = Slave(0x17);
let builder = tokio_serial::new(tty_path, 19200);
let port = SerialStream::open(&builder).unwrap();
let mut ctx = rtu::connect_slave(port, slave).await?;
println!("Reading a sensor value");
let rsp = ctx.read_holding_registers(0x082B, 2).await?;
println!("Sensor value is: {:?}", rsp);
Ok(())
}
Sync RTU client
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
use tokio_modbus::prelude::*;
let tty_path = "/dev/ttyUSB0";
let slave = Slave(0x17);
let builder = tokio_serial::new(tty_path, 19200);
let mut ctx = sync::rtu::connect_slave(&builder, slave)?;
println!("Reading a sensor value");
let rsp = ctx.read_holding_registers(0x082B, 2)?;
println!("Sensor value is: {:?}", rsp);
Ok(())
}
More examples can be found in the examples folder.