Visual Studio 上基於libmodbus庫的modbus RTU模式開發


本文內容是基於《Modbus軟件開發實戰指南》

看這本書的緣由是,我在做libmodbus+qt上位機,參考了網上的一些資料,照着來了一遍,總是編譯不過,就在博客中搜索,意外中看到了這本書,下載pdf居然也充錢收費,果斷借了書,針對其中有用的部分,碼字分享之,希望對各位有用。

第一部分:編譯libmodbus庫,在VS平台上(與之前在MSYS的編譯方式有所不同)

1.在github上下載libmodbus源代碼,下載網址:https://github.com/stephane/libmodbus.

2.解壓完成后,在src/win32文件目錄下,雙擊configure.js,生成了config.h文件和modbus-version.h文件。

3.打開項目文件modbus-9.sln,在彈出的文件升級對話框中,點擊確定。

4.將源文件夾下的modbus-version.h替換成新生成的modbus-version.h。

5.右鍵點擊項目,選擇屬性,打開屬性對話框,選擇該VS版本下的MDK,並去除掉Version選項的定義。

6.編譯通過。生成modbus.dll和modbus.lib文件。

第二部分:編寫RTU Master端(主機端)

新建項目工程,將之前生成的dll文件、lib文件以及libmodbus庫里的頭文件,復制到項目文件所在的目錄下,並通過添加現有文件到項目中,至此libmodbus中的各種接口函數可以應用了。

接下來,就是文中要貼的代碼了。

RTU-Master的代碼流程:
1.初始化並生成modbus_t結構體;
2.設置從機端的ID;
3.啟動調試模式;
4.建立modbus連接;
5.申請動態內存;
6.生成隨機數,其他地方是讀取寄存器/線圈的輸入;
7.線圈寄存器的單個讀寫/批量讀寫/保持寄存器的單個讀寫/批量讀寫/讀取多個寄存器;
8.釋放內存;
9.關閉modbus連接;
10.釋放modbus結構體

RTU-Slave的代碼流程:
1.初始化並生成modbus_t結構體;
2.設置從機端的ID;
3.起點調試模式;
4.建立modbus連接;
5.modbus_mapping_new()初始化寄存器,返回一個modbus_mapping_t指針;
6.調用modbus_receive()函數判斷串口的接收數據,負責接收和分析;
7.調用modbus_reply()函數,對接收到的請求指示發送響應(回復);
8.釋放modbus_mapping_t結構體;
9.關閉modbus連接;
10.釋放modbus_t結構體

 

補充函數解釋:

1.modbus_mapping_new()函數的使用和說明:
modbus_mapping_t modbus_mapping_new(int nb_bits,int nb_input_bits,int nb_registers,int nb_registers);
modbus_mapping_new()函數需要分配4個數組來存儲位、輸入位、寄存器和輸入寄存器。若不需要為特定類型的數據分配數組,可在參數中傳遞0值,關聯指針則為NULL。
該函數返回一個modbus_mapping_t指針。

2.modbus_receive()函數的使用和說明:
int modbus_receive(modbus_t *ctx,uint8_t *req);
modbus_receive()函數是Modbus從機端/服務器使用此功能接收和分析主機端/客戶機發送的指示請求。

3.modbus_reply()函數的使用和說明:
*int modbus_reply(modbus_t *ctx,const uint8_t *req,int req_length,modbus_mapping_t *mb_mapping);
modbus_reply()函數是對接收到的請求發送響應,先是分析參數中請求req,然后利用ctx來構建和發送響應。此功能是為Modbus 服務器設計的。

4.modbus_mapping_free()函數的使用和說明:
void modbus_mapping_free(modbus_mapping_t *mb_mapping);
modbus_mapping_free()函數將釋放mb_mapping_t結構中的四個數組,並最終釋放mb_mapping所引用的mb_mapping_t。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM