[关闭]
@haozhihao 2020-03-26T10:08:06.000000Z 字数 1655 阅读 872

ABB PC SDK手册学习3

ABB


Rapid域

数组处理

在rapid里我们可以使用最大3维数组,可以通过类似其他raipid数据类型一样来访问rapid对象
主要有两种访问数组中每个元素的方法:索引器或枚举器
ArrayData 对象
如果RapidData引用了一个rapid数组,则rapid数组是Valueproperty,返回一个ArrayData类型的对象。在进行强制转换之前,使用is操作符或使用RapidData对象上的IsArray属性检查类型。

RapidData rd = aController.Rapid.GetRapidData("T_ROB1", "user", "num_array");
if (rd.IsArray)
 {
 ArrayData ad = (ArrayData)rd.Value;
 .....
 }

ArrayData类允许将数据读写到rapid数组中。将数据从控制器传输到ArrayData类有两种不同的模式。

快照和动态模式都没有对可以传输的字节数施加任何限制。由于数据是按需传输的,因此使用动态模式的数据传输提供了比快照更好的性能。
若要使用动态模式,必须将模式设置为“动态”(如果在循环中使用ArrayData)。

arrayData.Mode = ArrayModes.Dynamic;
foreach (IRapidData rapidData in arrayData)
Console.WriteLine(rapidData.ToString());

当使用RapidData.ReadItem()访问单个项目时,ArrayData模式是无效的。
限制
不支持使用RapidData.Value.ToString()方法在快照模式下查看大型快速数组。
数组维数
数组的维数由Rank属性返回。如果需要检查各个数组的长度,可以使用ArrayData对象上的GetLength方法,将维度索引作为参数传递。

int aRank = ad.Rank;
     int len = ad.GetLength(aRank);

使用索引器访问数组项
使用索引器可以访问每个数组元素,即使是在三维数组中。GetLength方法和for循环的组合使访问任何项目成为可能:

double aSum = 0d;Num aNum;RapidData rd = aController.Rapid.GetRapidData("T_ROB1", "user", "num_array");
ArrayData ad = (ArrayData)rd.Value;
int aRank =  ad.Rank;
if (ad.Rank == 1)
{
 for (int i = 1; i <= ad.Length;
 i++)
 {
 aNum = (Num)ad[i];
 aSum += (double)aNum;
 }
 }
else if (ad.Rank == 2)
{
 for (int i = 1; i <= ad.GetLength(0); i++) 
  { 
    for (int j = 1; j <= ad.Length; j++)
     { 
      aNum = (Num)ad[i, j]; 
      aSum += (double)aNum; 
      }
   }
}
else
{ 
  for (int i = 0; i < ad.GetLength(0); i++)
   { 
     for (int j = 0; j < ad.GetLength(1);
j++)
    { 
       for (int k = 0; k < ad.GetLength(2); k++)
        {
         aNum = (Num)ad[i, j, k]; 
         aSum += (double)aNum; 
         }
     }
} 
}

使用枚举数访问数组项
您还可以使用枚举器操作(foreach),就像. net中的集合使用它一样。注意,它既可以用于一维数组,也可以用于多维数组来访问每个单独的元素。前面的例子要简单得多:

double sum = 0d;
foreach (Num ANum in ad)
{ sum += (double)ANum;
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注