| 
 中達電通PLC產(chǎn)品處 王乃全 
摘要:本文重點討論MODBUS ASCII通信協(xié)議及通過VB如何實現(xiàn)與臺達觸摸屏的通信。對于Visual Basic6編程語言亦有簡要的介紹。 
關(guān)鍵詞:Visual Basic    MODBUS ASCII   HMI 
1 引言 
    在自動化工程集成中經(jīng)常遇到VB與觸摸屏通信問題。對于不同的MODBUS通信協(xié)議觸摸屏產(chǎn)品,無論是通信協(xié)議和VB中的編程原理都是一樣的,所不同的僅是MODBUS在PLC和HMI中的地址映射不一樣。為了集中解決這個問題,本文以臺達觸摸屏通訊案例為背景,采用了一個比較簡單的實例描述如何建立雙方的通信,不涉及到更為復(fù)雜的VB與HMI的操作和編程技巧。 
2 串行通信基本概念 
2.1通信的種類 
    通常通信的形式可以分為兩種,并行通信(Parallel Communication)和串行通信(Serial Communication)。所謂并行,既是一次傳輸量為8位;而串行一次只傳1位。這兩種不同的通信模式如圖1所示。 
  
2.2串行通信 
    常用的串行通信也有兩種,分別位RS-232和RS-485。 
(1)RS-232通訊。RS-232的信號準(zhǔn)位乃是參考地線而來的,如圖2所示,傳輸端參考接地端1來傳送數(shù)據(jù);接收端則參考接地端2還原出傳送端的信號準(zhǔn)備。 
  
    由圖2可知,由于兩個接地端準(zhǔn)位不一定一樣,而且很容易受到干擾,所以信號在RS-232線路傳輸時,很容易產(chǎn)生錯誤。 
  
(2)RS-485通訊。RS-485的信號傳輸方式如圖3所示。 
  
    RS-485的信號將被傳送出去時會分成正負兩條線路,當(dāng)?shù)竭_接收端后,在將信號相減還原成原來的信號;如果將原始的信號表示成(DT),而被分成的信號分別標(biāo)示成(D+)及(D-),則DT= (D+)-(D-) 
同樣地,接收端在接收到信號后,也依據(jù)上式還原成原來的樣子。如果線路受到干擾,兩條線路的信號分別為(D+)+Noise   (D-)+Noise。接收端還原信號為 
(DT)= [(D+)+Noise]-[ (D-)+Noise]  
與先前結(jié)果一樣,所以RS-485可以有效的防止噪聲的干擾。 
3 Visual Basic控件 
    VB是微軟的窗口軟件,提供了很多接口成員。對象、屬性、事件、方法就是四個重要的接口。 
3.1卷標(biāo)控件 
    此控件專用于顯示文字,數(shù)字用,顯示如圖4所示。 
  
3.2按鈕控件 
    此控件使用率很高,提供一個供系統(tǒng)用戶操作用的按鈕,如圖5所示。 
  
3.3定時器控件 
    此控件的最大作用在于固定的時間內(nèi)會執(zhí)行所設(shè)置的程序代碼一次,如圖6所示。VB還提供了大量的控件,在此不一一敘述。 
  
3.4MScomm控件 
    要完成VB與PLC等串行設(shè)備的通信,MScomm控件是一個很好用的控件。所以在此有必要對MScomm控件做一個較為詳細的說明。MScomm非標(biāo)準(zhǔn)控件,要手動添加,步驟如下:選擇菜單的【工程】;選擇【部件】;在彈出的對話框中做如圖選擇,在部件選項卡就會出現(xiàn)MScomm控件,如圖7所示。MScomm控件基本屬性如圖8所示。 
  
  
4 MODBUS ASCII通訊協(xié)議(案例) 
    Modbus總線通訊協(xié)議 分為ASCII和RTU兩種。ASCII采用的格式和校驗相對簡單,本文采用ASCII格式,并僅對使用的功能碼進行說明,更多的信息,請參看協(xié)議的詳細說明。 
4.1 通信格式 
| 
 STX  | 
 起始字符 “:”(3AH)  |  
| 
 ADR 1  | 
 通信地址(站號)采用2個字符 
   |  
| 
 ADR 0  |  
| 
 CMD 1  | 
 功能碼。采用2個字符 
 |  
| 
 CMD 0  |  
| 
 DATA(0)  | 
 數(shù)據(jù)項 
 |  
| 
 DATA(1)  |  
| 
 ……….  |  
| 
 DATA(n-1)  |  
| 
 LRC CHK 1  | 
 LRC 校驗碼。采用2個字符 
   |  
| 
 LRC CHK 0  |  
| 
 END 1  | 
 結(jié)束字符。采用2個字符。 
END 1 = CR(0DH),END 0 = LF(0AH)  |    
4.2LRC算法 
    ADR H+CMD H+DATA H,然后取2的補碼 
4.3 功能碼 
05, 寫入線圈 
 
| 
 格式  | 
 例子(十六進制)  |  
| 
 字頭  | 
 3A  |  
| 
 站號  | 
 01  |  
| 
 功能碼  | 
 05  |  
| 
 地址  | 
 05  |  
| 
    | 
 00  |  
| 
 寫入狀態(tài)  | 
 FF  |  
