ModbusTCP和ModBusRTU 的区别
Modbus RTU 和 Modbus TCP 是 Modbus 协议的两种不同实现方式,主要区别如下:
-
通信介质
Modbus RTU:基于串行通信(如 RS-232 或 RS-485),使用二进制编码传输数据。
Modbus TCP:基于以太网,使用 TCP/IP 协议,数据通过以太网传输。
-
数据编码
Modbus RTU:采用二进制编码,数据紧凑,传输效率高。
Modbus TCP:数据封装在 TCP/IP 数据包中,增加了 IP 地址和端口号等信息。
-
传输速度
Modbus RTU:速度受限于串行通信,通常较慢。
Modbus TCP:基于以太网,速度更快,适合高速数据传输。
-
传输距离
Modbus RTU:RS-485 最大传输距离约 1200 米。
Modbus TCP:理论上无距离限制,实际受网络设备影响。
-
网络拓扑
Modbus RTU:通常为总线型拓扑,设备串联。
Modbus TCP:支持星型、树型等多种拓扑,设备通过交换机或路由器连接。
-
协议开销
Modbus RTU:协议开销小,数据帧简单。
Modbus TCP:协议开销较大,增加了 TCP/IP 包头。
-
应用场景
Modbus RTU:适用于工业控制、传感器网络等低速、短距离场景。
Modbus TCP:适用于需要高速、远距离通信的工业自动化系统。
-
设备成本
Modbus RTU:设备成本较低,适合预算有限的项目。
Modbus TCP:设备成本较高,但性能更强。
ModbusTCP
添加模块
ModBus读写
#ifndef WIDGET_H // 如果没有定义 WIDGET_H
#define WIDGET_H // 定义 WIDGET_H,防止重复包含
#include <QWidget> // 包含QWidget类的定义,QWidget是所有UI对象的基础类
#include <QModbusTcpClient> // 包含QModbusTcpClient类的定义,用于实现Modbus TCP协议的客户端
QT_BEGIN_NAMESPACE // 开始Qt命名空间
namespace Ui {
class Widget; } // 声明一个名为Widget的类在Ui命名空间中,通常由Qt Designer生成的UI类
QT_END_NAMESPACE // 结束Qt命名空间
class Widget : public QWidget // 定义Widget类,继承自QWidget
{
Q_OBJECT // 必须的宏,用于启用信号和槽机制
public:
Widget(QWidget *parent = nullptr); // 构造函数,允许创建无父级窗口部件的对象,默认为nullptr
~Widget(); // 析构函数
QModbusTcpClient *modbusClient; // 指向QModbusTcpClient类型的指针,用于管理与Modbus TCP服务器的连接
private slots: // 私有槽,用于处理特定事件或响应信号
void on_ReadBtn_clicked(); // 当ReadBtn按钮被点击时调用的槽函数
void ReceiveData(); // 接收数据的槽函数
void on_WriteBtn_clicked(); // 当WriteBtn按钮被点击时调用的槽函数
private: // 私有成员变量和函数
Ui::Widget *ui; // 指向Ui::Widget实例的指针,该实例包含了通过Qt Designer设计的UI元素
bool isconnect; // 标志位,表示是否已经连接到Modbus TCP服务器
void ReadValue(); // 读取值的私有函数
};
#endif // WIDGET_H // 结束WIDGET_H的条件编译指令
#include "widget.h"
#include "ui_widget.h"
#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QModbusReply>
#include <QMessageBox>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
modbusClient = new QModbusTcpClient(this);
modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, 503); // 设置Modbus端口
modbusClient->set