组态王的设置如下:
新建一个名为vbdde的DDE设备,服务程序名Ser,话题名water,数据交换方式为标准WINDOWS项目交换。新建一个名为SW的I/O变量,连接设备设为vbdde,项目名设为Text1。
3.2 组态王作为Server,VB作为Client
当有些参数需要从组态王传输到VB,如为了提高变频器电压以提升泵速,可在组态王应用程序中改变I/O变量BS值并动态传递给VB的Text2,VB接收到数据后经处理再传递给PLC相应继电器区。这时组态王作为Server,VB作为Client。
组态王设置如下:
新建一个名为BS的I/O变量,连接设备设为已建立的vbdde设备,项目名设为bengsu。
VB程序Ser.vbp中设置如下:
Text2.LinkTopic = "view|tagname"
Text2.LinkItem = "bengsu"
Text2.LinkMode = 1
TextBox控件有无连接、自动式连接、被动式连接和通知式连接四种连接模式,可依据实际情况灵活运用。
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)
本例重在说明基本原理,没有加入错误捕获陷阱及通信异常处理。
转贴于 酷文网-论文下载中心 http://www.coolwen.net
共3页: 上一页 [1] 2 [3] 下一页
网摘收藏: