技术文章 > 多串口数据采集技术

多串口数据采集技术

2018-06-23 01:18

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:
一.概述
1999年6月中石化股份公司巴陵分公司鹰山石油化工厂(以下简称鹰化厂)信息中心自行开发了生产调度监测系统,该系统采集生产装置中DCS系统中实时过程数据,存放于生产调度服务器,生产指挥人员通过网络和客户端软件能得到其需要的实时和历史的生产过程数据。该项目荣获1999年鹰化厂“科技进步三等奖”。本文主要讨论了以微软公司VisualBasic5.0为开发工具采用Moxa公司Moxa多串口卡Turbo C320实现对DCS系统的实时过程数据的采集。本文结合鹰化调度监测系统的实际应用,论述多串口数据采集技术的核心算法。
生产调度监测系统是我厂MIS系统的重要组成部分,是MIS系统完整实现的数据基础。以实时数据采集为基础,采集所有主装置生产过程数据。生产调度监测系统向工厂管理信息系统、办自动化系统提供数据,以达到整个生产过程的综合管理及优化的目的。
该系统数据采集软件的开发环境:在WindowsNT4.0下VisualBasic5.0企业版开发,以微软Access97为后台数据库。WindowsNT4.0 Server具有与Windows 95相同的用户界面,由于其功能强大,再加上友好的图形界面,使用户更容易接受,可减轻网络管理员的负担,是目前主流的网络操作系统之一。Visual Basic是Windows环境下最主要的开发工具之一,为广大的开发人员所接受。从生产调度监测系统数据采集软件的开发过程来看,选择Visual Basic 5.0企业版作为开发工具是十分适合的。虽然Access97是一种桌面型数据库系统,但由于它仍具备一定的大型数据库的特点,升迁到大型数据库系统如Oracle系统、微软公司的SQL-Server等十分容易,这非常有利于本系统今后向大型数据库的升级。后来,在我厂建设企业内部网时,本系统关键实时数据升迁至厂中心数据库Oracle8系统中。
二、多串口数据采集的原理
数据采集是指通过上位机把DCS数据采集到生产调度服务器数据库中,是生产调度监测系统的核心技术。我们创造性地在服务器上安装多串口设备,服务器上运行多串口数据采集软件,通过多串口直接采集现场多套DCS生产过程数据,这样,用一台服务器就实现多台数据采集工作站的功能,充分利用了服务器功能强大的优点(由于数据采集软件数据量较大,必须有速度较快的服务器充当生产调度服务器,我厂生产调度服务器采用HP公司HP LC3 服务器,数据采集软件占用CPU时间30%)。采用多串口数据采集方式完全改变了以往生产调度系统的系统结构,大副降低了生产调度监测系统的硬件成本(因为现场环境恶劣,必须采用工控机作为数据采集计算机,工控机的价格昂贵),减少了系统维护工作量(多台数据采集计算机日夜运行,出故障的概率高)。这种数据采集模式在厂生产高度监测系统中得到成功实施,系统运行一年多以来,被证明是完全可行和可靠的。目前,石化行业和其它制造行业普遍采用DCS,大部分生产单位采用多套DCS系统进行生产控制,因此这种多串口数据采集技术具有相当的推广应用价值。
多串口数据采集系统逻辑结构图:

我厂各主要生产装置的实时过程数据由四套DCS系统采集和设定。生产调度监测系统服务器(以下称上位机)采集DCS系统的各种数据,并把采集到的数据实时存入生产调度服务器数据库系统中,自动地形成历史数据库。其它与上位机通过网络连在一起的计算机可以通过计算机网络能够快速并准确无误地取得实时数据和历史数据。
三、数据采集软件的核心算法
鹰化厂生产调度监测系统数据采集软件运行于上位机上,软件用Visual Basic 5.0企业版开发,由于数据采集软件的主要功能是采集DCS系统的实时过程数据,因此,其核心算法便是对RS232C TTY通信口进行有效的控制的方法,这方面的主要算法有以下几个:(由于篇幅所限,在此只列出主要核心算法的代码)
3-1 串口卡的多RS232C TTY 口通信是同时进行的
由于Visual Basic 5.0不支持多线程开发,因此只利用Visual Basic 的内部功能无法做到多串口通信同时进行。利用Visual Basic 5.0的定时器控件数组巧妙地实现了多个串口同时通信而不互相干扰,这样大大加快了通信速度。
以下代码实现从数据库中取出各种通信参数动态生成多个通信控件MSCOMM、定时器以实现多个串口同时通信的功能:
With frmGetData.datRS232COM.Recordset
.MoveLast
.MoveFirst
 
