IP地址的類型共有4種(如圖3所示):A類用于處理超大型網(wǎng)絡(luò),最多16387064個主機(1~126);B類網(wǎng)絡(luò)最多可有64516個主機(網(wǎng)絡(luò)地址的第一段為128~191);C類用于小型網(wǎng)絡(luò),最多可有254個主機(網(wǎng)絡(luò)地址的第一段為192~223);D類用于多點播送,用于多目的信息的傳輸。全零(“0.0.0.0”)地址對應(yīng)于當(dāng)前主機,全1地址(“255.255.255.255”)是當(dāng)前子網(wǎng)的廣播地址。
TCP是基于傳輸層的協(xié)議,協(xié)議文件可從RFC793得到,使用廣泛,面向連接的可靠協(xié)議。它能把報文分解為數(shù)段,在目的站再重新裝配這些段,支持重新發(fā)送未被收到的段,提供兩臺設(shè)備間的全雙工連接,允許它們高效地交換大量數(shù)據(jù)。TCP使用滑動窗口協(xié)議來高效使用網(wǎng)絡(luò)。由于TCP很少干預(yù)底層投遞系統(tǒng)的工作,它適應(yīng)各種投遞系統(tǒng),且提供流量控制,能使各種不同速率的系統(tǒng)進行通信。報文段是TCP所使用的基本傳輸單元,用于傳輸數(shù)據(jù)或控制信息。
(2)用戶自定義功能代碼有兩組,分別為65~72和100~110,無需認(rèn)可,但不保證代碼使用的唯一性。如變?yōu)楣泊a,需交RFC認(rèn)可。
要完成VB與PLC等設(shè)備的以太網(wǎng)通信要用到Winsock控件,在此有必要對該控件作較詳細的說明。Winsock是一個ActiveX控件,需要要手動添加許多項目,其步驟如下:
(4)如圖7所示,在部件選項卡就會出現(xiàn)Winsock控件。
圖7 Winsock控件
7、Winsock控件的基本屬性
此控件對于用戶在運行時不可見,提供了一個簡單的途徑訪問TCP及UDP網(wǎng)絡(luò)服務(wù)而無需了解底層細節(jié),使用時你只需設(shè)置屬性、在恰當(dāng)?shù)臅r候調(diào)用它提供的方法即可。
主要屬性有:
BytesReceived:返回當(dāng)前緩沖區(qū)中的字節(jié)數(shù)量,我們可以使用 GetData 方法以接收數(shù)據(jù)。只讀且設(shè)計時不可用。
LocalHostName:返回本機名字符串,設(shè)計時不可用。
LocalIP:返回以(xxx.xxx.xxx.xxx)格式表達的IP地址串。設(shè)計時不可用,運行時只讀。
LocalPort :本機使用接收端口可讀寫,設(shè)計時可用,Long型。對于客戶,如果無需指定端口,則用端口0發(fā)送數(shù)據(jù)。在此情況下,控件將隨機選擇一個端口。在一個連接確定后,為TCP的端口。對于服務(wù)器,指用于監(jiān)聽的端口。如設(shè)置為0,則用隨機數(shù)。在調(diào)用Listen 方法后,該屬性自動包含用到的端口。端口0總是用于在兩計算機間建立動態(tài)連接?蛻粝Mㄟ^端口0獲得一個隨機端口以”回調(diào)”連接服務(wù)器。
Protocol :套接字類型,為TCP或UDP二者之一,缺省為TCP類型。設(shè)置為sckTCPProtocol表示TCP協(xié)議sckUDPProtocol表示UDP協(xié)議。在此屬性被重置之前需用Close方法關(guān)閉之。
RemoteHostIP:遠程主機的IP地址。對于客戶程序,在連接確定后使用Connect方法,此屬性包含遠程主機的IP名串。對于服務(wù)器程序,在引入連接需求后(Connection Request 事件),此屬性包含IP串。當(dāng)使用UDP套接字,在Data Arrival事件發(fā)生后,此屬性為發(fā)送UDP數(shù)據(jù)的機器IP地址串。
RemotePort:連接套接字端口值。例如通常HTTP應(yīng)用使用80端口,F(xiàn)TP則使用21。
State:控件的狀態(tài), 只讀且設(shè)計時不可用?蔀橐韵轮担
常量描述
sckClosed 0 缺省值,關(guān)閉套接字
sckOpen 1 打開套接字
sckListening 2 正監(jiān)聽端口
sckConnectionPending 3 正在進行未定的連接
sckResolvingHost 4 正解析主機地址
sckHostResolved 5 主機地址已解析
sckConnecting 6 正在連接
sckConnected 7 已連接
sckClosing 8 連接關(guān)閉
sckError 9 錯誤
8、VB與PLC基于MODBUS TCP的以太網(wǎng)通信的實現(xiàn)
以下舉例說明如何實現(xiàn)VB與PLC的以太網(wǎng)通信。
(1)控制要求:用交替型按鈕控制Y0,并用指示燈顯示Y0狀態(tài)(綠色為運行,紅色為停止);能夠?qū)100、D200兩個寄存器進行數(shù)值寫入與讀出的操作。
(2)實現(xiàn)思路:同樣Y0的地址分別為H0500。寫入FF00為ON,0000為OFF,按功能碼05操作;D100,D200地址分別為H1064,H10C8,按功能碼03操作即可實現(xiàn)寄存器的讀功能,按功能碼10H操作即可實現(xiàn)寄存器的寫功能。
(3)VB接口的設(shè)計如圖8所示

