00_PVI Services最简Demo

<< 点击显示目录 >>

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

00_PVI Services最简Demo

使用说明

使用ANSL协议,对gPV1这个全局变量进行连接,并注册为事件驱动类型,只要此变量在1ms内有数值变化即更新数值。

 

例程下载

例程名称

说明

PVIServicesC#_SimplestDemo.7z

最简的Demo-2022版本

2023-07-29-PVIServicesCSharp_SimplestDemo

新版本例程-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();

           }

       }

   }

}