4. 网络通信 VB6.0与旧版本相比较,最明显的特点是增加了强大的网络功能,将其用于分布式监控系统中可以轻松地实现远程通信。VB的WINSOCK控件有效屏蔽了对WINDOWS套接字的低层操作,可方便地建立起网络中任意两个具有唯一IP地址节点间的连接,并通过UDP或TCP协议进行数据交换,可用于创建Client/Server应用程序。 本文举分布式监控系统中节点间通信的实例,其中节点A(IP地址202.114.102.134)作为服务器负责某一区域的数据采集与处理,程序内有一名为TCPServer的Winsock控件;节点B(IP地址202.114.102.135)是同级或上一级的某一节点,作为客户机,其程序内有一名为TCPClient的Winsock控件。 节点A服务器核心程序如下: (1)初始化程序 tcpserver(0).RemoteHostIP = 202.114.102.135 tcpserver(0).LocalPort = 1001 'tcpserver(0)专用于侦听 tcpserver(0).Listen (2)发送数据程序 tcpserver(Index).SendData Text1.Text (3)处理客户机连接请求程序 Private Sub TCPServer_ConnectionRequest(Index As Integer, ByVal requestID As Long) Load tcpserver(Index) tcpserver(Index).Accept requestID End Sub (4)客户机数据到达处理程序 Private Sub TCPServer_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim RD As String tcpserver(Index).GetData RD, vbString txtRD.text=RD tcpserver(Index).SendData RD End Sub (5)关闭连接程序 Private Sub TCPServer_Close(Index As Integer) tcpserver(Index).Close Unload tcpserver(Index) End Sub 以上程序着重说明Winsock控件的主要属性、方法和事件,如要实现多进程(多个客户程序同时运行),可应用创建控件数组来代表已连接的控件实例的方法处理。 节点B客户机核心程序如下: Private ConnectFlag As Boolean '设置判断是否连接标志 (1)初始化程序 TCPClient.RemoteHost IP= 202.114.102.134 '远程计算机IP地址 TCPClient.RemotePort = 1001 '远程计算机端口 ConnectFlag = False (2)申请连接程序 If Not ConnectFlag Then TCPClient.Close TCPClient.Connect Do DoEvents Loop Until TCPClient.State = sckConnected ConnectFlag = True End Sub (3)数据到达处理程序 Private Sub TCPClient_DataArrival(ByVal bytesTotal As Long) Dim RD As String TCPClient.GetData RD, vbString txtRD.text = RD End Sub (4)发送数据程序 TCPClient.SendData txtSD.Text (5)关闭连接程序 Private Sub TCPClient_Close() TCPClient.Close Do DoEvents Loop Until TCPClient.State = sckClosed ConnectFlag = False End Sub 5. 远程通信 当监控系统的一些重要信息,如严重事故,需要及时通知有关部门即实现远程通信时,可以利用网络中某一连接至Internet的带有MODEM的节点,通过MODEM自动拨打电话,将信息及时地送达有关部门。 应用VB的MSCOMM控件可实现这一功能,基本方法与下位机通信类似。这里介绍调用API函数直接写I/O端口,使用设备控制块DCB的方法拨打电话并挂起MODEM。 首先利用VB的API Viewer浏览器在module1模块中声明对以下函数、数据类型和常量的引用: CreateFile 函数 CloseHandle 函数 BuildCommDCB 函数 SetCommState 函数 DCB数据类型 GENERIC_READ常量 GENERIC_WRITE 常量 OPEN_EXISTING 常量 (1) MODEM设置子程序 Public Function ModemSetup( ) As Boolean Dim lResult As Long Dim lCommHandle As Long Dim DCB_Comm As DCB Dim tDCBConfig As String ModemSetup = True '指定lCommHandle为通信源对象的句柄 lCommHandle = CreateFile(COM2,GENERIC_READ Or GENERIC_WRITE, _ 0&, 0&, OPEN_EXISTING, 0&, 0&) '构造DCB对象的初始化字符串 tDCBConfig = "baud=9600" & "parity=NONE" & "data=8" & "stops=1" '用初始化字符串指定DCB对象的规范 lResult = BuildCommDCB(tDCBConfig, DCB_Comm) '根据指定DCB对象的规范来设定通信设备 lResult = SetCommState(lCommHandle, DCB_Comm) lResult = CloseHandle(lCommHandle) End Function (2)发送数据子程序 Public Function ModemSD(tComm As String, tModemSend As String) As Boolean Dim nModem As Integer ModemSS = True nModem = FreeFile Open tComm For Output As nModem Print #nModem, tModemSend Close #nModem End Function (3)主程序 ModemSetup ModemSS(COM2, "ATDT" &"02767802169"& vbCr) ModemSS(COM2, "ATDT" & txt1.Text & vbCr) ModemSS(COM2, "ATH" & vbCr) 本例重在说明基本原理,没有加入错误捕获陷阱及通信异常处理。 6. 结束语 本文介绍了应用VB开发分布式监控系统的各种通信功能的基本原理和实例。通过以上实例可以看出,用VB开发通信程序简洁明了,编程效率高,可维护性好,尤其适用于自行开发中小型分布式监控系统。 参考文献 1. 俞旭明等,Visual Basic 6.0网络开发技术,人民邮电出版社,1999 2. 陶文伟等,InTouch和VB之间的动态数据交换,电脑与信息技术,1999,(6) 3. C200HX/C200HG/C200HE编程手册,日本欧姆龙公司,1997

评论