OPC UA 读写操作是原子的吗?

Is OPC UA Read and Write operations atomic?

换句话说,服务器或客户端是否可以在传输完成之前接收到部分数据?

我确信此信息已写在 OPC 基金会的大量文档中,但我认为这是必不可少的。

我正在使用用于数据库写入的 "atomic" 短语。当程序员更新 table 时,更新在完成或未完成的意义上始终是原子的。我们依靠数据库软件来保证操作仅部分成功。

在PLC充当OPC UA服务器的情况下;当客户端写入 1 KByte 数据时,我们是否确定 PLC 上的程序 运行 在任何时刻读取该数据的一部分,同时它仍在通信和写入?由于我们正在处理通信另一端的读取速度非常快的实体(PLC),因此 PLC 是否有可能在接收到其余字节之前先获取前 100 个字节?

Beckhoff OPC-UA Server通过ADS协议与Beckhoff PLC通信。

在广告路由器的帮助下发送的一致数据的默认最大大小为 16 kByte,但如果需要可以更改。

理解这一点很重要,因为 OPC-UA 服务器不是 PLC 运行时环境的一部分。

当 OPC-UA 客户端写入 OPC-UA 服务器的节点时,OPC-UA 服务器将此数据发送到 PLC。

在 Twincat 开发环境中,您可以选择为结构化类型声明一个特殊属性:

{attribute 'OPC.UA.DA.StructuredType' := '1'} 

这告诉 Beckhoff OPC-UA 服务器在从客户端接收到有关该特定数据结构的数据时,以一致的方式将其发送到 PLC。

Beckhoff OPC-UA 文档指出:

"StructuredTypes 允许您在不解释每个字节的情况下读取或写入结构,因为 UA 服务器 returns 结构体各元素的信息类型。基于现代复杂功能 OPC UA SDKs,OPC UA Clients 可以搜索和解释这个结构信息。"

因此,关于数据一致性,您的 OPC-UA SDK(客户端)足够现代以能够 "search and interpret this structural information"。

也很重要

In the case of a PLC acting as an OPC UA server; when the client writes say 1 KByte data, are we sure that the program running on the PLC, on any instant read a part of this data while it is still being communicated and written?

您可以确定,在客户端完全传输请求之前,任何服务器都不会处理任何读取或写入。 OPC UA 中没有用于处理来自客户端的 streaming/partial 请求的工具。

也就是说,服务器如何处理它刚刚作为写入接收的 1KB 数据不在规范中。无法保证它以原子方式写入任何 backing/underlying 数据源(在内存、共享内存、文件、网络上的另一个设备等中)。

我确实相信大多数内置于 PLC 的 OPC UA 服务器可能正在做正确的事情来确保原子性,但规范中没有任何东西可以保证它,除了联系供应商或查阅文档之外没有其他方法可以确定.

Flippo & Kevin 在上述评论中提供了答案。所以这将是一个让大家快速发现的回顾:

  1. OPC UA 仅保证简单类型​​(整数、双整数等)的原子性
  2. 更长的结构的原子性取决于特定的制造商。