本文介紹了一種基于Modbus 通信協議的eView 觸摸屏與常用的51 單片機的通信方法。該方法通過C51 編程實現Modbus 通信,在51 系列單片機上具有通用性,有一定的借鑒作用。工業控制中經常需要觀察系統的運行狀態或者修改運行參數。觸摸屏能夠直觀、生動地顯示運行參數和運行狀態,而且通過觸摸屏畫面可以直接修改系統運行參數,人機交互性好。單片機廣泛應用于工控領域中,與觸摸屏配合,可組成良好的人機交互環境。觸摸屏與單片機通信,需要根據觸摸屏采用的通信協議為單片機編寫相應的通信程序。Modbus 協議是美國Modicon 公司推出的,一種有效支持控制器之間以及控制器經由網絡(如以太網)與其他設備之間進行通信的協議。本文以STC89C51 單片機和人機電子有限公司的eView 觸摸屏為例,介紹其通信程序的開發過程。
1 系統結構
實現觸摸屏與單片機的通信,主要是解決通信協議的問題。本文使用開放的Modbus 通信協議,以觸摸屏作主站,單片機作從站。eView 觸摸屏本身支持Modbus通信協議,如果單片機也支持Modbus 協議,就可以進行通信了。eview 觸摸屏支持RS-232 和RS-485 兩種通信接口。在工業控制領域,由于RS-485 具有可靠性高、傳輸距離遠、抗干擾能力強等優點,所以在本系統中觸摸屏與單片機通信采用RS-485 連接,傳輸速率設置為9600kbps。RS-485 信號傳輸是一種半雙工的傳輸方式,單片機通過一個RS-232/RS-485 無源轉換器把232 信號轉換成485信號,連接到eView 觸摸屏上。圖l 為該系統的原理圖。

單片機控制系統采用STC89C51 系列單片機,其內部集成MAX810/STC810專用復位電路(原有外部復位可繼續保留,與Intel8051 引腳兼容),具有抗干擾能力強、加密性強、高抗靜電(ESD)、超低功耗等特點,而且價格低廉。在本系統中,觸摸屏是上位機,單片機是下位機。
2Modbus 協議
2.1Modbus 協議簡介
Modbus 協議是應用于電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網絡(如以太網)與其他設備之間可以通信。它已經成為一種通用工業標準。不同廠商生產的控制設備可以通過它連成工業網絡,集中監控。Modbus 協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其他設備的過程.如何回應來自其他設備的請求,以及怎樣偵測錯誤并記錄;制定了消息域格局和內容的公共格式。
當在某一Modbus 網絡上通信時,此協議決定了每個控制器需要知道它們的設備地址,識別按地址發來的消息,以及決定要產生何種行動。如果需要回應,則控制器將生成反饋信息并用Modbus 協議發出。在其他網絡上,包含了M0dhus協議的消息轉換為在此網絡上使用的幀或包結構。
2.2ModbusRTU 通信數據傳輸模式
當控制器設備基于Modbus 協議以RTU 模式通信時,消息中的每個字節包含2 個4 位的十六進制字符。這種方式的主要優點是:在同樣的波特率下,可比ASCII方式傳送更多的數據。
編碼采用8 位二進制,十六進制數0~9 和A~F;消息中每個8 位域都是由
2 個十六進制字符組成。組織結構如下:

2.3ModbusRTU 消息幀結構
ModbusRTU 消息幀結構如下:

(1)地址碼
地址碼為通信傳送的第一個字節。這個寧節表明,由用戶設定地址碼的從機將接收由主機發送來的信息。每個從機都有具有唯一的地址碼,只有符合地址碼的從機才能響應回送,且響應回送均以各自的地址碼開始。主機發送的地址碼則表明將發送到的從機地址,而從機發送的地址碼表明回送的從機地址。地址0用作廣播地址,以使所有的從設備都能認識。
(2)功能代碼
功能代碼為通信傳送的第二個字節。Modbus 通信規約定義可能的代碼范圍是十進制的1~255。當然,有些代碼適用于所有控制器,有些僅適用于某種控制器,還有些保留以備后用。主機發送請求,通過功能碼告訴從機執行什么動作;從機響應請求,從機發送的功能碼與從主機發送來的功能碼一樣,表明從機已響應主機進行操作。如果從機發送的功能碼的最高位為1,則表明從機沒有響應操作或發送出錯,主設備應用程序得到異議的回應后,典型的處理是重發消息。表l 列出了常用Modbus 支持的部分功能碼。

