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

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 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。

区块链分布式生态应用光子链PTN介绍
Snapchat Spectacle更新第二代 增加防水功能
智能水表的应用现状及前景
工程师必须要了解的中间继电器原理与选型要求
2020款哈弗F7更新 在智能化的道路上又迈进了一步
英创信息技术ESM6802支持Qt MODBUS程序开发简介
BigBiGAN问世,“GAN父”都说酷的无监督表示学习模型有多优秀?
硬盘数据保护技术
歌尔股份发布首款 XR 智能交互手环参考设计
半导体MiMMi推拉力机有哪些测试参数?
MIT:使用深度卷积神经网络提高稀疏3D激光雷达的分分辨率
华为linux和windows的区别_华为linux系统好用吗
拍照KING线下引关注,陈伟霆和李易峰“现身””网红地铁站”
5G来了还有必要换4G手机,机友一致赞同
杀手级分析——bootchart
魅族16X新品发布会确定 9月19日一起见证
移动设备电池续航如何突破
Yaskawa安川电机:实现高精度运动控制的利器
什么样的电信号可以作为RC一阶电路零输入响应的激励信号呢?
为游戏而生,4月25日Nank 南卡S2正式上线,强悍来袭!