分布式控制系统通常可以分为现场控制层、过程监控层、生产管理层和市场经营管理层四个层次,过程监控层通过对多个控制设备的集中管理,完成监控生产过程的目的。力控PCAuto监控组态软件是处于过程监控层的软件平台,它可运行于Windows 98/NT/2000/XP操作系统之上,能与国内外各工控厂家的常用设备通信,与工控机和网络系统相结合,可方便、快速地构造满足不同需求的数据采集与监控系统。
虽然力控提供了许多常用设备的驱动程序,但在实际应用中,由于工程需要和设备的特殊性,力控所提供的现有驱动程序并不能满足所有设备需要,此时便需利用力控驱动开发包提供的接口来开发新驱动程序。对于普通用户来说,驱动开发是一项很艰难的工作,但是力控提供了多种与第三方软件的接口,如OLE控件、内部组件等,这就为我们提供了另外一个解决问题的思路:利用VB、VC等开发工具自行开发通信程序采集数据,再利用力控提供的OLE控件等接口将通信程序与力控连接,实现数据共享。这样,无需开发新驱动程序便可使力控采集到现场设备的数据。这种基于力控组态软件的新型监控软件的结构框图如图1所示:
本文以基于RS-485串行通信的分布式控制系统为应用背景,对这种新型监控软件的实现做了探讨。
2 上位机串行通信的实现
2.1 串行通信接口技术
串行通信常用的接口有RS-232C接口及RS-485接口。由于RS-232C接口通信距离较近,当传输距离较远时,可采用RS-485串行通信接口。RS-232C接口和RS-485接口之间的转换可采用相应的转换模块。一般计算机内都配有通信适配器,使计算机能够与其它具有RS-232C 接口的计算机或设备进行通信。数据通过串口一次只传送1个字节,且数据和控制信号都在单根导线上移动,需要应用通信协议。常用的通信协议如下:1个起始位;7个或8个数据位;奇偶效验位;1个或2个停止位;通信速率(单位为波特率或bit/s)。
构成基于RS-485串行通信的分布式控制系统通常采用以下硬件构成方案:计算机RS-232C接口经RS-232C串行通信线连接RS-232C/RS-485转换模块,转换模块经RS-485串行通信线连接各个现场设备的RS-485接口。再配以上位机监控软件,便可以从计算机串行口采集现场设备的数据。
串行通信可以在DOS或Windows环境下进行,可以用汇编或高级语言编写通信程序。本文介绍如何利用Windows的ActiveX控件进行编程。利用ActiveX控件编写串行通信程序,其编程步骤如下:
(1) 设置通信协议(传输速率、奇偶校验、传输位数、终止位);
(2) 读取线路状态,判断是否可以通信;
(3) 发送或接收数据;
(4) 重复第2和第3步,直至通信完成。
2.2 串行通信编程
在Windows环境下编写串行通信程序,可以利用VB提供的良好界面设计能力及强大的串行通信功能。VB 6.0利用MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信能力。
MSComm控件是用于Windows环境的32位串行通信控件,每个MSComm控件对应于一个串行端口。应用程序中需要多个串行口时,要使用多个MSComm控件。MSComm控件的主要属性及说明如附表所示。
附表 MSComm控件常用属性
使用MSComm控件前,需要向工具箱添加该控件:选择“工程”菜单中“部件”项,“控件”页中选中“Microsoft Comm control 6.0”项,点击“确定”,完成MSComm控件的添加。
MSComm提供两种处理通信的方式:事件驱动通信和查询通信方式。串口通信中每接收或发送一个字符就产生一个事件,事件驱动通信就是利用MSComm控件OnComm事件捕获并处理通信事件,该事件包括了处理串口通信的各个消息。以下为采用计算机串口1发送接收数据的程序示例。
发送数据:
Private Sub DataSend ( )
Dim Data(5) As Byte
MSComm1. Commport = 1
‘设置MSComm1对应Comm1
MSComm1. Settings =”96000,N,8,1”
‘ 9600bit/s,无奇偶效验,8位数,1位终止位
If MSComm1. PortOpen =False Then
‘打开端口
MSComm1. PortOpen = True
End If
Data (0) = CByte(TeAddr.Text)
‘设备地址
Data e(1) = &H4
‘功能号 读取电力参数
Data e(2) = &H0
‘数据起始地址
Data (3) = &H0
Data (4) = &H0
‘数据长度
Data e(5) = &H15
MSComm1. OutBufferCount = 0
‘清除发送缓冲区
MSComm1. Output = Data
‘发送数据
MSComm1. PortOpen = False
‘关闭端口
End Sub
接收数据:
Private Sub MSComm1_OnComm()
Dim rec() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
‘串口接收事件
rec = MSComm1.Input
‘读输入缓冲区
End Select
End Sub
3 力控实时数据库与DbCom控件
力控的实时数据库是一个开放的数据平台。用户可以利用数据库提供的接口,在该平台上进行二次开发,创建自己的应用程序。实时数据库提供的控件DbCom就是一种方便、高效的接口方式。
DbCom是一个标准OLE控件,用户在各种常用开发环境(如C++ Builder、VC++、VB、Delphi等)下可以调用DbCom来访问数据库中的数据。通过DbCom,上位机通信程序不但可以读取力控数据库数据,而且可以设置力控数据库数据。在安装力控时,安装程序自动完成DbCom的安装与注册。DbCom是一个在程的OLE控件,在应用程序中使用时,必须同时启动数据库DB。
下面给出通过DbCom控件访问力控数据库的两个常用方法。
(1) 方法1:GetRealData。用于读取多个数值型数据
语法形式:long GetRealData(long count, LPCTSTR strNames, double* data)。
参数说明:count:数据个数。
strNames:数据名字符串,字符型变量,数据名间以‘,‘号分隔。
data:双精度浮点(Double)型指针,返回的数据数组。
返回值:长整型。0:成功;-1:失败。
(2) 方法2: SetStringData。根据数据名称和数据值设置数据库
语法形式:long SetStringData(long nCount, VARIANT* pvTagPars, VARIANT* pvData)。
参数说明:nCount:数据个数。
pvTagPars:VARIANT数组,nCount个数据名称。
pvData:VARIANT数组,nCount个数据值。
返回值:成功为0,否则为非0。
以下程序为上位机通信程序读写力控实时数据库的两种常用方法的示例。
//读取数据库
Private Sub GetParameters()
‘读取电度值和有功功率值
Dim count As Integer, result As Integer
Dim rdata(1) As Double
Dim pars As String
count=2
pars=”dbkWh1.PV,dbkW1.PV ”
‘调用DbCom的方法
result = DbCom1. GetRealData (count, pars, rdata)
‘读取数据
If result=-1 Then
MsgBox("请先启动力控实时数据库!")
Else
kWh=rdata(0)
‘电度值
kW=rdata(1)
‘有功功率值
End If
End Sub
//设置数据库
Private Sub SetParameters()
‘将电度值和有功功率值写入力控数据库
Dim count As Integer, result As Integer
Dim * pTagPars(1) As VARIANT, * pVals(1) As VARIANT
count=2
pTagPars(0)=dbkWh1.PV
‘数据名
pTagPars(1)=dbkW1.PV
pVals(0)=kW·h 数据值
pVals(1)=kW 调用DBcom的方法
result=DbCom1.SetStringData(count, pTagPars, pVals)
‘设置数据
End Sub
4 结束语
本文提出的基于力控组态软件的新型监控软件,利用了力控实时数据库提供的OLE控件接口,将力控组态软件的强大功能与VB自行开发程序的灵活性结合起来,更好的满足了工业分布式控制系统的需要。这种新型监控软件已在某港口配电监控系统等实际工程项目中得到成功应用。