馬亞玲
(云南省玉溪技師學(xué)院 玉溪工業(yè)財(cái)貿(mào)學(xué)校,云南 玉溪 653100)
倉庫進(jìn)行智能化改造時(shí),要求可以在值班室顯示倉庫當(dāng)前溫濕度參數(shù),并能夠在值班室對(duì)倉庫現(xiàn)場(chǎng)的除濕和通風(fēng)設(shè)備進(jìn)行遠(yuǎn)程控制。由于產(chǎn)品成本控制非常嚴(yán)格,所以在值班室計(jì)算機(jī)上安裝組態(tài)軟件作為上位機(jī),倉儲(chǔ)現(xiàn)場(chǎng)采用單片機(jī)控制裝置與除濕通風(fēng)設(shè)備相連,并將溫濕度傳感器參數(shù)接入到單片機(jī)中,上位機(jī)和單片機(jī)采用串行通信進(jìn)行信息的交換。需要搭建通信網(wǎng)絡(luò),并進(jìn)行上位機(jī)和單片機(jī)之間通信程序的開發(fā)。本文主要介紹上位機(jī)和單片機(jī)之間通信網(wǎng)絡(luò)及通信協(xié)議的選擇,重點(diǎn)論述單片機(jī)和上位機(jī)之間串行通信通信程序的開發(fā)實(shí)現(xiàn)。
隨著工業(yè)現(xiàn)代化及信息化的迅猛發(fā)展,單片機(jī)控制已經(jīng)從傳統(tǒng)的本地控制向遠(yuǎn)程控制、網(wǎng)絡(luò)控制發(fā)展,設(shè)備信息的采集和顯示也由本地處理、分散顯示向遠(yuǎn)程采集、集中顯示發(fā)展。單片機(jī)控制功能的改變對(duì)其應(yīng)用開發(fā)提出了新的要求。單片機(jī)開發(fā)應(yīng)用人員需要掌握與單片機(jī)相關(guān)的通信網(wǎng)絡(luò)和通信協(xié)議。
但在目前的單片機(jī)應(yīng)用中,主要還是以本地?cái)?shù)字量的采集和控制為主,很少涉及通信,即便是涉及通信部分,也只是采用RS-232串行接口,利用單片機(jī)自帶的UART進(jìn)行短距離的簡(jiǎn)單數(shù)據(jù)收發(fā)控制,也不涉及通信的協(xié)議規(guī)范。但是在工業(yè)控制中,基于RS-485總線的設(shè)備已經(jīng)得到了廣泛應(yīng)用,設(shè)備的網(wǎng)絡(luò)化、模塊化應(yīng)用需求日益明顯。相較于RS-232,RS-485在信號(hào)傳輸距離、傳輸速率、抗干擾性及支持多點(diǎn)通信等方面具有很強(qiáng)的優(yōu)勢(shì),能夠滿足工業(yè)現(xiàn)場(chǎng)通信的要求,因此在通信網(wǎng)絡(luò)搭建采用RS-485總線形式相連接。
確定通信網(wǎng)絡(luò)后,為了保證數(shù)據(jù)傳輸?shù)目煽啃?、?shí)時(shí)性以及協(xié)議的通用性,經(jīng)過對(duì)比研究,選擇MODBUS通信協(xié)議。MODBUS有兩種串行傳輸模式,包括RTU、ASCII[1]。兩種傳輸方式不同之處在于數(shù)據(jù)命令的編碼、解碼方式不同,多數(shù)支持MODBUS協(xié)議的設(shè)備都支持RTU模式,并且RTU模式在單片機(jī)上實(shí)現(xiàn)相對(duì)簡(jiǎn)單,因此采用MODBUS RTU進(jìn)行通信程序的開發(fā)。
采用MODBUS通信協(xié)議的設(shè)備連接在一起就構(gòu)成了通信網(wǎng)絡(luò),以RS-485方式為例進(jìn)行連接。一個(gè)通信網(wǎng)絡(luò)中只有一個(gè)設(shè)備可以作為主機(jī),其余設(shè)備均為從機(jī),每一個(gè)從機(jī)都會(huì)分配一個(gè)地址,從機(jī)地址的范圍為1~247。MODBUS通信協(xié)議中,主機(jī)發(fā)送數(shù)據(jù)和指令中包含指定的從機(jī)地址,通信網(wǎng)絡(luò)中的每個(gè)從機(jī)都會(huì)收到數(shù)據(jù)和指令,從機(jī)判斷協(xié)議命令中的地址和本機(jī)地址不一致時(shí),就不會(huì)進(jìn)行處理,只有讀取到協(xié)議命令中的地址和本機(jī)地址一致時(shí),才進(jìn)行數(shù)據(jù)命令的解析處理。MODBUS RTU方式主機(jī)發(fā)送時(shí)的數(shù)據(jù)格式如表1所示。
當(dāng)從機(jī)收到主機(jī)的指令時(shí),根據(jù)主機(jī)的功能代碼的命令要求,執(zhí)行從寄存器讀取數(shù)值或者寫入數(shù)值到寄存器中,并在執(zhí)行指令后向主機(jī)發(fā)送返回?cái)?shù)據(jù),響應(yīng)主機(jī)操作。功能碼是在標(biāo)準(zhǔn)MODBUS RTU協(xié)議中已經(jīng)定義了常用指令代碼的功能,在單片機(jī)通信應(yīng)用中常用功能碼及功能如表2所示。
表1 MODBUS通信數(shù)據(jù)格式
表2 常用MODBUS功能碼及功能
MODBUS協(xié)議是主/從通信協(xié)議,以單片機(jī)作為從機(jī),編寫接收主機(jī)命令,執(zhí)行命令,并發(fā)送響應(yīng)指令給主機(jī)的通信程序。MODBUS協(xié)議處理函數(shù)的流程如圖1所示。單片機(jī)循環(huán)掃描時(shí)間到時(shí),判斷是否接收到主機(jī)數(shù)據(jù)命令,當(dāng)接收到數(shù)據(jù)命令時(shí),首先解析地址是否為本機(jī)地址,然后判斷CRC校驗(yàn)是否正確,對(duì)CRC校驗(yàn)后正確的數(shù)據(jù)命令,按照功能碼指令以及數(shù)據(jù)地址和數(shù)據(jù)進(jìn)行處理,并在處理后返回給主機(jī)響應(yīng)數(shù)據(jù),對(duì)于不是本機(jī)地址,或者是本機(jī)地址但是CRC校驗(yàn)不正確的數(shù)據(jù),不進(jìn)行處理[2]。
圖1 MODBUS協(xié)議處理函數(shù)流程圖
01功能碼是主機(jī)讀取單片機(jī)一個(gè)數(shù)據(jù)位數(shù)據(jù)的指令。當(dāng)從機(jī)接收到01功能碼指令時(shí),首先解析要獲取的數(shù)據(jù)位的地址,然后讀取該地址中的數(shù)據(jù),將數(shù)據(jù)通過響應(yīng)指令發(fā)送給上位機(jī),即可實(shí)現(xiàn)01功能碼讀取一位數(shù)據(jù)的功能。01功能碼實(shí)現(xiàn)流程如圖2所示。
05功能碼是主機(jī)向單片機(jī)的一個(gè)數(shù)據(jù)位地址寫入數(shù)據(jù)的指令。當(dāng)從機(jī)接收到05功能碼指令時(shí),首先解析要寫入數(shù)據(jù)位的目標(biāo)地址,然后將指令中的數(shù)據(jù)寫入到目標(biāo)地址,最后向主機(jī)發(fā)送響應(yīng),即可實(shí)現(xiàn)05功能碼寫入一位數(shù)據(jù)的功能。
圖2 01功能碼實(shí)現(xiàn)流程圖
單片機(jī)控制裝置的通信網(wǎng)絡(luò)采用RS-485總線形式相連接。將計(jì)算機(jī)作為通信的主機(jī)、單片機(jī)作為通信的從機(jī),通過在51單片機(jī)中運(yùn)行MODBUS通信協(xié)議,實(shí)現(xiàn)在上位機(jī)對(duì)設(shè)備的控制。
在單片機(jī)的數(shù)據(jù)存儲(chǔ)空間中定義數(shù)據(jù)的接收和發(fā)送緩沖區(qū),單片機(jī)發(fā)送的數(shù)據(jù)首先送入發(fā)送緩沖區(qū)中,接收的數(shù)據(jù)放入到接收緩沖區(qū)中。對(duì)于單片機(jī)和主機(jī),數(shù)據(jù)緩沖區(qū)是一個(gè)公用的區(qū)域。本文定義兩個(gè)緩沖區(qū):
unsigned char TxBuff[20];//數(shù)據(jù)發(fā)送緩沖區(qū)
unsigned char RxBuff[20];//數(shù)據(jù)接收緩沖區(qū)
定義單片機(jī)中LED的地址為0,當(dāng)?shù)刂分袛?shù)據(jù)為0時(shí),設(shè)備打開,非0時(shí),設(shè)備關(guān)閉。當(dāng)單片機(jī)接收到主機(jī)打開和關(guān)閉設(shè)備的指令時(shí),處理函數(shù)如下:
CRC=CRC16MODBUS(RxBuff,6);//CRC校驗(yàn)
CRCH =CRC>>8; //獲取CRC校驗(yàn)高位
CRCL =CRC&0xff; //獲取CRC校驗(yàn)低位
if(RxBuff[6]==CRCH&&RxBuff[7]==CRCL)//判斷CRC校驗(yàn)是否正確
{
if(RxBuff[0]==Add)//判斷地址是否是本機(jī)地址
{
if(RxBuff[0]==0x05)//判斷是否是05功能碼
{
Regadd=RxBuff[2]*256+RxBuff[3];//獲取寄存器地址
if(Regadd==0)
{
if(RxBuff[4]==0x00) //判斷打開還是關(guān)閉
LED=0; //打開設(shè)備
else
LED=1; //關(guān)閉設(shè)備
TxBuff[0]=RxBuff[0]; //設(shè)備地址
TxBuff[1]=RxBuff[1]; //功能碼
TxBuff[2]=RxBuff[2]; //地址高位
TxBuff[3]=RxBuff[3]; //地址低位
TxBuff[4]=RxBuff[4]; //數(shù)據(jù)位
TxBuff[5]=RxBuff[5]; //數(shù)據(jù)位
CRC=CRC16MODBUS(TxBuff,6);//CRC 校驗(yàn)
TxBuff[6]=CRC>>8; //CRC校驗(yàn)高位
TxBuff[7]=CRC&0XFF; //CRC校驗(yàn)低位
TxDell();//向主機(jī)發(fā)送響數(shù)據(jù)
}
}
}
}
上位機(jī)發(fā)送協(xié)議指令:0105 00 00 00 00 CD CA,單片收到指令打開設(shè)備,并返回響應(yīng)指令。上位機(jī)發(fā)送協(xié)議指令:0105 00 00 FF 00 8C 3A,單片收到指令關(guān)閉設(shè)備,并返回響應(yīng)指令。對(duì)于現(xiàn)場(chǎng)溫濕度信息的采集,主機(jī)采用03功能碼數(shù)據(jù)指令進(jìn)行溫濕度數(shù)據(jù)的采集,單片機(jī)執(zhí)行指令將數(shù)據(jù)傳輸?shù)缴衔粰C(jī)的組態(tài)軟件中進(jìn)行顯示。
本文通過在單片機(jī)上運(yùn)行MODBUS從機(jī)通信協(xié)議程序,以計(jì)算機(jī)作為上位機(jī),通過上位機(jī)發(fā)送指令對(duì)單片機(jī)進(jìn)行遠(yuǎn)程控制和現(xiàn)場(chǎng)信息的采集。經(jīng)過產(chǎn)品開發(fā)研究,驗(yàn)證了基于RS-485通信網(wǎng)絡(luò)和MODBUS通信協(xié)議實(shí)現(xiàn)上位機(jī)和單片機(jī)通信的可行性,達(dá)到了預(yù)期的效果。