MCGS即"监视与控制通用系统",是为工业过程控制和实时监测领域服务的通用计算机系统软件,具有功能完善、操作简便、可视性好、可维护性强的突出特点。是目前比较优秀的工业过程控制和实时监测领域服务的计算机系统软件。
在西宁市尖扎县康扬水电站全厂综合监控系统中,使用MCGS组态的全厂水力测量监控上位机担当着全厂的水力数据和综合监控系统之间通信的枢纽,负责上传各种水力数据。而MCGS没有自带数据传输的驱动程序,无法实现数据的自动传输。笔者在工程调试阶段采用了两种方法都成功的实现了数据的通讯。一是借助MCGS提供的一套规范的设备驱动程序接口,编写了数据传输的设备驱动程序,二是利用MCGS支持OLE Automation技术允许用户在Visual Basic中操作MCGS中的对象这一优势使用VB编写数据通讯程序 并嵌入到MCGS监控系统中。
MCGS通过驱动程序、OLE两种方法和综合监控系统通信的系统框图如图1所示。数据传输采用串行通信方式,8位数据位,1位停止位,现场采用RS-485屏蔽双绞线通信以提高传输距离和抗干扰能力。
图1系统框图
1 驱动程序开发
虽然MCGS提供了大多数常用设备的驱动程序,但在实际应用中,或因为所用设备的特殊性、或因为实际工程的需要,MCGS所提供的设备驱动程序总会有些不尽人意,但我们可以借助MCGS提供的一套规范的设备驱动程序接口,根据自己的需要来编写设备驱动程序。
MCGS的设备驱动程序是由VB程序编写的DLL文件,即动态连接库文件。设备驱动程序中包含符合设备通信协议的处理程序,通过规范的OLE接口将驱动程序挂接到MCGS中,使其构成一个整体。OLE是一个可扩充的开放标准,用于实现不同软件之间的相互操作,而不管软件本身是使用什么编程语言。因此,只要遵守MCGS的接口规范,可以使用诸如VB、VC、Delphi等来编制MCGS设备驱动程序。鉴于VB的通用性和简单性,笔者采用了VB来开发数据传输的驱动程序。
1.1驱动程序的实现
MCGS设备构件的实现方法和原理与标准VB的Active DLL完全一致,但MCGS规定了一套接口规范,只有遵守这些接口规范的Active DLL才能用作MCGS的设备驱动构件。MCGS设备驱动构件具有5个属性和8个方法,分别如下:
属性接口:DevType、DevStyle、DevChannel、DevBaseIO、DevIONumber
方法接口: GetDevName、GetDevHelp、SetDevPage、InitNewDev、GetChlType、InitDevRun、RunDevCommand、CollectDevDat
开发MCGS设备驱动的过程,实际上就是根据设备的特性和需要实现的功能来完成5个属性接口和8个方法接口的编程过程。
下面详细介绍数据传输驱动程序的开发过程:
每个设备的驱动程序都必须有四个只读属性:DevType、DevStyle、DevIONumber和DevChannel。DevType标明设备的类型 当DevType = 0时表示父设备 ,当DevType = 1 表示子设备 ;DevStyle标明设备的种类 当DevStyle= 0时表示独立设备 ,当DevStyle = 1时表示和串口父设备对应的子设备; DevIoNumber标明设备所占用系统I/O的个数; DevChannel标明设备的通道个数。
由于本驱动设备属于串口父设备对应的子设备,没有占用系统I/O。又因为需要传输11个数据,故需要11个通道。编程如下:
Public Property Get DevType(),Get DevStyle(),Get DevIONumber(),Get DevChannel() As Long
DevType = 1 DevStyle = 1 DevIONumber = 0 DevChannel = 11
End Property
MCGS在组态模式和运行模式下需要调用方法接口来实现特定的功能,如实现初始化、数据的输入和输出等功能。在本驱动程序开发过程中主要用到GetChlType、CollectDevDat两个方法接口。其中GetChlType接口的目的是在运行环境中MCGS调用本接口读取设备各通道的数据类型和通道内容的文字描述,在设备属性设置窗口的通道连接属性页中所显示的内容均来自本接口。此接口中alngChlDataType表示存储通道的数据类型:1表示开关型,2表示数值型,3表示字符型。当通道的数据类型为负数时,表示该通道的作用是Mcgs中的数据传输到设备来,因此编程如下:
Public Function GetChlType(alngChlDataType As Variant, astrChlExplain As Variant) As Long
Dim lngIndex As Long
alngChlDataType(0) = 1
For lngIndex = 1 To 10
alngChlDataType(lngIndex) = -2
Next lngIndex
astrChlExplain(0) = "通信状态标志"
astrChlExplain(1) = "上游水位"
astrChlExplain(2) = "下游水位"
astrChlExplain(3) = "毛水头"
.
.
.
astrChlExplain(10) = "栅压差7"
End Function
CollectDevDat接口的作用是MCGS运行时,根据指定的采集周期,定时调用本接口,对设备进行数据采集工作。 CollectDevDat接口十分重要,设备构件首先调用串行通信父设备函数ComOutinDat把命令字写到串行端口输出到外部设备(如智能仪表),外设收到命令后,在判断命令字正确后发送数据到串行端口,串行端口读取返回的数据,存放到通道数组asngDataValue()中供MCGS进行各种处理操作。
由于本驱动只需要将数据传输出去,因此就不必读取返回数据。MCGS的数据传输是按照通信协议进行的。在本驱动程序中命令字为“#”+“数据串”+“回车”。其中#为起始符,回车符为结束标志。编程如下:
Public Function CollectDevDat(alngDataFlag As Variant, asngDataValue As Variant, astrDataString As Variant) As Long
Dim strCommOrder,strReturnData,lngDo As String,lngReturn ,lngIndex ,itemp As Long
For lngIndex = 1 To 10
itemp = asngDataValue(lngIndex) * 100
lngDo = lngDo & Right("000000" & itemp, 6)
Next lngIndex
strCommOrder = "#" + lngDo+ Chr(33)
lngReturn=FetchDataFormComm(m_lngCheckFlag,m_objCommParent,strCommOrder,strReturnData)
End Function
函数FetchDataFormComm()的作用是将读数据的命令通过串口发送出去,而返回数据在本驱动中不用理会。
到这里,我们已经完成数据传输设备驱动程序的开发工作。
1.2测试和挂接数据传输设备驱动程序
启动MCGS组态环境,打开监控程序,在VB环境下运行驱动程序源程序,测试组态环境接口和运行环境接口,调试成功后,重新编译一遍,生成最后可以使用的DLL文件,把这个文件拷贝到D:\MCGS\Program\Driver目录下(默认程序安装到D:\MCGS中)。完成上述步骤后,就完成了数据传输驱动程序的挂接工作。
2 OLE方法的实现
MCGS组态软件本身的OLE自动化功能可以帮助用户在VB应用程序中很方便地操纵MCGS组态软件的运行。MCGS把其核心作为一个对象包装起来,把MCGS的大多数功能作为对象的属性和方法暴露出来,使其它的应用程序通过OLE自动化来操作MCGS,在Visual Baisc、Excel、Access和、Delphi中都可以通过OLE自动化来取得MCGS实时数据库对象,编程操作MCGS提供的属性和方法。因此我们可以利用OLE自动化技术将MCGS中需要传输的变量读取到VB中,然后通过串口通讯程序将数据传输出去。
2.1界面设置及程序编写
建立一个工程,命名为MCGS-VB,包含一个窗体FORM1;窗体上放置一个MSComm控件;和一个Timer控件,Timer控件的Interval属性设为5000(即5秒传一次数据)
在代码窗口编写程序如下:
Dim DataCentre As Object
Private Sub Form_Load()
On Error Resume Next
Set DataCentre = GetObject(, "McgsRun.DataCentre")
If Err Then MsgBox ("请先启动MCGS运行环境!")
End
End If
End Sub
Private Sub Timer1_Timer()
Dim outdate,msg,lngDo As String, tt As Variant,otemp As Long
For i = 1 To 10
msg = "out" + Format$(i, "00")
DatObj.GetValueFromName msg, tt
otemp =tt * 100
lngDo = lngDo & Right("000000" & otemp, 6)
Next i
On Error Resume Next
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
outdat = "#" +lngDo+ Chr(13)
MSComm1.Output = outdat
End Sub
2.2 MCGS监控程序组态
打开MCGS监控程序,为编程方便在“实时数据库”窗口定义10个数值型变量,命名为:OUT1,OUT2…,OUT10,并在循环策略中将需要上传的数据分别赋给这10个变量。为了使MCGS和VB程序在运行时看起来是一个整体,可以使用 “shell”函数,在MCGS工程运行时同时启动VB数据传输程序。
这样OLE的连接就完成了,数据传输程序和MCGS监控程序同时运行时,就可以自动实现MCGS与外部设备的数据通信。
3 两种方法比较
以上介绍的两种方法经过实践都成功实现了数据的传输。
开发驱动程序,然后通过规范的OLE接口挂接到MCGS中,可以使其构成一个整体,又由于设备驱动程序和MCGS运行在同一个进程内,故运行速度快,可靠性高,不易受干扰。
使用OLE方法,借助VB编程,可以实现复杂的算法和控制功能,因而能大大扩展MCGS的功能。
就本文所涉及的数据传输程序来讲,MCGS和外设只是简单的传送数据,使用驱动程序是最好的,因为在康扬电站的水力测量工程中,由于综合监控系统与MCGS通信数据量很小,只有11个量,使用设备驱动可以保证数据通讯的稳定性和快速性。
4 结束语
考虑到综合监控系统与MCGS通信数据量比较小,因此在工程联调阶段,最终采用了开发驱动程序这一方法,将自己编写的数据传输设备驱动挂接道MCGS中,经过长时间测试运行,MCGS与综合监控系统通信正常。