TaskCollection class

<< 点击显示目录 >>

主页  PVI通信 > PVI帮助信息 > PVI Services > 所有列表类型的基础服务 > 用于管理通信对象的列表 >

TaskCollection class

TaskCollection类包含与ModuleCollection类相同的属性和方法。然而,这个类的实例也包含任务对象(在广义上也代表模块对象),应该可以简化对局部变量对象的访问。和模块属性一样,CPU对象也包含任务属性,它允许你访问CPU的任务对象。 上传 方法读取CPU的所有任务信息,从而创建单个任务对象并将其添加到列表(Tasks)中。

然后从CPU对象中访问一个局部变量对象(前提是 "ab_task "任务对象在其列表中包含局部变量对象),出现如下情况。

Variable tmpVar = cpu.Tasks["ab_task"].Variables["loc_var_01"];

任务集合例子

下面的例子显示了如何通过从控制器(Upload)读取任务信息并连接一个选定的任务对象来读取连接的任务对象的局部变量信息。此外,可以通过从列表中选择个别局部变量对象的值来访问它们。

image018

// Definition of global communication objects
Service service;
Cpu cpu;
Variable selectedVariable;
/// <summary>
/// Generate and connect service object
/// </summary>
private void btConnectPLC_Click(object sender, System.EventArgs e)
{   this.lbLocalVariables.SelectedValueChanged += new EventHandler(VariableSelected);
  if ( service == null )
  {
    service = new Service("service");
    service.Connected += new PviEventHandler(service_Connected);
  }
  service.Connect();
}
/// <summary>
/// Connect CPU object if service object connection successful
/// </summary>
private void service_Connected(object sender, PviEventArgs e)
{
  if ( cpu == null )
  {
        // Create CPU object and add the event handler
    cpu = new Cpu(service,"cpu");
    cpu.Connected += new PviEventHandler(cpu_Connected);
    cpu.Tasks.Uploaded += new PviEventHandler(TaskInfoUploaded);
    // Set the connection properties for a TCP/IP connection
    cpu.Connection.DeviceType = BR.AN.PviServices.DeviceType.TcpIp;
    cpu.Connection.TcpIp.SourceStation = 1;
    cpu.Connection.TcpIp.DestinationStation = 2;
    cpu.Connection.TcpIp.DestinationIpAddress = "10.43.70.202";
  }
    // Connect CPU
  cpu.Connect();
}
/// <summary>
/// CPU object connected successfully
/// </summary>
private void cpu_Connected(object sender, PviEventArgs e)
{
  this.tbEvents.Text += "PLC connected\r\n";
  this.btUploadTaskInfo.Enabled = true;
}
/// <summary>
/// Read task information of the CPU object.
/// 然后,任务对象被自动添加到TaskCollection对象的列表中(Tasks属性)。.
/// </summary>
private void btUploadTaskInfo_Click(object sender, System.EventArgs e)
{
  this.cpu.Tasks.Upload();
}
/// <summary>
/// Task information read successfully
/// </summary>
private void TaskInfoUploaded(object sender, PviEventArgs e)
{
  this.tbEvents.Text += "Task information uploaded\r\n";
  this.btConnectTask.Enabled = true;
  // 将任务对象插入ListBox中
  this.lbTasks.Items.Clear();
  foreach (Task task in cpu.Tasks.Values)
  {
    this.lbTasks.Items.Add(task.Name);
  }
}
/// <summary>
/// Connect to a selected task object on the
/// controller
/// </summary>
private void btConnectTask_Click(object sender, System.EventArgs e)
{
  if ( this.lbTasks.SelectedItem != null )
  {
    // 暂时存储选定的任务对象
    Task tmpTask = cpu.Tasks[this.lbTasks.SelectedItem.ToString()];
    // 添加处理程序并建立连接
    tmpTask.Connected += new PviEventHandler(SelectedTaskConnected);
    tmpTask.Connect();
  }   
}
/// <summary>
/// Connection to selected task successful
/// </summary>
private void SelectedTaskConnected(object sender, PviEventArgs e)
{
  Task tmpTask = (Task)sender;
  // 删除该任务的处理程序,因为它在下一次 "btConnectTask_Click "时被重新添加连接
  tmpTask.Connected -= new PviEventHandler(SelectedTaskConnected);
  this.tbEvents.Text += "Task \""
 ((Task)sender).Name.ToString() + "\" connected\r\n";
}
/// <summary>
/// 从控制器中读取所选任务的局部变量信息
/// </summary>
private void btUploadLocalVariables_Click(object sender, System.EventArgs e)
{
  if ( this.lbTasks.SelectedItem != null )
  {
    // 暂时存储选定的任务对象
    Task tmpTask = cpu.Tasks[this.lbTasks.SelectedItem.ToString()];
    // 为任务对象的VariableCollection对象添加处理程序并读取信息 ->上传
    tmpTask.Variables.Upload();
    tmpTask.Variables.Uploaded += new PviEventHandler(SelectedTaskVariablesUploaded);
    }
  }
