我有以下方法,我正在订阅 OPC DA 服务器项目。
public void read_OPC_items(string ip)
{
using (var client = new EasyDAClient())
{
client.ItemChanged += func_ItemChanged;
client.SubscribeMultipleItems(
new[] {
new DAItemGroupArguments(ip, "OPC.IwSCP.1", item_name, 1000, null),
});
}
}
public void func_ItemChanged(object sender, EasyDAItemChangedEventArgs e)
{
if (e.Succeeded)
{
Console.WriteLine(e.Vtq); // result of item
Console.WriteLine(e.Vtq.Value)
}
}
当我将结果打印到控制台时,我得到类似的信息:
[6, 14] {{1, 1, 0, UPS 电池故障。, 45305.2620848611, ...}, {1, 1, 0, UPS 电池故障。, 45304.9276650694, ...}...} 系统对象[,]
从打印的行中我了解到对象 e.Vtq 是一个 2D 数组。 结果只是部分正确。数组中只有 2 行 5 列显示正确。正如您所看到的,二维数组的其余部分被“...”截断。如何打印完整的结果而不被截断?
另外:如何通过索引访问 2D 对象的元素?
当我尝试下面的方法时,它不起作用。我得到:错误 CS0021 无法将 [] 索引应用于类型的表达式
string element_of_2darray = e.Vtq.Value[0, 0];
一些背景知识。关于这两个对象的官方文档是
正如您所看到的 Value 是对象类型(几乎每个对象都继承自 object),因此您无法将其作为数组访问,除非您对其进行类型转换(坏主意)。
它可能打印为二维数组这一事实没有任何意义,因为我可以在 C# 中做任何事情通过重写 ToString() 函数。
还有 Vtq.ValueType 可能会帮助您进行特定情况的处理。