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
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;
|
|
}
|