关联文档 → brhelp
•可以点击链接跳转至brhelp中PVI章节查看相关补充信息
Q1:如何让变量根据固定的频率(20ms)自动刷新值
A1:设置PVI Services方案中的内部刷新时间为1ms,每1ms检查连接的变量是否有变化,有变化则更新。
具体的代码片段如下:
Q2:在高频(ms)数据采集时,如何保持同一时刻(几百或几千)个变量的的数值同步更新?
A2:
•不同类型Runtime下的PLC,所使用的端口号会有所不同,一般我们常用的ARSim端口号为11160。连接实际PLC的端口号为11169。使用的通讯协议为ANSL协议,此协议由于仍然是标准的TCP/IP协议族中一部分,且传输层协议使用TCP,即会受制于协议本身的限制,在高频数据采集的时候,通讯时间延迟会根据实际网络阻塞情况受到影响,一般而言,20ms以下的高频数据采集是没有什么较大的问题,但是存在的一个情况是,通讯数据量越大,数据点越多,通讯数据点的传输效率越会降低。建议将需要采集的变量点均设置为事件触发模式,如问题一的方式。
•根据使用场景来看,目前这种方案是可以满足正常需求,但是要求特殊,如果一定需要尽可能高的满足高频数据采集,可以考虑只连接一个大的数组变量,将所有需要传递的数据在PLC内部做好数据处理与压缩,并将此变量通过PVI Services注册为事件触发模式。
Q3:Windows平台上使用PVI Services方案进行数据采集,发现之前可用的PVI工具,在Hypervisor下的GPOS内无法正常使用
A3:原来的工具默认的PLC连接端口为11159,而Hypervisor内部通讯只支持ANSL通讯,因此需要进行如下调整
Q4:通讯无法建立成功,提示报错码为11020
A4:查看报错号信息,发现此问题与通讯建立问题,检查源代码,发现原来此部分代码使用的的是INA2000协议,AR4.3之后默认支持ANSL协议,因此需要进行替换。
需要将
cpu.Connection.DeviceType = BR.AN.PviServices.DeviceType.TcpIp;
cpu.Connection.TcpIp.DestinationIpAddress = tbPLCIP.Text;
cpu.Connection.TcpIp.DestinationPort = 11159;
修改为
cpu.Connection.DeviceType = DeviceType.ANSLTcp;
cpu.Connection.ANSLTcp.DestinationIpAddress = tbPLCIP.Text;
Q5:为什么使用PVI访问PLC,PLC的内存会减少一部分
A5:ANSL通讯会占用一部分PLC的内存,在使用的时候需要注意PLC可用内存大小。具体可查看此处。
Q6: 如何保证数据采集的连续性?
A6:
首先,如果需要提升通讯的速率,需要使用事件触发的方式对变量进行读操作,具体可查看此处。
其次,需明确PLC的运行情况,是否有足够资源分配给外部通讯,如果PLC中运行的实时任务的负载较高,则会影响到与外部的TCP/IP等不具有实时要求的通讯。
PVI通讯的数据连续性与多种因素有关,有TCP通讯的网络传输结构的影响,还有网络发送机制的影响。在这个应用场景,产生的数据不连续的一个主要原因为,贝加莱PLC响应PVI通讯请求,是通过在IDLE的空闲任务中进行处理的,当PLC中的任务执行负载较高,且没有给IDLE分配一个高优先级的Cyclic的运行资源,则网络传输的连续性会受到影响。具体可以查看贝加莱培训手册TM213中的内容。
再者,由于PVI通讯是通过TCP协议建立起PLC与PC的通讯连接,数据的连续性取决于两个方面,一是PLC能否稳定每20ms发送数据,二是PC侧能否稳定每20ms接受数据。由于我们常用的PC侧操作系统是非实时的Windows操作系统,也会因为操作系统底层服务的影响,导致数据不连续。如果需要每20ms都需要实时保证数据连续,则需要保证数据源,通讯协议,数据接收端在20ms这个时间范围内都能保证实时性。基于之前的测试,在一定数据量的大部分情况下PVI通讯能够做到数据20ms连续。
最终,如果需要保证数据是完整连续不丢,建议在PLC侧写一段缓存数据程序,缓存需要采集的数据大约几秒的数据量,将采集数据的实时要求从20ms变为几秒,这样即可保证数据连续。
Q7:在Windows上使用PVI,是否必须安装并启动PVI Monitor
A7:是的,在Windows上没有PVI Monitor运行,PVI功能无法实现
Q8:Windows上使用PVI是否必须需要TG License?
A8:在贝加莱的工控机上使用,无须TG License,在非贝加莱的工控机上使用则必须插TG License,否则持续运行两小时,通讯会自动中断。
A9:
读:
Variable_read = New Variable(cpu ,"gStructVar")
Variable_read.Connect()
Text_to_read = Variable_read.Value("Array[2].Member.Status.uErrorCode")
写:
this.cpu.Variables["axConveyor"].Connect();
this.cpu.Variables["axConveyor"].Active = true;
this.cpu.Variables["axConveyor"].Value["simulation.parameter.mass1.inertia"] = 25; //结构体成员赋值
Q10: 结构体变量链接后读取,为什么有时候会遇到读不上的情况?
链接结构体变量,建议等待判断链接变量的 .isConnected 与 .DataValid 两个属性值均为True,再进行变量数据读取与赋值。
例程如下所示
'读取结构体变量中的成员变量
If variable(2).IsConnected And variable(2).DataValid Then
TestValueReal = Val(variable(2).Value("TypMem04[0].Mem01"))
End If
Q11: c# 的写法与原本C++的写法有什么差异
TM712中PVI Services C# 写法是对原先C++的PVI DLL用invoke包了一层,是PVI接口变得面向对象了。
变量的访问需要一层一层调用,等待其中的回调函数执行完成后,再继续执行下一个方法,这点与原DLL写法思路略有不同