完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ESM6802使用iMX6DL作为CPU,支持硬件图形加速,使得用户可以开发具有较好图形界面的工业控制程序。Qt是嵌入式开发中常用的图形库,MODBUS作为工控中常用的通信协议,已经作为Qt的模块引入了Qt中。我们在ESM6802上移植了最新的Qt 5.8.0版本,包括MODBUS模块,用户在使用中可以方便的调用Qt提供的API进行MODBUS协议相关的程序编写。Qt对于MODBUS协议的封装使得用户能够更加便捷快速的进行MODBUS应用程序开发,我们将在下面根据Qt源码中的modbusmaster例程简单介绍Qt的MODBUS相关函数接口。文中使用的程序可以在http://doc.qt.io/qt-5/qtserialbus-modbus-master-example.html获取或向我们的工程师索取。 在使用Qt提供的MODBUS相关API时需要使用Qt提供的MODBUS数据类:QModbusDataUnit,类中有公共数据RegisterType表示此数据代表的MODBUS数据类型: enum RegisterType { Invalid, DiscreteInputs, Coils, InputRegisters, HoldingRegisters } 可以使用构造函数进行初始化: QModbusDataUnit(RegisterType type, int address, quint16 size) 对于MODBUS client相关的函数,Qt将其封装在类QModbusClient中,部分函数如下: int numberOfRetries() const QModbusReply * sendRawRequest(const QModbusRequest &request, int serverAddress) QModbusReply * sendReadRequest(const QModbusDataUnit &read, int serverAddress) QModbusReply * sendReadWriteRequest(const QModbusDataUnit &read, const QModbusDataUnit &write, int serverAddress) QModbusReply * sendWriteRequest(const QModbusDataUnit &write, int serverAddress) void setNumberOfRetries(int number) void settimeout(int newTimeout) int timeout() const 其中numberOfRetries以及setTimeout是用于设置重试次数和超时时间的。send*Request系列函数是用于发送MODBUS数据包的函数,其中数据相关的都用之前介绍的QModbusDataUnit类对象作为函数参数。 截取部分Qt例程modbusmaster发送读请求的代码如下: 首先设置连接类型(RTU/TCP)、重试次数、超时时间等,然后建立连接: if (static_cast modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, ui->portEdit->text()); modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, m_settingsDialog->settings().parity); modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, m_settingsDialog->settings().baud); modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, m_settingsDialog->settings().dataBits); modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, m_settingsDialog->settings().stopBits); } else { const QUrl url = QUrl::fromUserInput(ui->portEdit->text()); modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port()); modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host()); } modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries); if (!modbusDevice->connectDevice()) { statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); } 设置读取数据类型、地址等参数: QModbusDataUnit MainWindow::readRequest() const { const auto table = static_cast int startAddress = ui->readAddress->value(); Q_ASSERT(startAddress >= 0 && startAddress < 65535); // do not go beyond 10 entries int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 65535 - startAddress); return QModbusDataUnit(table, startAddress, numberOfEntries); } 发送读数据请求: void MainWindow::on_readButton_clicked() { if (!modbusDevice) return; ui->readValue->clear(); statusBar()->cleARMessage(); if (auto *reply = modbusDevice->sendReadRequest(readRequest(), ui->serverEdit->value())) { if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, &MainWindow::readReady); else delete reply; // broadcast replies return immediately } else { statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); } } 可以看到使用Qt提供的API进行MODBUS通讯编程很便捷,只需要首先设置数据QModbusDataUnit,然后调用相应的Request函数发送请求即可。 modbusmaster程序运行效果如下图: 我们使用ESM6802连接ADAM模块进行测试连接图如下: ADAM-4117进行电流采集时电流输入量程为4~20mA,对应的采样值为0x0000~0xffff。有关AMAM-4117的介绍可以参考我们官网上的文章:《4~20mA模拟电流采集应用方案》。当输入12.0mA(半量程)时读到采样值为0x8007,可见modbusmaster与AMAM模块正确进行了数据通信。 更多Qt MODBUS相关内容请参考Qt官方资料:http://doc.qt.io/qt-5/qtmodbus-backends.html。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 01:40 , Processed in 0.579379 second(s), Total 53, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号