@haozhihao
2020-03-26T10:08:06.000000Z
字数 1655
阅读 872
ABB
在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;
}