在供水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环境下的通信软件,程序实现简单,极大的减轻了软件开发的工作。
责任编辑:小草