劉繼志,白曉亮
(1.河北申科電力股份有限公司產(chǎn)品研發(fā)中心,保定 071000:2.河北大學(xué),保定 071002)
MODBUS協(xié)議是Modicon公司(現(xiàn)在的施耐德電氣)于1979年發(fā)明的一種串行通信協(xié)議,最初是為解決可編程邏輯控制器(PLC)之間通信而制定的,現(xiàn)在在常用的控制器上都可以實(shí)現(xiàn)。MODBUS協(xié)議采用主從問答方式進(jìn)行工作,允許一個(gè)主機(jī)與一個(gè)或者多個(gè)從機(jī)通訊,通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(如以太網(wǎng))和其他設(shè)備之間可以通信。不同廠商生產(chǎn)的控制設(shè)備通過MODBUS協(xié)議可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。
MODBUS協(xié)議有兩種傳輸方式:ASCII和RTU。對(duì)于ASCII模式,一個(gè)字節(jié)的數(shù)據(jù),需要把高低4位分別轉(zhuǎn)換為ASCII碼傳輸;而RTU模式,是按16進(jìn)制字符傳輸?shù)摹Mㄟ^比較可以看出,相對(duì)于ASCII模式,RTU模式表達(dá)同樣的信息需要的位數(shù)較少,在同樣的傳輸速率下能獲取更多的信息,可以提高通訊的效率。本文采用RTU傳輸模式,RTU模式的消息幀結(jié)構(gòu)如表1所示。
表1 MODBUS幀結(jié)構(gòu)
本設(shè)計(jì)采用了意法半導(dǎo)體的STM32系列微控制器,該控制器內(nèi)核采用超低功率的ARMCortex-M3核心,具有高性能、低成本、低功耗的特點(diǎn),同時(shí)集成了豐富出眾的外設(shè)系統(tǒng),具有集成度高和開發(fā)便捷的優(yōu)勢。系統(tǒng)硬件結(jié)構(gòu)圖如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖
系統(tǒng)硬件包括stm32f103微控制器、485通信電路、時(shí)鐘電路、復(fù)位電路和電源電路等。stm32f103微控制器完成串口數(shù)據(jù)收發(fā)、數(shù)據(jù)幀的組包與解包、數(shù)據(jù)處理等,485通信電路部分采用了MAX483芯片,完成USART串口到485總線的轉(zhuǎn)換,通過高速光耦隔離芯片TLP2362和stm32f103微控制器的USART串口連接。
主程序首先完成外設(shè)的初始化,初始化完成后就等待串口中斷,MODBUS數(shù)據(jù)接收和發(fā)送都在串口中斷中調(diào)用相應(yīng)的函數(shù)完成。初始化程序首先完成串口的初始化,包括打開串口時(shí)鐘、配置GPIO復(fù)用功能、波特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和中斷配置等。然后進(jìn)行定時(shí)器初始化,定時(shí)器的作用是完成幀結(jié)束的判斷,MODBUS規(guī)定,MODBUS每幀之間需要間隔3.5字符,串口發(fā)送的每個(gè)字節(jié)數(shù)據(jù)都包含1位起始位,8位數(shù)據(jù)位、1位奇偶校驗(yàn)位、1位停止位,共11位。以波特率9600為例,就需要4毫秒多,在此用定時(shí)器定時(shí)4.5ms。最后配置MODBUS的從站號(hào)、初始化接收和發(fā)送緩沖區(qū)。
MODBUS發(fā)送數(shù)據(jù)程序響應(yīng)主機(jī)的請求,通過串口中斷完成數(shù)據(jù)發(fā)送緩沖區(qū)數(shù)據(jù)的發(fā)送。MODBUS發(fā)送數(shù)據(jù)程序流程圖見圖2所示。
圖2 MODBUS發(fā)送數(shù)據(jù)程序流程圖
當(dāng)串口接收數(shù)據(jù)后會(huì)觸發(fā)中斷,在中斷函數(shù)中判斷如果是接收到數(shù)據(jù)則調(diào)用MODBUS接收數(shù)據(jù)函數(shù)。MODBUS接收數(shù)據(jù)程序流程圖見圖3所示。
首先從串口緩沖區(qū)讀取接收到的字符,判斷當(dāng)前是否處于消息處理中,如果處于消息處理中則直接退出,等待消息處理完成,如果沒有處于消息處理中,通過判斷和上個(gè)字符之間的間隔是否超4.5ms,確定是否為新一幀,如果是新的一幀且該字符等于本從站號(hào),則初始化接收計(jì)數(shù)器,并把字符存放在接收緩沖區(qū)中,如果不是新的一幀,說明當(dāng)前正在進(jìn)行一幀的接收,則把字符直接放在接收緩沖區(qū)中。
圖3 MODBUS接收數(shù)據(jù)程序流程圖
從機(jī)在接收到主機(jī)發(fā)來的數(shù)據(jù)后,重新計(jì)算數(shù)據(jù)的CRC校驗(yàn),并和數(shù)據(jù)中的CRC進(jìn)行比較,如果相等說明數(shù)據(jù)無誤,則讀取功能碼,根據(jù)不同功能碼調(diào)用相應(yīng)的處理函數(shù);如果不相等說明數(shù)據(jù)有誤,調(diào)用誤差處理程序。
從機(jī)通過U轉(zhuǎn)485線和計(jì)算機(jī)相連,上位機(jī)通信測試軟件采用了MODBUSPoll,設(shè)置好串口參數(shù)即可。測試了02功能碼(輸入狀態(tài)寄存器)、04功能碼(輸入型寄存器)、05功能碼(控制寄存器)、06和16功能碼(配置參數(shù)寄存器),均能正常通信。
MODBUS廣泛應(yīng)用于自動(dòng)化控制行業(yè)中,已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。本文在STM32F103微控制器上實(shí)現(xiàn)了MODBUS的數(shù)據(jù)通信,并將其應(yīng)用在低壓監(jiān)測設(shè)備中,并進(jìn)行了實(shí)際測試和使用。