For i = 1 To .RecordCount
Index = .Fields("rs232com")
Me.TabStrip1.Tabs.Add i, "COM" & Index
Me.TabStrip1.Tabs(i).Caption = "COM" & Index
Load frmGetData.lblAcmd(Index)
Load frmGetData.lblGcmd(Index)
Load frmGetData.TimeReComm(Index)
Load frmGetData.TimerSend(Index)
Load frmGetData.MSCommDCS(Index)
frmGetData.MSCommDCS(Index).Settings = .Fields("set")
frmGetData.MSCommDCS(Index).CommPort = .Fields("rs232com")
frmGetData.MSCommDCS(Index).PortOpen = True
frmGetData.MSCommDCS(Index).RThreshold = 1
“ frmGetData.MSCommDCS(Index).InputLen = 1
frmGetData.TimeReComm(Index).Interval = 1
If i = 1 Then
frmGetData.lblAcmd(Index).Visible = True
frmGetData.lblGcmd(Index).Visible = True
End If
.MoveNext
Next i
End With
3-2 RS232C TTY 口通信是事件驱动的
RS232TTY通信程序开发一般采用2种方法:
1)查询法:程序不断地查询RS232TTY 口,如果有数据则接收,否则继续查询。
2)中断法:有通信事件产生时则自动产生中断,程序转入通信事件处理模块。
鹰化厂生产调度监测系统数据采集软件采用中断法开发。RS232C TTY 串口通信是利用Visual Basic 5.0的MSCOMM通信控件实现的,在通信过程中,各个通信事件自动驱动相关的处理模块,使数据采集程序的结构性好,便于调试,并且在处理串口通信的过程中占用的CPU时间少。
 
以下代码只是简要描述事件驱动模式下的串口控件开发方法,不是原程序中的代码:
Private Sub MSComm1_OnComm()
Dim strGet As String
 
Select Case MSComm1.CommEvent
Case 2
strGet = Me.MSComm1.Input
Me.Text2 = Me.Text2 & strGet
 
End Select
End Sub
3-3 通信格式的处理
在与DCS系统进行通信的过程中,数据采集向DCS系统发送数据采集请求,其请求的命令格式必须严格地遵照各个DCS的通信命令的格式要求,如果有误,则采集不到DCS的数据。本系统对通信格式先作预处理,利用数据维护子模块得到符合各个要采集的DCS系统的通信格式的采集命令字符串,并且存放至数据库的相关表格记录之中,在要进行通信时,只需要从相关表格中取得此字符串,发往相应的RS232C TTY口即可,这样采集程序运行时不再需进行通信格式的生成,使得程度的运行效率得到提高,并且由于采集程序不涉及到通信命令的生成,使得程序不可能产生通信格式方面的错误,因此程序运行的可靠性大大提高。
 
