你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
4.1 程序间互联通信
 

目前在自动化程度较高、规模较大的设备系统中,往往采用的是DCS集散系统,即PLC、变频器、单片机等设备的信息通过现场总线(如CAN总线、PROFIBUS总线等)进行互联通信,并将信息传递给上位计算机(假设上位计算机编号为123,…),而如果整个系统的规模比较庞大,上位计算机数量较多,而且每个上位计算机之间又要进行通信来传递信息和指令,则需要将所有这些上位计算机连接起来。下面介绍软硬件构建。

一、硬件

目前要实现多台计算机的互联已有成熟的技术,可采用以太网来构建局域网,在每台上位计算机中采用以太网卡作为通信接口,采用以太网线将各个计算机连接到一个或多个路由器或小型交换机上,再小一点的网络,接到HUB上也可。该局域网采用TCP/IP协议进行通信。

二、软件

1.前提条件

在现场应用程序的编程中,使用得最多的就是VB6.0软件,假设所需要联网通信的应用程序均采用VB6.0软件来编写,则可以利用本论文当中提供的通信程序来实现互联通信。

2.设置计算机名和IP地址

对所有联网的计算机都需要设置计算机名和IP地址。为论述的需要,假设要联网的计算机有4个,其计算机名和IP地址如下:

廖学武  10.182.15.71

蒋冬星  10.182.15.64

张翰明  10.182.15.59

谢敏    10.182.15.60

3.调入Winsock控件

在本应用构建的硬件平台和VB6.0软件开发环境下,可采用VB6.0提供的Winsock控件来实现通信。具体的调用方法如下:

VB6.0开发软件中选择“project”下拉菜单中的“components…”选项,然后在弹出的选项框中选中“Microsoft Winsock Control 6.0复选框,再按确定按钮,将winsock控件调入编辑环境中。

4.多计算机通信的方式的选择

目前,多个计算机互联情况下,可实现的通信方式主要有以下方式。

1)多客一服点对点方式

这种方式是指在联网的计算机中只有1个服务器,而有多个客户机。所有的客户机都可以向服务器发送指令,服务器收到指令后,就将相应的信息传递给相应的客户机。客户机和客户机之间不能相互通信。

2)一客多服点对点方式

这种方式是指在联网的计算机中,只有1个客户机,其余的都是服务器。在这种方式中,客户机可以向所有的服务器传递信息和指令,然后这些服务器再向客户机返回信息。服务器和服务器之间不能相互通信。

3)多客一服广播方式

这种方式是指在联网的计算机中只有1个服务器,而有多个客户机。这种方式下,不但所有的客户机都可以和服务器通信,而且客户机和客户机之间也可以进行通信。联网中的任何一台计算机,不管它是客户机还是服务器,它发出的信息都能被其他的计算机所收到,即以广播的方式发送信息。

显然,上述3种通信方式中,以第3种方式最为全面,适用面最广,它包括了前2种的所有功能。只要我们在应用层定制相应的通信协议就可实现通信。通信协议可以制定如下:

起始位(S

源地址

目的地址

数据(若干字节)

停止位

5.多客一服广播方式的实现

1)客户端

客户端运行界面如图1所示。


1 客户端界面

 

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)服务器端


     2 服务端界面

2界面中“通过winsock3发送”按钮对应command1, 用于和廖学武计算机通信;“通过winsock4发送”按钮对应command2, 用于和蒋冬星计算机通信;“通过winsock5发送”按钮对应command4, 用于和张翰明计算机通信; “关闭连接”按钮对应command3。其应用步骤如下:

首先,每个客户机只要和服务器建立了连接,服务器就会在相应的连接状态栏显示出来。

其次,当服务器收到任何一个客户机发送来的信息,它就立即将原信息转发给其他的已经建立了连接的客户机,从而达到广播的目的。

此外,服务器还可以通过command124实现点对点通信。实现的核心代码如下:

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集散自动化控制。

 

 

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089