当前位置: 首页 > wzjs >正文

卡二卡四无卡国产网站梦幻西游网页版最新版本

卡二卡四无卡国产网站,梦幻西游网页版最新版本,移动互联网公司,驻马店标准网站建设最近项目中用到了ModbusSlave,也就是Modbus从设备的功能,之前用的基本都是master设备,所以读取数据啥的用单线程就行了,用 void WaitHelper::WaitImplByEventloop(int msec) {QEventLoop loop;QTimer::singleShot(msec, &loop…

最近项目中用到了ModbusSlave,也就是Modbus从设备的功能,之前用的基本都是master设备,所以读取数据啥的用单线程就行了,用

 void WaitHelper::WaitImplByEventloop(int msec)
{QEventLoop loop;QTimer::singleShot(msec, &loop, &QEventLoop::quit);  // 设置定时器,在超时时退出事件循环loop.exec();  // 进入事件循
}

这种方法进行流程等待也没啥问题。但是在slave模式下,使用这种模式就会造成事件无法正常回调,在等待过程中没法回复请求,导致master设备卡死,最终使用多线程解决的该问题。
这里遵循Qt多线程最佳实践,使用worker->moveToThread(workerThread);实现多线程功能。核心方法就是创建ModbusWorker实例并且移动到QThread中。

bool ModbusTcpSlave::connectToHost()
{worker = new ModbusWorker();workerThread = new QThread(this);worker->moveToThread(workerThread);connect(workerThread, &QThread::started, [=]() {worker->startMonitoring(_obj["address"].toString());});connect(worker, &ModbusWorker::dataWritten, this, &ModbusTcpSlave::onDataWritten);connect(workerThread, &QThread::finished, worker, &QObject::deleteLater);connect(workerThread, &QThread::finished, workerThread, &QObject::deleteLater);workerThread->start();return true;
}

然后就是调用方法时使用QMetaObject::invokeMethod异步调用

void ModbusTcpSlave::WriteRegister(int address, int value)
{// 异步跨线程调用QMetaObject::invokeMethod(worker,"setData",Qt::QueuedConnection,Q_ARG(QModbusDataUnit::RegisterType, QModbusDataUnit::HoldingRegisters),Q_ARG(int, address),Q_ARG(quint16, value));
}

以下是源码:

#ifndef MODBUSWORKER_H
#define MODBUSWORKER_H#include <QObject>
#include <QModbusTcpServer>
#include <QModbusDataUnit>class ModbusWorker : public QObject
{Q_OBJECTpublic:explicit ModbusWorker(QObject *parent = nullptr);~ModbusWorker();bool connectToHost(const QString &address);void startMonitoring(const QString &address);void stopMonitoring();public slots:bool setData(QModbusDataUnit::RegisterType table, int address, quint16 value);signals:void dataWritten(QModbusDataUnit::RegisterType table, int address, quint16 value);private slots:void onDataWritten(QModbusDataUnit::RegisterType table, int address, int size);void onStateChanged(QModbusDevice::State state);private:QModbusTcpServer *_modbusServer;
};#endif // MODBUSWORKER_H
#include <QUrl>
#include <QDebug>
#include "modbusworker.h"ModbusWorker::ModbusWorker(QObject *parent) : QObject(parent), _modbusServer(new QModbusTcpServer(this))
{qRegisterMetaType<QModbusDataUnit::RegisterType>("QModbusDataUnit::RegisterType");QObject::connect(_modbusServer, &QModbusTcpServer::stateChanged, this, &ModbusWorker::onStateChanged);QObject::connect(_modbusServer, &QModbusTcpServer::dataWritten, this, &ModbusWorker::onDataWritten);
}ModbusWorker::~ModbusWorker()
{_modbusServer->disconnectDevice();
}bool ModbusWorker::setData(QModbusDataUnit::RegisterType table, int address, quint16 value)
{return _modbusServer->setData(table,address,value);
}void ModbusWorker::onDataWritten(QModbusDataUnit::RegisterType table, int address, int size)
{if(size==1){quint16 value;_modbusServer->data(table, address, &value);emit dataWritten(table,address,value);}
}void ModbusWorker::onStateChanged(QModbusDevice::State state)
{qDebug()<<__FUNCTION__<<__LINE__<<state;
}bool ModbusWorker::connectToHost(const QString &address)
{const QUrl url = QUrl::fromUserInput(address);_modbusServer->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());_modbusServer->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host());// 设置Modbus数据单元,类型为保持寄存器QModbusDataUnitMap reg;reg.insert(QModbusDataUnit::HoldingRegisters, {QModbusDataUnit::HoldingRegisters, 0, 30});reg.insert(QModbusDataUnit::InputRegisters, {QModbusDataUnit::InputRegisters, 0, 10});_modbusServer->setMap(reg);_modbusServer->setServerAddress(1);// 初始化保持寄存器的值for (int i = 0; i < 10; ++i) {_modbusServer->setData(QModbusDataUnit::HoldingRegisters, i, 0);}return _modbusServer->connectDevice();
}void ModbusWorker::startMonitoring(const QString &address)
{if(connectToHost(address)){return;}
}void ModbusWorker::stopMonitoring()
{_modbusServer->disconnectDevice();
}```cpp
#ifndef MODBUSTCPSLAVE_H
#define MODBUSTCPSLAVE_H#include <QObject>
#include <QModbusTcpServer>
#include "basecommunication.h"
#include "modbusworker.h"class ModbusTcpSlave : public BaseCommunication
{Q_OBJECT
public:Q_INVOKABLE explicit ModbusTcpSlave(QObject *parent = nullptr);signals:public slots:// BaseCommunication interface
public:virtual bool connectToHost() override;virtual bool isConnected() override;virtual bool disConnectFromHost() override;void WriteRegister(int address, int value);void WriteInputRegister(int address, int value);signals:void dataWritten(QModbusDataUnit::RegisterType,int address, quint16 val);private slots:void onDataWritten(QModbusDataUnit::RegisterType table, int address, int value);private:QThread *workerThread;ModbusWorker *worker;
};#endif // TCPMODBUSSERVER_H```cpp
#include <QUrl>
#include "modbustcpslave.h"ModbusTcpSlave::ModbusTcpSlave(QObject *parent) : BaseCommunication(parent)
{
}bool ModbusTcpSlave::connectToHost()
{worker = new ModbusWorker();workerThread = new QThread(this);worker->moveToThread(workerThread);connect(workerThread, &QThread::started, [=]() {worker->startMonitoring(_obj["address"].toString());});connect(worker, &ModbusWorker::dataWritten, this, &ModbusTcpSlave::onDataWritten);connect(workerThread, &QThread::finished, worker, &QObject::deleteLater);connect(workerThread, &QThread::finished, workerThread, &QObject::deleteLater);workerThread->start();return true;
}bool ModbusTcpSlave::isConnected()
{return true;
}bool ModbusTcpSlave::disConnectFromHost()
{worker->stopMonitoring();return true;
}void ModbusTcpSlave::WriteRegister(int address, int value)
{// 异步跨线程调用QMetaObject::invokeMethod(worker,"setData",Qt::QueuedConnection,Q_ARG(QModbusDataUnit::RegisterType, QModbusDataUnit::HoldingRegisters),Q_ARG(int, address),Q_ARG(quint16, value));
}void ModbusTcpSlave::WriteInputRegister(int address, int value)
{QMetaObject::invokeMethod(worker,"setData",Qt::QueuedConnection,Q_ARG(QModbusDataUnit::RegisterType, QModbusDataUnit::InputRegisters),Q_ARG(int, address),Q_ARG(quint16, value));
}void ModbusTcpSlave::onDataWritten(QModbusDataUnit::RegisterType table, int address, int value)
{emit dataWritten(table,address,value);
}
http://www.dtcms.com/wzjs/792307.html

