摘要:首先介紹ARM控制系統的組成,并簡略介紹控制器所用到的MODBUS通信協議#65380;IEC61131-3標準和ARM微處理器,然后結合實際工程,對過程映像進行介紹,詳細描述在ADS編程環境下實現設備地址#65380;功能代碼#65380;數據以及CRC校驗的分配過程,并利用MODBUS通信協議實現組態軟件對基于IEC 61131-3標準的ARM控制器的監測和控制#65377;
關鍵詞:MODBUS通信協議;IEC 61131-3標準;CRC校驗
中圖分類號:TP273+.5;TP39文獻標識碼:A
1引言[1]
近年來隨著工業控制領域自動化水平的不斷提高,許多廠#65380;礦企業原有的控制系統陸續開始各種軟硬件的升級和改造#65377;其中,數據通信的可靠關系到了整個系統的安全#65377;由于整個工程往往是由不同的單位分別完成的,各部分之間數據的交換就成了一個十分關鍵的問題#65377;因此工業控制系統中常使用標準的通信協議進行通信#65377;
MODBUS協議是MODICON公司推出的一個開放式現場總線的通信協議,現得到了眾多儀表廠家的支持并廣泛應用于工業控制領域#65377;IEC61131是IEC(國際電工委員會)制定的有關可編程控制器(PLC)的相關標準,IEC 61131-3是其中的編程語言部分#65377;該標準針對的工業控制系統所闡述的軟件設計的概念和軟件模型,適應了當今世界軟件#65380;工業控制系統的發展方向, 并且還廣泛地應用于集散型控制系統#65380;工業控制計算機#65380;數控系統#65380;遠程終端單元等產品#65377;
在我們設計的ARM控制器中使用了MODBUS通信協議,在軟件設計部分使用了IEC 61131-3標準#65377;我們通過MODBUS通信協議實現了用“力控”組態軟件對基于IEC 61131-3標準的ARM控制器的監控#65377;
2控制系統的組成[2][3][4]
首先利用底層編程系統ADS(由ARM公司推出的ARM核微處理器集成開發工具,全稱為ARM Developer Suite,并支持JTAG硬件仿真調試),通過JTAG把底層運行程序燒寫到ARM控制器中構建運行系統#65377;
然后利用所選用的基于IEC 61131-3標準的軟件編寫用戶程序,并通過其自帶的通信協議把符合IEC 61131-3標準的應用程序下載到運行系統(ARM控制器)里面去#65377;
最后通過MODBUS通信協議實現“力控”組態軟件對ARM控制器運行狀態的監測和控制#65377;選用的是MODBUS的RTU方式,波特率設置為9600Bit/s;ARM控制器是ATMEL公司基于ARMTTDMI微處理核的32位嵌入式RISC處理器AT91M55800A#65377;
圖1ARM控制系統的實現原理圖
基于IEC標準的嵌入式控制器的MODBUS通信
3MODBUS通信的實現
3.1過程映像
所選用的基于IEC 61131-3標準的軟件中,I/O變量訪問是通過對過程映像的訪問來實現的#65377;所謂過程映像其實是運行系統自動定義的一個段#65377;I/O接口通過對過程映像的訪問來實現I/O變量的訪問#65377;而上位機就是通過過程映像來與物理硬件設備通信,讀寫I/O變量的信息#65377;過程映像內存單元和編程系統I/O變量的物理定義地址是一一對應的#65377;
過程映像有一個段表頭,段表頭后面跟著用于物理輸入(%I)的內存空間,接著是物理輸出(%Q)和用于標志(%M)的內存空間#65377;在輸入和輸出之間,輸出和標志之間,以及在標志之后,都有可能有一些不用的內存空隙#65377;對過程映像的訪問是通過指針pProcImgSeg-l來實現的,讓其總指向物理輸入的起始偏移地址,pProcImgSeg-l加上相對偏移量,就可以訪問不同I/O變量和標志的存儲單元#65377;
過程映像的布局如圖2所示#65377;
圖2過程映像布局
3.2ARM控制器中MODBUS通信的實現
在該基于MODBUS通信協議的ARM控制器中,“力控”組態軟件是主設備(master),而ARM控制器是從設備(slave)#65377;因此我需要編寫的MODBUS通信協議部分就是MODBUS通信的slave部分,而所用的編程環境也是專門針對ARM的ADS(ARM Developer Suite V1.2)開發環境#65377;為了便于說明問題,本文主要通過對功能代碼03H的使用來演示程序的運行#65377;
3.3從設備部分MODBUS通信的實現
圖3說明了在從設備ARM控制器上接收#65380;處理#65380;發送的流程圖#65377; 首先是main函數里面的循環檢查標志位是否置1#65377;當標志位置1的時候表示接收緩沖區里面有數據了,則讀出地址碼,并清0標志位,等待下一次數據的到來;假如標志位為0,則表示接收緩沖區內沒有數據,就繼續循環等待數據到來#65377;然后判斷地址碼是否相符,若相符則讀取數據中的CRC校驗位,若不相符合則退出繼續循環等待#65377;
在地址碼正確的情況下,把得到的數據重新進行CRC運算,并把運算得到的CRC碼與接收到的CRC校驗碼進行比較,相符說明接收無誤,不符說明接收錯誤,回發錯誤代碼要求主設備重發數據#65377;
在判斷了CRC校驗無誤的情況下,就調用modbus-unfasten函數進行數據的處理和回發#65377;我們以功能代碼03H為例進行說明#65377;當調用了modbus-unfasten函數以后,首先是讀取數據中的功能代碼,通過多路選擇結構swith語句進行處理#65377;如當讀取的功能代碼為03H時,執行如下代碼:
在判斷了功能代碼以后先分別讀取寄存器地址的高位和低位,然后組合成完整的地址;同樣又讀取數據數目的高低位,再組合成完整的數據數目#65377;過程映像的指針加上偏移量以后就指向了需要讀取的數據#65377;然后調用modbus-encapsulation-read,把設備地址#65380;功能代碼#65380;數據個數以及新讀取的數據進行封裝,并返回封裝后數據的地址#65377;最后調用AT91M55800A中提供的串口發送程序at91-usart-send-frame,將數據從串口發送給主設備——“力控”組態軟件#65377;
使用RTU模式,消息中所使用的是CRC循環冗余檢測#65377;CRC校驗碼是兩個字節,包含一個16位的二進制值,它由傳輸設備計算后加入消息中,接收設備重新計算收到的數據的CRC,并與接收到的CRC校驗碼進行比較#65377;CRC校驗需要對位進行操作,根據MODBUS的相關介紹,在ADS環境下制作了一個CRC校驗碼計算函數crc16#65377;該程序中使用的是查表法,這種方法不需要大量煩瑣的計算,只需要在CRC高位字節值表(auchCRCHi[])和CRC低位字節值表(auchCRCLo)中進行查詢就可以了#65377;
3.4主設備部分MODBUS通信的實現
主設備,也就是PC機上的MODBUS通信是靠“力控”組態軟件來實現的#65377;在“力控”中建立MODBUS通信需要三個步驟:
(1)在I/O設備驅動中建立一個MODBUS(RTU串行口)的連接,配置好其中的設備名稱#65380;設備地址#65380;通信方式以及串口號等參數; (2)在實時數據庫中的數據庫組態界面添加新變量,包括變量名#65380;定義I/O設備(選擇第一步定義的MODBUS RTU串行口),并選擇所要實現的功能,即選擇功能代碼;
(3)在窗口界面里面添加一個文本,然后對文本的對象類型進行配置,選擇好數值輸入和數值輸出的類型,并選擇好所要顯示的變量(即剛才在第二步里面定義的變量名)#65377;
4結束語[5]
本文介紹了在基于ARM和IEC 61131-3標準的控制器上實現MODBUS通信的設計和實現方法#65377;MODBUS協議受到眾多儀表廠家的支持,基于MODBUS協議的通用工控組態軟件也越來越多#65377;MODBUS協議正在成為儀表及智能終端的工業標準,在我國的智能儀表與工業控制領域的應用越來越廣泛#65377;而軟件方面采用了IEC 61131-3國際標準,使得開發出來的用戶程序具有很好的可移植性和可重用性#65377;使用這兩個標準提高了對ARM控制器監控的可靠性和通用性#65377;
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。