0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术ESM6802支持Qt MODBUS程序开发简介

英创信息技术 ? 来源:英创信息技术 ? 作者:英创信息技术 ? 2020-02-05 11:28 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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,intaddress, quint16 size)

对于MODBUS client相关的函数,Qt将其封装在类QModbusClient中,部分函数如下:

intnumberOfRetries()const

QModbusReply *sendRawRequest(constQModbusRequest &request,intserverAddress)

QModbusReply *sendReadRequest(constQModbusDataUnit &read,intserverAddress)

QModbusReply *sendReadWriteRequest(constQModbusDataUnit &read,constQModbusDataUnit &write,intserverAddress)

QModbusReply *sendWriteRequest(constQModbusDataUnit &write,intserverAddress)

voidsetNumberOfRetries(intnumber)

voidsetTimeout(intnewTimeout)

int timeout()const

其中numberOfRetries以及setTimeout是用于设置重试次数和超时时间的。send*Request系列函数是用于发送MODBUS数据包的函数,其中数据相关的都用之前介绍的QModbusDataUnit类对象作为函数参数。

截取部分Qt例程modbusmaster发送读请求的代码如下:

首先设置连接类型(RTU/TCP)、重试次数、超时时间等,然后建立连接:

if(static_cast(ui->connectType->currentIndex()) == Serial) {

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

{

constautotable =

static_cast(ui->writeTable->currentData().toInt());

intstartAddress = 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);

}

发送读数据请求:

voidMainWindow::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

deletereply; // 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。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6105

    浏览量

    36462
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    stm32支持canfd和dma结合使用吗?

    stm32支持canfd和dma结合使用吗
    发表于 08-01 07:15

    K230支持ONVIF上传视频吗?

    K230支持ONVIF上传视频吗
    发表于 06-20 07:11

    请问ADS1255/6支持菊花链吗?

    ADS1255/6支持菊花链吗?连接方法是否同ADS1271?菊花链连接以后各ADC是否同步采集,顺序输出数据?
    发表于 02-12 06:05

    P82B96支持HDCP吗?

    你好:我用P89B96用做HDMI的DDC通道的I2C的转换,我现在是解决了II2问题,但是它里面有个HDCP保护协议通过DDC通道,感觉它有延时一样,不稳定。请问是否用P82B96支持HDCP?
    发表于 12-27 07:01

    ADS1256支持菊花链连接吗?

    求助:1、ADS1256支持菊花链连接吗? 2、如果不支持菊花链连接,能否把多片ADS1256挂在同一个SPI(CLK,MISO,MOSI)总线上,通过不同的CS来选择芯片? 3、多片ADS1256能否支持广播,来启动所有芯片
    发表于 12-24 06:03

    DS92LV2421支持最长的传输距离只有10m吗?

    DS92LV2421支持最长的传输距离只有10m吗
    发表于 12-03 08:11

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 ?1061次阅读

    请问PCM9211支持HDMI音频输入吗?

    请问PCM9211支持HDMI 2.1 eARC 标准的帧的专用输入,是否同时支持HDMI音频输入。
    发表于 10-17 07:53

    请问TLV320ADC3101支持Digital MIC and Analog MIC input同时输入吗?

    TLV320ADC3101支持Digital MIC and Analog MIC input同时输入吗?
    发表于 10-16 06:57

    TMS320DM6467支持HDMI发射器/接收器

    电子发烧友网站提供《TMS320DM6467支持HDMI发射器/接收器.pdf》资料免费下载
    发表于 10-15 11:36 ?0次下载
    TMS320DM6467<b class='flag-5'>支持</b>HDMI发射器/接收器

    请问TAS5727支持几段EQ?

    TAS5727支持几段EQ? 比如PCM5121支持7段以上,TAS5727可以么?
    发表于 10-14 07:02

    TPS272C45支持远程I/Os的智能电源管理

    电子发烧友网站提供《TPS272C45支持远程I/Os的智能电源管理.pdf》资料免费下载
    发表于 09-25 11:13 ?4次下载
    TPS272C45<b class='flag-5'>支持</b>远程I/Os的智能电源管理

    TPS25831-Q1支持C型VCONN电源,不使用LDO

    电子发烧友网站提供《TPS25831-Q1支持C型VCONN电源,不使用LDO.pdf》资料免费下载
    发表于 09-25 10:06 ?0次下载
    TPS25831-Q1<b class='flag-5'>支持</b>C型VCONN电源,不使用LDO

    请问OPA2541支持单电源吗?如果支持此时功放范围是多少?

    请问OPA2541支持单电源吗?如果支持此时功放范围是多少?
    发表于 09-02 07:42

    TUBS8041支持从设备吗?

    TUBS8041支持从设备么?
    发表于 08-19 06:22