Modbus是工業自動化領域使用廣泛的通信協議之一,隨著電子、計算機和通信技術的不斷發展,特別是物聯網以及“互聯網 ”等概念的興起,Modbus通信技術也從串行總線發展到了Modbus TCP,方興未艾。為了讓廣大在校學生、工業控制和自動化工程師、技術人員了解Modbus協議的內涵,特別是徹底掌握Modbus通信技術的軟件開發方法,作者從初學者的角度,由淺入深,循循善誘,以文字和畫面相結合的方式撰寫了本書。 本書分為11章,依次介紹了Modbus協議,特別是功能碼消息幀的定義,然后從軟件開發的角度,詳細介紹了輔助調試工具、軟件開發環境的構筑,重點介紹和解析了libmodbus開發庫的源代碼,以及使用libmodbus在不同語言環境下的開發技巧。閱讀本書,可快速入門并精通Modbus軟件開發技術。作為一本軟件技術開發指南的書籍,本書不僅僅局限于Modbus通信協議,對其他通信協議的軟件開發也有很強的參考價值。 本書可作為各大中專院校、工程設計院、系統集成商和工廠企業的Modbus通信協議開發人員的軟件設計和開發的入門指導書籍,也可作為工業自動化領域及物聯網開發的參考資料,還可供廣大自動化及通信專業的教師、學生及物聯網開發愛好者閱讀。
著重講述如何快速入門并精通Modbus軟件開發技術,適用于初學Modbus通信協議的讀者。如果你想用C/C 語言開發Modbus通信庫,如果你想用其它語言(如Visual Basic、Visual C#)開發Modbus應用程序,如果你想從事物聯網或Modbus測試開發,本書干貨滿滿,值得一讀。
楊更更 2003年畢業于清華大學,先后加入中國航天科工集團公司、日本橫河電機株式會社等多家大型企業工作。曾作為主要研發人員,參與過多個大型項目的開發,了解并精通各現場總線通信協議,所開發的多個軟硬件設備,正在世界各地穩定地運行。作為一個純粹的技術開發者,閑暇時愛讀書,所獵甚廣,每有所得便欣欣然也。
目錄
第1章初識Modbus1
1.1背景2
1.2模型4
1.3協議版本4
1.4通信設備6
1.5事務處理6
1.6專業術語9
第2章Modbus開發環境11
2.1虛擬串口軟件12
2.1.1什么是虛擬串口軟件12
2.1.2使用方法13
2.2Modbus Poll的使用16
2.2.1簡介16
2.2.2功能17
2.2.3使用方法18
2.3Modbus Slave的使用21
2.3.1簡介21
2.3.2功能22
2.3.3使用方法232.4Modbus PollSlave互聯互通24
2.5Visual Studio 2015的安裝28
第3章Modbus協議的相關知識31
3.1協議概要32
3.2Modbus寄存器34
3.2.1寄存器種類說明34
3.2.2寄存器地址分配35
3.3Modbus串行消息幀格式35
3.3.1ASCII消息幀格式36
3.3.2RTU消息幀格式36
3.3.3地址域38
3.3.4功能碼域39
3.3.5數據域39
3.4Modbus差錯校驗39
3.4.1LRC校驗40
3.4.2CRC校驗42
3.5字節序和大小端49
3.5.1來歷49
3.5.2為什么會有大小端50
3.5.3什么是“大端”和“小端”51
3.6Modbus TCP消息幀格式53
3.6.1協議描述53
3.6.2查詢與響應報文例56
第4章Modbus功能碼詳解59
4.1功能碼概要60
4.201(0x01)讀取線圈/離散量輸出狀態61
4.2.1功能說明61
4.2.2查詢報文61
4.2.3響應報文62
4.2.4借助工具軟件觀察和理解63
4.302(0x02)讀取離散量輸入值72
4.3.1功能說明72
4.3.2查詢報文72
4.3.3響應報文73
4.403(0x03)讀取保持寄存器值74
4.4.1功能說明74
4.4.2查詢報文74
4.4.3響應報文75
4.504(0x04)讀取輸入寄存器值76
4.5.1功能說明76
4.5.2查詢報文76
4.5.3響應報文77
4.605(0x05)寫單個線圈或單個離散輸出78
4.6.1功能說明78
4.6.2查詢報文79
4.6.3響應報文79
4.706(0x06)寫單個保持寄存器80
4.7.1功能說明80
4.7.2查詢報文80
4.7.3響應報文81
4.808(0x08)診斷功能82
4.8.1功能說明82
4.8.2查詢報文82
4.8.3響應報文83
4.8.4診斷子功能碼84
4.911(0x0B)獲取通信事件計數器87
4.9.1功能說明87
4.9.2查詢報文87
4.9.3響應報文88
4.1012(0x0C)獲取通信事件記錄89
4.10.1功能說明89
4.10.2查詢報文89
4.10.3響應報文90
4.1115(0x0F)寫多個線圈91
4.11.1功能說明91
4.11.2查詢報文91
4.11.3響應報文92
4.1216(0x10)寫多個保持寄存器93
4.12.1功能說明93
4.12.2查詢報文93
4.12.3響應報文95
4.1317(0x11)報告從站ID(僅用于串行鏈路)96
4.13.1功能說明96
4.13.2查詢報文96
4.13.3響應報文97
4.14Modbus異常響應97
第5章libmodbus開發庫101
5.1功能概要102
5.2源碼獲取與編譯102
5.3與應用程序的關系109
第6章libmodbus源碼解析111
6.1類型與結構定義112
6.1.1精細類型定義112
6.1.2常量定義114
6.1.3核心結構體定義之一115
6.1.4核心結構體定義之二120
6.2常用接口函數122
6.2.1各類輔助接口函數122
6.2.2各類Modbus功能接口函數126
6.2.3數據處理的相關函數或宏定義131
6.3RTU/TCP關聯接口函數132
6.3.1RTU模式關聯函數133
6.3.2TCP模式關聯函數135
6.4部分內部函數詳解135
6.4.1函數read_io_status()135
6.4.2函數read_registers()141
6.4.3函數write_single()144
6.4.4函數modbus_mapping_new_start_
address()147
6.5開發應用程序基本流程151
第7章完整RTU模式開發范例153
7.1開發RTU Master端154
7.1.1新建工程154
7.1.2添加開發庫155
7.1.3添加應用源代碼158
7.1.4代碼調試166
7.2開發RTU Slave端169
7.2.1新建工程并添加開發庫169
7.2.2添加應用源代碼169
第8章完整TCP模式開發范例173
8.1開發TCP Client端174
8.1.1新建工程174
8.1.2添加開發庫176
8.1.3添加應用源代碼177
8.1.4代碼調試186
8.2開發TCP Server端189
8.2.1新建工程并添加開發庫189
8.2.2添加應用源代碼189
第9章Visual Basic中使用libmodbus193
9.1函數調用約定與修飾名194
9.1.1函數調用約定194
9.1.2函數修飾名196
9.1.3調用約定的使用198
9.2模塊定義文件198
9.3對libmodbus開發庫的改造200
9.3.1添加__stdcall調用符200
9.3.2添加DEF模塊定義文件201
9.4開發Visual Basic程序204
9.4.1創建新項目204
9.4.2添加函數描述文件205
9.4.3調用libmodbus庫函數213
第10章Visual C#中使用libmodbus217
10.1開發Visual C#程序218
10.1.1創建新項目218
10.1.2添加函數描述文件219
10.1.3調用libmodbus庫函數226
10.2基于C#的NModbus類庫230
10.2.1什么是NModbus類庫230
10.2.2NModbus類庫用法232
第11章打造自己的Modbus調試工具237
11.1開發自己的Modbus Poll238
11.1.1軟件需求分析238
11.1.2命令行解析功能240
11.1.3創建應用程序并調試246
11.2開發自己的Modbus Slave270
11.2.1軟件需求分析270
11.2.2創建應用程序并調試272
參考文獻284
第5章libmodbus開發庫Modbus作為一種常見的工業通信協議,幾乎被所有的設備所支持,如果能在軟件或者設備中增強Modbus通信功能,無疑對于市場應用來說是個很吸引人的賣點。而對于Modbus開發來說,網絡上存在相當多的開源庫,其中libmodbus(www.libmodbus.org)和freemodbus(www.freemodbus.org)可以說是其中的翹楚,值得開發者認真分析和學習。5.1功能概要古人云: “登高而招,臂非加長也,而見者遠;順風而呼,聲非加疾也,而聞者彰。假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假于物也”。確實,在互聯網以及開源項目蓬勃發展的時代,閉門造車已顯得非常不合時宜。libmodbus 是一個免費的跨平臺的支持RTU和TCP的Modbus庫,遵循LGPL v2.1 協議。libmodbus支持Linux、Mac OS X、FreeBSD、QNX和Windows等操作系統。libmodbus可以向符合Modbus協議的設備發送和接收數據,并支持通過串口或者TCP網絡進行連接。作為一個開源項目,libmodbus還處于開發測試階段,代碼量還不是十分龐大,文檔和注釋也不夠,本章通過對libmodbus源代碼的閱讀過程,一方面可以進一步理解Modbus協議,同時也可以學習下一個好的開源項目的代碼組織及開發過程。libmodbus官方網站libmodbus.org/,現在穩定的版本是v3.0.6,當前近期版是v3.1.4,可以從libmodbus.org/download/下載源碼。作為開源軟件,還可以從GitHub網站獲取近期版本代碼。GitHub: https://github.com/stephane/libmodbus.git5.2源碼獲取與編譯首先,訪問libmodbus官方GitHub網站https://github.com/stephane/libmodbus,并下載近期版本源代碼。如圖51所示,單擊[Clone or download]按鈕,再單擊[Download ZIP]按鈕,則自動下載近期的源代碼。圖51下載libmodbus源碼源碼下載完畢,解壓下載的zip文件,如圖52所示。簡單查看源代碼根目錄的構成: 圖52解壓libmodbus源碼 doc目錄: libmodbus庫的各API接口說明文檔。 m4目錄: 存放GNU m4文件,在這里對理解代碼沒有意義,可忽略。 src目錄: 全部libmodbus源文件。 tests目錄: 包含自帶的測試代碼。其他文件對我們理解源代碼關系不大,可以暫時忽略。進一步展開src代碼目錄,如圖53所示。圖53libmodbus源碼構成 win32: 定義了在Windows下使用Visual Studio編譯時的項目文件和工程文件,以及相關配置選項等。其中,modbus9.sln默認使用的是Visual Studio 2008。 Makefile.am: Makefile.am是Linux下AutoTool編譯時讀取相關編譯參數的配置文件,用于生成Makefile文件,因用于Linux下開發,在這里暫時忽略。 modbus.c: 核心文件,實現Modbus協議層,定義共通的Modbus消息發送和接收函數、各功能碼對應的函數。 modbus.h: libmodbus對外暴露的接口API頭文件。 modbusdata.c: 數據處理的共通函數,包括大小端相關的字節、位交換等函數。 modbusprivate.h: libmodbus內部使用的數據結構和函數定義。 modbusrtu.c: 通信層實現,RTU模式相關的函數定義,主要是串口的設置、連接及消息的發送和接收等。 modbusrtu.h: RTU模式對外提供的各API定義。 modbusrtuprivate.h: RTU模式的私有定義。 modbustcp.c: 通信層實現,TCP模式下相關的函數定義,主要包括TCP/IP網絡的設置、連接、消息的發送和接收等。 modbustcp.h: 定義TCP模式對外提供的各API定義。 modbustcpprivate.h: TCP模式的私有定義。 modbusversion.h.in: 版本定義文件。下面開始嘗試在Visual Studio 2015中編譯libmodbus庫文件。為了在Visual Studio下展開項目,首先雙擊configure.js,用以生成 config.h 和 modbusversion.h文件。然后打開前面已經安裝的開發環境Visual Studio 2015,在Visual Studio 2015中,打開modbus9.sln文件,彈出項目文件升級對話框,如圖54所示。圖54libmodbus項目文件升級對話框在圖54中勾選全部可選項,然后單擊[OK]按鈕,完成項目文件升級。在Visual Studio 2015中打開后,源代碼展開如圖55所示。圖55libmodbus項目文件結構此時如果直接編譯工程文件,將發生編譯錯誤。原因是其中新生成的文件modbusversion.h沒有正確加載,在文件上單擊右鍵選擇[Remove]菜單,刪除舊的文件,同時,在目錄Header Files上右鍵單擊,在彈出的菜單中依次選擇[Add]→[Existing Item...],重新加載新生成的modbusversion.h文件,如圖56所示。圖56修改或者添加文件嘗試著再次編譯看看: 在項目名稱上單擊右鍵,在彈出的菜單上選擇[Rebuild Solution]菜單項,如圖57所示。libmodbus庫文件開始編譯。圖57編譯libmodus庫文件編譯完成的時候,出現編譯錯誤,如圖58所示。圖58編譯libmodus出現錯誤為了解決這個錯誤,同時按下Alt F7鍵彈出項目屬性設置對話框,依次找到[VERSION]項的定義。查看路徑為[Configuration Properties]→[Linker]→[All Options]→[Version],如圖59所示。圖59Version項的定義找到后直接刪除[VERSION]項的定義,再次重新編譯庫文件。如果一切順利,在win32目錄下將會成功生成modbus.dll和modbus.lib文件。在工具欄上將工程文件目標屬性切換到[Release]項,按照上面的方法重新編譯Release版,在win32目錄下同樣成功生成modbus.dll和modbus.lib文件。至此,對libmodbus庫文件的編譯工作完成,成功生成的動態鏈接庫可以方便地供其他應用程序調用。5.3與應用程序的關系我們已經知道libmodbus是一個免費的跨平臺的支持RTU和TCP的Modbus開發庫,借助于libmodbus開發庫能夠非常方便地建立自己的應用程序或者將Modbus通信協議嵌入到單體設備中。libmodbus開發庫與應用程序的基本關系如圖510所示。圖510應用程序與libmodbus的關系在對libmodbus的接口及代碼框架簡單了解之后,不妨讓我們再深入一下細節,探探究竟。看看libmodbus都實現了哪些基礎功能?以及源代碼中對Modbus各功能碼和消息幀是如何包裝的?具體內容請看下一章。
物流速度太慢
物流挺快的,紙質不錯,就是想找一本可以邊學習邊編程操作的書,目前看著還行,等學習一段時間再來評價!
條理清楚,
紙質很好,正版
這本書還可以
很基礎入門書,軟件截圖占太多篇幅,有點水
很好很好很好
這本書講的淺顯易懂,講的簡單明了。作者很用心。作為modbus學習完全足夠。過段時間要用到,之前在網上也學了一些,可是現在想系統學一下。推薦。