馬亞玲
(云南省玉溪技師學院 玉溪工業財貿學校,云南 玉溪 653100)
倉庫進行智能化改造時,要求可以在值班室顯示倉庫當前溫濕度參數,并能夠在值班室對倉庫現場的除濕和通風設備進行遠程控制。由于產品成本控制非常嚴格,所以在值班室計算機上安裝組態軟件作為上位機,倉儲現場采用單片機控制裝置與除濕通風設備相連,并將溫濕度傳感器參數接入到單片機中,上位機和單片機采用串行通信進行信息的交換。需要搭建通信網絡,并進行上位機和單片機之間通信程序的開發。本文主要介紹上位機和單片機之間通信網絡及通信協議的選擇,重點論述單片機和上位機之間串行通信通信程序的開發實現。
隨著工業現代化及信息化的迅猛發展,單片機控制已經從傳統的本地控制向遠程控制、網絡控制發展,設備信息的采集和顯示也由本地處理、分散顯示向遠程采集、集中顯示發展。單片機控制功能的改變對其應用開發提出了新的要求。單片機開發應用人員需要掌握與單片機相關的通信網絡和通信協議。
但在目前的單片機應用中,主要還是以本地數字量的采集和控制為主,很少涉及通信,即便是涉及通信部分,也只是采用RS-232串行接口,利用單片機自帶的UART進行短距離的簡單數據收發控制,也不涉及通信的協議規范。但是在工業控制中,基于RS-485總線的設備已經得到了廣泛應用,設備的網絡化、模塊化應用需求日益明顯。相較于RS-232,RS-485在信號傳輸距離、傳輸速率、抗干擾性及支持多點通信等方面具有很強的優勢,能夠滿足工業現場通信的要求,因此在通信網絡搭建采用RS-485總線形式相連接。
確定通信網絡后,為了保證數據傳輸的可靠性、實時性以及協議的通用性,經過對比研究,選擇MODBUS通信協議。MODBUS有兩種串行傳輸模式,包括RTU、ASCII[1]。兩種傳輸方式不同之處在于數據命令的編碼、解碼方式不同,多數支持MODBUS協議的設備都支持RTU模式,并且RTU模式在單片機上實現相對簡單,因此采用MODBUS RTU進行通信程序的開發。
采用MODBUS通信協議的設備連接在一起就構成了通信網絡,以RS-485方式為例進行連接。一個通信網絡中只有一個設備可以作為主機,其余設備均為從機,每一個從機都會分配一個地址,從機地址的范圍為1~247。MODBUS通信協議中,主機發送數據和指令中包含指定的從機地址,通信網絡中的每個從機都會收到數據和指令,從機判斷協議命令中的地址和本機地址不一致時,就不會進行處理,只有讀取到協議命令中的地址和本機地址一致時,才進行數據命令的解析處理。MODBUS RTU方式主機發送時的數據格式如表1所示。
當從機收到主機的指令時,根據主機的功能代碼的命令要求,執行從寄存器讀取數值或者寫入數值到寄存器中,并在執行指令后向主機發送返回數據,響應主機操作。功能碼是在標準MODBUS RTU協議中已經定義了常用指令代碼的功能,在單片機通信應用中常用功能碼及功能如表2所示。

表1 MODBUS通信數據格式

表2 常用MODBUS功能碼及功能
MODBUS協議是主/從通信協議,以單片機作為從機,編寫接收主機命令,執行命令,并發送響應指令給主機的通信程序。MODBUS協議處理函數的流程如圖1所示。單片機循環掃描時間到時,判斷是否接收到主機數據命令,當接收到數據命令時,首先解析地址是否為本機地址,然后判斷CRC校驗是否正確,對CRC校驗后正確的數據命令,按照功能碼指令以及數據地址和數據進行處理,并在處理后返回給主機響應數據,對于不是本機地址,或者是本機地址但是CRC校驗不正確的數據,不進行處理[2]。

圖1 MODBUS協議處理函數流程圖
01功能碼是主機讀取單片機一個數據位數據的指令。當從機接收到01功能碼指令時,首先解析要獲取的數據位的地址,然后讀取該地址中的數據,將數據通過響應指令發送給上位機,即可實現01功能碼讀取一位數據的功能。01功能碼實現流程如圖2所示。
05功能碼是主機向單片機的一個數據位地址寫入數據的指令。當從機接收到05功能碼指令時,首先解析要寫入數據位的目標地址,然后將指令中的數據寫入到目標地址,最后向主機發送響應,即可實現05功能碼寫入一位數據的功能。

圖2 01功能碼實現流程圖
單片機控制裝置的通信網絡采用RS-485總線形式相連接。將計算機作為通信的主機、單片機作為通信的從機,通過在51單片機中運行MODBUS通信協議,實現在上位機對設備的控制。
在單片機的數據存儲空間中定義數據的接收和發送緩沖區,單片機發送的數據首先送入發送緩沖區中,接收的數據放入到接收緩沖區中。對于單片機和主機,數據緩沖區是一個公用的區域。本文定義兩個緩沖區:
unsigned char TxBuff[20];//數據發送緩沖區
unsigned char RxBuff[20];//數據接收緩沖區
定義單片機中LED的地址為0,當地址中數據為0時,設備打開,非0時,設備關閉。當單片機接收到主機打開和關閉設備的指令時,處理函數如下:
CRC=CRC16MODBUS(RxBuff,6);//CRC校驗
CRCH =CRC>>8; //獲取CRC校驗高位
CRCL =CRC&0xff; //獲取CRC校驗低位
if(RxBuff[6]==CRCH&&RxBuff[7]==CRCL)//判斷CRC校驗是否正確
{
if(RxBuff[0]==Add)//判斷地址是否是本機地址
{
if(RxBuff[0]==0x05)//判斷是否是05功能碼
{
Regadd=RxBuff[2]*256+RxBuff[3];//獲取寄存器地址
if(Regadd==0)
{
if(RxBuff[4]==0x00) //判斷打開還是關閉
LED=0; //打開設備
else
LED=1; //關閉設備
TxBuff[0]=RxBuff[0]; //設備地址
TxBuff[1]=RxBuff[1]; //功能碼
TxBuff[2]=RxBuff[2]; //地址高位
TxBuff[3]=RxBuff[3]; //地址低位
TxBuff[4]=RxBuff[4]; //數據位
TxBuff[5]=RxBuff[5]; //數據位
CRC=CRC16MODBUS(TxBuff,6);//CRC 校驗
TxBuff[6]=CRC>>8; //CRC校驗高位
TxBuff[7]=CRC&0XFF; //CRC校驗低位
TxDell();//向主機發送響數據
}
}
}
}
上位機發送協議指令:0105 00 00 00 00 CD CA,單片收到指令打開設備,并返回響應指令。上位機發送協議指令:0105 00 00 FF 00 8C 3A,單片收到指令關閉設備,并返回響應指令。對于現場溫濕度信息的采集,主機采用03功能碼數據指令進行溫濕度數據的采集,單片機執行指令將數據傳輸到上位機的組態軟件中進行顯示。
本文通過在單片機上運行MODBUS從機通信協議程序,以計算機作為上位機,通過上位機發送指令對單片機進行遠程控制和現場信息的采集。經過產品開發研究,驗證了基于RS-485通信網絡和MODBUS通信協議實現上位機和單片機通信的可行性,達到了預期的效果。