王曉寧,黃傳偉,郭 劍,王 潔,李斯偉,魯茗莉
Modbus協(xié)議在單片機(jī)通信中的應(yīng)用研究
王曉寧,黃傳偉,郭 劍,王 潔,李斯偉,魯茗莉
目的:研制一套單片機(jī)控制系統(tǒng),用于單片機(jī)與外部設(shè)備觸摸屏之間的數(shù)據(jù)通信,實(shí)現(xiàn)人機(jī)交互操作。方法:對(duì)基于標(biāo)準(zhǔn)Modbus協(xié)議的觸摸屏和單片機(jī)STC89C58RD+之間的串行通信方法進(jìn)行研究,硬件接口采用標(biāo)準(zhǔn)RS232協(xié)議,觸摸屏作主機(jī),STC作從機(jī)。結(jié)果:經(jīng)實(shí)際測(cè)試,實(shí)現(xiàn)了通過(guò)觸摸屏對(duì)整個(gè)系統(tǒng)進(jìn)行顯示和操作等功能。結(jié)論:該方法穩(wěn)定可靠,可實(shí)現(xiàn)人機(jī)交互控制,且軟硬件設(shè)計(jì)、制作簡(jiǎn)便,易于實(shí)現(xiàn),達(dá)到了設(shè)計(jì)要求。
Modbus協(xié)議;觸摸屏;單片機(jī);串行通信
單片機(jī)(設(shè)備)之間的相互通信以及單片機(jī)與個(gè)人計(jì)算機(jī)(PC)之間的通信[1-2],最常用到的就是RS232(recommended standard,RS代表推薦標(biāo)準(zhǔn),232是標(biāo)志號(hào))通信接口以及其通信協(xié)議[3]。它是由美國(guó)電子工業(yè)協(xié)會(huì)(Electronic Industries Association,EIA)所制定的異步傳輸標(biāo)準(zhǔn)接口。該接口標(biāo)準(zhǔn)具有使用方便、安裝簡(jiǎn)單、在短距離內(nèi)通信可靠性強(qiáng)、全雙工工作、價(jià)格低廉等優(yōu)點(diǎn),在微型計(jì)算機(jī)、工業(yè)現(xiàn)場(chǎng)和實(shí)驗(yàn)室設(shè)備等通信過(guò)程中得到廣泛應(yīng)用。
隨著通用串行總線(universal serial bus,USB)接口標(biāo)準(zhǔn)的推出和普及[4],RS232接口標(biāo)準(zhǔn)的應(yīng)用受到非常大的沖擊,一度出現(xiàn)被取代的趨勢(shì)。但隨著RS232-USB、RS232-TCP/IP、RS232-RS485和RS232 -RS422等接口標(biāo)準(zhǔn)自動(dòng)轉(zhuǎn)換模塊的出現(xiàn),RS232接口標(biāo)準(zhǔn)又恢復(fù)了勃勃生機(jī),依靠其無(wú)可比擬的簡(jiǎn)單、易用、低成本等特點(diǎn),繼續(xù)得到廣大研發(fā)工程師的喜愛(ài)與認(rèn)可。目前,RS232接口標(biāo)準(zhǔn)依然是工業(yè)控制和通信領(lǐng)域使用最多的接口標(biāo)準(zhǔn),而Modbus通信協(xié)議是在RS232接口通信中最常用到的一種工業(yè)級(jí)現(xiàn)場(chǎng)總線協(xié)議[5]。
Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個(gè)品牌)在1979年發(fā)明的,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議[6]。在中國(guó),Modbus已經(jīng)成為國(guó)家標(biāo)準(zhǔn)(《GB/T 19582—2008》)。Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言,通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)和其他設(shè)備之間可以通信。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)、使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一個(gè)控制器請(qǐng)求訪問(wèn)其他設(shè)備的過(guò)程、如何回應(yīng)來(lái)自其他設(shè)備的請(qǐng)求以及怎樣偵測(cè)錯(cuò)誤并記錄。Modbus制定了消息域格局和內(nèi)容的公共格式。
Modicon控制器上的標(biāo)準(zhǔn)Modbus端口是使用一個(gè)RS232兼容的串行接口,它定義了連接口的針腳、電纜、信號(hào)位、傳輸波特率、奇偶校驗(yàn)。控制器通信使用主-從技術(shù),即僅一個(gè)設(shè)備(主設(shè)備)能初始化傳輸(查詢),其他設(shè)備(從設(shè)備)根據(jù)主設(shè)備查詢提供的數(shù)據(jù)做出相應(yīng)反應(yīng)。主設(shè)備可單獨(dú)和從設(shè)備通信,也可以廣播方式和所有從設(shè)備通信??刂破骺梢栽O(shè)置為2種傳輸模式——ASCII(美國(guó)標(biāo)準(zhǔn)信息交換代碼)或RTU(遠(yuǎn)程終端單元)中的任何一種在標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)中通信。RTU模式通信時(shí),消息中的每8 bit包含2個(gè)4 bit的十六進(jìn)制字符。這種方式的主要優(yōu)點(diǎn)是在同樣的波特率下,可比ASCII方式傳送更多的數(shù)據(jù)。本文采用RTU模式。
RTU模式中每個(gè)字節(jié)的格式如下所示:
(1)編碼系統(tǒng):采用二進(jìn)制方式進(jìn)行編碼。(2)初始時(shí)間間隔:每次消息發(fā)送至少要以3.5個(gè)字符時(shí)間的停頓間隔開始。(3)數(shù)據(jù)位:1個(gè)起始位;8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送;奇偶校驗(yàn)時(shí)1位,無(wú)校驗(yàn)時(shí)0位;帶校驗(yàn)時(shí)1位停止位,無(wú)校驗(yàn)時(shí)2位停止位。(4)錯(cuò)誤檢測(cè)域:CRC(循環(huán)冗余校驗(yàn)碼)校驗(yàn)。
Modbus具有以下幾個(gè)顯著特點(diǎn):
(1)標(biāo)準(zhǔn)、開放,用戶可以免費(fèi)、放心地使用Modbus協(xié)議,不需要交納許可證費(fèi),也不會(huì)侵犯知識(shí)產(chǎn)權(quán);(2)Modbus可以支持多種電氣接口,如RS232、RS485等,還可以在各種介質(zhì)上(如雙絞線、光纖、無(wú)線等)傳送;(3)Modbus的幀格式簡(jiǎn)單、緊湊、通俗易懂,用戶容易使用,開發(fā)簡(jiǎn)便。
在本文中采用深圳市宏晶科技設(shè)計(jì)生產(chǎn)的單片機(jī)STC89C58RD+作為系統(tǒng)的MCU(微控制單元)[7],采用標(biāo)準(zhǔn)Modbus協(xié)議通過(guò)RS232硬件接口與深圳市顯控自動(dòng)化技術(shù)有限公司出品的SK系列彩色觸摸屏SK-043AE(下面簡(jiǎn)稱“觸屏”)進(jìn)行人機(jī)交互(HMI)控制操作[8]。系統(tǒng)通信連接如圖1所示。
圖1 系統(tǒng)通信連接示意圖
2.1 Modbus主從機(jī)的通信幀格式
以觸屏作為Modbus通信主機(jī),MCU作為從機(jī)[9],這樣做的最大好處是當(dāng)屏上的內(nèi)容或參數(shù)進(jìn)行修改時(shí),能夠第一時(shí)間主動(dòng)通知MCU進(jìn)行相應(yīng)的動(dòng)作調(diào)整。另外,大大地減少了MCU的資源開銷,只需響應(yīng)命令動(dòng)作即可。
在本文應(yīng)用的觸屏主機(jī)通信中[10],主要涉及到的Modbus協(xié)議功能碼為0×01、0×02、0×03、0×04、0× 05、0×06、0×010,其對(duì)應(yīng)的可操作寄存器及其地址范圍見(jiàn)表1。
下面以功能碼0×01為例來(lái)介紹Modbus主從機(jī)通信的數(shù)據(jù)幀格式。
功能碼0×01的目的是讀取從機(jī)中的相應(yīng)線圈,也就是從機(jī)離散量輸出口的開關(guān)狀態(tài)。請(qǐng)求幀格式為:從機(jī)地址+0×01+線圈起始地址+線圈數(shù)量+CRC檢驗(yàn)。其具體幀格式見(jiàn)表2。
響應(yīng)幀格式為:從機(jī)地址+0×01+字節(jié)數(shù)+線圈狀態(tài)+CRC檢驗(yàn)。其具體幀格式見(jiàn)表3。
在從機(jī)響應(yīng)程序編寫時(shí),還有針對(duì)發(fā)生錯(cuò)誤響應(yīng)時(shí)的錯(cuò)誤響應(yīng)幀格式,這里不再細(xì)述。
表1 觸屏對(duì)應(yīng)可操作寄存器及其地址范圍
表2 功能碼0x01請(qǐng)求幀格式
表3 功能碼0x01響應(yīng)幀格式
2.2 MCU程序的工作流程設(shè)計(jì)
在作為Modbus從機(jī)通信的MCU主程序設(shè)計(jì)中,主要考慮在主流程中對(duì)相應(yīng)參數(shù)進(jìn)行通信前的準(zhǔn)備和接收后的響應(yīng),以及串口中斷接收主機(jī)觸屏發(fā)來(lái)的數(shù)據(jù)和定時(shí)器中斷對(duì)接收數(shù)據(jù)的解析及響應(yīng)回傳處理[11]。MCU程序的工作流程如圖2所示。
2.3 MCU軟件的編程設(shè)計(jì)(部分代碼)
這里著重介紹從機(jī)單片機(jī)的軟件開發(fā)中與通信相關(guān)的程序設(shè)計(jì)編寫,并給出部分源代碼。采用標(biāo)準(zhǔn)C語(yǔ)言在Keil uVision 3開發(fā)環(huán)境下進(jìn)行源代碼開發(fā)設(shè)計(jì),編譯調(diào)試正常。
//一些用到的全局變量
unsigned char rece_index=0; //實(shí)際接收數(shù)組長(zhǎng)度計(jì)數(shù)
unsigned char idata sendBuf[75];//定 義 發(fā) 送 數(shù)組,最大允許發(fā)送32個(gè)字,64個(gè)字節(jié)
unsigned char idata receBuf[75];//定 義 接 收 數(shù)組,最大允許接收32個(gè)字,64個(gè)字節(jié)unsigned char*ps=sendBuf; //發(fā)送數(shù)據(jù)指針unsigned char*pr=receBuf; //接收數(shù)據(jù)指針unsigned int xdata WordBuf[128]; //定義字尋址區(qū),32個(gè)short型,有符號(hào)型
unsigned int xdata BitBuf[32]; //定 義 位 尋 址
區(qū),10~31內(nèi)部位,0~9輸出口
圖2 MCU程序的設(shè)計(jì)流程圖
unsigned char xdata inputBit[32];//輸入位狀態(tài)
unsigned int*pw=WordBuf; //字指針
unsigned int*pb=BitBuf; //位指針
unsignedintsendlength; //發(fā)送數(shù)據(jù)長(zhǎng)度
//主流程
void main()
{
init(); //執(zhí)行初始化程序,T0設(shè)定為1 ms定時(shí)器,//串口 mode1,N-8-1-1,9 600 bps
while(1) //執(zhí)行運(yùn)行程序
{…… //進(jìn)行相關(guān)數(shù)據(jù)分析處理與收發(fā)準(zhǔn)備
}
}
//串口中斷服務(wù)程序
void ser()interrupt 4 //串口中斷的序號(hào)是4
{
RI=0; //產(chǎn)生串口中斷時(shí)RI被硬件置1,需要用軟件清0;
comm_END=4; //9 600 bps下,等待3.5個(gè)字節(jié)需要約4 ms的時(shí)間
Reciver_bit=1; //產(chǎn)生一次中斷置一次位
Reciver_Buf=SBUF; //將接收到的數(shù)據(jù)賦給一個(gè)變量;
receBuf[rece_index++]=Reciver_Buf;
//將接收到的數(shù)據(jù)存入接收數(shù)組
}
//T0中斷服務(wù)程序
//1 ms定時(shí)中斷,用于判斷通信幀結(jié)束
void comm_stop()interrupt 1
{
if(Reciver_bit&&comm_END!=0)
comm_END--; //等待4 ms延時(shí)if(comm_END==0) {
Reciver_bit=0; //幀接收,對(duì)標(biāo)志位清零
//判斷是否為本站地址或者是廣播地址,有效報(bào)文的字節(jié)數(shù)量最少是8個(gè)字節(jié)
if((*(pr+0)==0x01||*(pr+0)==0x00)&&rece_index>=8)
{ AnalyzeRecieve(); //分析并生成響應(yīng)報(bào)文if(*(pr+0)==0x01) send_comm(); //發(fā)送響應(yīng)報(bào)文,廣播模式下不用返回
}
comm_END=4; //重新賦延
時(shí)初值
rece_index=0; //數(shù)組長(zhǎng)度
清零
for(i=0;i<75;i++)receBuf[i]=0; //清空接收數(shù)組
Reciver_Buf=0;
}
}
//分析并生成響應(yīng)報(bào)文
void AnalyzeRecieve()
{
…… //計(jì)算校驗(yàn)CRC,得到a1 CRC低字節(jié),a2 CRC高字節(jié)
if(a1==*(pr+(rece_index-2))&&a2==*(pr+ rece_index-1))//校驗(yàn)正確
{
switch(*(pr+1))
{ case 0×01:Recirve_01();break;
//讀位狀態(tài)case 0x02:Recirve_02();break;
//讀輸入位狀態(tài)case 0x03:Recirve_03();break;
//讀寄存器case 0x04:Recirve_04();break;
//讀輸入寄存器
case 0x05:Recirve_05();break;
//寫單個(gè)位狀態(tài)case 0x06:Recirve_06();break;
//寫單個(gè)寄存器case 0x10:Recirve_10();break;
//寫多個(gè)寄存器default:errorsend(*(pr+1),0×04); break;//不支持的功能碼
}
}
else //返回校驗(yàn)錯(cuò)誤代碼
{
…… //進(jìn)行錯(cuò)誤代碼響應(yīng)處理
}
}
//分析01功能碼報(bào)文,產(chǎn)生響應(yīng)報(bào)文 讀位狀態(tài)void Recirve_01()
{
…… //相關(guān)局部變量設(shè)置
startaddH=*(pr+2);
startaddL=*(pr+3);
bit_numH=*(pr+4);
bit_numL=*(pr+5);
startadd=(startaddH<<8)+startaddL; //要返回的起始地址
bit_num=(bit_numH<<8)+bit_numL; //要讀的字節(jié)數(shù)量,單位是位
if((startadd+bit_num)>=32) //最多允許32位,從第4位開始讀
{
errorsend(0x01,0x02); //響 應(yīng) 寄存器
數(shù)量超出范圍
}
else //準(zhǔn)備發(fā)送回傳的位狀態(tài)數(shù)據(jù)包
{
*(ps+0)=0x01; //站號(hào)
*(ps+1)=0x01; //功能碼
if((bit_num%8)==0)*(ps+2)=(bit_num)/8; //要返回的字節(jié)數(shù)
else*(ps+2)=((bit_num)/8)+1; //不能 整除8的時(shí)候要多返回一個(gè)字節(jié)
for(i=0;i<*(ps+2);i++)
{ *(ps+3+i)=0; //先清零復(fù)位
for(j=0;j<8;j++) //每8個(gè)
位狀態(tài)組成一個(gè)字節(jié)返回
{ //低位在前,高位在后;此處位指針*ps指向即為需要向觸屏提供的位狀態(tài)參數(shù)
*(ps+3+i)=(u8)((*(pb+startadd+i*8+j)&0× 01)<<j)+*(ps+3+i);
}
}
…… //CRC校驗(yàn),低位在前,高位在后
sendlength=*(ps+2)+5; //設(shè)置響應(yīng)報(bào)文長(zhǎng)度
}
}
目前,雖然各種通信協(xié)議發(fā)展得都很迅速,特別是USB通信接口的應(yīng)用已經(jīng)成為個(gè)人電子娛樂(lè)消費(fèi)產(chǎn)品中最常用到的接口形式,但是在工業(yè)領(lǐng)域應(yīng)用最多的還是Modbus通信協(xié)議。該協(xié)議可應(yīng)用在RS232、RS422、RS485、TCPIP等多種系統(tǒng)接口網(wǎng)絡(luò)中,熟悉和掌握Modbus通信方法是電子工程師設(shè)計(jì)、研發(fā)工業(yè)類和實(shí)驗(yàn)室類設(shè)備通信或組網(wǎng)所應(yīng)具備的一項(xiàng)專業(yè)技能。本文較為系統(tǒng)地介紹了運(yùn)用Modbus通信協(xié)議通過(guò)RS232硬件接口實(shí)現(xiàn)單片機(jī)與彩色觸摸屏的通信和控制,希望能為同行提供一些借鑒和參考。
[1]馬忠梅,籍順心.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,1999.
[2]陳龍三,張琦.8051單片機(jī)C語(yǔ)言控制與應(yīng)用[M].北京:清華大學(xué)出版社,1999.
[3]何立民.MCS-51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)系統(tǒng)配置與接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,2001.
[4] 王曉寧.基于C8051F340單片機(jī)的USB數(shù)據(jù)采集系統(tǒng)[J].醫(yī)療衛(wèi)生裝備,2009,30(7):111-113.
[5]線巖團(tuán),許江淳,鄢大鵬.基于單片機(jī)的MODBUS的協(xié)議實(shí)現(xiàn)[J].云南大學(xué)學(xué)報(bào),2009,31(S2):120-124.
[6]呂國(guó)芳,唐海龍,李進(jìn).基于Modbus RTU的串口調(diào)試軟件的實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(9):236-238.
[7]羅湘,余臻.基于Modbus協(xié)議的單片機(jī)數(shù)據(jù)采集[J].工業(yè)控制計(jì)算機(jī),2009,22(6):75-76.
[8] 深圳市顯控自動(dòng)化技術(shù)有限公司.MODBUS通訊詳細(xì)說(shuō)明[EB/ OL].[2012-06-20].http://www.zhongsou.net/顯控自動(dòng)化/channel/ MODBUS通訊詳細(xì)說(shuō)明.pdf.
[9]孟華,王鵬達(dá),李明偉.基于Modbus協(xié)議的觸摸屏與PIC單片機(jī)的通信實(shí)現(xiàn)[J].儀表技術(shù)與傳感器,2009(10):58-60.
[10]袁臣虎,王臻,李秀艷,等.基于MODBUS協(xié)議的觸摸屏與TMS32 0F2812串行通信研究[J].天津工業(yè)大學(xué)學(xué)報(bào),2010,29(2):63-67.
[11]張桓,趙樹忠.基于Modbus協(xié)議的單片機(jī)與觸摸屏通訊系統(tǒng)設(shè)計(jì)[J].河北理工大學(xué)學(xué)報(bào),2010,32(4):82-87.
(收稿:2013-06-17 修回:2013-08-20)
Application of Modbus Protocol to MCU Communication
WANG Xiao-ning,HUANG Chuan-wei,GUO Jian,WANG Jie,LI Si-wei,LU Ming-li
(Plant of Experimental Instrument,Academy of Military Medical Sciences,Beijing 100850,China)
ObjectiveTo develop a set of MCU control system for the data communication between MCU and the touch screen to achieve human-machine interaction.MethodsThe serial communication method between the touch screen and MCU STC89C58RD+based on Modbus protocol was studied.The hardware interface used standard RS232 protocol,with the touch screen as the host device and STC as the slave one.ResultsTrails proved that the touch screen could realize the functions of display,manipulation and etc.ConclusionThe control system,being stable and reliable,can realize humanmachine interaction,and the design of the hardware and software is convenient,so that the design requirements are met.
Modbus protocol;touch screen;MCU;serial communication
R318;TN914
A
1003-8868(2014)01-0023-04
10.7687/J.ISSN1003-8868.2014.01.023
王曉寧(1974—),男,工程師,主要從事電子控制系統(tǒng)的設(shè)計(jì)研制與醫(yī)學(xué)信號(hào)的測(cè)量與處理,E-mail:wxnamms@sina.com。
100850北京,軍事醫(yī)學(xué)科學(xué)院實(shí)驗(yàn)儀器廠(王曉寧,黃傳偉,郭劍,王 潔,李斯偉,魯茗莉)
[Chinese Medical Equipment Journal,2014,35(1):23-26]