当前位置:自动化网>智慧工厂门户>应用案例>金属矿山实时数据采集传送软件开发设计

金属矿山实时数据采集传送软件开发设计

发布时间:2019-12-02 09:35   类型:解决方案   人浏览

1 引言


在构建工业互联平台生态体系,促进产业优化升级的过程中,对底层工业设备的数据采集,包括各种仪器仪表,DCS系统,PLC等等工业生产中用到的重要设备,为工业互联网的提供了基础数据支持。目前大多数的生产设备都支持OPC通讯接口, OPC 为多种多样的过程控制设备提供了一个公共的接口,可以减化和促进企业内部各系统的集成,更好的实现数据采集。本设计通过OPC接口采集各种生产数据并上传到云端服务器,并用手机APP显示这些生产数据,把工业自动化生产过程中的数据与互联网相结合的系统软件。


2 OPC 标准概要


微软OPC标准中文全称是(基于Windows的)用于过程控制的链接与嵌入(Object Linking and EmbeddingOLEfor Process Control)。


OPC标准的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。


在过去,为了存取现场设备的数据信息,每一个应用软件开发商都需要编写专用的接口函数。由于现场设备的种类繁多,且产品的不断升级,往往给用户和软件开发商带来了巨大的工作负担。通常这样也不能满足工作的实际需要,系统集成商和开发商急切需要一种具有高效性、可靠性、开放性、可互操作性的即插即用的设备驱动程序。


在这种情况下,OPC标准应运而生。OPC标准以微软公司OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的,在OPC技术中使用的是OLE 2技术,OLE标准允许多台微机之间交换文档、图形等对象。


OPC 是工业自动化过程中数据交换的一个标准, OPC的出现为基于 windows 平台的组态软件和基于现场控制的控制器之间的数据交换提供了确实可行的方法。 它实际上提供了一种机制, 使系统以标准的方式从数据源获取数据, 并提供标准的接口给客户应用程序。 各客户应用程序利用这些接口访问数据。 这样, 现场设备生产商只需要开发一套遵循 OPC 规范的服务器,由服务器与数据源进行通信, 获取现场数据。 客户应用程序通过服务器访问现场设备。


通过全球统一致标准的 OPC 接口可以共享所有提供了 OPC 服务器的现场设备的数据。 现场设备中 OPC 服务器的功能类似于IO 驱动器, 它负责与作为数据供应方的现场设备通信, 将来自数据供应方的数据通过标准的 OPC 接口传送给给数据使用方(人机界面软件)OPC服务器通常支持两种类型的访问接口,它们分别为不同的编程语言环境提供访问机制。这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VisualBasicDelphiPowerBuilder等编程语言开发OPC服务器的客户应用。而自定义接口是专门为C++等高级编程语言而制定的标准接口。


OPC现已成为工业界系统互联的缺省方案,为工业监控编程带来了便利,用户不用为通讯协议的难题而苦恼。任何一家自动化软件解决方案的提供者,如果它不能全方位地支持OPC,则必将被历史所淘汰。


3 金属矿山数据系统


金属矿山数据系统总体架构参见图1所示。


1 矿业数据系统总体结构


在现代化发展的进程中,陈盛矿业生产装备发展越发精密,设备环境越来越复杂,对日常储存的数据监控提出了更高的要求。以往维护都是个很难解决的现实问题,需要安排特定人员完成监测工作,由于人工监控的方式非常容易将出现的异常情况忽视,因此迫切的需要对数据采集监控系统进行开发和研究,此系统能够全天候实时监测现场的环境参数和设备工作状况并实时反映到移动端APP上,以至于不需要人员随时呆在电脑旁,在任何区域只要有互联网即可知道现场生产情况,对异常情况能够及时报警并推送到手机端,从而保证企业人员及时了解现场设备运行情况及生产情况。 


本设计数据采集端采用VB6.0为开发工具,编写OPC客户端程序,实现对现场数据的实时采集。并通过互联网把数据上传到云端服务器,数据库采用sql server 2008。通过C# 语言在.net平台下开发WebAPI云端服务。手机APP采用android系统Java开发语言进行开发。


3.1 系统总方案设计


本项目中,底层采集设备为西门子PLC德国西门子公司PLC 及相关软件因其具有功能强、 速度快、 扩展灵活等优点, 在工业控制领域占据了重要地位, 得到了十分广泛的应用。数据采集程序采用了VB语言进行编写,通过OPC接口进行以太网数据通讯。通过数据采集到的工业生产数据进行处理后上传到云端服务器SQL Server2008,并通过编写.net webAPI作为服务接口给手机端APP提供相关数据显示,数据报警,报警消息推送等等功能。为了能实时快速的显示当前生产数据在手机APP上,本系统读取数据周期为1秒,为了加快数据读取及实时上传数据,系统经过了各种优化,能同时满足同时读取1500个点的,而保证手机端显示数据不会卡死。


3.2 VB语言开发OPC采集系统特点


