在供水SCADA系統中對於遠程測控終端的通信我公司過去是通過無線數傳電台實現,由於受外界干擾太大,溫度過高易造成頻偏,導致數據經常接收不到,隨著供水管網的遠程檢測監控技術的不斷發展進步,現在流行的CDMA或GPRS無線通信無論在穩定性還是在准確性方面都勝一籌,並且在速度上有質的提高。鑒於此,在SCADA系統中對於遠程測控終端的通信,在硬件上我們決定采用CDMA無線通信設備傳輸數據以替代過去的無線數傳電台。
具體結構見下圖:
我公司的SCADA系統在采集端用的是SIMENS S7-200 PLC ,傳輸數據采用自由口通訊,這樣可以連接帶RS232串口的CDMA 設備(愛賽德A60I),該設備采用透傳模式,內嵌TCP/IP協議棧,在透傳模式下串口輸入的數據通過CDMA網絡和INTERNET網絡透傳到服務器,這樣在CDMA的設備內設置好服務器的公網IP地址和端口號,遠程數據就可以通過無線網絡和互聯網將數據傳到SCADA系統的主服務器上,SCADA系統上位機組態軟件用的是INTOUCH 7.0。
由於上位機組態軟件INTOUCH 7.0不支持與下位機直接通信,因此須編寫應用程序來連接上、下位機。
VB是開發 Windows應用程序的一種面向對象程序設計語言,它支持 Windows環境下的 DDE通信機制,並提供了DDE的編程接口。DDE(動態數據交換(Dynamic Data Exchange)).是在Windows操作系統中不同程序之間進行數據交換的一種標准。這項標准可以讓你的程序自動接收別的應用程序傳過來的數據,傳送端的數據有任何變化,接收端都可以自動更新。同樣.你的應用程序也可以傳送數據給別的應用程序。INTOUCH支持采用DDE的數據交換方式來發送和獲得數據。
此外VB中WINSOCK控件可實現點到點的通信。這樣可以與遠程測控終端點一一建立通信。
因此通過編寫VB程序來將遠程測控終端和上位機組態軟件銜接起來是個很好的選擇。流程如下圖所示:
具體通信程序主要包括二大部分:
一、VB與遠程測控終端的通信
Winsock控件允許我們采用TCP協議進行通信。TCP協議允許建立並維持同遠端主機的連接。利用此種方式的客戶必須要知道服務器的名字(RemoteHost屬性),也要知道服務器正監聽(Listening)的端口(RemotePort),然後調用Connect方法。服務器程序則必須設置本Scoket的監聽端口(LocalPort),然後調用Listen方法;當客戶要求建立一個連接時,服務器方產生ConnectionRequest事件,如果服務器想完成連接,則調用Accept方法認可。一旦連接建立成功,雙方計算機都能利用SendData方法發送。當接收到數據時,發生DataArrival事件,我們可以在此事件中調用GetData方法接收數據。
因此首先在遠程測控終端(CDMA 設備)內設置好服務器的公網IP 地址和端口號。然後在VB 程序中將Winsock控件的Remoteport 項屬性的端口號與CDMA設備的端口號一一對應,套接字類型protocol 選 scktcpprotocol,
具體編程主要用到下面二段語句:
請求連接:
Private Sub Winsock1_ConnectionRequest _(ByVal requestID As Long)
Winsock1.Accept requestID
接收數據:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Winsock1.GetData Tdata()
二、VB與上位機INTOUCH的通信
動態數據交換(簡稱 DDE)是一種開放的、與語言無關的、基於消息的協議,它是應用程序通過共享內存進行進程間通信的一種形式。服務器程序與客戶程序之間的數據交換被稱做為一個“會話”,其中客戶程序是初始化鏈接和發送數據請求的應用程序,而服務器程序則是通過執行自身的命令或發送數據來響應客戶程序的應用程序。DDE協議將控制通信對象劃分為應用程序名(Application)、主題名(Topic)和項目名(Item)。每次 DDE會話 由應用程序名和主題名唯一確定。客戶應用程序可以通過 DDE協議和服務器應用程序的一個或多個項目建立數據鏈接。
在本例的DDE通信中VB應用程序為客戶端,INTOUCH為服務器端。在VB裡設置如下:
數據的LinkTopic項屬性 設置 \服務器名應用程序名|主題名,本例為: \serverview|tagname
LinkItem項屬性 設置為 INTOUCH中的標記名
LinkTimeout連接等待時間 50
Linkmode(連接模式)1
最後在程序中調用LINKPOKE 即可完成數據的傳送。
具體程序代碼如下(僅選取一個測壓點為例):
Private Sub Command9_Click()
On Error GoTo ec
Winsock8.Close
Winsock8.LocalPort = 14571
Winsock8.Listen
Dim i As Integer
For i = 0 To 1
ctcy(i).LinkMode = 0
ctcy(i).LinkMode = 1
ctcy(i).Caption = 0
Next i
Exit Sub
ec:
MsgBox "監控程序未開或端口出錯:請先開啟監控程序,再連接"
End Sub
Private Sub Winsock8_ConnectionRequest _
(ByVal requestID As Long)
'檢查控件的 State 屬性是否為關閉的。
'如果不是,在接受新的連接之前先關閉此連接。
If Winsock8.State <> sckClosed Then _
Winsock8.Close
'接受具有 requestID 參數的連接。
Winsock8.Accept requestID
End Sub
Private Sub Winsock8_DataArrival(ByVal bytesTotal As Long)
Dim Tdata() As Byte
Dim Idata(0 To 4) As String
Dim TIdata(0 To 4) As Long
Dim i As Integer
On Error GoTo ec
Winsock8.GetData Tdata()
Idata(0) = Hex(Tdata(0))
TIdata(0) = Int("&H" & Idata(0))
If TIdata(0) = 126 Then
For i = 1 To 4
Idata(i) = Hex(Tdata(i))
TIdata(i) = Int("&H" & Idata(i))
Next i
ctcy(0).Caption = TIdata(3) * 256 + TIdata(4)
End If
If ctcy(1).Caption < 1000000 Then
ctcy(1).Caption = ctcy(1).Caption + 1
Else: ctcy(1).Caption = 0
End If
For i = 0 To 1
ctcy(i).LinkPoke
Next i
sock1(8).Caption = 0
Exit Sub
ec:
End Sub
最終的VB軟件界面示意如下:
經過上述配置後,在主服務器上啟動組態軟件INTOUCH 7.0後再啟動此VB程序,即可實時在組態軟件的顯示界面上看到遠程數據。
以上僅舉其中的一個點作為例子,其余的依此類推。經過測試該應用程序運行正常。
VB應用程序一方面與測控終端裝置進行通信,另一方面同INTOUCH進行數據交換,對於用戶而言只與INTOUCH友好人機界面打交道,實際運行證明該通信軟件使用可靠,操作方便。通過VB編制WINDOWS環境下的通信軟件,程序實現簡單,極大的減輕了軟件開發的工作。