16,203
社区成员
发帖
与我相关
我的任务
分享
#ifndef CMODBUS_H
#define CMODBUS_H
#include <QModbusTcpClient>
#include <CSerialPortConfig.h>
#include <QModbusRtuSerialMaster>
class CModBus : public CSerialPortConfig
{
Q_OBJECT
public:
explicit CModBus(const QString &capstr);
~CModBus();
void portOpen();
void portClose();
bool portIsOpen();
void read(const QModbusDataUnit &mdu, const int &address);
void write(const QModbusDataUnit &mdu, const int &address);
signals:
void linkState(const int &address, const bool &st);
void dataReady(const int &address, const QModbusDataUnit &mdu);
private:
void readReady();
void writeFinished();
void newSetttings(const Settings &ns);
void errorOccurred(const QModbusDevice::Error &error);
int m_lastAddress = 0;
QModbusClient *m_device = nullptr;
};
#endif // CMODBUS_H
#include "CModBus.h"
CModBus::CModBus(const QString &capstr) : CSerialPortConfig(capstr)
{
newSetttings(curSettings());
connect(this, &CSerialPortConfig::sigNewSetttings, this, &CModBus::newSetttings);
connect(m_device, &QModbusClient::errorOccurred, this, &CModBus::errorOccurred);
m_device->connectDevice();
if(m_device->state() != QModbusDevice::ConnectedState)
{
errorAppend(capstr + " : " + portName() + tr(" : port error!"));
}
}
CModBus::~CModBus()
{
}
void CModBus::newSetttings(const Settings &ns)
{
bool isopen = false;
if(m_device != nullptr)
{
isopen = (m_device->state() == QModbusDevice::ConnectedState);
delete m_device;
m_device = nullptr;
}
if(ns.tcpEnable)
{
m_device = new QModbusTcpClient(this);
const QUrl url = QUrl::fromUserInput(ns.tcpHost);
m_device->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());
m_device->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host());
}
else
{
m_device = new QModbusRtuSerialMaster(this);
m_device->setConnectionParameter(QModbusDevice::SerialPortNameParameter, ns.portName);
m_device->setConnectionParameter(QModbusDevice::SerialParityParameter, ns.parity);
m_device->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, ns.baud);
m_device->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, ns.dataBits);
m_device->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, ns.stopBits);
}
m_device->setTimeout(ns.responseTime);
m_device->setNumberOfRetries(ns.numberOfRetries);
if(isopen)
{
m_device->connectDevice();
}
}
void CModBus::read(const QModbusDataUnit &mdu, const int &address)
{
if((!m_device) || (m_device->state() != QModbusDevice::ConnectedState))
{
emit linkState(address, false);
return;
}
QModbusReply *reply = m_device->sendReadRequest(mdu, address);
if(reply)
{
m_lastAddress = address;
if(!reply->isFinished())
{
connect(reply, &QModbusReply::finished, this, &CModBus::readReady);
}
else
{
emit linkState(address, false);
delete reply;
}
}
else
{
emit linkState(address, false);
}
}
void CModBus::write(const QModbusDataUnit &mdu, const int &address)
{
if((!m_device) || (m_device->state() != QModbusDevice::ConnectedState))
{
emit linkState(address, false);
return;
}
QModbusReply *reply = m_device->sendWriteRequest(mdu, address);
if(reply)
{
m_lastAddress = address;
if(!reply->isFinished())
{
connect(reply, &QModbusReply::finished, this, &CModBus::writeFinished);
}
else
{
emit linkState(address, false);
delete reply;
}
}
else
{
emit linkState(address, false);
}
}
void CModBus::readReady()
{
QModbusReply *reply = qobject_cast<QModbusReply *>(sender());
if(!reply)
{
emit linkState(m_lastAddress, false);
return;
}
const int address = reply->serverAddress();
const QModbusDataUnit mdu = reply->result();
if(reply->error() == QModbusDevice::NoError)
{
emit dataReady(address, mdu);
emit linkState(address, true);
}
else
{
emit linkState(m_lastAddress, false);
}
reply->deleteLater();
}
void CModBus::writeFinished()
{
auto *reply = qobject_cast<QModbusReply *>(sender());
if(!reply)
{
emit linkState(m_lastAddress, false);
return;
}
if(reply->error() == QModbusDevice::NoError)
{
emit linkState(reply->serverAddress(), true);
}
else
{
emit linkState(m_lastAddress, false);
}
reply->deleteLater();
}
void CModBus::errorOccurred(const QModbusDevice::Error &error)
{
Q_UNUSED(error)
emit linkState(m_lastAddress, false);
}
void CModBus::portOpen()
{
m_device->connectDevice();
}
void CModBus::portClose()
{
m_device->disconnectDevice();
}
bool CModBus::portIsOpen()
{
return (m_device->state() == QModbusDevice::ConnectedState);
}
请问楼主解决了嘛?求问
我遇到了同样的问题,QModbusTCP 的reply是否根本没有被释放内存? 通讯越久,内存越大! 有人一起交流吗?
我也遇到了这个问题。就直接跑他的master 例子。走TCP模式链接。内存也会不断地增长。不知道兄弟怎么解决的。
我是50ms去读7个寄存器值,当然QModbusReply肯定是删掉的。整个程序的内存增长不是太明显,差不多1个小时10MB
我从晚上11点开启程序跑,此时程序为7MB不到。到早上6点。整个程序是70MB。
不知道楼主怎么解决这个问题
同样遇到此问题,楼主怎么解决的?