以下子程序实现从数据库中取出通信命令字符串并给RS232口:
Public Sub SendTGData(Index As Integer)
Dim strData As String
Dim strFindIndex As String
frmGetData.lblAcmd(Index).Caption = ""
FlagLineBusy(Index) = True
frmGetData.datQRunPageCom.Refresh
With frmGetData.datQRunPageCom.Recordset
strFindIndex = "rs232com=" & Index
.FindFirst strFindIndex
If .NoMatch = False Then
strData = .Fields("Gcommand")
frmGetData.MSCommDCS(Index).Output = strData
frmGetData.lblGcmd(Index).ForeColor = vbBlack
frmGetData.lblGcmd(Index).Caption = strData
frmGetData.lblGcmd(Index).Refresh
Else
frmGetData.lblGcmd(Index).Caption = ""
End If
End With
End Sub
3-4 数据包的处理
DCS系统得到上位机的数据采集要求后,便把上位机所要求的过程数据进行数据打包处理并发给上位机。为了提高通信效率,上位机一次要求的数据不止一个,DCS系统回应的数据包中包含这些数据,这样便要求有一个解开数据包的子模块。本系统的数据采集解数据包子模块利用数据过滤的算法得到单个过程数据,之后把此过程数据放入一个过程数据集合中,于是便得到各个过程数据。
 
“按DCS格式分离采集命令得到位号放至一集合中
Public Function GetDataFromA(strAData As String) As Collection
Dim i As Integer
Dim strLen As Integer
Dim strMid As String
Dim colData As New Collection
Dim strData As String
If strAData = "" Then
Exit Function
End If
strData = Left(strAData, Len(strAData) - 2) “除去回车换行符
strLen = Len(strData)
 
For i = 1 To strLen
strMid = ""
Do While Mid(strData, i, 1) <> strDataFLag And i <= strLen
strMid = strMid & Mid(strData, i, 1)
i = i + 1
Loop
If strMid <> "" Then
colData.Add strMid
End If
Next i
Set GetDataFromA = colData
End Function
 
Public Function GetTagFromG(strGData As String) As Collection
Dim i As Integer
Dim strLen As Integer
Dim strMid As String
Dim colData As New Collection
Dim strData As String
If strGData = "" Then
Exit Function
End If
strData = Left(strGData, Len(strGData) - 2)
strLen = Len(strData)
For i = 1 To strLen
strMid = ""
Do While Mid(strData, i, 1) <> strDataFLag And i <= strLen
strMid = strMid & Mid(strData, i, 1)
i = i + 1
Loop
If strMid <> "" Then
colData.Add strMid
End If
Next i
Set GetTagFromG = colData
End Function
四、多串口数据采集软件的易用性和健壮性
4-1 多串口数据采集软件的易用性:即程序界面、人机接口的友好性
在生产调度监测系统中,只有系统维护人员可以看到数据采集软件的界面。由于数据采集软件需要同时采集多个DCS系统的数据,因此给数据采集软件的编写、调试以及维护带来相当大的困难,数据采集软件利用Visual Basic5.0的多页面控件实现了本系统的多串口通信数据显示功能,这种界面给系统开发维护人员提供极大方便。
从上图可以看出,在一个窗口上可以同时看到多个串口数据,只需鼠标在所需要的串口上(下图中的COM5,COM6,COM7等)一点,此串口的接收和发送的数据即显示出来。
 
以下子程序代码实现多页面以及位于其上的各种控件数组的动态生成。
Private Sub Form_Load()
Dim i As Integer
Dim Index As Integer
frmGetData.datRS232COM.ReadOnly = True
frmGetData.datRS232COM.Refresh
With frmGetData.datRS232COM.Recordset
.MoveLast
.MoveFirst
 