相关文章:

  • 地方网站推广网页设计素材图片免费
  • 公众号做电影网站合肥房产网备案查询
  • php 手机网站cms系统宁津网页设计
  • 凤岗建设网站上海vis设计
  • 俄语网站推广施工企业信用综合评价系统
  • 网站文章发布时间湛江房产网
  • 在线名片制作网站开发做淘宝优惠卷网站步骤
  • 杰讯山西网站建设网站备案域名购买
  • 网站带数据库下载上海今天最新新闻10条
  • 东莞家政网站建设网页设计师工作职责
  • 平台网站开发方案单位做核酸检测的通知
  • 想兼职做网站推广泉州建设网站
  • 网站做美食视频挣钱吗新建网站怎么保存
  • 网站建设策划ppt网站的设计方法有哪些内容
  • 紫金公司网站制作响水县住房和城乡建设局网站
  • 什么网站可以找到防水工程做背投广告典型网站
  • 专门做商标的网站有哪些中山网站建设文化信息
  • 免费情感网站哪个好天津建筑信息网
  • p2p的网站建设设计师建站网站
  • 网站建设先有域名然后呢荆州网络推广
  • 宁波网站建设地址网站怎么百度收录
  • 网站建设及推广费用怎么入账如何做360网站优化
  • 网站定制 天津道路建设去什么网站能看到
  • 木渎建设局网站网页编辑软件绿色
  • wordpress php转html代码宁波seo推广哪家好
  • 网站建设开发费入什么科目什么是在线设计平台
  • 海淀区网站制作公司建立的读音
  • wap自助建站排板wordpress左侧产品分类目录
  • 销售网站的销量统计怎么做天津微信网站
  • 提供零基础网站建设教学深圳全网推广平台