|
|
@ -2,156 +2,170 @@ |
|
|
|
|
|
|
|
ModbusConfig ServoController::initiateConfig(QString serialPort) |
|
|
|
{ |
|
|
|
ModbusConfig _config; |
|
|
|
_config.baud = QSerialPort::Baud19200; |
|
|
|
_config.parity = QSerialPort::EvenParity; |
|
|
|
_config.dataBits = QSerialPort::Data8; |
|
|
|
_config.stopBits = QSerialPort::OneStop; |
|
|
|
_config.responseTime = 2000; |
|
|
|
_config.serialPort = serialPort; |
|
|
|
_config.clientAddress = 1; |
|
|
|
ModbusConfig _config; |
|
|
|
_config.baud = QSerialPort::Baud19200; |
|
|
|
_config.parity = QSerialPort::EvenParity; |
|
|
|
_config.dataBits = QSerialPort::Data8; |
|
|
|
_config.stopBits = QSerialPort::OneStop; |
|
|
|
_config.responseTime = 2000; |
|
|
|
_config.serialPort = serialPort; |
|
|
|
_config.clientAddress = 1; |
|
|
|
|
|
|
|
return _config; |
|
|
|
return _config; |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::apply() |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_APPLY_SETTING_REG, SRV_APPLY_SETTING_VAL); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_APPLY_SETTING_REG, SRV_APPLY_SETTING_VAL); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::enableDrive() |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_ENABLE_DRIVE_REG, 3); |
|
|
|
apply(); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_ENABLE_DRIVE_REG, 3); |
|
|
|
apply(); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::setStartStop(bool start) |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_STOP_REG, start ? 3 : 0); |
|
|
|
apply(); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_STOP_REG, start ? 3 : 0); |
|
|
|
apply(); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::setStartAngle(double angle) |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_ANGLE_INT_PART_REG, static_cast<quint16>(angle)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_ANGLE_FRAC_PART_REG, |
|
|
|
static_cast<quint16>((angle - (static_cast<int>(angle))) * |
|
|
|
100)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_ANGLE_INT_PART_REG, static_cast<quint16>(angle)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_START_ANGLE_FRAC_PART_REG, |
|
|
|
static_cast<quint16>((angle - (static_cast<int>(angle))) * |
|
|
|
100)); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::setStopAngle(double angle) |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_STOP_ANGLE_INT_PART_REG, static_cast<quint16>(angle)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_STOP_ANGLE_FRAC_PART_REG, |
|
|
|
static_cast<quint16>((angle - (static_cast<int>(angle))) * |
|
|
|
100)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_STOP_ANGLE_INT_PART_REG, static_cast<quint16>(angle)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_STOP_ANGLE_FRAC_PART_REG, |
|
|
|
static_cast<quint16>((angle - (static_cast<int>(angle))) * |
|
|
|
100)); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::setSpeed(double speed) |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_AZIMUTH_SPEED_REG, |
|
|
|
static_cast<quint16>(speed * SRV_SPEED_FACTOR)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_AZIMUTH_SPEED_REG, |
|
|
|
static_cast<quint16>(speed * SRV_SPEED_FACTOR)); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::changeMode(double startAngle, double stopAngle, double speed) |
|
|
|
{ |
|
|
|
setStartAngle(startAngle); |
|
|
|
setStopAngle(stopAngle); |
|
|
|
setSpeed(speed); |
|
|
|
setStartStop(true); |
|
|
|
enableDrive(); |
|
|
|
apply(); |
|
|
|
setStartAngle(startAngle); |
|
|
|
setStopAngle(stopAngle); |
|
|
|
setSpeed(speed); |
|
|
|
setStartStop(true); |
|
|
|
enableDrive(); |
|
|
|
apply(); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::init(QString serialPort) |
|
|
|
{ |
|
|
|
_modbusWrapper.init(); |
|
|
|
_modbusWrapper.connectToDevice(initiateConfig(serialPort)); |
|
|
|
_modbusWrapper.close(); |
|
|
|
_modbusWrapper.init(); |
|
|
|
_modbusWrapper.connectToDevice(initiateConfig(serialPort)); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::startMoving() |
|
|
|
{ |
|
|
|
setStartStop(true); |
|
|
|
setStartStop(true); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::stopMoving() |
|
|
|
{ |
|
|
|
setStartStop(false); |
|
|
|
setStartStop(false); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::resetAzimuth() |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_CALIBRATE_REG, SRV_CALIBRATION_VAL); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_CALIBRATE_REG, SRV_CALIBRATION_VAL); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::fix(double angle) |
|
|
|
{ |
|
|
|
changeMode(angle, angle, 5 / 6.0); |
|
|
|
changeMode(angle, angle, 5 / 6.0); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::sector(double startAngle, double stopAngle, double speed) |
|
|
|
{ |
|
|
|
changeMode(startAngle, stopAngle, speed); |
|
|
|
changeMode(startAngle, stopAngle, speed); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
double ServoController::getSpeed() |
|
|
|
{ |
|
|
|
auto speedVector = _modbusWrapper.getHoldingRegister(SRV_AZIMUTH_SPEED_REG, 1); |
|
|
|
auto speedVector = _modbusWrapper.getHoldingRegister(SRV_AZIMUTH_SPEED_REG, 1); |
|
|
|
|
|
|
|
return (speedVector[0] / SRV_SPEED_FACTOR); |
|
|
|
return (speedVector[0] / SRV_SPEED_FACTOR); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
double ServoController::getStopAngle() |
|
|
|
{ |
|
|
|
auto speedVector1 = _modbusWrapper.getHoldingRegister(SRV_STOP_ANGLE_INT_PART_REG, 1); |
|
|
|
auto speedVector2 = _modbusWrapper.getHoldingRegister(SRV_STOP_ANGLE_FRAC_PART_REG, 1); |
|
|
|
auto speedVector1 = _modbusWrapper.getHoldingRegister(SRV_STOP_ANGLE_INT_PART_REG, 1); |
|
|
|
auto speedVector2 = _modbusWrapper.getHoldingRegister(SRV_STOP_ANGLE_FRAC_PART_REG, 1); |
|
|
|
|
|
|
|
return (speedVector1[0] + speedVector2[0] / SRV_ANGLE_FACTOR); |
|
|
|
return (speedVector1[0] + speedVector2[0] / SRV_ANGLE_FACTOR); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
double ServoController::getStartAngle() |
|
|
|
{ |
|
|
|
auto speedVector1 = _modbusWrapper.getHoldingRegister(SRV_START_ANGLE_INT_PART_REG, 1); |
|
|
|
auto speedVector2 = _modbusWrapper.getHoldingRegister(SRV_START_ANGLE_FRAC_PART_REG, 1); |
|
|
|
auto speedVector1 = _modbusWrapper.getHoldingRegister(SRV_START_ANGLE_INT_PART_REG, 1); |
|
|
|
auto speedVector2 = _modbusWrapper.getHoldingRegister(SRV_START_ANGLE_FRAC_PART_REG, 1); |
|
|
|
|
|
|
|
return (speedVector1[0] + speedVector2[0] / SRV_ANGLE_FACTOR); |
|
|
|
return (speedVector1[0] + speedVector2[0] / SRV_ANGLE_FACTOR); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
double ServoController::getAngleOffset() |
|
|
|
{ |
|
|
|
auto angleOffsetVector = _modbusWrapper.getHoldingRegister(SRV_ZERO_OFFSET_ANGLE, 1); |
|
|
|
auto angleOffsetVector = _modbusWrapper.getHoldingRegister(SRV_ZERO_OFFSET_ANGLE, 1); |
|
|
|
|
|
|
|
return (angleOffsetVector[0] / SRV_ANGLE_FACTOR); |
|
|
|
return (angleOffsetVector[0] / SRV_ANGLE_FACTOR); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
void ServoController::setAngleOffset(double offset) |
|
|
|
{ |
|
|
|
_modbusWrapper.setSingleRegister(SRV_ZERO_OFFSET_ANGLE, |
|
|
|
static_cast<quint16>(offset * SRV_ANGLE_FACTOR)); |
|
|
|
_modbusWrapper.setSingleRegister(SRV_ZERO_OFFSET_ANGLE, |
|
|
|
static_cast<quint16>(offset * SRV_ANGLE_FACTOR)); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
double ServoController::getAzimuth() |
|
|
|
{ |
|
|
|
auto azimuthVector = _modbusWrapper.getHoldingRegister(SRV_AZIMUTH_REG, 1); |
|
|
|
auto azimuthVector = _modbusWrapper.getHoldingRegister(SRV_AZIMUTH_REG, 1); |
|
|
|
|
|
|
|
return (azimuthVector[0] / SRV_ANGLE_FACTOR); |
|
|
|
return (azimuthVector[0] / SRV_ANGLE_FACTOR); |
|
|
|
} |
|
|
|
|
|
|
|
/*************************************************************************************************/ |
|
|
|
bool ServoController::getStatus() |
|
|
|
{ |
|
|
|
try { |
|
|
|
getSpeed(); |
|
|
|
return true; |
|
|
|
|
|
|
|
} catch (ServoException ex) { |
|
|
|
_modbusWrapper.close(); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|