|
|
@ -8,8 +8,24 @@ using namespace iflytop; |
|
|
|
void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); } |
|
|
|
|
|
|
|
int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { //
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief 发送失败重发3次 |
|
|
|
*/ |
|
|
|
for (size_t i = 0; i < 3; i++) { |
|
|
|
int32_t err = _setValvePos(valueid, pos); |
|
|
|
if (err == 0) return 0; |
|
|
|
} |
|
|
|
return 1; |
|
|
|
} |
|
|
|
int32_t PreportionalValveCtrl::_setValvePos(int32_t valueid, int32_t pos) { //
|
|
|
|
if (valueid > 255 || valueid < 1) { |
|
|
|
return 1; |
|
|
|
} |
|
|
|
bool ret = m_modbusBlockHost.writeReg06(valueid, CTRL_STATE_REG, pos, 30); |
|
|
|
if (!ret) return 1; |
|
|
|
m_last_set_valve_ticket = HAL_GetTick(); |
|
|
|
m_targetpos[valueid] = pos; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) { |
|
|
@ -20,6 +36,65 @@ int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) { |
|
|
|
if (!ret) return 1; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) { |
|
|
|
uint16_t pos16 = 0; |
|
|
|
bool ret = m_modbusBlockHost.readReg03(valueid, CTRL_STATE_REG, &pos16, 30); |
|
|
|
*pos = pos16; |
|
|
|
if (!ret) return 1; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
#define TAG "PreportionalValveCtrl"
|
|
|
|
|
|
|
|
int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) { |
|
|
|
#if 1
|
|
|
|
int32_t orderpos = 0; |
|
|
|
int32_t pos = 0; |
|
|
|
int32_t err = 0; |
|
|
|
|
|
|
|
#if 0
|
|
|
|
err = getValveOrderPos(valueid, &orderpos); |
|
|
|
if (err != 0) return err; |
|
|
|
#endif
|
|
|
|
orderpos = m_targetpos[valueid]; |
|
|
|
|
|
|
|
err = getValvePos(valueid, &pos); |
|
|
|
if (err != 0) return err; |
|
|
|
|
|
|
|
if (abs(m_targetpos[valueid] - pos) <= 11) { |
|
|
|
*busy = 0; |
|
|
|
} else { |
|
|
|
*busy = 1; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
#endif
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief |
|
|
|
* 比例阀当前状态的更新是有延迟的,例如下发指令控制比例阀开合到90%,下发执行后(收到指令的回执), |
|
|
|
* 此时读取比例阀状态,比例阀的状态并非运动中,而是stop,需要等待一段时间后,再读取状态,状态才是运动中。 |
|
|
|
*/ |
|
|
|
if (haspassedms(m_last_set_valve_ticket) < 300) { |
|
|
|
*busy = 1; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t valve1state = 0; |
|
|
|
int32_t err = 0; |
|
|
|
|
|
|
|
err = getValveWorkState(1, &valve1state); |
|
|
|
if (err != 0) return err; |
|
|
|
|
|
|
|
if (valve1state == kstate_stop) { |
|
|
|
*busy = 0; |
|
|
|
} else { |
|
|
|
*busy = 1; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
|
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) { |
|
|
|
uint16_t state16 = 0; |
|
|
|
bool ret = m_modbusBlockHost.readReg03(valueid, WORK_STATE_REG, &state16, 30); |
|
|
|