1概述信息
1.1 系统要求
使用范围 |
满足PVI的安装环境,并且基于Microsoft .net 平台的系统,就能适用该方案 |
Automation Runtime 版本 |
V4.2以上 |
1.2 硬件信息
贝加莱的产品:
适用于所有的能被PVI系统连接的对象,包括标准型PLC、Compact CPU、Hypervisor、ARwin、ARsimulator系统的硬件平台。未在SGC系统,比如X20CP0292等系统,2005系统中使用过该方式。
1.3 版本信息
软件版本 |
修改内容 |
时间 |
修改人 |
V1.00 |
按照已有的资料做整理 |
2022-05-16 |
丁瀚舟 |
1.4 术语表
PVI
Process Visualization Interface的简称,是Windows系统和贝加莱PLC系统的软件接口
PVICOM interface
访问PVI 系统的一种方式
Object name
PVI Manager中的过程对象名字
Object path
对象路径由一个或多个Object name组成,并确定过程对象在对象结构中的位置。
Class
类,类是包含了方法、属性、数据成员的高级代码模块,它既在模块的范畴之内,又是一个没有图形界面的Activeocx,程序员可以象使用控件一样使用它。
动态链接库
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。
2基本知识
2.1 通讯原理
为了解决Windows端应用程序能够访问贝加莱系统的问题,我们需要在Windows端为应用程序提供一个官方接口,使客制化的应用程序能够连接到贝加莱系统。
PVI(Process Visualization Interface)为所有的Windows 系统下的应用提供了一个软件接口,该系统以一个应用程序的方式统一接口,并且能够连接大部分类型的贝加莱系统,对接并处理其所有的数据类型数据,并且一些数据转换工作。在此结构下,多个PVI系统能够同时工作,并且能够和媒介相独立。
2.1.1 通讯结构
PVI整个系统由三部分组成:
•PVI Clients
•PVI Manager
•PVI Lines
2.1.2 PVI Clients
PVI Clients指的是 应用程序和PVI Manager的接口,他将请求发送给PVI Manger ,同时PVI Manager 将请求结果反还给PVI Clients。
贝加莱的编程软件Automation Studio 、BROPC DA server可以被认为PVI Clients。对于客制化的应用程序,通过.dll动态链接库中的函数可以将其变成一个PVI Clients。这个.dll动态链接库 被称作为PVICom 接口。
2.1.3 PVI Manager
PVI Manager 是连接的核心,他协调了PVI Clients 系统和PVI Lines系统;从PVI Clients中获得请求,将请求打包按需发送给PV lines 获取数据。
另一个主要功能是转换了数据类型,将IEC类型转换为了Windows通用数据类型,方便Microsoft .net平台的业务应用能够获得数据。
2.1.4 PVI Lines
PVI Lines负责底层,管理通信协议、数据类型、通信介质等因素。目前常用的贝加莱协议为ANSL、INA2000。
2.1.5 PVICOM接口
PVICOM 接口(客户端接口)在最低级别建立对 PVI 系统的访问。就性能而言,是最优化的 PVI 接口。 PVICOM 接口也被所有其他具有 PVI 访问权限的基于 Windows 的组件(PVI OPC、PVI DDE、PVI 服务等)使用。
通过 PVICOM 接口进行的通信由 PVI 通信库“PviCom.dll”(32 位版本)或“PviCom64.dll”(64 位版本)中的函数处理。 PVI 通信库是基于 Windows 标准的 DLL(动态链接库)。
2.1.6 PVI Services接口
PviServices 组件面向希望在 Microsoft .NET 开发平台中要和B&R 控制器通信和诊断服务的用户。由于它基于 PVICOM接口 组件,它作为控制器的接口工作,通过面向对象的处理方式,将数据返回给用户,使用户尽可能轻松快速地交换过程数据。该组件可用于 X86 和 X64(从组件版本 5.0 开始)应用程序。 动态链接库 BR.AN.PviServices.dll 是开发人员构建应用程序所需的唯一引用对象。
2.1.7 PVIServices的层级结构
PVI Services 是基于PVICOM接口的上层组件接口,通过这个接口能方便快速的方位PLC中的数据,同样PVI Services也有层级划分,下面的表说明了PVIServices会分为下面这个层级和与PVICOM接口的关系。
层级 |
描述 |
控制的PVI中的object |
Service |
所有通讯的基础必须生成,生成通讯连接 |
CPU objects(cpu collection) |
CPU |
用于建立和CPU的连接,用于配置CPU连接参数 |
Module objects
Task objects
Global variable objects |
Task |
表示CPU中的任务对象 |
Local variable objects |
Variable |
表示CPU中的变量 |
Structure variables&Structure elements (VariableCollection)
Process data |
Module |
表示CPU中的Module对象 |
- |
2.1.8 函数调用流程
在使用PVI Services时,需要按照层级关系来调用函数,这样才能正常连接到数据,调用逻辑可以查看下面的状态转换图。
3. 配置方法
本文中的配置方法全部基于以下版本,低版本方法类似。
Automation studio V4.9.3.144
Automation runtime VA4.73
PVI版本:PVI 4.11.2.14
Visu studio版本 : VS2019
Microsoft .net 版本:.netframework 4.0
3.1 事前准备
下载并且安装PVI,进入贝加莱官网 Downloads → Software → Automation Net /PVI 下载PVI Development Setup。
下载完成后,点击安装,在选择安装项时,按照下图内容选择安装项。
3.2 配置用例
我们需要搭建一个实用的程序用来连接我们的PLC,此处PLC会用模拟程序代替实际的PLC程序
使用一个进程来循环读取PLC中的特定变量,使用触发方式来写入变量。
3.3 使用VS调用PVI Services组件编程
1.新建一个VB项目(使用C++ 也可以,此处以VB为例)
2.在References里面选择Add Reference将PVIServices的动态链接库导入到项目中
3.选择Browse去PVI的安装目录(例如:X\BrAutomation\PVI\V4.11\PVI\PviServices\VS2012)下将BR.AN.PviServics.dll加载到项目中去。
4.引用PVIServices的动态链接库 ,并且申明要使用的变量。
service、cpu和variable 为PVIservice类,variable 和 PVName设置为数组能够访问复数个PLC变量。其他为程序中使用的变量。
5.实例化Service对象,并且注册service_connected回调事件
6.实例CPU对象,在此对象中配置连接信息,并且注册CPU Connect 事件
此处选择了ANSLTCP连接作为测试,正确配置IP地址和超时时间就能正常获得连接
7.实例化variable对象
当CPU connected 事件出现后,进行variable的实例化并且做variable connect,此处需要填写variable实例的属性,同时注册variable connected 属性。注意打开Active属性和关闭WirteValueAutomatic属性。同时,要注意的是不能对同一个变量名做多次variable连接。这里的变量全部为Automation studio的全局变量。
完成注册后启动进程。
8.在进程中调用variables read 函数读取对应变量。
9.使用variables 实例连接各种变量
a)当Variable 是一个单独变量时:
在实例化variable时候 在PVName处直接填写变量名,
并且在value处不引用成员名
b)当Variable是一个数组时
在实例化variable时候填入数组名
有两种方式获得数组数据,一种是通过value(X)的方式获得特定的数组变量
另一种是通过value.ArrayData的方式整体获得数组变量,但是需要注意的是这个数组必须要从0开始,并且这个接收的数组长度和类型必须和原来的数组一致。
c)当Variable是一个结构体时
在实例化时,需要填写整个结构体的最顶层变量名。
需要注意的是当连接是结构体时,必须要保证变量有IsConnected和DataValid标志位才能有效使用Value(””)的方式进行引用
当需要引用下面的成员时,通过value("成员名”)的方式实现。
如果说他是一个多层的结构体的时候,通过value("成员名.成员名”)的方式实现。
当最终连接的成员是数组时,可以通过value(”成员名.成员名”).ArrayData的方式实现,当然必须使用一个数据类型和数组长度都一致的变量接受。
当连接结构体数组下面的对象时,可以通过value(”成员名[X].成员名”)的方式来实现。
d)当Variable是一个结构体数组时
在实例化时,需要填写整个结构体的最顶层变量名。并且指定是第几个结构体成员。
其成员引用与结构体的下层引用类似。
10.通过触发方式读取变量
制作一个按钮,调用写入变量的命令,variable().Write
例子程序调用了自制函数,实际只要使用variable().Write就可以将变量写入。
写入操作时变量对象的表达也和读取时用同一种表达方式。
11.当退出页面时解除Variable连接,这样才能保证能够下次能够正常连接
3.4 通信错误诊断
1.检查程序逻辑,确保所有的PVIServices层级都正常连接,并且数据类型转换正确。
2.通过PVI的诊断系统进行诊断。
a)通过开始菜单通过管理员模式打开打开PVI monitor,如果打开以后可以在右下角找到小图标,双击也可以打开,打开以后就会显示PVI Monitor操作页面。
b)点击Options点击PVI Diagnostics,在弹出的对话框中选择保存路径,之后点击Snapshot
将会将诊断信息保存到这个路径中。
c)关闭这个PVI对话框后,点击option选择PVI Snapshot Viewer,可以查看当时的报警信息。
4. 测试数据
4.1 使用应用程序对PLC进行读取写入数据测试
4.1.1 读取数据
测试方法:
通过应用程序建立两个Variale 访问结构体数组gStructArr[0] gStructArr[1],该结构体有6000个UDINT变量,数组大小为2。
CPU 占用率变化:
CPU为X20CP0484级别的控制器,空载时:43%,当进行访问时:增加到73%,上升30%
4.1.2 写入数据
在连接变量后,如果在writeValueAutomatic = false情况下,通过数组方式刷新6000个变量数据能够正常刷新,负载变化不明显。
在连接变量后,如果在writeValueAutomatic = True的情况下,通过数组方式刷新6000个变量,应用程序卡死 无法运行。
4.2 测试总结
1.在读取事件变化时,是否有进行写入是不影响Cpu占用率,所以可以一边读取 一边触发式写入。需要控制Varaible的数量,他是负载上升的
2.当建立的Varaibles增多后会出现PVI应用程序object增多的情况,当object增多后负载产生明显上升。
3.不能激活Variable 的writeAutomatic属性,容易造成应用程序卡死。