以讀取線圈狀態為例說明。主站發送命令:[設備地址][命令號01][起始寄存器地址高8 位][低8 位][讀取的寄存器數高8 位][低8 位][CRC 校驗的低8位][高8 位]。從站響應:[設備地址][命令號01][返回的字節個數][數據1][數據2]…[數據n][CRC 校驗的低8 位][高8 位]。
(3)數據區
數據區根據功能碼的不同而不同。數據區包含需要從機執行什么動作,或由從機采集的返送信息。這些信息可以是實際數值、設置點、主機發送給從機或從機發送給主機的地址等。例如,功能碼告訴從機讀取寄存器的值,則數據區必須包含要讀取寄存器的起始地址及讀取長度。對于不同的從機,地址和數據信息都不相同。
(4)錯誤校驗碼
主機或從機可用校驗碼判別接收信息是否出錯。錯誤檢測域包含一個16 位的值(用2 個8 位的字符來實現)。錯誤檢測域的內容是通過對消息內容進行“循環冗余檢測”得出的。CRC 域附加在消息的最后,添加時先是低字節然后是高字節,故CRC 的高位字節是發送消息的最后一個寧節。錯誤校驗采用CRC-16 校驗方法。
3 軟件編程
下面是采用C5l 編寫的軟件,主要包括CRC 校驗和終端接收及波特率設置等。由于篇幅有限,其他程序略。
//功能:串口初始化,波特率為9600bps,方式1;
void lnit_Com(void)
{
TMOD=0X20;
PCON=0X00;
SCON=-X50;
TH1=0Xfd;
TL=0Xfd;
TR1=1;
EA=1;
ES=1;
}
//CRC 校驗函數
uint CRC 16(uchar*pushmsg,unsigned short usdatalen)
{
uchar uchCRCHi=0xff; //高CRC字節初始化
uchar uchCRCLO=0xff; //低CRC字節初始化
uint ulndex;
while (usDataLen--) //傳輸消息緩沖區
{
ulndex=uchCRCHi-*pushMsg0++;// 計算CRC
uchCRCHi=uchCRCLO^auchCRCHi[ulndex];
uchCRCLO=uchCRCLO[ulndex];
}
return (uchCRCHi<<8|uchCRCLo);
}
//發送函數和判斷函數
void send(uchar rrbuf[],int sendCount)
{
uchar i,crcHi,crclo,j,k=0;
uchar sendbuf[32];
usDataLen=sendCount-2;
sendbuf[0]=ReceBuf[0];
sendbuf[1]=ReceBuf[1];
sendbuf[2]=sendCount-2;
for(j=3;j<sendCount-2;j++)
{
sendbuf[j]=rrbuf[k];k++;
}
k=o;
crcData=CRC(sendbuf,usDataLen);
crcHi=crcData/256;
crcHi=crcData%256;
senddbuf[sendCount-2]=crcHi;
senddbuf[sendCount-1]=crcLo;
for(i=0;i<sendCount;i++)
{
SBUF=sendbuf[ i ];
while(TI=0);TI=0;
}
}
void Read()
{
switch(startAdress)
{
case 0x002; send(&writcVUf[0],sendcCount);break;
case 0x003; send(rbufl,sendCount );break;
default;
{
SBUF=0x00;while(TI==0 TI=0; );
}
}
}
//數據幀分析處理函數
void crc_Data()
{
crcDataHi=crcData/256;
crcDataHi=crcData/256;
if(crcDataHi==receBuf[6]&crcDataLo==recebuf[7])
{
StartAress=ReceBuf[2] ;
StartAress<<=8;
StartAress=StartAress|ReceBuf[3];
if(ReceBuf[0]==0x00)
{
sendCount=5+2*(ReceBUf[4]*256+ReceBuf[5]);
Read();
}
}
else{SBUF=0x0a;while(TI==0);TI=0;}
}
//串口中斷函數---實現CRC數據信息的分析處理
void cmmmIntProc()interrupt 4{
if(RI){
RI=0;ReceBuf[receCount]=SBUF;
receCount++;usDataLen=receCount-2;
switch(ReceBuf[1])
{
case 0x01;if(receCount>=8)
{receCount=0readbit();} break;
case 0x02;if(receCount>=8)
{receCount=0readbit();} break;
case 0x03;if(receCount>=8)
{receCount=0readbit();} break;
case 0x04;if(receCount>=8)
{receCount=0readbit();} break;
case 0x05;if(receCount>=8)
{receCount=0readbit();} break;
case 0x06;if(receCount>=8)
{receCount=0;WriteVyte();}break;
default; if(receCount>=8)
{
receCount=0;SBUF=0X55;
while(TI==0);
TI=0;
}
}
}
}
4 總結
由于Modhus 協議具有開放性和透明性等特點,而51系列單片機技術成熟、開發成本低,二者的結合將繼續成為各類通信系統設計的首選。本設計方法已經應用于觸摸屏與單片機通信設計,并取得了較好效果。這種方法對于編制類似的通信軟件有一定的借鑒作用,部分程序可以直接移植。
|