OPC通信技术一经问世, 就在自动化生产等相关行业掀起了浪潮, 其独特的机制屏蔽了不同种硬件设备之间的差异, 全部使用一个标准, 使得软件开发商不再拘泥于各种纷繁杂乱的驱动软件开发工作, 节省了许多开发时间, 不同厂商的设备也可以实现互连互访[1]. 目前OPC技术在编程语言开发的软件中实现方式有很多种, 文献[2]使用Qt开发OPC服务器, 并利用Matlab建立Simulink工程进行仿真模拟, 验证了其可行性. 文献[3]基于C#语言实现了OPC客户端, 详细地阐述了客户端的编写过程, 并有具体的代码实现, 为OPC自动化接口的实现提供了借鉴. 如文献[2,3]等研究基本涵盖了当下常用的开发环境, 对OPC组件的开发具有一定的指导意义, 但主要集中在OPC服务器或客户端研究, 缺乏对整体过程构建的探讨, 难以在实际生产中指导上位机程序的编写. 在此情况下, 本文提出了一种基于“Qt+KEPServerEX”的OPC开发方式, 以KEPServerEX作为OPC服务器, 简化了服务器的开发过程, 并使用Qt将客户端嵌套进上位机监测系统中, 加之一些上位机常用功能模块, 构成一个完整的生产线监测系统, 并在一条实际的装配线中投入使用.
1 技术概述 1.1 OPC技术简介用于过程控制的OLE (OLE for Process Control, OPC)是一种基于Windows系统的工业自动化标准. 它采用C/S模式[4], 简化了软、硬件间的通信流程, 为应用程序和现场硬件生产设备等架起了桥梁. 该技术以微软的OLE技术为基础, 跨过TCP协议层次, 在应用层中直接进行数据通讯, 客户程序只需简单配置客户端程序, 即可访问OPC接口中的Server程序[5], 实现与设备之间的交互.
1.2 KEPServerEX简介KEPServerEX是一款服务器软件, 内部已集成OPC标准接口. 客户端程序按照OPC标准编写, 并和服务器做对应的配置, 即可连接KEPServerEX所建立的服务器.
1.3 PLC简介可编程逻辑控制器(PLC)是一种工业控制微型计算机, 其稳定性好、操作灵活, 可通过内部预设的各种运算指令等来控制各种类型的设备及生产过程, 并进行相关的计算[6].
2 通信过程的构建 2.1 OPC通信接口选择OPC服务器有两种接口, 如图1所示. 一种是自动化接口, 这种自动化接口主要用于VB、C#等编程语言, 为这一类可使用自动化对象的程序服务[7]. 另一种定制接口则为C++等语言服务, 定制接口是服务商必须提供的, 具有一定的灵活性. Wincc之类的软件可以直接通过其内部的OPC Server接口实现与PLC的通信[8], 但是组态软件价格昂贵, 对于一个项目而言是一笔很大的开支. 一般项目为了节省成本, 采用C++等高级编程语言来实现OPC通信接口. 而在Qt等C++环境中应用OPC通信技术, 必须引入OPC基金会提供的文件[9].
系统的核心部分为与PLC的交互部分, 数据接收与处理需严密及准确, 而定制接口可以根据现场需要来定制开发, 所以综合考虑, 决定采用定制接口来构建OPC客户端.
2.2 数据访问方式OPC的数据读取方式有同步、异步、订阅式3种访问方式.
(1)同步访问可进行读、写操作, 其特点是在和OPC服务器发生数据交互的期间, 会阻塞系统线程, 直到OPC数据标签的读取或写入完成后才可继续执行. 适用于标签数据较少的情况.
(2)异步访问是把数据交互过程放在服务器端执行, 执行期间客户端程序可以去进行其他工作. 当数据交互完成后, 服务器会主动触发客户端的异步访问完成事件. 该方式在数据标签量较多和网络拥堵的情况下执行效率很高.
(3)订阅式数据采集属于异步访问的一种特殊类型. 服务器在固定周期内检查过程数据, 如果发现数据变化超过一定范围, 就立刻通知客户端来接收数据. 这种方式可有效降低客户程序对服务器的重复访问次数. 缺点是不能对服务器进行写入操作.
一般生产线数据总体产生量较大, 并且在运行过程中, 经常需要由客户端向PLC发送一些数据指令, 以完成一些特殊的控制操作, 客户端对服务器的读写功能是必要的. 综上所述, 异步读取的方式更加适合本系统.
2.3 KEPServerEX构建服务器利用KEPServerEX搭建OPC服务器, 其核心思想与一般构建服务器的思路基本一致, 关键点在于创建OPC服务器的服务器对象(Server)、组对象(Group)、项对象(Item). 一个服务器对象可以包含多个组, 一个组对象可以包含多个项[10]. 项是整个通信过程的基本单位, 其作用是维护OPC服务器中与数据有关的信息. 组则作为设备的基本单位, 提供包容和组织OPC项对象的机制[11], 在实际的生产过程中对应由一台PLC上测量产生的所有数据的集合. 服务器对象则作为OPC组对象的包容器, 通过列举本地设备上的所有可连接的服务器, 对其进行初始化后获取服务器名称和唯一标识符. KEPServerEX在本系统中充当服务器的角色. 在KEPServerEX中, 先需要指定设备对应的模型, 该模型为设备所使用的PLC型号, 设备驱动选择当前PLC以太网网卡驱动, 随后指定一个固定网段(根据交换机划分)作为设备的唯一ID. LinkType表示要选择上位机的类型, 有OP、PG、PC三种类型, 其中PG是针对生产线上的工控机使用的连接类型. 构建过程如图2所示.
Tag作为一个设备的基本单位, 对应需要采集的数据信息, 由PLC产生其通讯地址, 一个数据变量产生一个地址. 如地址“DB14,REAL2”, DB是PLC数据块的简写, DB14代表编号为14的PLC数据块, 而REAL则是该数据的类型, 2代表则是在该段连续的表示通道结果的地址上的偏移量, 随后依次为通道2、通道3等. 根据PLC数据块中产生的变量信息, 组合产生数据地址. 随后在KEPServerEX对应的设备中输入地址, 即可形成与PLC间的数据通道. 数据地址一般由PLC内部程序的编写人员以文档的形式提供, 上位机开发人员只需将数据地址与标签数据对应起来, 无需考虑PLC内部如何设定变量地址.
2.4 构建OPC客户端
OPC客户端构建工作主要集中在连接服务器、响应接收、关闭连接3个部分, 具体过程如下:
(1)自定义ConnectedOPC函数, 包含OPCClient.h头文件, 创建了一个客户端对象, 调用成员函数Connect函数进行连接, 该函数原型为: HRESULT Connect(QString s). 连接成功后, 使用HRESULT AddGroup(QString n, DWORD update_rate, int async=1)创建组信息, n为组信息, 包含标签tags, 组名的格式一般为“服务器名+组名+数据项”, 一个工位的数据为一组. update_rate为数据刷新率, 其设置时要保证小于服务器的接收速率. async为访问方式设定, 其值为0时表示同步方式, 值为1时表示异步方式, 缺省值为1, 读写函数会根据该值来区分调用. 之后自定义AddItemwin函数, 将所有数据项预先装入列表中, 通过AddItems将数据项添加进服务器, 与服务器中添加的tags对应起来, 形成一个与服务器之间进行数据交互的通道, 建立连接.
(2)利用Qt中信号与槽机制, 设立信号sg_OnDataChange(OPCHANDLE, DWORD, OPCHANDLE*,VARIANT*, WORD*, FILETIME*, HRESULT*)与接收处理槽函数sl_OnDataChange(OPCHANDLE hGroup,DWORD dwCount, OPCHANDLE *phClientItems, VARIANT *pvValues, WORD *pwQualities, FILETIME *pftTimeStamps, HRESULT *pErrors), 该机制中要求信号和槽的参数类型必须保持一致. 以槽中参数为例, 依次为组、标签个数、数据项、数据内容、数据质量、时间戳、错误信息, 其中数据质量代表着数据的可信度, 时间戳代表着数据的存取时间, 使用VariantString函数来输出项目值字符串, 函数原型为QString VariantString(VARIANT & pValue), 以pvValues[i](0<i<dwCount)作为参数, 接收来自服务器的数据信息. 这里的发生机制为触发式进行, sg_OnDataChange信号来自copctransaction.h头文件, 在OPCClient.h包含其对象, 每当PLC有新数据到达服务器时, 就会发送该信号给客户端, 提醒其有数据到来. 针对异步访问, 需设立一个数组, 作为缓冲区来辅助接收服务器数据, 方便后续处理.
(3)当完成数据通信后, 客户端资源会随着程序关闭而释放. 在工位类析构函数中调用Disconnect函数, 该函数会清除通信过程中所有的组、数据项等信息, 释放通信过程中的中间对象等, 并置为初始状态. 当客户端内部对象释放之后, 客户端对象释放.
3 上位机基本功能模块在接收到PLC的数据后, 需先进行数据过滤, 否则数据表中会混入一些无效数据. 经过滤之后得到的数据一般有以下4个流向.
3.1 数据存储模块数据汇入数据转储模块中, 经过客户端接收过滤后, 直接存储进MySQL数据库中. 每个需要存储数据的工位对应一个数据模型, 各自独立存储, 随时等待数据到来. 而工位类过滤完毕后, 将一组数据打包, 通过信号发送给对应的模型类. 保存之后, 在每天固定时间生成备份文件, 并按月导出生成数据报表, 以便后续查看.
3.2 界面反馈该模块主要包含实时数据显示和CPK计算两个子部分.
(1)实时数据显示: 采集的数据需要实时反馈到界面上, 方便现场人员的测试与观察. 显示的内容一般还会包括工位的运行信息, 如循环周期、日生产计数、累计生产计数, 这些数据由各工位PLC独立统计, 既可以作为观测工位运行情况的重要参考, 又可以和程序主界面中的时间模块统计信息一起作为OEE的计算要素. OEE又称为设备综合效率, 是从运行情况中的各种时间角度来分析设备运行效率[12], 不同的项目根据实际情况决定是否添加OEE计算模块.
(2) CPK计算: CPK又称为过程能力指数, 是现代企业用于表示制程能力的指标. CPK的标准分为A+至D五个等级, 如表1所示, 根据其等级来指导生产线后续生产计划.
CPK标准的计算公式为:
${V_{\rm CPK}}{\rm{ = }}Cp\times(|1 - Ca|)$ | (1) |
其中, Cp, Ca分别为制程精准度和制程精确度. 取样的数据至少在20组以上, 这样计算的结果才具有代表性. 计算过程如下:
以X1, …, Xn来表示n个样本数据, 则:
${X_s} = \sum\limits_{i = 1}^n {{X_i}} $ | (2) |
${X_{\rm avg}} = \frac{{{X_s}}}{n}$ | (3) |
$\sigma = \sqrt {\frac{{\displaystyle\sum\limits_{i = 1}^n {{{\left( {{X_i} - {X_{\rm avg}}} \right)}^2}} }}{n}} $ | (4) |
${V_{CPK}} = \frac{{Min(USL - {X_{\rm avg}},\;{X_{\rm avg}} - LSL)}}{{3\sigma }}$ | (5) |
其中, Min函数意为取两个参数中值较小的那一个作为结果. 随后将计算结果显示在界面中, 并依据结果对生产线进行改进.
3.3 图表分析图表分析模块可采用外部导入的QCustomPlot完成. 一般情况是对采集的数据进行均值极差图(Xbar-R)和正态分布图的绘制, 均值极差图可对采集的连续的数据进行分析, 观察生产情况是否处于控制限中. 正态分布图则可观察一个阶段生产的产品的概率分布, 根据分布是否明显来判断生产过程的稳定性.
3.4 警报信息记录及导出每个工位采集的数据中有一部分是工位报警信息. 在工位类中预设报警的内容, 并与PLC发送来的报警标签进行对应. 主界面中应设立相应的报警模块, 每当某个工位的某个预警项收到警告数据时, 即显示该工位为报警状态, 并将警告数据对应的报警信息显示在该模块中, 统计已发送的警告信息的数量, 每天导出文本文档用作报警日志文件.
4 程序的部署 4.1 生产线结构及服务器部署本系统部署在某轮毂装配线的工控机上, 同时监控上料、清洗、孔径检测、压装等11台工位, 每一台工位由一个PLC控制, 由两台交换机构成生产线网络. 由AGV小车对轮毂进行运送, 机械手臂进行轮毂的上料, 完成一圈装配检测后, 机械手臂将轮毂取下并区分放置, 统计合格数与NG数, 发送至本系统用以记录生产信息, 并将质量情况和检测结束时间导入另一张数据表. KEPServerEX的配置情况如图3所示, 系统的类结构如图4所示.
PLC采用SIMATIC S7-1200型号. S7-1200设计紧凑、功能强大, 市场应用十分广泛, 并且逐渐取代S7-200等产品[13], 其通信能力极强, 以太网接口可以实现与S7-200、Wincc, 以及一些计算机或显控面板的OPC通信.
设备驱动设置为Siemens TCP/IP Ethemet, 服务器名预设为“Kepware.KEPServerEX.V5”. 系统整体结构如图5所示.
4.2 人机交互界面设计
依据现场提供的装配线信息和布局情况, 在程序中大致建立装配线的二维模型, 每个工位根据实际位置布局分布在模型的对应位置上, 可操作区域用特殊颜色标记. 整体界面如图6所示.
4.3 核心分析模块
系统核心分析模块主要是针对CPK值、XBar-R图、正态分布情况的分析, 具体过程如下:
(1) CPK分析: 在系统中通过指定日期间隔来选择计算区间的数据, 从而进行CPK计算. 根据实际的生产情况, 初始化孔径、测笔(位移传感器)、锥度的USL与LSL: USL(孔径)=159.915, LSL(孔径)=159.845, USL(测笔)=37.00, LSL(测笔)=36.85, USL(锥度)=0.1, LSL(锥度)= −0.1. 这里主要是对OP103进行计算, 部分参与计算的数据如 表2所示, 这里总共计算7个CPK值, 由表3的计算结果可以看出, 当前103工位处于A级, 状态良好.
(2) Xbar-R图及正态分布分析: Xbar-R控制图是取所有测量数据中心的部分数据来绘制, 可以每小时连续取5个数据, 随着数据的不断增加, 坐标轴会自动进行横向扩展, 动态地展示数据情况. 这里图表分析采用的是实时采集的数据, 如图7所示, 可以看出当前测量的数据皆处于控制限中, 分布于中心线(CL)两侧.
正态分布则是基于公式:
$F(x) = \frac{1}{{\sqrt {2\pi } \sigma }}\exp \left( { - \frac{{{{(x - \mu )}^2}}}{{2{\sigma ^2}}}} \right)$ | (6) |
其中, μ为期望值, σ为标准差, 对于各个标签数据进行正态分布分析, 观测其概率分布情况. 取当前数据库中保存的单个标签的所有数据, 代入公式, 根据计算结果绘制正态分布图. 103工位通道1~2(孔径)正态分布图如图8、图9所示, 可以观察出孔径1、2概率分布多数集中于[159.87, 159.885]区间之中, 生产情况稳定.
5 实验结果本系统在卡车轮毂装配线中部署, 成功地与生产线上的11台工位通信并交互, 部分设备采集数据如图10、图11所示, 测试过程中发现传输延时小于800 ms, 可满足一般生产线的需求. 采集之后实时计算数据, 并进行相应的分析, 结果以文本和数据库的方式保存下来, 或导出为数据报表. 该系统经过多次实验测试、现场对接和修改后, 最终形成了稳定版本. 目前该系统已经在现场运行了10个月, 在此期间除一些界面设计的问题需要修改, 系统主体和功能模块均无问题.
6 结束语
本文针对当下OPC技术在自动化生产线的运用, 提出了一种构建完整OPC通信机制的思路, 简化了通信机制的构建过程, 在此基础上又融合一些在实际生产过程中常用的数据转储、分析计算等功能, 构成了一个能满足一般生产线需求的上位机系统, 并在实际过程中部署及使用, 验证了该系统通信延时低、稳定性高等特点, 为今后上位机监控软件的编写提供了一定的借鉴与参考.
下一阶段我们的工作主要是以下两个方面: (1)对系统的性能等问题进行优化; (2)对现有功能模块进行改进, 使其更加方便直观地反馈信息.
[1] |
赵勤学, 杨俊杰, 楼志斌. 基于OPC技术的高压开关柜无源无线温度监测系统设计. 计算机工程, 2017, 43(11): 303-309. DOI:10.3969/j.issn.1000-3428.2017.11.049 |
[2] |
黎邦腾, 梁薇, 马平. 基于Qt平台的OPC服务器的开发及仿真应用. 计算机测量与控制, 2017, 25(11): 154-158. |
[3] |
龚勋, 王淑营. 基于C#的OPC客户端设计. 计算机系统应用, 2020, 29(5): 239-244. DOI:10.15888/j.cnki.csa.007373 |
[4] |
尤炜焜. 基于虚实融合的自动化产线实时监控系统设计与实现[硕士学位论文]. 武汉: 华中科技大学, 2019.
|
[5] |
郭骅祥, 杨延超. 基于OPC协议的数据采集实际应用分析. 工业控制计算机, 2019, 32(9): 40-41, 43. DOI:10.3969/j.issn.1001-182X.2019.09.017 |
[6] |
甘小林. 基于PLC的电梯模拟控制系统的设计[硕士学位论文]. 电子科技大学, 2018.
|
[7] |
秦胜利, 王锬. 用VB编写OPC客户端访问WinCC的实现. 安徽冶金, 2011(4): 33-35. |
[8] |
巩超, 宫亮, 杨煜普. 基于TCP/IP的异构平台OPC通信. 计算机工程, 2008, 34(21): 62-64. DOI:10.3969/j.issn.1000-3428.2008.21.023 |
[9] |
何西坤, 王运福, 张东. 基于VC++的OPC客户端的研究与实现. 计算机与网络, 2013, 39(16): 62-65. DOI:10.3969/j.issn.1008-1739.2013.16.067 |
[10] |
张河, 鲁五一. OPC客户端与实时数据库通信的实现. 计算机工程与科学, 2008, 30(5): 81-83. DOI:10.3969/j.issn.1007-130X.2008.05.025 |
[11] |
王杰, 高昆仑, 王万召. 基于OPC通信技术的火电厂DCS后台控制. 电力自动化设备, 2013, 33(4): 142-147. DOI:10.3969/j.issn.1006-6047.2013.04.026 |
[12] |
卢才武, 钱维秀, 江松. 基于OEE的露天矿电铲生产效率测评方法研究. 矿业研究与开发, 2018, 38(5): 74-79. |
[13] |
张露, 贲鑫. 基于S7–1200的RS485串口通讯. 工业控制计算机, 2020, 33(4): 99-100. |