rsiot_plc/config.rs
1use std::time::Duration;
2
3use serde::Serialize;
4
5use rsiot_messages_core::{Message, MsgDataBound};
6
7use crate::plc::function_block_base::{FunctionBlockBase, IFunctionBlock};
8
9/// Конфигурация компонента ПЛК
10///
11/// # Шаблон функционального блока
12///
13#[doc = include_str!("./template.rs")]
14///
15#[derive(Clone)]
16pub struct Config<TMessage, I, Q, S>
17where
18 TMessage: MsgDataBound,
19 I: Clone + Default + Serialize,
20 Q: Clone + Default + Serialize,
21 S: Clone + Default + Serialize,
22 FunctionBlockBase<I, Q, S>: IFunctionBlock<I, Q, S>,
23{
24 /// Функция преобразования входящих сообщений во входную структуру ПЛК.
25 ///
26 /// # Примеры
27 ///
28 /// ```rust
29 /// fn_input: |input: &mut fb_main::I, msg: &TMessage| match msg {}
30 /// ```
31 pub fn_input: fn(&mut I, &Message<TMessage>) -> (),
32
33 /// Функция преобразования выходной структуры ПЛК в исходящие сообщения.
34 ///
35 /// # Примеры
36 ///
37 /// ```rust
38 /// fn_output: |output: &fb_main::Q| vec![]
39 /// ```
40 pub fn_output: fn(&Q) -> Vec<Message<TMessage>>,
41
42 /// Главный функциональный блок ПЛК
43 ///
44 /// # Примеры
45 ///
46 /// ```rust
47 /// fb_main: fb_main::FB::new()
48 /// ```
49 pub fb_main: FunctionBlockBase<I, Q, S>,
50
51 /// Периодичность выполнения логики ПЛК
52 ///
53 /// # Примеры
54 ///
55 /// ```rust
56 /// period: Duration::from_millis(100)
57 /// ```
58 pub period: Duration,
59}