QtModbusTCP通讯读写操作

QtModbusTCP通讯读写操作
Qt Modbus TCP通讯读写
Modbus TCP 协议
Modbus协议是⼀个master/slave架构的协议。有⼀个节点是master节点,其他使⽤Modbus协议参与通信的节点是slave节点。每⼀个slave设备都有⼀个唯⼀的地址。在串⾏和MB+⽹络中,只有被指定为主节点的节点可以启动⼀个命令(在以太⽹上,任何⼀个设备都能发送⼀个Modbus命令,但是通常也只有⼀个主节点设备启动指令)。
Modbus TCP/IP协议格式
主机poll端发送读写报⽂样例如下,该报⽂对应的功能码选择的10
如上图所⽰,报⽂主要分为两部分。协议头(MBAP Header)和PDU。PDU ⼜包含功能码(Function code)和数据(Data)两部分。
0232 0000 0009 01 10 9C490001020000
协议头: 0232 0000 0009 01
PDU: 10 9C490001020000
数据含义
0232主机发出的检验信息,从机slave将这个两个字节放在响应报⽂中
0000表⽰协议标识符,00 00为modbus的TCP/IP协议
0009数据长度,⽤来指⽰接下来数据的长度,单位字
01设备地址,⽤以标识连接在串⾏线或者⽹络上的远程服务端的地址
10功能码,此时代码10为WriteMultipleRegisters写多个寄存器数据
9C49写⼊的起始地址40009
0001写⼊寄存器长度,16进制
新型混凝土搅拌机02 0000写⼊的数据,02 表⽰数据长度为两个字节; 0000表⽰两个字节的数据
Qt Modbus 模块读写
引⼊模块
QT      += serialbus serialport
引⼊头⽂件
#include<QModbusTcpClient>
#include<QModbusReply>
建⽴连接
QModbusClient *modbusDevice=new QModbusTcpClient();
modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter,1502);
modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter,"127.0.0.1");    modbusDevice->setTimeout(2000);
modbusDevice->setNumberOfRetries(3);
modbusDevice->connectDevice();
读取
//发送请求
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters,30001,1);
if(auto*reply = modbusDevice->sendReadRequest(readUnit,1))
{
if(!reply->isFinished())
{
connect(reply,&QModbusReply::finished,this,&ThisClass::readReady);
}贝雷梁
else
{
delete reply;
}
}
//处理请求
void ThisClass::readReady()
{
QModbusReply *reply = qobject_cast<QModbusReply *>(sender());
if(!reply)
return;
if(reply->error()== QModbusDevice::NoError)
{
多功能烧烤车
const QModbusDataUnit unit = reply->result();
//        if(unit.startAddress()==30001){
手动滤水器
qint16 res=unit.value(0);
//        }
服务器状态
}
else
{
}
reply->deleteLater();// delete the reply
}
向40009寄存器地址写⼊1 (0232 0000 0009 01 10 9C49 0001 02 0001)
//写请求
// 9C490001020001 :数据部分
QByteArray data=QByteArray::fromHex("9c490001020001");
// QModbusRequest::WriteMultipleRegisters:功能码 10
QModbusRequest request(QModbusRequest::WriteMultipleRegisters,
data);
// 1 :设备地址
if(auto*reply = modbusDevice->sendRawRequest(request,1))
{
if(!reply->isFinished())
{
connect(reply,&QModbusReply::finished,this,&ThisClass::writeReady);
m型钢}
else
{
delete reply;
}
}
/
/响应处理
void ThisClass::writeReady()
{
QModbusReply *reply = qobject_cast<QModbusReply *>(sender());
if(!reply)
return;
reply->deleteLater();// delete the reply
}

本文发布于:2024-09-25 14:25:49,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/147822.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:节点   数据   协议   地址   功能
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议