rsiot/components/cmp_plc/plc/library/edge_detect/
rising_edge.rs

1//! Фронт сигнала 0 -> 1
2
3use serde::{Deserialize, Serialize};
4
5use crate::components::cmp_plc::plc::FbSystemData;
6
7use super::super::super::function_block_base::{FunctionBlockBase, IFunctionBlock};
8
9/// Входные данные
10#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
11pub struct I {
12    /// Сигнал, фронт которого нужно определить
13    pub i: bool,
14}
15
16/// Выходные данные
17#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
18pub struct Q {
19    /// Устанавливается в true на один цикл при обнаруженном фронте сигнала 0 -> 1
20    pub q: bool,
21}
22
23/// Статичные данные
24#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
25pub struct S {
26    prev_i: bool,
27}
28
29impl IFunctionBlock<I, Q, S> for FunctionBlockBase<I, Q, S> {
30    fn logic(input: &mut I, stat: &mut S, _system_data: &FbSystemData) -> Q {
31        let rising_edge = input.i && !stat.prev_i;
32        stat.prev_i = input.i;
33
34        Q { q: rising_edge }
35    }
36}
37
38/// Фронт сигнала 0 -> 1
39pub type FB = FunctionBlockBase<I, Q, S>;