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