For i = 1 To .RecordCount
Index = .Fields("rs232com")
Me.TabStrip1.Tabs.Add i, "COM" & Index
Me.TabStrip1.Tabs(i).Caption = "COM" & Index
Load frmGetData.lblAcmd(Index)
Load frmGetData.lblGcmd(Index)
Load frmGetData.TimeReComm(Index)
Load frmGetData.TimerSend(Index)
Load frmGetData.MSCommDCS(Index)
frmGetData.MSCommDCS(Index).Settings = .Fields("set")
frmGetData.MSCommDCS(Index).CommPort = .Fields("rs232com")
frmGetData.MSCommDCS(Index).PortOpen = True
frmGetData.MSCommDCS(Index).RThreshold = 1
frmGetData.MSCommDCS(Index).InputLen = 1
frmGetData.TimeReComm(Index).Interval = 1
If i = 1 Then
frmGetData.lblAcmd(Index).Visible = True
frmGetData.lblGcmd(Index).Visible = True
End If
.MoveNext
Next i
End With
frmGetData.TabStrip1.Tabs.Remove i
frmGetData.Caption = "调度系统后台通信程序"
frmGetData.mnuBegin.Checked = False
frmGetData.lblAcmd(0).Visible = False
frmGetData.lblGcmd(0).Visible = False
frmGetData.datPage.Visible = False
frmGetData.datQRunPageCom.Visible = False
frmGetData.datRS232COM.Visible = False
frmGetData.datTagDB.Visible = False
Call mnuModel_Click “通信控件在事件摸式
mGetData.IndexCentumTrend = mGetData.GetIndexCentumTrendCom
For i = 5 To 20
mGetData.blnConnect(i) = True
Next i
End Sub
 
4-2 多串口数据采集软件的健壮性:通信自动恢复功能和事件日志功能
在通信过程中,可能有意外的事件发生,例如停电造成Modem不能通信等等情况,这些情况会造成通信出错而导致系统失败。数据采集软件对各种意外事件均做了相当充分的考虑,如Modem停电或断线等,在恢复供电后或Modem断线重新挂接后,数据采集软件可以判断并进行自动恢复工作。
当有通信意外事件发生时,数据采集软件自动地把出现的意外事件记录到数据库中,便于维护人员分析。在生产调度系统运行一年多以来,没有出现因为数据通信有误而导致系统失败的情况发生,其中数据采集软件的通信自动恢复和事件日志功能起了关键性的作用。
 
以下子程序通过检查专线Modem的状态判断通信线路是否正常:
Public Function CheckConnect(Index As Integer) As Boolean
Dim intPos As Integer
intPos = InStr(1, frmGetData.lblAcmd(Index).Caption, "NO CARRIER")
If intPos > 0 Then
frmGetData.TimerSend(Index).Enabled = False
mGetData.blnConnect(Index) = False
frmGetData.lblAcmd(Index) = ""
frmGetData.lblGcmd(Index).ForeColor = vbRed
frmGetData.MSCommDCS(Index).OutBufferCount = 0
frmGetData.MSCommDCS(Index).InBufferCount = 0
Call mGetData.LogEvents(Index, "NO CARRIER")
CheckConnect = False
Exit Function
End If
intPos = InStr(1, frmGetData.lblAcmd(Index).Caption, "CONNECT")
If intPos > 0 Then
frmGetData.lblAcmd(Index) = ""
frmGetData.MSCommDCS(Index).InBufferCount = 0
frmGetData.MSCommDCS(Index).OutBufferCount = 0
frmGetData.lblGcmd(Index).ForeColor = vbBlack
Call mGetData.LogEvents(Index, "CONNECT")
mGetData.blnConnect(Index) = True
If frmGetData.mnuBegin.Checked = True Then
frmGetData.TimerSend(Index).Enabled = True
End If
Exit Function
End If
FlagLineBusy(Index) = False
CheckConnect = True
End Function
 
以下子程序实现通信事件日志记录到数据库系统:
Public Sub LogEvents(Index As Integer, strEvents As String)
With frmCommEvents.datPrimaryRS.Recordset
.AddNew
.Fields("rs232com") = Index
.Fields("DateTime") = Date & " " & Time
.Fields("EventsLog") = strEvents
.Update
End With
End Sub
五、结束语
目前,我厂生产调度实时监测系统投入使用1年多以来,生产数据准确可靠,系统运行安全稳定,数据更新快速,大大方便生产指挥人员及时、准确掌握生产实际情况,为生产指挥人员正确、有效、科学地指挥生产提供了强有力的保证,确保了工厂生产的安全运行。
我厂该项目的实施得到了原鹰化厂总工程师朱泽华同志的大力支持和鼓励,在此表示感谢,此外,本文的撰写得到了信息中心有关技术人员的大力支持,一并表示感谢。