摘 要:对于中、大型自动化DCS集散系统中上位计算机之间的联网及通信方式采用以太网技术,通过VB6.0软件中的winsock控件来进行通信程序的编写,并通过一个具体的实例给出了多客一服广播通信方式的详细程序,该程序可做为模块直接被编程者调用,加快了编程速度。
关键词:局域网;VB程序;互联通信
目前在自动化程度较高、规模较大的设备系统中,往往采用的是DCS集散系统,即PLC、变频器、单片机等设备的信息通过现场总线(如CAN总线、PROFIBUS总线等)进行互联通信,并将信息传递给上位计算机(假设上位计算机编号为1,2,3,…),而如果整个系统的规模比较庞大,上位计算机数量较多,而且每个上位计算机之间又要进行通信来传递信息和指令,则需要将所有这些上位计算机连接起来。可如何才能实现这些上位计算机之间的互联通信呢?可以从软硬件两个方面来构建,现详述如下:
一、硬件的构建
目前要实现多台计算机的互联已有成熟的技术,可采用以太网来构建局域网,在每台上位计算机中采用以太网卡作为通信接口,采用以太网线将各个计算机连接到一个或多个路由器或小型交换机上,再小一点的网络,接到HUB上也可。
该局域网采用TCP/IP协议进行通讯。
二、软件的构建
(一)本通信程序使用的前提
在现场应用程序的编程中,使用得最多的就是VB6.0软件,假设所需要联网通信的应用程序均采用VB6.0软件来编写,则可以利用本论文当中提供的通信程序来实现互联通信。
(二)设置计算机名和IP地址
对所有联网的计算机都需要设置计算机名和IP地址。为论述的需要,假设要联网的计算机有4个,其计算机名和IP地址如下:
廖学武 10.182.15.71
蒋冬星 10.182.15.64
张翰明 10.182.15.59
谢敏 10.182.15.60
(三)调入winsock控件
在本应用构建的硬件平台和VB6.0软件开发环境下,可采用VB6.0提供的winsock控件来实现通信。具体的调用方法如下:
在VB6.0开发软件中选择“project”下拉菜单中的“components…”选项,然后在弹出的选项框中选中“Microsoft Winsock Control 6.0”复选框,再按确定按钮,将winsock控件调入编辑环境中。
(四)多计算机通讯的方式的选择
目前,多个计算机互联情况下,可已实现的通讯方式主要有:
1、多客一服点对点方式
这种方式是指在联网的计算机中只有1个服务器,而有多个客户机。所有的客户机都可以向服务器发送指令,服务器收到指令后,就将相应的信息传递给相应的客户机。客户机和客户机之间不能相互通信。
2、一客多服点对点方式
这种方式是指在联网的计算机中,只有1个客户机,其余的都是服务器。在这种方式中,客户机可以向所有的服务器传递信息和指令,然后这些服务器再向客户机返回信息。服务器和服务器之间不能相互通讯。
3、多客一服广播方式
这种方式是指在联网的计算机中只有1个服务器,而有多个客户机。这种方式下,不但所有的客户机都可以和服务器通信,而且客户机和客户机之间也可以进行通讯。联网中的任何一台计算机,不管它是客户机还是服务器,它发出的信息都能被其它的计算机所收到,即以广播的方式发送信息。
显然,上述3种通信方式中,以第3种方式最为全面,适用面最广,它包括了前2种的所有功能。只要我们在应用层定制相应的通信协议就可实现通讯。通信协议可以制定如下:
起始位(S) |
源地址 |
目的地址 |
数据(若干字节) |
停止位 |
(五)多客一服广播方式程序及界面的编写
1、客户端界面及程序如下:
上述界面中,“建立连接”按钮对应command2, “数据发送”按钮对应command1, “关闭连接”按钮对应command3。具体应用步骤如下:
首先,设置“谢敏”计算机为服务器,其它计算机为客户机。
其次,对应特定的一台客户端计算机,在其界面上选择客户端姓名和服务器端姓名。
再其次,按下“建立连接”按钮,则连接开始,当连接成功后,上述界面的“连接状态”处,就会显示“已连接服务器”(label10标签)。
最后,在text5文本框中输入信息或指令,再按“数据发送”按钮,信息或指令就被发送出去,并被服务器和所有已建立连接的其他客户机所接收。
其相应的程序如下:
Private Sub Combo1_Click()
If Combo1.Text = "谢敏" Then
Text4.Text = "1200"
Text3.Text = "10.182.15.60"
End If
If Combo1.Text = "廖学武" Then
Text4.Text = "1200"
Text3.Text = "10.182.15.71"
End If
If Combo1.Text = "蒋冬星" Then
Text4.Text = "1200"
Text3.Text = "10.182.15.64"
End If
If Combo1.Text = "张翰明" Then
Text4.Text = "1200"
Text3.Text = "10.182.15.59"
End If
End Sub
Private Sub Combo2_Click()
If Combo2.Text = "谢敏" Then
Text2.Text = "1200"
End If
If Combo2.Text = "廖学武" Then
Text2.Text = "1200"
End If
If Combo2.Text = "蒋冬星" Then
Text2.Text = "1200"
End If
If Combo2.Text = "张翰明" Then
Text2.Text = "1200"
End If
End Sub
Private Sub Command1_Click()
Dim data1 As String
data1 = Text5.Text
Winsock1.SendData data1
End Sub
Private Sub Command2_Click()
Winsock1.RemoteHost = Text3.Text
Winsock1.RemotePort = 1200
Winsock1.Connect Winsock1.RemoteHost, Winsock1.RemotePort
End Sub
Private Sub Command3_Click()
If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
End Sub
Private Sub Form_Load()
Text1.Text = Winsock1.LocalIP
Combo1.AddItem "谢敏"
Combo1.AddItem "廖学武"
Combo1.AddItem "蒋冬星"
Combo1.AddItem "张翰明"
Combo1.Text = ""
Combo2.AddItem "谢敏"
Combo2.AddItem "廖学武"
Combo2.AddItem "蒋冬星"
Combo2.AddItem "张翰明"
Combo2.Text = ""
Timer1.Enabled = True
Timer1.Interval = 50
End Sub
Private Sub Timer1_Timer()
If Winsock1.State = 7 Then
Label10.Caption = "已连接服务器"
Else
Label10.Caption = "没有连接"
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data4 As String
Winsock1.GetData data4, vbString
Text6.Text = data4
End Sub
2、服务器端界面及程序如下:
上述界面中“通过winsock3发送”按钮对应command1, 用于和廖学武计算机通讯;“通过winsock4发送”按钮对应command2, 用于和蒋冬星计算机通讯;“通过winsock5发送”按钮对应command4, 用于和张翰明计算机通讯; “关闭连接”按钮对应command3。其应用步骤如下:
首先,每个客户机只要和服务器建立了连接,服务器就会在相应的连接状态栏显示出来。
其次,当服务器收到任何一个客户机发送来的信息,它就立即将原信息转发给其他的已经建立了连接的客户机,从而达到广播的目的。
此外,服务器还可以通过command1、2、4实现点对点通信。
界面对应的程序如下:
Private Sub Command1_Click()
Dim data3 As String
data3 = Text5.Text
If Winsock3.State = 7 Then '已连接 廖学武
Winsock3.SendData data3
End If
End Sub
Private Sub Command2_Click()
Dim data3 As String
data3 = Text5.Text
If Winsock4.State = 7 Then '已连接 蒋冬星
Winsock4.SendData data3
End If
End Sub
Private Sub Command3_Click()
If Winsock2.State <> sckClosed Then
Winsock2.Close
End If
If Winsock3.State <> sckClosed Then
Winsock3.Close
End If
If Winsock4.State <> sckClosed Then
Winsock4.Close
End If
If Winsock5.State <> sckClosed Then
Winsock5.Close
End If
End Sub
Private Sub Command4_Click()
Dim data3 As String
data3 = Text5.Text
If Winsock5.State = 7 Then '已连接 张翰明
Winsock5.SendData data3
End If
End Sub
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 50
Winsock2.LocalPort = 1200
Winsock2.Bind Winsock2.LocalPort '与本地端口绑定
Winsock2.Listen ' 侦听
End Sub
Private Sub Timer1_Timer()
If Winsock3.State = 7 Then
Label10.Caption = "已连接 廖学武"
End If
If Winsock4.State = 7 Then
Label1.Caption = "已连接 蒋冬星"
End If
If Winsock5.State = 7 Then
Label2.Caption = "已连接 张翰明"
End If
End Sub
Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long)
'谢敏 "10.182.15.60" 为服务器
Dim sip As String
Dim I As Integer
sip = Winsock2.RemoteHostIP '获得登录者的IP地址
If sip = "10.182.15.71" Then '廖学武
If Winsock3.State <> 0 Then
Winsock3.Close
End If
Winsock3.Accept requestID
End If
If sip = "10.182.15.64" Then '蒋冬星
If Winsock4.State <> 0 Then
Winsock4.Close
End If
Winsock4.Accept requestID
End If
If sip = "10.182.15.59" Then '张翰明
If Winsock5.State <> 0 Then
Winsock5.Close
End If
Winsock5.Accept requestID
End If
End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim data2 As String
If Winsock2.State = 7 Then
Winsock2.GetData data2, vbString
Text6.Text = data2
End If
If Winsock3.State = 7 Then '已连接 廖学武
Winsock3.SendData data2
End If
If Winsock4.State = 7 Then '已连接 蒋冬星
Winsock4.SendData data2
End If
If Winsock5.State = 7 Then '已连接 张翰明
Winsock5.SendData data2
End If
End Sub
Private Sub Winsock3_DataArrival(ByVal bytesTotal As Long)
If Winsock3.State = 7 Then '已连接 廖学武
Winsock3.GetData data2, vbString
Text6.Text = data2
End If
If Winsock4.State = 7 Then '已连接 蒋冬星
Winsock4.SendData data2
End If
If Winsock5.State = 7 Then '已连接 张翰明
Winsock5.SendData data2
End If
End Sub
Private Sub Winsock4_DataArrival(ByVal bytesTotal As Long)
If Winsock4.State = 7 Then '已连接 蒋冬星
Winsock4.GetData data2, vbString
Text6.Text = data2
End If
If Winsock3.State = 7 Then '已连接 廖学武
Winsock3.SendData data2
End If
If Winsock5.State = 7 Then '已连接 张翰明
Winsock5.SendData data2
End If
End Sub
Private Sub Winsock5_DataArrival(ByVal bytesTotal As Long)
If Winsock5.State = 7 Then '已连接 张翰明
Winsock5.GetData data2, vbString
Text6.Text = data2
End If
If Winsock3.State = 7 Then '已连接 廖学武
Winsock3.SendData data2
End If
If Winsock4.State = 7 Then '已连接 蒋冬星
Winsock4.SendData data2
End If
End Sub
上述多客一服广播方式的程序已在计算机上调试通过,可以正常使用。多客一服点对点方式和一客多服点对点方式的程序我也已经上机调试通过,但限于篇幅,这些程序就没有列出,有兴趣的读者可以参考上述程序自己编写。通过上述通信程序的编写,就能够实现在更大范围内实现设备的DCS集散自动化控制。