| 
    | 
 00  |  
| 
 LRC 碼  | 
 F6  |   
01, 讀線圈狀態(tài) 
 
| 
 格式  | 
 例子 (十六進制)  |  
| 
 字頭  | 
 3A  |  
| 
 站號  | 
 01  |  
| 
 功能碼  | 
 01  |  
| 
 起始地址  | 
 06  |  
| 
    | 
 14  |  
| 
 讀取數(shù)目  | 
 00  |  
| 
    | 
 25  |  
| 
 LRC 碼  | 
 BF  |   
06, 寫入單個字寄存器 
| 
 格式  | 
 例子(十六進制)  |  
| 
 字頭  | 
 3A  |  
| 
 站號  | 
 01  |  
| 
 功能碼  | 
 06  |  
| 
 寄存器地址  | 
 06  |  
| 
    | 
 00  |  
| 
 寫入的資料  | 
 12  |  
| 
    | 
 34  |  
| 
 LRC 校驗碼  | 
 AD  |    
5 VB與臺達HMI通信的實現(xiàn)(案例) 
5.1 控制要求 
   (1)PC能控制HMI中某個位地址的啟動、停止。 
   (2)在HMI上對某個內(nèi)部寄存器進行數(shù)值修改操作,在PC上能同步顯示。 
5.2設(shè)計思路 
   (1)PC控制的內(nèi)部地址為$2000.0,查看映射表,知道為MODBUS地址為B00001。在PC上按功能碼05操作。 
   (2)HMI上寫入的寄存器地址為$0,查看映射表,知道為MODBUS地址為W40001。在PC上按功能碼03操作。 
   HMI內(nèi)部地址與MODBUS地址映射表    
| 
 MODBUS ADDRESS  | 
 HMI ADDRESS  | 
 描述  |  
| 
 W40001~W41024  | 
 $0~$1023  | 
 內(nèi)部寄存器  |  
| 
 W42001~W43024  | 
 $M0~$M1023  | 
 斷電保持內(nèi)部寄存器  |  
| 
 W44001  | 
 RCPNO  | 
 配方編號寄存器  |  
| 
 W45001~……..  | 
 RCP0~RCPn  | 
 配方寄存器  |  
| 
 B00001~B01024  | 
 $2000.0~$2063.15  | 
 內(nèi)部寄存器(bit)  |  
| 
 B01025~B02048  | 
 $M200.0~$M263.15  | 
 斷電保持內(nèi)部寄存器(bit)  |    
5.3 VB接口的設(shè)計 
  
用按鈕控制$2000.0的啟動停止; 
用timer組件不停的讀取$0的顯示值(十六進制顯示,可以轉(zhuǎn)換為十進制); 
用MScomm控件實現(xiàn)PC與PLC的通信。 
5.4代碼構(gòu)成 
   (1)LRC算法校驗的實現(xiàn): 
Public Function LRC(str As String) As String 
c = 0 
l = Len(str)    
For c = c + 1 To l 
c_data = Mid$(str, c, 2)    
d_lrc = d_lrc + Val("&H" + c_data) 
c = c + 1 
Next c 
If d_lrc > &HFF Then 
   d_lrc = d_lrc Mod &H100 
End If 
h_lrc = Hex(&HFF - d_lrc + 1) 
If Len(h_lrc) > 2 Then 
   h_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2) 
End If 
LRC = h_lrc 
End Function 
(2)讀取$0,也就是W40001數(shù)值: 
Private Sub Timer1_Timer() 
MSComm1.Output = ":" + "010300000001" + LRC("010300000001") + Chr$(13) + Chr$(10) 
'MSComm1.Output = ":" + "00050500FF00" + LRC("00050500FF00") + Chr$(13) + Chr$(10) 
inputstring = MSComm1.Input 
Text1.Text = Mid(inputstring, 8, 4) 
End Sub 
(3)控制$2000.0 ON: 
Private Sub Command1_Click() 
MSComm1.Output = ":" + "00050000FF00" + LRC("00050000FF00") + Chr$(13) + Chr$(10) 
End Sub 
(4)控制$2000.0 OFF: 
Private Sub Command2_Click() 
MSComm1.Output = ":" + "000500000000" + LRC("000500000000") + Chr$(13) + Chr$(10) 
End Sub 
  
(5)HMI中的程序與設(shè)置如圖9所示(要注意【人機站號】與【控制器】的設(shè)置): 
 
  
6 結(jié)束語 
    VB語言使用的簡易為眾多工程技術(shù)人員與串行設(shè)備的通信提供了很大的方便。 
    臺達觸摸屏采用標(biāo)準(zhǔn)的MODBUS協(xié)議,這一協(xié)議目前廣為流行,為大家所熟知,也為大家最終實現(xiàn)通信提供了簡化的平臺。由于臺達所有的機電產(chǎn)品都支持MODBUS協(xié)議,所以,掌握了VB與觸摸屏通信過程,也就等于掌握了PC與臺達所有機電產(chǎn)品的通信。 
參考文獻 
[1]VB與RS-232通信實例. 
[2]VB6從入門到精通. 
[3]DOP系列人機界面應(yīng)用技術(shù)手冊. 
[4]DVP-Protocal.  
		          	
           |