实现基本的功能
QT+= serialport serialbus
modbusSlove_.h
#ifndef MODBUSSLOVE__H
#define MODBUSSLOVE__H
#include <QObject>
#include <QModbusServer>
#include <QModbusRtuSerialSlave>
#include <QModbusTcpServer>
#include <QSerialPort>
/*
*
*
* modbus slave 从站
*
* modbusSlove_* m_slave = new modbusSlove_(this);
*
* initModbusSerialSlove()
*
* connectDevice()
*
* //寄存器值发生改变,连接这个信号
void registerData_signal(int address,int value);
*
*/
class modbusSlove_ : public QObject
{
Q_OBJECT
public:
explicit modbusSlove_(QObject *parent = nullptr);
/**
* @projectName testMyClass
* @brief 初始化串口modbusSlave
* 其他参数 波特率 数据位 校验位 停止位
* @author SMY
* @date 2019-03-27
*/
bool initModbusSerialSlove(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
QSerialPort::Parity parity, QSerialPort::StopBits stopBits);
/**
* @projectName testMyClass
* @brief 初始化网口modbusSlave
* ip地址,端口号
* @author SMY
* @date 2019-03-27
*/
bool initModbusNetworkSlove(QString address,int port);
/**
* @projectName testMyClass
* @brief 连接设备
* @author SMY
* @date 2019-03-27
*/
bool connectDevice();
/**
* @projectName testMyClass
* @brief 网口还是串口连接
* @author SMY
* @date 2019-03-26
*/
enum modbusConnection
{
Serial,
Tcp
};
signals:
//寄存器值发生改变
void registerData_signal(int address,int value);
//发生错误
void error_signal(QString errorString);
/*state :1 connect ,0:unconnect
*状态发生改变
*/
void stateChanged_signal(int state);
public slots:
private slots:
/**
* @projectName testMyClass
* @brief 更新寄存器数据
* @author SMY
* @date 2019-03-26
*/
void updateData(QModbusDataUnit::RegisterType table, int address, int size);
/**
* @projectName testMyClass
* @brief device error
* @author SMY
* @date 2019-03-27
*/
void handleDeviceError(QModbusDevice::Error newError);
/**
* @projectName testMyClass
* @brief 连接状态改变
* @author SMY
* @date 2019-03-27
*/
void onStateChanged(int state);
private:
modbusConnection m_mode;
QModbusServer* m_slove;
};
#endif // MODBUSSLOVE__H
modbusSlove_.cpp
#include "modbusslove_.h"
#include <QDebug>
modbusSlove_::modbusSlove_(QObject *parent) : QObject(parent)
{
}
bool modbusSlove_::initModbusSerialSlove(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
QSerialPort::Parity parity,
QSerialPort::StopBits stopBits)
{
// if(m_slove != nullptr)
// {
// m_slove->disconnect();
// delete m_slove;
// m_slove = nullptr;
// }
//串口
m_slove = new QModbusRtuSerialSlave(this);
m_mode = Serial;
if(!m_slove)
{
qDebug()<<"could not create modbus slave";
return 0;
}
QModbusDataUnitMap reg;
reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });
m_slove->setMap(reg);
m_slove->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
portName);
m_slove->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
baudRate);
m_slove->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
dataBits);
m_slove->setConnectionParameter(QModbusDevice::SerialParityParameter,
parity);
m_slove->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
stopBits);
//更新寄存器值
connect(m_slove,&QModbusServer::dataWritten,this,
&modbusSlove_::updateData);
//更新连接状态
connect(m_slove, &QModbusServer::stateChanged,
this, &modbusSlove_::onStateChanged);
//错误发生
connect(m_slove, &QModbusServer::errorOccurred,
this, &modbusSlove_::handleDeviceError);
return 1;
}
bool modbusSlove_::initModbusNetworkSlove(QString address, int port)
{
// if(m_slove)
// {
// m_slove->disconnect();
// delete m_slove;
// m_slove = nullptr;
// }
//网口
m_slove = new QModbusTcpServer(this);
m_mode = Tcp;
if(!m_slove)
{
qDebug()<<"could not create modbus slave";
return 0;
}
QModbusDataUnitMap reg;
reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });
m_slove->setMap(reg);
m_slove->setConnectionParameter(QModbusDevice::NetworkAddressParameter,address);
m_slove->setConnectionParameter(QModbusDevice::NetworkPortParameter,port);
//更新寄存器值
connect(m_slove,&QModbusServer::dataWritten,this,
&modbusSlove_::updateData);
//更新连接状态
connect(m_slove, &QModbusServer::stateChanged,
this, &modbusSlove_::onStateChanged);
//错误发生
connect(m_slove, &QModbusServer::errorOccurred,
this, &modbusSlove_::handleDeviceError);
}
bool modbusSlove_::connectDevice()
{
return m_slove->connectDevice();
}
void modbusSlove_::updateData(QModbusDataUnit::RegisterType table, int address, int size)
{
for (int i = 0; i < size; ++i) {
quint16 value;
QString text;
switch (table) {
case QModbusDataUnit::Coils:
m_slove->data(QModbusDataUnit::Coils, address + i, &value);
break;
case QModbusDataUnit::HoldingRegisters:
m_slove->data(QModbusDataUnit::HoldingRegisters, address + i, &value);
break;
default:
break;
}
emit registerData_signal(address+i,value);
}
}
void modbusSlove_::handleDeviceError(QModbusDevice::Error newError)
{
if(newError == QModbusDevice::NoError || !m_slove)
return;
emit error_signal(m_slove->errorString());
}
void modbusSlove_::onStateChanged(int state)
{
if(state == QModbusDevice::UnconnectedState)
emit stateChanged_signal(0);
else if(state == QModbusDevice::ConnectedState)
emit stateChanged_signal(1);
}
MASTER 主站