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

手机数据线东莞网站建设技术支持孝义网站建设

手机数据线东莞网站建设技术支持,孝义网站建设,php快速开发平台,小说在线阅读网站怎么做《Qt Modbus 服务端学习笔记》 1.因为项目的需要,要写一个modbus通信,csdn上感觉有些回答,代码是人工智能生成的,有些细节不对。我这个经过实测,是可以直接用的。 首先要包含Qt 的相关模块 Qt Modbus 模块主要包含以…

《Qt + Modbus 服务端学习笔记》

1.因为项目的需要,要写一个modbus通信,csdn上感觉有些回答,代码是人工智能生成的,有些细节不对。我这个经过实测,是可以直接用的。

首先要包含Qt 的相关模块

在这里插入图片描述

Qt Modbus 模块主要包含以下几类关键组件:

  • 设备类:如 QModbusTcpServerQModbusTcpClient,分别用于创建 Modbus TCP 服务器和客户端,提供了建立连接、断开连接等基础操作接口。

  • 数据单元类:例如 QModbusDataUnit,用于表示 Modbus 协议中的数据单元,可方便地操作和管理 Modbus 寄存器中的数据。

  • 协议数据单元类:像 QModbusPdu,它表示 Modbus 协议数据单元,用于处理 Modbus 请求和响应的协议层数据。

  • 初始化:在 ModeBusServer 类的构造函数里,初始化 QModbusTcpServer 和定时器,同时建立信号与槽的连接,以处理定时器超时、数据写入、状态改变等事件。

  • 启动与停止

    • startServer 函数会对输入参数进行检查,设定 Modbus 数据单元映射和连接参数,尝试连接设备,若成功就启动数据更新定时器。
    • stopServer 函数则停止定时器,断开服务器连接。
  • 数据更新:借助定时器,定时调用 updateData 函数。此函数从 SystemInfoCollector 获取系统信息,将其写入 Modbus 数据单元,再设置到服务器里。

  • 数据处理

    • printUpdateData 函数用于打印更新后的数据和解析出的系统信息。
    • handleRequest 函数处理客户端请求,记录请求信息。
    • onDataWritten 函数处理数据写入事件。

运行结果

在这里插入图片描述

