[−][src]Crate tokio_modbus
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
#[cfg(feature = "tcp")] #[tokio::main] 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
#[cfg(all(feature = "tcp", feature = "sync"))] 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
#[cfg(feature = "rtu")] #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { use std::future::Future; use tokio::runtime::Runtime; use tokio_serial::{Serial, SerialPortSettings}; use tokio_modbus::prelude::*; let tty_path = "/dev/ttyUSB0"; let slave = Slave(0x17); let mut settings = SerialPortSettings::default(); settings.baud_rate = 19200; let port = Serial::from_path(tty_path, &settings).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(()) }
More examples can be found in the examples folder.
Protocol-Specification
Modules
client | |
prelude | |
slave |