extern crate libmodbus_rs; mod unit_test_config; use libmodbus_rs::{Modbus, ModbusMapping, ModbusServer, ModbusTCP, ModbusRTU}; use std::env; use unit_test_config::*; fn run() -> Result<(), std::io::Error> { let args: Vec<_> = env::args().collect(); let backend = if args.len() > 1 { match args[1].to_lowercase().as_ref() { "tcp" => Backend::TCP, "rtu" => Backend::RTU, _ => { println!("Usage:\n {} [tcp|rtu] - Modbus client to measure data bandwith\n", args[0]); std::process::exit(-1); } } } else { Backend::TCP }; let mut modbus; let mut socket; if backend == Backend::TCP { modbus = Modbus::new_tcp("127.0.0.1", 1502).expect("Could not create TCP context"); socket = modbus.tcp_listen(1).expect("Could not listen to TCP socket"); modbus.tcp_accept(&mut socket).unwrap(); } else { modbus = Modbus::new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1).expect("Could not create RTU context"); modbus.set_slave(1).unwrap(); modbus.connect().unwrap(); } let mb_mapping = ModbusMapping::new(Modbus::MAX_READ_BITS, 0, Modbus::MAX_READ_REGISTERS, 0).expect("Failed to allocate the mapping"); loop { let mut query = vec![0u8; Modbus::TCP_MAX_ADU_LENGTH]; match modbus.receive(&mut query) { Ok(rc) => modbus.reply(&query, rc, &mb_mapping), Err(err) => { println!("Quit the loop: {}", err); break; } }.unwrap(); } Ok(()) } fn main() { if let Err(ref err) = run() { println!("{}", Modbus::strerror(err.raw_os_error().unwrap())); std::process::exit(1) } }