在C ++中实现PLC“定时器脉冲”功能块

时间:2019-07-01 14:58:21

标签: c++ plc

我一直在实现PLC功能块的库。功能块之一是“ Timer Pulse”功能块,其行为如下: enter image description here

我已经以这种方式实现了该功能块

Tpulse.h:

#include <stdint.h>
#include "LogicBlk.h"

namespace LogicBlocks
{

// Timer Pulse i.e. logic one at the output for specified time as soon as 0->1 at the input
class Tpulse : public LogicBlk{
public:
    Tpulse(uint32_t*, uint32_t, uint32_t, uint32_t);
    virtual ~Tpulse();

    void Update(void);

private:

    uint32_t *m_BitsArray;
    uint32_t m_Input;
    uint32_t m_Output;
    uint32_t m_PulseTime;
    uint32_t m_StartTime;
    uint32_t m_ElapsedTime;
    uint32_t m_CurrentTime;

};

}

Tpulse.cpp:

LogicBlocks::Tpulse::Tpulse(uint32_t *bitsArray, uint32_t input, uint32_t output, uint32_t pulseTime):
                            m_BitsArray{bitsArray}, m_Input{input}, m_Output{output}, m_PulseTime{pulseTime}{
                                m_StartTime     = 0;
                                m_ElapsedTime   = 0;
                                m_CurrentTime   = 0;
}

LogicBlocks::Tpulse::~Tpulse(){
}

void LogicBlocks::Tpulse::Update(void){

    if(Utils::TestBitSet(m_BitsArray, m_Input) && Utils::TestBitClr(m_BitsArray, m_Output) && !m_ElapsedTime){

        m_StartTime = GetTick();
        SetBit(m_BitsArray, m_Output);

    }else if(Utils::TestBitSet(m_BitsArray, m_Output)){

        m_CurrentTime = GetTick();
        m_ElapsedTime = m_CurrentTime - m_StartTime;

        if(m_ElapsedTime >= m_PulseTime){

            ClrBit(m_BitsArray, m_Output);
            if(TestBitClr(m_BitsArray, m_Input)){

                m_ElapsedTime = 0;
            }
        }

    }else if(TestBitClr(m_BitsArray, m_Input) && TestBitClr(m_BitsArray, m_Output)){

        m_ElapsedTime = 0;

    }

}

基于我已经完成的测试,在我看来它可以正常工作,但我不确定。任何人都可以从功能和编程风格的角度评估我的代码吗?预先感谢您的任何建议。

0 个答案:

没有答案