You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

107 lines
2.8 KiB

#include "preportional_valve_ctrl.hpp"
#include "transmit_disfection_protocol/transmit_disfection_protocol.hpp"
using namespace iflytop;
using namespace zscanprotocol;
#define WORK_STATE_REG 0x0000
#define CTRL_STATE_REG 0x0001
#define POS_STATE_REG 0x0013
#define OVERTIME 30
#define TAG "PreportionalValveCtrl"
void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); }
int32_t PreportionalValveCtrl::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal) {
// 重发三次
for (size_t i = 0; i < 3; i++) {
int32_t err = m_modbusBlockHost.writeReg06(slaveAddr, regAddr, regVal, OVERTIME);
if (err == 0) return 0;
}
return err::kerr_subdevice_offline;
}
int32_t PreportionalValveCtrl::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal) {
// 重发三次
for (size_t i = 0; i < 3; i++) {
int32_t err = m_modbusBlockHost.readReg03(slaveAddr, regAddr, regVal, OVERTIME);
if (err == 0) return 0;
}
return err::kerr_subdevice_offline;
}
int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { //
int32_t ret = 0;
if (valueid > 255 || valueid < 1) {
return err::kerr_invalid_param;
}
ret = writeReg06(valueid, CTRL_STATE_REG, pos);
if (!ret) return err::kerr_subdevice_offline;
m_last_set_valve_ticket = HAL_GetTick();
m_targetpos[valueid] = pos;
return 0;
}
int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) {
int32_t ret = 0;
if (valueid > 255 || valueid < 1) {
return err::kerr_invalid_param;
}
uint16_t pos16 = 0;
ret = readReg03(valueid, POS_STATE_REG, &pos16);
if (!ret) return err::kerr_subdevice_offline;
*pos = pos16;
return 0;
}
int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) {
int32_t ret = 0;
if (valueid > 255 || valueid < 1) {
return err::kerr_invalid_param;
}
uint16_t pos16 = 0;
ret = readReg03(valueid, CTRL_STATE_REG, &pos16);
if (!ret) return err::kerr_subdevice_offline;
*pos = pos16;
return 0;
}
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
}
int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) {
int32_t ret = 0;
if (valueid > 255 || valueid < 1) {
return err::kerr_invalid_param;
}
uint16_t state16 = 0;
ret = readReg03(valueid, WORK_STATE_REG, &state16);
if (!ret) return err::kerr_subdevice_offline;
*state = state16;
return 0;
}