<< 点击显示目录 >> 主页 PVI通信 > 应用例程 > Windows > PVIServices_C# > 00_PVI Services最简Demo |
使用说明
•使用ANSL协议,对gPV1这个全局变量进行连接,并注册为事件驱动类型,只要此变量在1ms内有数值变化即更新数值。
例程下载
例程名称 |
说明 |
最简的Demo-2022版本 |
|
新版本例程-2023版本 |
实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BR.AN.PviServices; //使用相应的库
using System.Windows.Forms;
namespace ConsoleApplication2
{
class Program
{
static Service service;
static Cpu cpu;
static Variable variable; //实例化所需连接变量
[STAThread]
static void Main(string[] args)
{
// STEP 1 :首先创建PVI的第一层,Service
Console.WriteLine("Connecting Service ...");
service = new Service("Service");
service.Error += new PviEventHandler(Error);
// STEP 1.1 :委托Service一个方法,若Service层正常创建,则执行service_Connected方法
service.Connected += new PviEventHandler(service_Connected); //添加事件,若触发则自动跳转至service_Connected方法
service.Connect();
// Message loop
Application.Run();
}
static void service_Connected(object sender, PviEventArgs e)
{
// STEP 2 :在PVI第一层Service的基础上,创建PVI通信第二层CPU
Console.WriteLine("Service Connected Error=" + e.ErrorCode.ToString());
// STEP 2.1 :设置CPU即PLC的IP地址与通信协议
cpu = new Cpu(service, "Cpu");
cpu.Connection.DeviceType = DeviceType.ANSLTcp; //此处选择需要通信的协议,若ANSL协议则为ANSLTcp,若为INA2000协议则为TcpIp。老设备 (AR < 4.08) 只支持INA2000协议.
cpu.Connection.ANSLTcp.DestinationIpAddress = "10.86.13.220";
//cpu.Connection.TcpIp.DestinationPort = 11159; //此为INA2000协议的端口号
//cpu.Connection.TcpIp.ResponseTimeout = 2000;
// STEP 2.2 :委托CPU一个方法,若CPU正常创建并可连接上,则执行cpu_Connected方法
cpu.Connected += new PviEventHandler(cpu_Connected);
Console.WriteLine("Connecting Cpu ...");
cpu.Connect();
}
static void cpu_Connected(object sender, PviEventArgs e)
{
// STEP 3.1 在PVI第二层CPU的基础上,创建PVI通信第三层,全局变量
Console.WriteLine("Cpu Connected Error=" + e.ErrorCode.ToString()); //e代表事件类型,记录事件传递过来的额外信息
variable = new Variable(cpu, "gPV1");
variable.Active = true; //True:PLC中的变量可以被PVI访问。False:不访问此变量,当数据量大,当需要提升通信速率,可将不需要通信的变量设置为False。
variable.RefreshTime = 1; //单位为ms。设置数值 > 0,即PLC中数值已固定的频率检查变量是否更新,更新则将数值更新至PVI Monitor中。对于此案例,若参数为1000,数值每1s更新一次;若参数为100,数值每100ms更新一次
variable.Polling = false; //PVI Monitor参数,建议设置为False,若设置为True,则写变量时,会导致写的上一次变更缓存在PVI Monitor的数值。
// STEP 3.2 注册一个委托事件,当variable对应的变量在PLC侧有数值变化,则执行ValueChanged方法
variable.ValueChanged += new VariableEventHandler(ValueChanged);
// STEP 3.3 注册一个委托事件,当全局变量正常创建并可连接,则执行variable_Connected方法
variable.Connected += new PviEventHandler(variable_Connected);
Console.WriteLine("Connecting Variable ...");
variable.Connect();
}
static void variable_Connected(object sender, PviEventArgs e) //sender:代表当前对象
{
Console.WriteLine("Variable Connected Error=" + e.ErrorCode.ToString());
}
/// <summary>
/// Exit application if an error occurs
/// </summary>
static void Error(object sender, PviEventArgs e)
{
Console.WriteLine(String.Format("Error:{0}", e.ErrorText));
//Application.Exit();
}
/// <summary>
/// Write variable value to the console
/// </summary>
static void ValueChanged(object sender, VariableEventArgs e)
{
// 注册至PLC中的变量,若变量变化,则自动输出数值
Variable var = (Variable)sender;
if (var.IsConnected && var.DataValid){
// 若注册的变量是结构体的父变量名,则会输出这个结构体下所有的信息,这些变量以Hash表的方式存储在内存中
Console.WriteLine(DateTime.Now.ToString("yyyy - MM - dd hh: mm:ss.fff") + ": " + "Value={0}", var.Value.ToString());
// 若希望读取结构体成员,则可以Varible[`子成员变量名`]的方式访问具体其中一个变量
// Console.WriteLine(DateTime.Now.ToString(" ") + " gHeating.status.actTemp is : " + "{0}", var["status.actTemp"].Value.ToString());
//Application.Exit();
}
}
}
}