我一直在实现PLC功能块的库。功能块之一是“ Timer Pulse”功能块,其行为如下:
我已经以这种方式实现了该功能块
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;
}
}
基于我已经完成的测试,在我看来它可以正常工作,但我不确定。任何人都可以从功能和编程风格的角度评估我的代码吗?预先感谢您的任何建议。