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