rusty_modbus_sim/
config.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct SimConfig {
8 pub device: DeviceConfig,
10 #[serde(default)]
12 pub registers: RegisterConfig,
13 #[serde(default)]
15 pub faults: Vec<FaultConfig>,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct DeviceConfig {
21 #[serde(default = "default_unit_id")]
23 pub unit_id: u8,
24 #[serde(default = "default_vendor")]
26 pub vendor_name: String,
27 #[serde(default = "default_product")]
29 pub product_code: String,
30 #[serde(default = "default_revision")]
32 pub revision: String,
33 #[serde(default = "default_listen")]
35 pub listen_addr: String,
36}
37
38fn default_unit_id() -> u8 {
39 1
40}
41fn default_vendor() -> String {
42 String::from("rusty-modbus-sim")
43}
44fn default_product() -> String {
45 String::from("SIM")
46}
47fn default_revision() -> String {
48 String::from("0.1.0")
49}
50fn default_listen() -> String {
51 String::from("127.0.0.1:0")
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
56pub struct RegisterConfig {
57 #[serde(default)]
59 pub holding: Vec<RegisterBlock>,
60 #[serde(default)]
62 pub input: Vec<RegisterBlock>,
63 #[serde(default)]
65 pub coils: Vec<CoilBlock>,
66 #[serde(default)]
68 pub discrete_inputs: Vec<CoilBlock>,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct RegisterBlock {
74 pub address: u16,
76 pub count: u16,
78 #[serde(default)]
80 pub initial: Vec<u16>,
81 #[serde(default)]
83 pub mode: UpdateMode,
84 #[serde(default)]
86 pub min: u16,
87 #[serde(default = "default_max_u16")]
89 pub max: u16,
90}
91
92fn default_max_u16() -> u16 {
93 1000
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct CoilBlock {
99 pub address: u16,
101 pub count: u16,
103 #[serde(default)]
105 pub initial: Vec<bool>,
106}
107
108#[derive(Debug, Clone, Default, Serialize, Deserialize)]
110#[serde(rename_all = "snake_case")]
111pub enum UpdateMode {
112 #[default]
114 Static,
115 Random,
117 Increment,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct FaultConfig {
124 #[serde(rename = "type")]
126 pub fault_type: FaultType,
127 #[serde(default)]
129 pub trigger: FaultTrigger,
130 #[serde(default)]
132 pub exception: Option<String>,
133 #[serde(default)]
135 pub delay_ms: Option<u64>,
136 #[serde(default)]
138 pub probability: Option<f64>,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
143#[serde(rename_all = "snake_case")]
144pub enum FaultType {
145 Exception,
147 Delay,
149 Timeout,
151 Corrupt,
153}
154
155#[derive(Debug, Clone, Default, Serialize, Deserialize)]
157pub struct FaultTrigger {
158 pub function: Option<String>,
160 pub address: Option<u16>,
162 pub unit_id: Option<u8>,
164}