/// <summary>
/// 成功读取所选任务对象的局部变量信息
/// </summary>
private void SelectedTaskVariablesUploaded(object sender, PviEventArgs e)
{
  // 这个事件的 "发送者 "不是任务对象,而是任务的局部变量对象的VariableCollection对象。
 // 因此,任务必须通过VariableCollection的父对象。
  Task tmpTask = (Task)(((VariableCollection)sender).Parent);
  // 移除处理程序
  tmpTask.Variables.Uploaded-=new PviEventHandler(SelectedTaskVariablesUploaded);
  // 将局部变量对象插入列表中
  this.lbLocalVariables.Items.Clear();
  foreach ( Variable variable in tmpTask.Variables.Values )
  {
    this.lbLocalVariables.Items.Add(variable.Name);
  }
}
 
/// <summary>
/// 当ListBox对象被选中时,它被主动连接,并添加一个处理例程用于修改数值。
/// 之前选择的对象被取消注册。
/// </summary>
private void VariableSelected(object sender, EventArgs e)
{
  // 断开以前选择的变量对象与过程对象的连接
  if ( selectedVariable != null )
  {
   selectedVariable.Disconnect();
   selectedVariable.Disconnected += new PviEventHandler(SelectedVariableDisconnected);
  }
  // 通过CPU对象确定当前选择的变量对象
  selectedVariable = this.cpu.Tasks[this.lbTasks.SelectedItem.ToString()].Variables[this.lbLocalVariables.SelectedItem.ToString()];
      
  if ( selectedVariable.IsConnected == false )
  {
    // 切换变量激活并连接
    selectedVariable.Active = true;
    selectedVariable.Connect();
    selectedVariable.Connected += new PviEventHandler(SelectedVariableConnected);
    // 添加ValueChanged处理程序
    selectedVariable.ValueChanged += new VariableEventHandler(SelectedVariableValueChanged);
  }
}
/// <summary>
/// 显示所选变量对象的数值变化
/// </summary>
private void SelectedVariableValueChanged(object sender, VariableEventArgs e)
{
  Variable tmpVariable = (Variable)sender;
  // 只对基础数据类型进行处理
  this.lbValue.Text = String.Format("\"{0}\":{1}",tmpVariable.Name,tmpVariable.Value.ToString());
}
/// <summary>
/// 所选变量对象连接成功
/// </summary>
private void SelectedVariableConnected(object sender, PviEventArgs e)
{
  Variable tmpVariable = (Variable)sender;
  tmpVariable.Connected -= new PviEventHandler(SelectedVariableConnected);
  this.tbEvents.Text += String.Format("\"{0}\" connected\r\n",tmpVariable.Name);
}
/// <summary>
/// 选定的变量对象成功断开了连接
/// </summary>
private void SelectedVariableDisconnected(object sender, PviEventArgs e)
{
  Variable tmpVariable = (Variable)sender;
  // Remove handling routing from event again
  tmpVariable.Disconnected -= new PviEventHandler(SelectedVariableDisconnected);
  this.tbEvents.Text += String.Format("\"{0}\" disconnected\r\n",tmpVariable.Name);
}

使用 连接断开连接上传下载方法  以及处理各自的列表事件(连接断开连接等)可以被视为与ModuleCollection类相同。