(1)采集程序采用了VB开发语言,这里用VB语言编写是为了兼容一些老旧的操作系统,由于工业生产中某些计算机的操作系统还比较旧,例如WINDOWS XP,且部分计算机本身配置不足,造成用其他新式语言编写时,由于新式语言的运行平台和相关配置对系统及计算机本身有一定的要求,所以这里选用VB语言更加轻量级,发布的程序不需要安装配套任何软件运行的相关平台或配置,能大大的提高兼容相关低配计算机的实际情况。即使工业计算机配置达不到要求,但一样可以轻松运行。也给相关生产企业降低相关升级计算机软硬件的成本。


(2)VB开发语言对OPC通讯来说更加支持对OPC相关组件的调用,不会出现和其他语言一样兼容性问题。


3.3 选用SQL server数据库作为云数据库特点


1)高性能设计,可充分利用WindowsNT的优势。


2)系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置。


3)强壮的事务处理功能,采用各种方法保证数据的完整性。


4)支持对称多处理器结构、存储过程ODBC,并具有自主的SQL语言。 SQLServer以其内置的数据复制功能、强大的管理工具、与Internet的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。


3.4 选用.net WebAPI服务特点


       (1是简单的 构建HTTP服务的新框架。


       2.net平台上WebApi是一个开源的,理想的,构建REST-FUL服务的技术。


       3不想WCF REST Server 它可以使用HTTP的全部特点。(URI,request/response头,缓存,版本控制,多种内容格式)


       4支持MVC的特征。像路由、控制器、actionfilter、模型绑定、控制反转(IOC)或依赖注入(DI),单元测试。


       5可以部署在IIS和应用程序上。


       6轻量级框架,并且对限制带宽的设备,比如智能手机等支持的很好。


       7Response可以被Web APIMediaTypeFormatter转换成JsonXML 或者任何你想转换的格式。


       8Web API非常适合构建移动客户端服务


3.5选用Java开发手机APP(android)


选用Java开发手机端APP是,一是因为支持android系统,二是因为android系统的占有率比较高,开发效率高,成本低的特点。


4 数据采集程序软件设计


4.1 OPC 对象


OPC 数据存取规范规定的基本对象有三类


服务器(sevrer)、 组(Group)和数据项(Item)。 服务器对象包含服务器的所有信息,也是组对象的容器,一个服务器对应于一个OPCSevrer,即一种设备的驱动程序。 组对象除了包含它自身信息外,还负责管理数据项。每一个数据项代表到数据源的一个连接,但它没有提供外部接口,客户端程序无法对数据项直接进行操作,应用程序必须依靠数据项的容器组对象来对它进行操作。  


4.2 OPC 数据访问方式


OPC 客户端与 OPC 服务器交互包括两个方面:一个是客户端程序从服务器读取数据;一个是客户端向服务器写入数据. 客户端程序读取数据有四种基本方法:同步读、 异步读、 订阅和刷新;客户端向服务器写数据有两种方式:同步写和异步写. 也就是说,OPC 服务器与 OPC 客户端的交互存在 4 种方式:同步、 异步、订阅和刷新。同步通讯时, OPC 客户端向 OPC 服务器进行请求时, OPC 客户端必须等到 OPC 服务器对应的响应全部完成以后才能返回, 在此期间 OPC 客户端一直处于等待状态, 若进行读操作, 那么必须等待 OPC 服务器响应后才返回。


4.3连接OPCServer及建立OPCGroup组部分代码


Dim NewGroupSelection As OPCGroupClass

    Dim OPCServerGroupsCls As Collection

    With OPCServers

        Set Module1.SelectedOPCServer = .Item("Server 0")

    End With

    Set OPCServerGroupsCls = Module1.SelectedOPCServer.GetOPCServerGroupCollection

    Set NewGroupSelection = OPCServerGroupsCls.Item("Group 1 0")

    If (Not NewGroupSelection Is Module1.SelectedOPCGroup) Then

        Set Module1.SelectedOPCGroup = NewGroupSelection

        GetNewItemList

End If

 

Sub AddSelectedOPCServerMain(OPCServerName As String)

    Dim OPCServer As OPCServerClass

    Set OPCServer = New OPCServerClass

    Dim result As Boolean

    Dim SrvName As String

    SrvName = "Server" + str(Module1.ServerIndex)

    result = OPCServer.ConnectOPCServer(OPCServerName, SrvName, Module1.ServerIndex)

    If result = False Then

        result = OPCServer.ConnectOPCServer("KEPware.KEPServerEx.V5", SrvName, Module1.ServerIndex)

    End If

    Module1.ServerIndex = Module1.ServerIndex + 1

    If (result = True) Then

           

        With OPCServers

           .Add OPCServer, SrvName

        End With

       Dim nodX As Node    'declareNode variable.

       Set nodX = fMainForm.tvTreeView.nodes.Add(, , SrvName, OPCServerName)

       nodX.EnsureVisible

        Set Module1.SelectedOPCServer = OPCServer

        Set Module1.SelectedOPCGroup = Nothing

        Set Module1.SelectedOPCItem = Nothing

        lvListView.ListItems.Clear

    End If

    End Sub


4.4 建立读取Item项部分代码


Function AddOPCItemMain(ByVal ItemID As String, ByVal DataTypeSelected As Integer, ByVal ActiveState As Integer)

    Dim ItemKey As String

    If Not Module1.SelectedOPCGroup Is Nothing Then

If Module1.SelectedOPCGroup.AddOPCItem(ItemID, DataTypeSelected, ActiveState, ItemKey) = False Then

            AddOPCItemMain = False

            GoTo ErrorOnAdd

        Else

            AddOPCItemMain = True

        End If

    End If

    

    Dim itmX As ListItem

    Set itmX = lvListView.ListItems.Add(, ItemKey, ItemID)

    itmX.SubItems(1) = "" 'Initialize to no value

    itmX.SubItems(2) = "Bad" ' Initialize to Bad quality

ErrorOnAdd:

End Function


4.5 实时获取相关数据部分代码


Private Sub Timer1_Timer()

    On Error GoTo SkipDisplayUpdate

    Dim OPCGroupItemsCls As Collection

    If InStr("Group 1 0", "Group") Then

        Dim OPCGroupToUpdate As OPCGroupClass

        Dim OPCItemData As OPCItemClass

        Dim OPCServerGroupsCls As Collection

 Set OPCServerGroupsCls=Module1.SelectedOPCServer.GetOPCServerGroupCollection

        Set OPCGroupToUpdate = OPCServerGroupsCls.Item("Group 1 0")

        Set OPCGroupItemsCls = OPCGroupToUpdate.GetOPCGroupItemsCollection

        If OPCGroupItemsCls.Count = 0 Then

            GoTo SkipDisplayUpdate

        End If

        Dim itmX As ListItem

        Set itmX = lvListView.GetFirstVisible

        If Not itmX Is Nothing Then

            Dim NumLinesDisplayed  As Integer

            ' NumLinesDisplayed = (lvListView.Height / 214)

            

            NumLinesDisplayed = (lvListView.ListItems.Count)

            Dim i As Integer

            Dim a As Integer

            Dim GroupItemIndex As Integer

            Dim OPCItemToUpdate As OPCItemClass

            Dim Quality As Long

            Dim ItemValue As Variant

            a = itmX.index

            If LastTopItem <> a Then

                If LastTopItem <> -1 Then

                    Set lvListView.SelectedItem = itmX

                End If

                LastTopItem = a

            End If

            For i = 1 To NumLinesDisplayed

                GroupItemIndex = Val(Mid(itmX.key, InStr(itmX.key, " ")))

                Set OPCItemToUpdate = OPCGroupItemsCls.Item(str(GroupItemIndex))

                ItemValue = OPCItemToUpdate.GetItemValue(OPCItemLocal)

               

                If Not IsArray(ItemValue) Then

                    itmX.SubItems(1) = ItemValue

                Else

                    Dim b As Integer

                    itmX.SubItems(1) = "" ' listview item string to start

                    For b = 0 To UBound(ItemValue)

                        itmX.SubItems(1) = itmX.SubItems(1) + str(ItemValue(b)) + ", "

                    Next b

                End If

                Quality = OPCItemToUpdate.GetItemQuality(OPCItemLocal)

                If Quality And &HC0 Then

                    itmX.SubItems(2) = "Good"

                Else

'                    itmX.SubItems(2) = "Bad" + Str(Quality)

                    itmX.SubItems(2) = "Bad"

                End If

                a = a + 1

                Set itmX = lvListView.ListItems.Item(a)

            Next i

      End If

    End If

SkipDisplayUpdate:

End Sub


5 结束语


本项目中运用的OPC接口采集已经是成为主流的工业数据采集标准,以后越来越多的设备厂家都要支持OPC接口通讯,所以在工业数据采集方面必定成为主流采集方式。除此之外,在项目过程中也遇到了一些问题,比较重要的问题就是关于采集数据点量大的时候数据采集时的数据处理、数据存储、数据上传延时问题及应用程序卡死问题。经过了多次的修改及优化,用数据压缩,数据整合,减少访问数据库次数的方式来使得程序在数据量大的时候也能正常运行。数据采集系统最重要的就是保证数据稳定、高效的传输,这个是基础,如果不能保证,那么后面的数据管理,数据显示,数据报警等功能都无法实现。

本文地址:http://www.ca800.com/apply/d_1o1ak73bk5331_1.html

拷贝地址

版权声明:版权归中国自动化网所有,转载请注明出处!

留言反馈
  • 评价:

  • 关于:

  • 联系人:

  • 联系电话:

  • 联系邮箱:

  • 需求意向:

  • 验证码:

    看不清楚?

  • 在线咨询