圖8 監(jiān)控程序界面圖
在界面中用按鈕控制Y0的ON/OFF及D100、D200數(shù)據(jù)的寫與讀;用shape組件做指示燈,指示Y0的ON/OFF狀態(tài);用Winsock控件實現(xiàn)PLC與VB的通信。
(1)實現(xiàn)功能的代碼構(gòu)成
(2)建立網(wǎng)絡(luò)連接
Private Sub Command1_Click()
Winsock1.Close
Winsock1.Connect Text1, 502
Label2.Caption = "Version: 1.0 : " + Format(Now, "mmm dd yyyy Hh:Nn:Ss")
Command1.Enabled = False
Command1.Enabled = False
Text1.Enabled = False
End Sub
(2)、Y0的ON/OFF控制
Private Sub Comd_send_Click()
On Error GoTo ErrProc
Dim sendstr(14) As Byte
sendstr(0) = &H0 '交換識別號高字節(jié),通常為0
sendstr(1) = &H0 '交換識別號低字節(jié),通常為0
sendstr(2) = &H0 '協(xié)議識別號高字節(jié),為 0
sendstr(3) = &H0 '協(xié)議識別號低字節(jié),為 0
sendstr(4) = &H0 '字節(jié)長度高字節(jié)
sendstr(5) = &H9 '以下字節(jié)長度低字節(jié)
sendstr(6) = &HFF '單元識別號,確省為 255
sendstr(7) = &H5 '寫一個線圈命令代碼
sendstr(8) = &H0 '寫線圈的起始地址高字節(jié)
sendstr(9) = &H1'寫線圈的起始地址低字節(jié)
sendstr(10) = a '=FF打開線圈,=00關(guān)閉線圈
sendstr(11) = &H0 '
Dim aStr As String
Dim i, j As Integer
For i = 0 To 11
aStr = aStr & Chr(sendstr(i))
Next
Winsock1.SendData aStr
Exit Sub
ErrProc:
MsgBox "傳輸數(shù)據(jù)失敗", vbCritical, "網(wǎng)絡(luò)傳輸"
End Sub
(3)線圈狀態(tài)顯示及寄存器讀出數(shù)據(jù)顯示
Private Sub winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strdata() As Byte
Dim i, j As Integer
Dim s As String
Dim s1 As String
Dim IO As Byte
i = Winsock1.BytesReceived
ReDim strdata(i)
Winsock1.GetData strdata, vbByte, i
For j = 0 To i - 1
s = s + Hex(strdata(j))
Next
If s Like "*5*" Then
s1 = Mid(s, 12, 2)
If s1 = "FF" Then
IO = 1
a = &H0
Else
IO = 0
a = &HFF
End If
If IO = 1 Then
Shape1.FillColor = RGB(0, 255, 0) 'green
Labl3.Caption = "IO點接通"
Else
Shape1.FillColor = RGB(255, 0, 0) 'red
Labl3.Caption = "IO點斷開"
End If
End If If s Like "*3*" Then
Text3.Text = Text3.Text + Mid(s, 11) + ""
End If
(4)、讀多個寄存器數(shù)據(jù)
End Sub Private Sub Command4_Click()
On Error GoTo ErrProc
Dim str(12) As Byte
str(0) = &H0 '交換識別號高字節(jié),通常為 0
str(1) = &H0 '交換識別號低字節(jié),通常為 0
str(2) = &H0 '協(xié)議識別號高字節(jié),為 0
str(3) = &H0 '協(xié)議識別號低字節(jié),為 0
str(4) = &H0 '字節(jié)長度高字節(jié)
str(5) = &H6 '以下字節(jié)長度低字節(jié)
str(6) = &HFF '單元識別號,確省為 255
str(7) = &H3 '讀多個寄存器命令代碼
str(8) = &H10 '讀數(shù)據(jù)的起始地址高字節(jié)
str(9) = &HC8 '讀數(shù)據(jù)的起始地址低字節(jié)
str(10) = &H0 '數(shù)據(jù)長度高字節(jié)
str(11) = &H1 '數(shù)據(jù)長度低字節(jié)
Dim bStr As String
Dim i As Integer
For i = 0 To 11
bStr = bStr & Chr(str(i))
Next
Winsock1.SendData bStr
Exit Sub
ErrProc:
MsgBox "傳輸數(shù)據(jù)失敗", vbCritical, "網(wǎng)絡(luò)傳輸"
End Sub
D100寄存器的寫入操作類似,由于篇幅所限其他代碼在此就不再贅述。
9.結(jié)速語
工業(yè)以太網(wǎng)是工業(yè)自動化網(wǎng)絡(luò)發(fā)展的必然趨勢,為了對工業(yè)設(shè)備進行實時的管理與監(jiān)控,工業(yè)以太網(wǎng)設(shè)備大多都支持遠程管理,而且各廠商業(yè)都有各自的網(wǎng)絡(luò)管理軟件以提供對網(wǎng)絡(luò)設(shè)備進行友好的圖形化界面操作。管理員還可以通過遠程telnet或web界面的方式直接對設(shè)備進行調(diào)試。完善的兼容性,可靠的穩(wěn)定性,對惡劣環(huán)境的適應(yīng)性,強大的冗余能力和方便的可管理性,是人們越來越多地在網(wǎng)絡(luò)設(shè)計過程中采用工業(yè)以太網(wǎng)的原因,而這也勢必成為工業(yè)以太網(wǎng)在越來越多的網(wǎng)絡(luò)環(huán)境里大顯身手的重要契機。借臺達即將推出以太網(wǎng)模塊之際撰寫此文,希望能夠為其以太網(wǎng)模塊的推廣提供一些幫助。由于本人水平有限本文編寫難免會有錯漏之處,也請讀者給予批評指正。