概述
Modbus是一種串行通信協(xié)議,是Modicon公司(現(xiàn)施耐德電氣)于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表。如今Modbus已成為工業(yè)領域通信協(xié)議的業(yè)界標準,并且是工業(yè)電子設備之間常用的連接方式。 ?
關于Modbus協(xié)議
Modbus協(xié)議使用的是主從的通訊技術,即由主設備主動查詢和操作從設備。一般將主控設備方所使用的協(xié)議稱為Modbus Master,從設備方所使用的協(xié)議稱為Modbus Slave。典型的主設備包括工控機和工業(yè)控制器等;典型的從設備如可編程邏輯控制器(PLC)等。
MODBUS是OSI模型第7層上的應用層報文傳輸協(xié)議,它在連接至不同類型總線或網絡的設備之間提供客戶機/服務器通信。 Modbus通訊物理接口可以選用串口(包括RS232、RS485等),也可以選擇以太網口等。 圖1. Modbus通信棧
MODBUS協(xié)議定義了一個與基礎通信層無關的簡單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網絡上的MODBUS協(xié)議映射能夠在應用數(shù)據(jù)單元(ADU)上引入一些附加域。
圖2. 通用Modbus幀
當服務器對客戶機響應時,它使用功能碼域來指示正常(無差錯)響應或者出現(xiàn)某種差錯(稱為異常響應)。需要管理超時,以便明確地等待可能不會出現(xiàn)的應答。
圖3. Modbus事務處理(無差錯) ? 圖4. Modbus事務處理(異常響應)
MODBUS使用一個‘big-Endian’表示地址和數(shù)據(jù)項。這意味著當發(fā)射多個字節(jié)時,首先發(fā)送最高有效位。例如,寄存器大小16-bit的值為0x1234,先發(fā)送的第一字節(jié)為0x12,然后為0x34。
MODBUS的數(shù)據(jù)模型以一系列具有不同特征表格上的數(shù)據(jù)模型為基礎。四個基本表格為:
表1. Modbus數(shù)據(jù)模型
MODBUS有三類功能碼:公共功能碼、用戶定義功能碼、保留功能碼。
公共功能碼是較好地被定義的功能碼,保證是唯一的、公開證明的,具有可用的一致性測試。
圖5. 公共功能碼定義
Modbus串行鏈路協(xié)議是一個主從協(xié)議。在同一時刻,只有一個主節(jié)點連接于總線,一個或多個子節(jié)點(最大編號為247)連接于同一個串行總線。Modbus通信總是由主節(jié)點發(fā)起。子節(jié)點在沒有收到來自主節(jié)點的請求時,從不會發(fā)送數(shù)據(jù)。子節(jié)點之間從不會互相通信。主節(jié)點在同一時刻只會發(fā)起一個Modbus事務處理。
主節(jié)點以兩種模式對子節(jié)點發(fā)出Modbus請求:
1、單播模式,主節(jié)點以特定地址訪問某個子節(jié)點,子節(jié)點接到并處理完請求后,子節(jié)點向主節(jié)點返回一個報文(一個'應答')。每個子節(jié)點必須有唯一的地址(1到247),這樣才能區(qū)別于其它節(jié)點被獨立的尋址。
圖6. 單播模式
2、廣播模式,主節(jié)點向所有的子節(jié)點發(fā)送請求。對于主節(jié)點廣播的請求沒有應答返回。廣播請求一般用于寫命令。所有設備必須接受廣播模式的寫功能。地址0是專門用于表示廣播數(shù)據(jù)的。
圖7. 廣播模式
Modbus有兩種串行傳輸模式被定義:RTU模式(默認)和ASCII模式。
圖8. RTU和ASCII模式的位序列
Modbus串行鏈路上所有設備的傳輸模式(和串行口參數(shù))必須相同。
有關Modbus實現(xiàn)和特性的詳細信息,請訪問Modbus官網:https://modbus.org。 ?
關于FreeModbus協(xié)議棧
FreeMODBUS是一個針對通用的Modbus協(xié)議棧在嵌入式系統(tǒng)中應用的實現(xiàn)。它提供了RTU/ASCII傳輸模式及TCP協(xié)議支持。FreeModbus遵循BSD許可證,這意味著用戶可以將FreeModbus應用于商業(yè)環(huán)境中。目前FreeMODBUS只免費提供了一個Modbus從機節(jié)點的協(xié)議棧。該協(xié)議棧使用ANSI C編寫,并且支持多個變量。 本應用指南將介紹如何在AT32F435單片機上,通過FreeMODBUS協(xié)議棧實現(xiàn)Modbus從機節(jié)點的主要功能,并提供基于AT32F43x_StdPeriph_Lib和FreeMODBUS協(xié)議棧的源代碼。如結合AT32-Comm-EV Board和AT-START Board可以方便快速的搭建起基于RS485的Modbus從機節(jié)點。 ?
關于Modbus Poll調試軟件
Modbus Poll是一個Modbus主機模擬器,支持Modbus RTU、ASCI、TCP/IP傳輸模式。它可以協(xié)助開發(fā)人員調試Modbus從設備,測試和模擬Modbus協(xié)議的通信。通過多文檔界面接口,可以同時監(jiān)控多個Modbus從機設備、數(shù)據(jù)域等。每個窗口可簡單地設定從設備ID、功能碼、地址、長度和輪詢間隔。支持Modbus數(shù)據(jù)模型的四個基本表格,支持Modbus的多個公共功能碼。
本應用指南中將下載安裝Modbus Poll在PC機上作為Modbus主機,與AT-START Board(作為Modbus從機)通過USB轉RS485的模塊相連,實現(xiàn)一個完整的、可測試的Modbus通信網絡。
AT32硬件準備
硬件主要由AT32-Comm-EV Board和AT-START Board組成。
本應用指南提供的demo使用到的外設資源有USARTTMR等,用戶可根據(jù)具體需要靈活配置和修改,使用RS232或RS485來實現(xiàn)Modbus物理層的連接。
圖9. AT32 Modbus結構原理圖
AT-START Board
當前提供例程基于AT-START-F435。可提供基于RS232的Modbus通信。
圖10. AT-START-F435 V1.0實驗板
AT32-Comm-EV Board
可提供例程基于RS485的Modbus通信支持。
圖11. AT-START結合AT32-Comm-EV使用
將FreeModbus移植到AT32上
基礎工程準備
下載最新版本BSP&PACK文件,按照其應用指南進行安裝及配置,本文檔及例程均基于AT32F4xx_StdPeriph_Lib_V2.x.x的BSP&PACK文件進行開發(fā)。可借用at_start_f435文件夾下的temple工程來進行修改,更改文件夾及工程名為freemodbus,并準備在該工程內添加FreeMODBUS源碼。
工程內添加FreeModbus源碼
用戶需前往FreeMODBUS官網或Github上下載最新版源碼。源碼包解壓后,內有如下文件。
本文及所有移植例程均基于freemodbus-v1.6版本進行移植。
圖12. FreeMODBUS源碼文件
將源碼包解壓后,復制modbus文件夾和demoBAREport文件夾到前面的基礎工程freemodbus目錄下面,將port文件夾改名為modbus_port。如下圖所示。
圖13. freemodbus工程目錄
打開工程文件,并按以下2個步驟添加到工程文件內。可參考AT提供的例程文件進行添加。
1、添加modbus和modbus_port內的所有.c文件(與tcp相關的除外)到工程項目內。
圖14. freemodbus工程的項目
2、需將添加的.c文件所對應的.h文件的路徑添加到工程的文件夾設置內。
圖15. freemodbus工程的文件夾設置
工程代碼的修改
1、修改“port.h”文件。在該文件中添加包含關于AT32 MCU的“at32f435_437.h”頭文件。補全用于互斥操作的開關中斷宏定義。屏蔽掉關于TRUE、FALSE的宏定義,因在AT BSP的頭文件中已有定義,避免編譯出錯。
2、修改“portserial.c”和“porttimer.c”文件。在該文件中添加關于USART和TMR外設的底層驅動部分代碼。用戶可根據(jù)自己的硬件環(huán)境來自行修改,所以這里不進行具體說明,也可參考AT所提供的例程文件。
3、需特別注意的是,因USART寄存器DT的值里包含數(shù)據(jù)位和校驗位,而FreeMODBUS源碼里在讀取USART接收的數(shù)據(jù)后,會把所有值都當作數(shù)據(jù)位來處理而出錯,這可能是和其他廠家的MCU有差異,所以這里需在“mbascii.c”文件中去修改源碼。具體可參考AT所提供的例程文件。
4、在工程中新建并添加“mbtask.c/.h”文件。該文件用于創(chuàng)建Modbus的通信任務(作從機)來調用FreeMODBUS協(xié)議棧的API層,并建立Modbus的數(shù)據(jù)模型(4個基本表格)用于與ModbusPoll(作主機)進行模擬通信測試。 “mbtask.c/.h”文件中實現(xiàn)的調用管理:
保持寄存器的讀/寫
輸入寄存器的讀取
線圈的讀/寫
離散量輸入的讀取
“mbtask.h”文件中定義的Modbus數(shù)據(jù)模型和建立通信所需的參數(shù):
表2. Modbus的配置參數(shù)
設備功能的實現(xiàn)
1、在“mbtask.c”文件中編寫void modbus_task(void)函數(shù)去調用協(xié)議棧的API層,來實現(xiàn)modbus從機任務的功能。
2、在“main.c”文件中,由int main(void) 主函數(shù)去調用modbus_task()任務函數(shù)即可。
設備的測試
至此,官方例程移植完畢,編譯并下載,開打與AT-Link相連的串口,可看到如下打印信息。 圖16. 串口打印信息
從打印信息可以看到,從設備已經正常的運行起來。
這時我們需要將此設備與上位機相連接,再打開Modbus Poll軟件,模擬主設備來進行單播通信,即發(fā)送請求并接收應答。
1. 首先對Modbus Poll軟件進行連接設置,選擇與從設備相同的傳輸模式(RTU Mode),并配置相應串口的參數(shù),也須與從設備相同。
圖17. Modbus Poll連接設置
2. 再對Modbus Poll軟件進行讀寫命令的定義,下面僅以功能碼03(讀保持寄存器)為例來講解,用戶可自行用同樣的方式測試其他功能碼。
圖18. Modbus Poll讀/寫定義
3. 在Modbus Poll軟件的文檔界面中,可以看到已成功讀回保持寄存器的值,并與從設備的程序中初始化保持寄存器時的值一致,測試通過。
圖19. Modbus Poll文檔界面
審核編輯:黃飛
?
評論