modbus_rtu/common/request_form.rs
1use super::BypassRequest;
2
3
4/// Modbus RTU request packet format
5#[derive(Debug, Clone)]
6pub enum RequestForm<'a> {
7 /// Request format for reading multiple Holding Registers
8 ///
9 /// - `start_register`: The starting register address
10 /// - `registers_count`: The number of registers to read
11 ///
12 ReadHoldingRegisters { start_register: u16, registers_count: u16 },
13
14 /// Request format for reading multiple Input Registers
15 ///
16 /// - `start_register`: The starting register address
17 /// - `registers_count`: The number of registers to read
18 ///
19 ReadInputRegisters { start_register: u16, registers_count: u16 },
20
21 /// Request format for writing a single Holding Register
22 ///
23 /// - `register_address`: The register address to write to
24 /// - `data_to_write`: The data value to write
25 ///
26 WriteSingleRegister { register_address: u16, data_to_write: u16 },
27
28 /// Request format for writing multiple Holding Registers
29 ///
30 /// - `start_register`: The starting register address
31 /// - `datas_to_wirte`: Slice of data values to write to consecutive registers
32 ///
33 WriteMultipleRegisters { start_register: u16, datas_to_write: &'a [u16] },
34
35 /// Request format for bypassing a packet to a downstream device
36 #[cfg(feature="bypass")]
37 BypassRequest(&'a BypassRequest<'a>),
38}
39
40
41impl<'a> RequestForm<'a> {
42 /// Retrieves the Modbus function code corresponding to the request form variant.
43 ///
44 /// ---
45 /// # Returns
46 /// A `u8` representing the Modbus function code of the request.
47 ///
48 /// ---
49 /// # Examples
50 /// ```
51 /// use modbus_rtu::common::RequestForm;
52 ///
53 /// let form = RequestForm::ReadHoldingRegisters {
54 /// start_register: 0x0000,
55 /// registers_count: 2,
56 /// };
57 ///
58 /// assert_eq!(form.get_function_code(), 0x03);
59 /// ```
60 ///
61 pub fn get_function_code(&self) -> u8 {
62 match self {
63 RequestForm::ReadHoldingRegisters { .. } => 0x03,
64 RequestForm::ReadInputRegisters { .. } => 0x04,
65 RequestForm::WriteSingleRegister { .. } => 0x06,
66 RequestForm::WriteMultipleRegisters { .. } => 0x10,
67 #[cfg(feature="bypass")]
68 RequestForm::BypassRequest(_) => 0x45,
69 }
70 }
71}
72
73
74/// Modbus RTU bypass request packet format
75#[cfg(feature="bypass")]
76#[derive(Debug, Clone)]
77pub enum BypassRequestForm<'a> {
78 /// Request format for reading multiple Holding Registers
79 ///
80 /// - `start_register`: The starting register address
81 /// - `registers_count`: The number of registers to read
82 ///
83 ReadHoldingRegisters { start_register: u16, registers_count: u16 },
84
85 /// Request format for reading multiple Input Registers
86 ///
87 /// - `start_register`: The starting register address
88 /// - `registers_count`: The number of registers to read
89 ///
90 ReadInputRegisters { start_register: u16, registers_count: u16 },
91
92 /// Request format for writing a single Holding Register
93 ///
94 /// - `register_address`: The register address to write to
95 /// - `data_to_write`: The data value to write
96 ///
97 WriteSingleRegister { register_address: u16, data_to_write: u16 },
98
99 /// Request format for writing multiple Holding Registers
100 ///
101 /// - `start_register`: The starting register address
102 /// - `datas_to_wirte`: Slice of data values to write to consecutive registers
103 ///
104 WriteMultipleRegisters { start_register: u16, datas_to_write: &'a [u16] },
105}
106
107
108#[cfg(feature="bypass")]
109impl<'a> BypassRequestForm<'a> {
110 /// Retrieves the Modbus function code corresponding to the request form variant.
111 ///
112 /// ---
113 /// # Returns
114 /// A `u8` representing the Modbus function code of the request.
115 ///
116 /// ---
117 /// # Examples
118 /// ```
119 /// use modbus_rtu::common::BypassRequestForm;
120 ///
121 /// let form = BypassRequestForm::ReadHoldingRegisters {
122 /// start_register: 0x0000,
123 /// registers_count: 2,
124 /// };
125 ///
126 /// assert_eq!(form.get_function_code(), 0x03);
127 /// ```
128 ///
129 pub fn get_function_code(&self) -> u8 {
130 match self {
131 BypassRequestForm::ReadHoldingRegisters { .. } => 0x03,
132 BypassRequestForm::ReadInputRegisters { .. } => 0x04,
133 BypassRequestForm::WriteSingleRegister { .. } => 0x06,
134 BypassRequestForm::WriteMultipleRegisters { .. } => 0x10,
135 }
136 }
137}