Qt modbus slave 从站 封装好的类直接使用

本文介绍了一个基于Qt的Modbus从站实现方案,包括通过串口和网络进行连接的方法,并详细说明了如何初始化、连接设备及处理数据更新、错误和状态变更等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现基本的功能

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 主站

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值