rsiot-plc 0.0.71

Компонент для исполнения логики наподобие PLC
Documentation
use serde::{Deserialize, Serialize};

use crate::plc::function_block_base::{FunctionBlockBase, IFunctionBlock};

#[derive(Clone, Default, Deserialize, Serialize)]
pub struct I {
    pub i: bool,
}

#[derive(Clone, Default, Deserialize, Serialize)]
pub struct Q {
    pub q: bool,
}

#[derive(Clone, Default, Deserialize, Serialize)]
pub struct S {
    prev_i: bool,
}

impl IFunctionBlock<I, Q, S> for FunctionBlockBase<I, Q, S> {
    fn logic(input: &I, stat: &mut S) -> Q {
        let rising_edge = input.i && !stat.prev_i;
        stat.prev_i = input.i;

        Q { q: rising_edge }
    }
}

pub type FunctionBlock = FunctionBlockBase<I, Q, S>;