劉繼志,白曉亮
(1.河北申科電力股份有限公司產品研發中心,保定 071000:2.河北大學,保定 071002)
MODBUS協議是Modicon公司(現在的施耐德電氣)于1979年發明的一種串行通信協議,最初是為解決可編程邏輯控制器(PLC)之間通信而制定的,現在在常用的控制器上都可以實現。MODBUS協議采用主從問答方式進行工作,允許一個主機與一個或者多個從機通訊,通過此協議,控制器相互之間、控制器經由網絡(如以太網)和其他設備之間可以通信。不同廠商生產的控制設備通過MODBUS協議可以連成工業網絡,進行集中監控。
MODBUS協議有兩種傳輸方式:ASCII和RTU。對于ASCII模式,一個字節的數據,需要把高低4位分別轉換為ASCII碼傳輸;而RTU模式,是按16進制字符傳輸的。通過比較可以看出,相對于ASCII模式,RTU模式表達同樣的信息需要的位數較少,在同樣的傳輸速率下能獲取更多的信息,可以提高通訊的效率。本文采用RTU傳輸模式,RTU模式的消息幀結構如表1所示。

表1 MODBUS幀結構
本設計采用了意法半導體的STM32系列微控制器,該控制器內核采用超低功率的ARMCortex-M3核心,具有高性能、低成本、低功耗的特點,同時集成了豐富出眾的外設系統,具有集成度高和開發便捷的優勢。系統硬件結構圖如圖1所示。

圖1 系統硬件結構圖
系統硬件包括stm32f103微控制器、485通信電路、時鐘電路、復位電路和電源電路等。stm32f103微控制器完成串口數據收發、數據幀的組包與解包、數據處理等,485通信電路部分采用了MAX483芯片,完成USART串口到485總線的轉換,通過高速光耦隔離芯片TLP2362和stm32f103微控制器的USART串口連接。
主程序首先完成外設的初始化,初始化完成后就等待串口中斷,MODBUS數據接收和發送都在串口中斷中調用相應的函數完成。初始化程序首先完成串口的初始化,包括打開串口時鐘、配置GPIO復用功能、波特率、數據位數、奇偶校驗和中斷配置等。然后進行定時器初始化,定時器的作用是完成幀結束的判斷,MODBUS規定,MODBUS每幀之間需要間隔3.5字符,串口發送的每個字節數據都包含1位起始位,8位數據位、1位奇偶校驗位、1位停止位,共11位。以波特率9600為例,就需要4毫秒多,在此用定時器定時4.5ms。最后配置MODBUS的從站號、初始化接收和發送緩沖區。
MODBUS發送數據程序響應主機的請求,通過串口中斷完成數據發送緩沖區數據的發送。MODBUS發送數據程序流程圖見圖2所示。

圖2 MODBUS發送數據程序流程圖
當串口接收數據后會觸發中斷,在中斷函數中判斷如果是接收到數據則調用MODBUS接收數據函數。MODBUS接收數據程序流程圖見圖3所示。
首先從串口緩沖區讀取接收到的字符,判斷當前是否處于消息處理中,如果處于消息處理中則直接退出,等待消息處理完成,如果沒有處于消息處理中,通過判斷和上個字符之間的間隔是否超4.5ms,確定是否為新一幀,如果是新的一幀且該字符等于本從站號,則初始化接收計數器,并把字符存放在接收緩沖區中,如果不是新的一幀,說明當前正在進行一幀的接收,則把字符直接放在接收緩沖區中。

圖3 MODBUS接收數據程序流程圖
從機在接收到主機發來的數據后,重新計算數據的CRC校驗,并和數據中的CRC進行比較,如果相等說明數據無誤,則讀取功能碼,根據不同功能碼調用相應的處理函數;如果不相等說明數據有誤,調用誤差處理程序。
從機通過U轉485線和計算機相連,上位機通信測試軟件采用了MODBUSPoll,設置好串口參數即可。測試了02功能碼(輸入狀態寄存器)、04功能碼(輸入型寄存器)、05功能碼(控制寄存器)、06和16功能碼(配置參數寄存器),均能正常通信。
MODBUS廣泛應用于自動化控制行業中,已經成為工業領域通信協議的業界標準,并且現在是工業電子設備之間常用的連接方式。本文在STM32F103微控制器上實現了MODBUS的數據通信,并將其應用在低壓監測設備中,并進行了實際測試和使用。