Skip to main content

rusty_modbus_server/
config.rs

1//! Server configuration types.
2
3use std::net::SocketAddr;
4use std::time::Duration;
5
6use rusty_modbus_tcp::config::TcpServerConfig;
7use rusty_modbus_types::UnitId;
8
9/// Server configuration.
10#[derive(Debug, Clone)]
11pub struct ServerConfig {
12    /// Address to listen on.
13    pub listen_addr: SocketAddr,
14    /// This server's Unit ID. Default: `UnitId(1)`.
15    pub unit_id: UnitId,
16    /// Maximum concurrent connections. Default: 64.
17    pub max_connections: usize,
18    /// Maximum concurrent transactions per connection. Default: 16.
19    pub max_transactions: u16,
20    /// Shutdown timeout. Default: 10s.
21    pub shutdown_timeout: Duration,
22    /// Device identification for FC 0x2B/0x0E.
23    pub device_id: DeviceIdentification,
24    /// Underlying TCP server config.
25    pub tcp_config: TcpServerConfig,
26}
27
28impl Default for ServerConfig {
29    fn default() -> Self {
30        Self {
31            listen_addr: "0.0.0.0:502".parse().unwrap(),
32            unit_id: UnitId(1),
33            max_connections: 64,
34            max_transactions: 16,
35            shutdown_timeout: Duration::from_secs(10),
36            device_id: DeviceIdentification::default(),
37            tcp_config: TcpServerConfig::default(),
38        }
39    }
40}
41
42/// Device identification for Read Device ID (FC 0x2B/0x0E).
43#[derive(Debug, Clone)]
44pub struct DeviceIdentification {
45    /// Vendor name (mandatory, object 0x00).
46    pub vendor_name: String,
47    /// Product code (mandatory, object 0x01).
48    pub product_code: String,
49    /// Major/minor revision (mandatory, object 0x02).
50    pub major_minor_revision: String,
51    /// Vendor URL (optional).
52    pub vendor_url: Option<String>,
53    /// Product name (optional).
54    pub product_name: Option<String>,
55    /// Model name (optional).
56    pub model_name: Option<String>,
57    /// User application name (optional).
58    pub user_application_name: Option<String>,
59}
60
61impl Default for DeviceIdentification {
62    fn default() -> Self {
63        Self {
64            vendor_name: String::from("rusty-modbus"),
65            product_code: String::from("RMOD"),
66            major_minor_revision: String::from("0.1.0"),
67            vendor_url: None,
68            product_name: None,
69            model_name: None,
70            user_application_name: None,
71        }
72    }
73}