如何通过OPC自定义接口来实现客户端数据的读取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过OPC自定义接口来实现客户端数据的读取?相关的知识,希望对你有一定的参考价值。

参考技术A

通过OPC自定义接口来实现客户端数据的读取步骤如下。

1:使用OPC DA进行Client的读写操作时,我们使用Custom接口,出此之外还有Automation接口。以下是Custome接口开发时涉及到的三个关键对象:OpcServer、OpcGroup、OpcItem。

2:在客户端开发时,要使用OpcServer对象来实现客户端与Opc服务器之间的连接。一个OpcServer对象下有多个OpcGroup,一个OpcGroup下有多个OpcItem,在自定义接口下的Client开发,是以Group为单位的操作,数据读写都是通过OpcGroup进行的。  

3:我们可以不写OPC Client程序来测试,如何通过OPCServer与PLC之间的交互。首先当我们安装完毕SimaticNet之后,需要对Station Configuration Editor进行配置。

4:当我们组态完毕时,如何判断组态是否正确,在SimaticNet的目录上有个叫Opc Scout(Opc Scout V10)的软件,列出来了本机所有的Server,我们能使用名为OPC.SimaticNET的Server。

使用 C# 客户端读取 OPC UA 节点属性值

【中文标题】使用 C# 客户端读取 OPC UA 节点属性值【英文标题】:Reading OPC UA Node attribute values with C# client 【发布时间】:2022-01-12 14:10:35 【问题描述】:

我有一个简单的 C# OPC UA 客户端与 OPC UA 服务器通信。服务器使用 Modbus 数据模型。我实际上是使用 NuGet 的 Opc.UA.Fx 包。

我可以连接,并从我尝试读取的节点获取属性。但是,我无法弄清楚如何读取数组的元素。我只是想阅读布尔数组的元素。当我访问节点值时,它返回“System.Boolean[]”

    我搜索了 OPC 10000-8 Pat 8: Data Access Manual,但我不太清楚如何访问节点的元素。 我研究了许多源示例,但它们都非常臃肿和神秘。 我尝试了 OPC.Ua.Fx 文献中的示例,但无法通过类型转换。 我可以通过使用UAExpert 进行监控来验证我的服务器是否正常工作。

这是读取线圈节点(离散IO)的简单客户端:

static void Main(string[] args)

  StringBuilder localEndpoint = new StringBuilder();
  var rawIpAddress = "127.0.0.1";
  localEndpoint.Append(epPrefix + rawIpAddress + epSuffix);

  // HmiClient is a class that constructs the OpcClient and Connects.
  var robot = new HmiClient(localEndpoint.ToString()); 

  // Create a list and store Attribute info
  List<string> coilNodeAttributes = new List<string>();    
  coilNodeAttributes = GetAttributeInfo(robot.hmiClient, NodeDef.Coils);

  foreach (var el in coilNodeAttributes)
  
    Console.WriteLine(el);
  
  Console.WriteLine("==================================\n");

  // Trying to determing the data type for reading the array elements.
  OpcValue discreteInputs = robot.hmiClient.ReadNode(1,302,OpcAttribute.Value);

  Type inputType = discreteInputs.GetType();      

  Console.WriteLine("ReadNode Value Relflection: 0", inputType.ToString());  

  Console.Read();

下面是UAExpert 连接到服务器和我的C# 客户端连接的屏幕截图。

再次,我不明白为什么我根本无法访问布尔 [ ] 的元素。我显然在努力将值转换为正确的 C# 类型。

【问题讨论】:

HmiClient 是自定义类?通常您使用Session.ReadValues(IList&lt;NodeId&gt; nodes, types, out values, out results) 来读取值。 NodeId 有几个构造函数重载(包括一个 int(用于您的 302)) 是的,它只是一个简单的类来连接服务器。让我用您建议的方法进行调查和试验。 你可能可以读到像new NodeId("Coils[1]")这样的值 【参考方案1】:

为了回答我自己的问题,我的 OpcValue 作为 Object 返回,需要转换为您正在处理的类型。我的转换语法不正确。

正确:

  OpcValue discreteInputs = robot.Client.ReadNode(1, 302, OpcAttribute.Value);

  bool[] discreteInputValues = (bool[])discreteInputs.Value;

显然,现在我可以遍历数组来显示元素。

【讨论】:

以上是关于如何通过OPC自定义接口来实现客户端数据的读取?的主要内容,如果未能解决你的问题,请参考以下文章

C# OPC 应用程序代码相同,但工作方式不同

如何使用 opc ua 从 PLC 读取信号?

Delphi编的程序想要通过OPC与WINCC通讯,要怎样实现

使用 C# 客户端读取 OPC UA 节点属性值

OPC协议解析-OPC客户端与服务器通讯解析

怎样用PLC读取一个外部的数字信号,然后在WINCC中显示出来?