Browse Source

Add Get Status

AddStatus
nasi 3 years ago
parent
commit
11ab0aaca0
  1. 2
      Servo/include/ModbusWrapper.h
  2. 18
      Servo/include/ServoController.h
  3. 10
      Servo/src/ModbusWrapper.cpp
  4. 116
      Servo/src/ServoController.cpp
  5. 13
      Test/MainWindow.cpp
  6. 34
      Test/MainWindow.ui

2
Servo/include/ModbusWrapper.h

@ -21,7 +21,7 @@ public:
~ModbusWrapper();
void connectToDevice(ModbusConfig modbusConfig);
void init();
void close();
QBitArray getCoil(int startAddress, quint16 readSize);
QBitArray getInputCoil(int startAddress, quint16 readSize);
QVector<quint16> getHoldingRegister(int startAddress, quint16 readSize);

18
Servo/include/ServoController.h

@ -11,14 +11,14 @@ private:
const int SRV_START_ANGLE_INT_PART_REG = 2000;
const int SRV_STOP_ANGLE_INT_PART_REG = 2001;
const int SRV_AZIMUTH_SPEED_REG = 2002;
const int SRV_APPLY_SETTING_REG = 2004;
const int SRV_START_STOP_REG = 2005;
const int SRV_ZERO_OFFSET_ANGLE = 2007;
const int SRV_START_ANGLE_FRAC_PART_REG = 2010;
const int SRV_STOP_ANGLE_FRAC_PART_REG = 2011;
const int SRV_CALIBRATE_REG = 2013;
const int SRV_ENABLE_DRIVE_REG = 2017;
const int SRV_AZIMUTH_REG = 2030;
const int SRV_APPLY_SETTING_REG = 2003; //2004;
const int SRV_START_STOP_REG = 2004; //2005;
const int SRV_ZERO_OFFSET_ANGLE = 2005; //2007;
const int SRV_START_ANGLE_FRAC_PART_REG = 2006; //2010;
const int SRV_STOP_ANGLE_FRAC_PART_REG = 2007; //2011;
const int SRV_CALIBRATE_REG = 2008; //2013;
const int SRV_ENABLE_DRIVE_REG = 2009; //2017;
const int SRV_AZIMUTH_REG = 2010; //2030;
const double SRV_ANGLE_FACTOR = 100.0;
const double SRV_SPEED_FACTOR = 1000.0;
@ -48,6 +48,8 @@ public:
double getAngleOffset();
void setAngleOffset(double offset);
double getAzimuth();
bool getStatus();
};
#endif //SERVOCONTROLLER_H

10
Servo/src/ModbusWrapper.cpp

@ -80,7 +80,15 @@ void ModbusWrapper::init()
if(exp.valid)
{
throw ServoException(exp.message);
}
}
}
/*************************************************************************************************/
void ModbusWrapper::close()
{
_modbusMaster.close();
_workerThread.quit();
_workerThread.wait();
}
/*************************************************************************************************/

116
Servo/src/ServoController.cpp

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

13
Test/MainWindow.cpp

@ -212,15 +212,18 @@ void MainWindow::on_init_clicked()
void MainWindow::handleGetRequestFromServo()
{
try {
ui->showSpeed->setText(QString::number(_servoControler.getSpeed()));
ui->showStartAngle->setText(QString::number(_servoControler.getStartAngle()));
ui->showStopAngle->setText(QString::number(_servoControler.getStopAngle()));
ui->showAngleOffset->setText(QString::number(_servoControler.getAngleOffset()));
ui->showAzimuth->setText(QString::number(_servoControler.getAzimuth()));
// ui->showSpeed->setText(QString::number(_servoControler.getSpeed()));
//ui->showStartAngle->setText(QString::number(_servoControler.getStartAngle()));
//ui->showStopAngle->setText(QString::number(_servoControler.getStopAngle()));
//ui->showAngleOffset->setText(QString::number(_servoControler.getAngleOffset()));
//ui->showAzimuth->setText(QString::number(_servoControler.getAzimuth()));
ui->connectionState->setText(QVariant(_servoControler.getStatus()).toString());
}
catch(ServoException exp)
{
timer->stop();
ui->showServoError->setText(exp.getMessage());
}
}

34
Test/MainWindow.ui

@ -621,6 +621,40 @@ background-color: rgb(186, 178, 158);</string>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_18">
<property name="geometry">
<rect>
<x>180</x>
<y>0</y>
<width>181</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Connection State to Client:</string>
</property>
</widget>
<widget class="QLabel" name="connectionState">
<property name="geometry">
<rect>
<x>370</x>
<y>0</y>
<width>121</width>
<height>20</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(52, 101, 164);
color: rgb(238, 238, 236);
</string>
</property>
<property name="text">
<string/>
</property>
<property name="margin">
<number>0</number>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_12">
<property name="geometry">

Loading…
Cancel
Save