rsiot/components_config/modbus_client/
fieldbus_request.rs

1use std::time::Instant;
2
3use crate::components_config::master_device::RequestResponseBound;
4
5/// Структура отдельного запроса на коммуникацию по шине Modbus
6#[derive(Clone, Debug)]
7pub struct FieldbusRequest {
8    /// Время создания запроса.
9    ///
10    /// Можно контролировать время выполнения запросов
11    pub request_creation_time: Instant,
12
13    /// Вид запроса.
14    ///
15    /// Необходим для правильной расшифровки ответа
16    pub request_kind: u8,
17
18    /// Массив операций
19    pub operation: RequestContent,
20}
21
22impl FieldbusRequest {
23    /// Создание запроса. Адрес задается позже
24    pub fn new(request_kind: impl Into<u8>, operation: RequestContent) -> Self {
25        Self {
26            request_creation_time: Instant::now(),
27            request_kind: request_kind.into(),
28            operation,
29        }
30    }
31}
32
33impl RequestResponseBound for FieldbusRequest {}
34
35/// Параметры запроса Modbus
36#[derive(Clone, Debug)]
37pub enum RequestContent {
38    /// Чтение регистров флагов
39    ReadCoils {
40        /// Начальный адрес
41        start_address: u16,
42        /// Количество
43        count: u16,
44    },
45    /// Чтение регистров хранения
46    ReadHoldingRegisters {
47        /// Начальный адрес
48        start_address: u16,
49        /// Количество
50        count: u16,
51    },
52    /// Чтение регистров ввода
53    ReadInputRegisters {
54        /// Начальный адрес
55        start_address: u16,
56        /// Количество
57        count: u16,
58    },
59    /// Запись одного регистра хранения
60    WriteSingleRegister {
61        /// Адрес
62        address: u16,
63        /// Значение
64        value: u16,
65    },
66}