rsiot-plc 0.0.71

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

use rsiot_plc::plc::{
    function_block_base::{FunctionBlockBase, IFunctionBlock},
    library::timer::ton,
    types,
};

#[derive(Clone, Default, Serialize)]
pub struct I {
    pub counter: u16,
}

#[derive(Clone, Default, Serialize)]
pub struct Q {
    pub out_counter: u16,
}

#[derive(Clone, Default, Serialize)]
pub struct S {
    timer: ton::FB,
}

impl IFunctionBlock<I, Q, S> for FunctionBlockBase<I, Q, S> {
    fn logic(input: &I, stat: &mut S) -> Q {
        let ton_res = stat.timer.call(ton::I {
            input: true,
            preset_time: types::TimeDuration::from_secs(10),
        });

        println!(
            "in fb1, timer: {}, elapsed: {:?}",
            ton_res.output, ton_res.elapsed_time
        );

        Q {
            out_counter: input.counter,
        }
    }
}

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