豆勤勤
力控組態(tài)軟件是對現(xiàn)場生產(chǎn)進行監(jiān)控和數(shù)據(jù)采集的一種軟件,可以與現(xiàn)場總線模塊、智能模塊等多種輸入輸出I/O設(shè)備進行通信,本文采用的力控組態(tài)軟件對于采用不同協(xié)議通信的I/O設(shè)備,提供具有針對性的I/O驅(qū)動程序.實時數(shù)據(jù)庫就借助于I/O驅(qū)動程序?qū)/O設(shè)備執(zhí)行數(shù)據(jù)的采集與回送,與I/O驅(qū)動程序構(gòu)成服務(wù)器與客戶端的結(jié)構(gòu)模式[1].
該項目是基于某大型鋼廠鋼坯標(biāo)識碼的讀碼監(jiān)控系統(tǒng).由于項目中采用的是國外的某款掃碼槍設(shè)備,在力控組態(tài)軟件中并沒有提供其通訊驅(qū)動程序,而開發(fā)驅(qū)動程序工作量較大,因此需要采取其他方法實現(xiàn)與上位機的通信.對于力控不提供驅(qū)動程序的I/O設(shè)備,本項目采用的是借助于VB應(yīng)用程序軟件,利用力控向控制層和管理層提供的軟、硬件全部接口實現(xiàn)間接控制的方法.
VB中提供有WinSock控件[2],此控件能夠通過TCP協(xié)議連接到遠程的機器并進行數(shù)據(jù)交換.而力控組態(tài)軟件和VB之間又可以通過DDE協(xié)議來實現(xiàn)通信.整個工程項目實現(xiàn)過程如圖1所示.
圖1
VB是一個可視化的窗口開發(fā)環(huán)境,可以方便的應(yīng)用到很多控制系統(tǒng)中.在使用WinSock控件時,可以使用的協(xié)議包括TCP和UDP.兩種協(xié)議之間的重要區(qū)別在于它們的連接狀態(tài).TCP協(xié)議是一種基于連接的協(xié)議,可以將它同電話系統(tǒng)相比.在開始數(shù)據(jù)輸出之前,用戶必須先建立連接.UDP協(xié)議是一種無連接協(xié)議,兩臺計算機之間的傳輸類似于傳遞郵件,消息從一臺計算機發(fā)送到另一臺計算機,但是兩者之間沒有明確的連接.在應(yīng)用程序使用TCP協(xié)議,首先必須決定應(yīng)用程序是服務(wù)器還是客戶端.如果要創(chuàng)建一個服務(wù)器端,那么應(yīng)用程序需要“監(jiān)聽”指定的端口.當(dāng)客戶端提出連接請求時,服務(wù)器端能夠接受請求并建立連接.在連接建立之后,客戶端與服務(wù)器端可以自由地互相通訊.本項目中VB是作為客戶端,與掃碼設(shè)備進行數(shù)據(jù)通訊.
在VB中,由于WinSock通信控件不是內(nèi)置控件,在使用時,需要將其添加到工具箱中.選擇工程-部件-控件,選中Microsoft WinSock Control復(fù)選框,點擊確定,就添加成功了.此時選擇WinSock控件,添加到窗體上,利用此控件編程就可實現(xiàn)VB和設(shè)備通信.使用控件時,先對WinSock控件設(shè)置相應(yīng)的屬性和事件.首先必須知道服務(wù)器計算機名或IP地址及服務(wù)器進行偵聽的端口,然后調(diào)用Connect方法.
WinSock控件的參數(shù)設(shè)置如下:
Private Sub Command1_Click()
Dim StartTime
Winsock1.RemoteHost="169.254.6.244"
Winsock1.RemotePort=23
Winsock1.Connect
StartTime=Timer
Do While ((Timer<StartTime+2)And(Winsock1.State<> 7))
DoEvents
Loop
If(Winsock1.State = 7)Then
Text5.Text= "Connected"
Text7.Text= "1"
Text5.BackColor= &HFF00&
Command1.Enabled = False
Else
Text5.Text="Can't connect to"+Text1.Text
Text5.BackColor= &HFF
Text7.Text= "0"
End If
End Sub
接收數(shù)據(jù)程序如下:
Private Sub Command4_Click()
If(Winsock1.State=7)Then
StartLow=Val(Text2.Text)Mod 256
StartHigh=Val(Text2.Text)256
LengthLow=Val(Text3.Text)Mod 256
LengthHigh=Val(Text3.Text)256
MbusWriteQuery=Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(7+2*Val(Text3.Text))+Chr(1)+Chr(16)+Chr(StartHigh)+Chr(Start-Low)+Chr(0)+Chr(Val(Text3.Text))
For i=0 To Val(Text3.Text)-1
ByteLow=Val(Text4(i).Text)Mod 256
ByteHigh=Val(Text4(i).Text)256
MbusWriteQuery=MbusWriteQuery+Chr(ByteHigh)+Chr(ByteLow)
Next i
MbusRead=False
MbusWrite=True
Winsock1.SendData MbusWriteQuery
ModbusWait=True
ModbusTimeOut=0
Timer1.Enabled=True
Else
MsgBox("Device not connected via TCP/IP")
End If
End Sub
VB與力控進行通信數(shù)據(jù)傳輸可以通過動態(tài)數(shù)據(jù)交換DDE來進行.
動態(tài)數(shù)據(jù)交換(DDE)[3,4]是微軟的一種數(shù)據(jù)通信形式,它使用共享的內(nèi)存在應(yīng)用程序之間進行數(shù)據(jù)交換,能夠及時更新數(shù)據(jù),在兩個應(yīng)用程序之間信息是自動更新的,無須用戶參與.兩個同時運行的程序間通過DDE方式交換數(shù)據(jù)時他們之間是客戶端/服務(wù)器關(guān)系;數(shù)據(jù)通信時,接收信息的應(yīng)用程序稱作客戶端,提供信息的應(yīng)用程序稱作服務(wù)器.一個應(yīng)用程序可以是DDE客戶端或是DDE服務(wù)器,也可以兩者都是.一旦客戶端和服務(wù)器建立起來連接關(guān)系,則當(dāng)服務(wù)器中的數(shù)據(jù)發(fā)生變化后就會馬上通知客戶端.通過DDE方式建立的數(shù)據(jù)連接通道是雙向的,即客戶端不但能夠讀取服務(wù)器中的數(shù)據(jù),而且可以對其進行修改.
DDE有兩種數(shù)據(jù)交換方式,即冷連接和熱連接.冷連接(Cool Link)指數(shù)據(jù)交換是一次性數(shù)據(jù)傳輸,與剪貼板相同.當(dāng)服務(wù)器中的數(shù)據(jù)發(fā)生變化后不通知客戶端,但客戶端可以隨時從服務(wù)器讀寫數(shù)據(jù).熱連接(Hot Link)指當(dāng)服務(wù)器中的數(shù)據(jù)發(fā)生變化后馬上通知客戶端,同時將變化的數(shù)據(jù)直接送給客戶.
VB與力控組態(tài)軟件進行DDE對話是通過機器名、應(yīng)用程序名、主題名和項目名進行約定的.
在VB中新建一個工程,將窗體命名為“DDEServer”;其中,LinkMode 設(shè)為“1-Source(表示此程序作為服務(wù)端)”;LinkTopic為窗體的名字(即DDEServer).建立窗體如圖2所示.VB應(yīng)用程序中采用文本框控件和力控進行DDE通訊.
在力控組態(tài)軟件中定義一個I/O設(shè)備DDE.服務(wù)名稱設(shè)定為VB應(yīng)用程序名,“工程1”,主題名稱指定為VB應(yīng)用程序窗體名稱“DDESERVE”.鏈接模式為熱連接,如圖3和圖4所示.
圖2
圖3
圖4
在數(shù)據(jù)庫中創(chuàng)建三個數(shù)據(jù)庫點:A1,A2和A3,這幾個數(shù)據(jù)點的數(shù)據(jù)連接項中的DDE分別指定為VB窗體中的文本框的名字,如圖5所示.
先啟動VB程序,然后啟動力控運行程序,就可以實現(xiàn)VB與力控組態(tài)軟件之間的DDE數(shù)據(jù)交換.整個系統(tǒng)運行如圖6所示.
圖5
圖6
本文采用VB中WinSock控件和DDE通訊技術(shù)很好的實現(xiàn)了力控組態(tài)軟件與下位機掃碼設(shè)備之間的通信,較好地解決了對于力控組態(tài)程序沒有驅(qū)動程序支持的設(shè)備之間數(shù)據(jù)的通信問題.采用力控組態(tài)軟件編寫了上位機監(jiān)控界面,人機交互直觀、方便.在實際項目中得到了很好地應(yīng)用,實用價值很高.