#ifndef MODEBUSSERVER_H
#define MODEBUSSERVER_H#include <QObject>
#include <QModbusTcpServer>
#include <QModbusDataUnit>
#include <QTimer>
#include <QMap>
#include <memory> // 包含 std::unique_ptr 所在的头文件
#include <iostream>
#include <QDateTime>#include "SystemInfoCollector.h"
//解决中文乱码
#pragma execution_character_set("utf-8")class ModeBusServer : public QObject
{Q_OBJECT
public:explicit ModeBusServer(QObject* parent = nullptr);~ModeBusServer();void startServer(quint16 deviceID, const QString& ipAddress, quint16 port);void stopServer();void printUpdateData(QModbusDataUnit& unit);signals:void statusUpdated(const QString& message);void dataUpdated(const QModbusDataUnit& data);void requestReceived(const QModbusPdu& request, QModbusDataUnit::RegisterType table, int address, int size);private slots:void updateData();void writeSystemInfoToModbus(QModbusDataUnit& unit, SystemInfo& info);void handleRequest(const QModbusPdu& request, QModbusDataUnit::RegisterType table, int address, int size);void sendDataPeriodically();void onDataWritten(QModbusDataUnit::RegisterType table, int address, int size);
private:std::unique_ptr<QModbusTcpServer> m_modbusServer;std::unique_ptr<QTimer> m_dataUpdateTimer;std::unique_ptr<QTimer> m_sendDataTimer;QMap<int, quint16> m_dataCache; // 数据缓存quint16 m_holdingRegistersSize = 100;int m_deviceID;int m_valueIndex;SystemInfoCollector m_infoCollector;
};#endif // MODEBUSSERVER_H#include "modeBusServer.h"
#include <QDebug>
ModeBusServer::ModeBusServer(QObject* parent): QObject(parent),m_modbusServer(std::make_unique<QModbusTcpServer>(this)),m_dataUpdateTimer(std::make_unique<QTimer>(this)),m_sendDataTimer(std::make_unique<QTimer>(this))
{connect(m_dataUpdateTimer.get(), &QTimer::timeout, this, &ModeBusServer::updateData);connect(this, &ModeBusServer::statusUpdated, this, [&](const QString& statusUpdateStr) {qDebug() << statusUpdateStr;});// 修改连接,使用新的槽函数connect(m_modbusServer.get(), &QModbusTcpServer::dataWritten, this, &ModeBusServer::onDataWritten);connect(m_modbusServer.get(), &QModbusTcpServer::stateChanged, this, [this](int state) {if (state == QModbusDevice::ConnectedState) {qDebug() << "Server connected";}else if (state == QModbusDevice::UnconnectedState) {qDebug() << "Server disconnected";}});
}
ModeBusServer::~ModeBusServer()
{stopServer();
}
void ModeBusServer::startServer(quint16 deviceID, const QString& ipAddress, quint16 port)
{if (port == 0 || deviceID == 0 || ipAddress.isEmpty()) {emit statusUpdated("Invalid parameters.");return;}m_deviceID = deviceID;QModbusDataUnitMap reg;reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, m_holdingRegistersSize });m_modbusServer->setMap(reg);m_modbusServer->setConnectionParameter(QModbusDevice::NetworkAddressParameter, ipAddress);m_modbusServer->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);m_modbusServer->setServerAddress(deviceID);if (m_modbusServer->connectDevice()) {emit statusUpdated("Server started on " + ipAddress + ":" + QString::number(port));m_dataUpdateTimer->start(500);}else {emit statusUpdated("Server start failed: " + m_modbusServer->errorString());}
}
void ModeBusServer::stopServer()
{m_dataUpdateTimer->stop();m_modbusServer->disconnectDevice();emit statusUpdated("Server stopped.");
}
void ModeBusServer::printUpdateData(QModbusDataUnit& unit)
{for (int i = 0; i < unit.valueCount(); ++i) {m_dataCache[i] = unit.value(i); // 更新缓存}qDebug() << QString("%1号设备").arg(m_deviceID) << "寄存器数据:" << unit.values();SystemInfo info1 = m_infoCollector.parseSystemInfo(unit.values());qDebug() << "Memory Usage:" << info1.memoryUsage << "%";qDebug() << "CPU Usage:" << info1.cpuUsage << "%";qDebug() << "Boot Time:" << info1.bootTime.toString(Qt::ISODate);qDebug() << "Up Time:" << info1.upTime << "seconds";}
// 更新数据
void ModeBusServer::updateData()
{m_valueIndex = 0;QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 0, 10);SystemInfo info;// 将系统信息写入 Modbus 数据单元writeSystemInfoToModbus(unit, info);bool  isSetDataSuccess = m_modbusServer->setData(unit);//设置数据if (isSetDataSuccess){m_dataCache.clear(); // 清空缓存printUpdateData(unit);emit dataUpdated(unit);}else{qDebug() << "Failed to update data: " << m_modbusServer->errorString();}}
// 将 SystemInfo 数据写入 QModbusDataUnit
void ModeBusServer::writeSystemInfoToModbus(QModbusDataUnit& unit, SystemInfo& info) {info = m_infoCollector.getSystemInfo();// 写入内存占用率quint16 memoryUsageInt = static_cast<quint16>(info.memoryUsage * 100); // 转换为整数unit.setValue(m_valueIndex++, memoryUsageInt & 0xFFFF);// 写入 CPU 占用率quint16 cpuUsageInt = static_cast<quint16>(info.cpuUsage * 100); // 转换为整数unit.setValue(m_valueIndex++, cpuUsageInt & 0xFFFF);// 写入开机时间(时间戳)qint64 bootTimestamp = info.bootTime.toSecsSinceEpoch();unit.setValue(m_valueIndex++, static_cast<quint16>(bootTimestamp & 0xFFFF));unit.setValue(m_valueIndex++, static_cast<quint16>((bootTimestamp >> 16) & 0xFFFF));// 写入运行时间unit.setValue(m_valueIndex++, static_cast<quint16>(info.upTime & 0xFFFF));unit.setValue(m_valueIndex++, static_cast<quint16>((info.upTime >> 16) & 0xFFFF));}
void ModeBusServer::handleRequest(const QModbusPdu& request, QModbusDataUnit::RegisterType table, int address, int size)
{emit requestReceived(request, table, address, size);qDebug() << "Request received: Function Code" << request.functionCode() << ", Type" << table << ", Address" << address << ", Size" << size;
}
void ModeBusServer::sendDataPeriodically()
{qDebug() << "Periodic Data Send:";for (auto it = m_dataCache.begin(); it != m_dataCache.end(); ++it) {qDebug() << "Address" << it.key() << "@" << it.value();}
}
// 实现新增的槽函数
void ModeBusServer::onDataWritten(QModbusDataUnit::RegisterType table, int address, int size)
{// 处理数据写入事件,可根据需要扩展qDebug() << "写入数据类型" << table << "从地址" << address << "开始。" << "数据长度:" << size;}}
}
// 实现新增的槽函数
void ModeBusServer::onDataWritten(QModbusDataUnit::RegisterType table, int address, int size)
{// 处理数据写入事件,可根据需要扩展qDebug() << "写入数据类型" << table << "从地址" << address << "开始。" << "数据长度:" << size;}

文章转载自:

http://cmSGJ07f.pqwrg.cn
http://Rqd6ZWvo.pqwrg.cn
http://bARBTXdC.pqwrg.cn
http://O35OxQkG.pqwrg.cn
http://y6gLtHt3.pqwrg.cn
http://kVZzPyiK.pqwrg.cn
http://oRF4CiAH.pqwrg.cn
http://z3NZ38l9.pqwrg.cn
http://JeT5x3RC.pqwrg.cn
http://RN1Qa2pq.pqwrg.cn
http://SbMsT7K5.pqwrg.cn
http://XARsLdIQ.pqwrg.cn
http://Hi5W9PcU.pqwrg.cn
http://4WSvKc4y.pqwrg.cn
http://5LetcyLI.pqwrg.cn
http://P7x9Sero.pqwrg.cn
http://VnTmjozF.pqwrg.cn
http://eHbuoksb.pqwrg.cn
http://UF5LkzMl.pqwrg.cn
http://HojOU15u.pqwrg.cn
http://Yb3rsxyo.pqwrg.cn
http://8FNGihcd.pqwrg.cn
http://WuuykKRU.pqwrg.cn
http://rIudPNe0.pqwrg.cn
http://x9kC0VZy.pqwrg.cn
http://L6AisjXJ.pqwrg.cn
http://71qNY6eV.pqwrg.cn
http://JWWkFZsO.pqwrg.cn
http://FiqWRCxP.pqwrg.cn
http://QyBPXNni.pqwrg.cn
http://www.dtcms.com/wzjs/650156.html

相关文章:

  • 平面设计接单的网站北京公司黄页
  • 网站开发无形资产江苏省住房城乡建设厅网站首页
  • 重庆光龙网站建设网站开发有哪些
  • 音乐网站开发参考文献模板王字体网
  • wordpress简约江门网站优化排名
  • 网站关键词优化排名生活做爰网站
  • 网站seo推广员招聘wordpress 修改仪表盘
  • 湖北华路建设工程有限公司网站动漫网站策划书
  • 金泉网做网站多少钱女生学建筑选择什么专业
  • 最新企业网站模板php网站源码建设教程
  • 天津做网站选津坤科技网站网页建设实训心得体会
  • 网站与平台的开发区别百度关键词快速优化
  • 电子商务网站规划报告正规的现货交易平台
  • 嘉兴哪里做网站建设电影网站的目的
  • 宿迁网站推广公司2022推广app赚佣金平台
  • ajax+jsp网站开发从入门到精通手机免费建设网站
  • 旅游网站建设流程北京网站设计制作招聘网
  • 如何创建一个简单的网站公众号登陆
  • 东营网站建设规划书桂林网站艰涩
  • 免费ppt模板 网站开发建设网站一定要数据库吗
  • 网站运营公司做类似淘宝的网站前景
  • 黑龙江专业建站京建站公司
  • 营销推广网站wordpress里面的附件如何导出
  • 企业网站开发步骤阿里巴巴外贸平台中文
  • 购物网站html模板html代码怎么用网页查看
  • vue做网站如何优化seo福州公众号小程序制作公司
  • 长沙哪家制作网站好怎么制作微信网站
  • 广告公司名字三个字深圳搜索引擎优化seo
  • 最漂亮网站锦州网站建设资讯
  • 网站设计 无锡网站竞价托管