ESM6802使用iMX6DL作為CPU,支持硬件圖形加速,使得用戶可以開(kāi)發(fā)具有較好圖形界面的工業(yè)控制程序。Qt是嵌入式開(kāi)發(fā)中常用的圖形庫(kù),MODBUS作為工控中常用的通信協(xié)議,已經(jīng)作為Qt的模塊引入了Qt中。我們?cè)贓SM6802上移植了最新的Qt 5.8.0版本,包括MODBUS模塊,用戶在使用中可以方便的調(diào)用Qt提供的API進(jìn)行MODBUS協(xié)議相關(guān)的程序編寫(xiě)。Qt對(duì)于MODBUS協(xié)議的封裝使得用戶能夠更加便捷快速的進(jìn)行MODBUS應(yīng)用程序開(kāi)發(fā),我們將在下面根據(jù)Qt源碼中的modbusmaster例程簡(jiǎn)單介紹Qt的MODBUS相關(guān)函數(shù)接口。文中使用的程序可以在http://doc.qt.io/qt-5/qtserialbus-modbus-master-example.html獲取或向我們的工程師索取。
在使用Qt提供的MODBUS相關(guān)API時(shí)需要使用Qt提供的MODBUS數(shù)據(jù)類(lèi):QModbusDataUnit,類(lèi)中有公共數(shù)據(jù)RegisterType表示此數(shù)據(jù)代表的MODBUS數(shù)據(jù)類(lèi)型:
enum RegisterType { Invalid, DiscreteInputs, Coils, InputRegisters, HoldingRegisters }
可以使用構(gòu)造函數(shù)進(jìn)行初始化:
QModbusDataUnit(RegisterType type,intaddress, quint16 size)
對(duì)于MODBUS client相關(guān)的函數(shù),Qt將其封裝在類(lèi)QModbusClient中,部分函數(shù)如下:
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是用于設(shè)置重試次數(shù)和超時(shí)時(shí)間的。send*Request系列函數(shù)是用于發(fā)送MODBUS數(shù)據(jù)包的函數(shù),其中數(shù)據(jù)相關(guān)的都用之前介紹的QModbusDataUnit類(lèi)對(duì)象作為函數(shù)參數(shù)。
截取部分Qt例程modbusmaster發(fā)送讀請(qǐng)求的代碼如下:
首先設(shè)置連接類(lèi)型(RTU/TCP)、重試次數(shù)、超時(shí)時(shí)間等,然后建立連接:
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);
}
設(shè)置讀取數(shù)據(jù)類(lèi)型、地址等參數(shù):
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);
}
發(fā)送讀數(shù)據(jù)請(qǐng)求:
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進(jìn)行MODBUS通訊編程很便捷,只需要首先設(shè)置數(shù)據(jù)QModbusDataUnit,然后調(diào)用相應(yīng)的Request函數(shù)發(fā)送請(qǐng)求即可。
modbusmaster程序運(yùn)行效果如下圖:
我們使用ESM6802連接ADAM模塊進(jìn)行測(cè)試連接圖如下:
ADAM-4117進(jìn)行電流采集時(shí)電流輸入量程為4~20mA,對(duì)應(yīng)的采樣值為0x0000~0xffff。有關(guān)AMAM-4117的介紹可以參考我們官網(wǎng)上的文章:《4~20mA模擬電流采集應(yīng)用方案》。當(dāng)輸入12.0mA(半量程)時(shí)讀到采樣值為0x8007,可見(jiàn)modbusmaster與AMAM模塊正確進(jìn)行了數(shù)據(jù)通信。
更多Qt MODBUS相關(guān)內(nèi)容請(qǐng)參考Qt官方資料:http://doc.qt.io/qt-5/qtmodbus-backends.html。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35396
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論