FAQ

<< 点击显示目录 >>

主页  PVI通信 > 应用例程 > Windows >

FAQ

关联文档 → brhelp

可以点击链接跳转至brhelp中PVI章节查看相关补充信息

 

Q1:如何让变量根据固定的频率(20ms)自动刷新值

A1:设置PVI Services方案中的内部刷新时间为1ms,每1ms检查连接的变量是否有变化,有变化则更新。

具体的代码片段如下:

clip0300

 


 

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通讯,因此需要进行如下调整

clip0302

 


 

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,否则持续运行两小时,通讯会自动中断。

clip0315

 


 

Q9:如何对复杂结构体中的某个成员进行读写?

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写法思路略有不同