若該文為原創文章,轉載請注明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116196923
長期持續帶來更多專案與技術分享,咨詢請加QQ:21497936、微信:yangsir198808
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中…(點擊傳送門)
Qt開發專欄:三方庫開發技術
前言
??本文章講解libmodbus,
libModbus介紹
??libmodbus是一個免費軟體庫,可根據Modbus協議發送/接收資料,該庫用C撰寫,并支持RTU(串行)和TCP(以太網)通信,
編譯:平臺windows + Qt5.9.3 + mingw32
步驟一:下載
??https://github.com/stephane/libmodbus
??QQ群下載地址:1047134658(點擊“檔案”搜索“modbus”,群內與博文同步更新)
步驟二:使用msys編譯,配置好環境
??
步驟三:命令列引入mingw32環境變數
export PATH=$PATH:/mingw530_32/bin
步驟四:配置configure
cd /home/21497/compile/modbus
tar xvf libmodbus-3.1.6.tar.gz
cd libmodbus-3.1.6
./configure --prefix=/home/21497/compile/modbus/libmodbus-3.1.6/install
??
??錯誤,識別平臺失敗,如下圖:
??
./configure --prefix=/home/21497/compile/modbus/libmodbus-3.1.6/install -build=x86
??是在mysy使用linux環境編譯x86構架下的,如下圖:
??
步驟五:編譯make
make -j16
??
??再單執行緒確認一下
??
步驟六:安裝make install
make install
??會出錯,缺一些檔案夾,手動自己建檔案夾即可,
??
步驟七:讀者請稍微核對下檔案
??
模塊化
??
Demo
bool ModbusManager::testEnvAndRtu()
{
LOG << LIBMODBUS_VERSION_STRING;
// 步驟一:創建modbus RTU
modbus_t *pModbus = 0;
pModbus = modbus_new_rtu("com5",
115200,
'E',
8,
1);
if(!pModbus)
{
LOG << "Failed to modbus_new_rtu";
return false;
}
LOG << "Succeed to modbus_new_rtu";
// 步驟二: 485 RTU 模式
modbus_rtu_set_serial_mode(pModbus, MODBUS_RTU_RS485);
// 步驟三: 設定從機站號 1
modbus_set_slave(pModbus, 1);
// 步驟四:設定超時時間 100 ms
modbus_set_response_timeout(pModbus, 0, 100 * 1000);
// 步驟五: 連接 (注意:經過測驗,只是485和232只是打開串口,并未互動)
int ret = modbus_connect(pModbus);
if(ret)
{
LOG << "Failed to modbus_connect, ret =" << ret;
return false;
}
LOG << "Succeed to modbus_connect, ret =" << ret;
// 步驟六:讀取線圈
uint8_t buffer8t[10] = {0x00};
ret = modbus_read_bits(pModbus, 25, 10, buffer8t);
if(ret <= 0)
{
LOG << "Failed to modbus_read_registers, ret =" << ret;
return false;
}
LOG << "Succeed to modbus_read_registers, ret =" << ret;
// 步驟七:列印回傳
for(int index = 0; index < 10; index++)
{
LOG << QString("%1").arg(buffer8t[index]);
}
// 步驟八:讀取暫存器
uint16_t buffer16t[10] = {0x00};
ret = modbus_read_registers(pModbus, 95, 10, buffer16t);
if(ret <= 0)
{
LOG << "Failed to modbus_read_registers, ret =" << ret;
return false;
}
LOG << "Succeed to modbus_read_registers, ret =" << ret;
// 步驟九:列印回傳
for(int index = 0; index < 10; index++)
{
LOG << QString("%1").arg(buffer16t[index]);
}
// 步驟十:讀取暫存器
memset(buffer16t, 0, 10);
ret = modbus_read_input_registers(pModbus, 100, 1, buffer16t);
if(ret <= 0)
{
LOG << "Failed to modbus_read_registers, ret =" << ret;
return false;
}
LOG << "Succeed to modbus_read_input_registers, ret =" << ret;
// 步驟十一:列印回傳
for(int index = 0; index < 10; index++)
{
LOG << QString("%1").arg(buffer16t[index]);
}
return true;
}
Demo演示
??
工程模板
??modbusDemo_v1.0.0_基礎模板_讀取線圈_讀取暫存器簡單測驗.rar
若該文為原創文章,轉載請注明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116196923
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281336.html
標籤:其他
下一篇:使用內網穿透實作外網訪問本地介面
