HALCON 21.11:学习笔记---OPC_UA(I/O)

HALCON 21.11:学习笔记---OPC_UA(I/O)

本章主要提供有关OPC_UA的信息。

系统要求

  1. Intel compatible PC with Windows 7 (32-bit or 64-bit) or newer that is also supported by the vendor-specific SDK, also WoW64 (using 32-bit HALCON on 64-bit Windows), Linux with kernel 2.6 (or higher), or OS X 10.8/10.9.
  2. Windows: HALCON I/O device interface hioOPC_UA.dll or hioOPC_UAxl.dll, respectively. Also required are libcrypto-1_1.dll, libssl-1_1.dll, and uastack.dll. If you have properly installed the interface, all these DLLs should reside in bin\%HALCONARCH% within the HALCON base directory %HALCONROOT% you have chosen during the installation of HALCON.
  3. Linux: HALCON I/O device interface hioOPC_UA.so or hioOPC_UAxl.so, respectively. Also required are the 3rd party libraries libcrypto.so.1.1, libssl.so.1.1, and libuastack.so. If you have properly installed the interface, the shared objects should reside in lib/$HALCONARCH, and the 3rd party shared libraries in lib/$HALCONARCH/thirdparty within the HALCON base directory $HALCONROOT you have chosen during the installation of HALCON.
  4. MacOS: HALCON I/O device interface hioOPC_UA.dylib or hioOPC_UAxl.dylib, respectively. Also required are libcrypto.dylib.1.1, libssl.dylib.1.1, and libuastack.dylib. If you have properly installed the interface, the shared objects should reside in the HALCON framework /Library/Frameworks/HALCON.framework or the HALCON XL framework /Library/Frameworks/HALCONxl.framework in the Libraries subdirectory.

接口版本

数字I/O和图像采集的MVTec接口总是兼容一系列HALCON版本。因此,版本控制方案既描述了接口的兼容性,也描述了接口本身的修订。接口版本总是由三个由点分隔的数字组成,如18.11.5。前两个数字描述接口兼容的最小HALCON版本。对于示例版本18.11.5,这意味着该接口兼容自HALCON 18.11以来的所有HALCON版本。最后一个数字描述了接口的修订,在本例中是修订5

安装

只有在手动安装或更新接口时,才遵循以下步骤:

Windows:将包含接口文件的存档解压到HALCON基本目录%HALCONROOT%(注意:此步骤可能需要管理员权限)。此外,您必须手动将接口示例移动到目录%HALCONEXAMPLES%

Linux:将包含接口文件的归档文件解压缩到HALCON基本目录$HALCONROOT

OS X:解压存档。手动移动以下文件:位于lib/x64-macosx.dylib文件移动到/Library/Frameworks/HALCON.framework/Libraries;示例文件夹放在/Users/Shared/Library/Application Support的版本子目录下;将doc文件夹放到/Library/Application Support的版本子目录下。

限制

  1. OPC UA I/O接口返回的字符串均为UTF-8编码。
  2. 所有日期和时间都假定为UTC
  3. OPC UA数据类型'ImageBMP' 'ImageGIF' 'ImageJPG''ImagePNG'被表示为字节串,因为HALCONI/O接口不允许交换图标数据。
  4. 32位系统上,64OPC UA整数值(包括有符号的和无符号的)不能正确表示。只有当实际值适合32位整数时,才可以使用它们。
  5. OPC UA节点id在其XML表示中最多限制为255个字符。如果服务器的节点id很长,这会导致'translate' control_io_device动作和'browse' query_io_device参数出现问题。
  6. 目前支持的OPC UA用户令牌的唯一类型是AnonymousUserPassword
  7. 不支持OPC UA多维向量。

连接OPC UA服务器

open_io_device函数用于连接OPC UA服务器。IODeviceName参数中指定要连接的服务器的URL。如果服务器没有使用默认OPC UA端口(4840),服务器URL通常以'opc.tcp://Server' 'opc.tcp://Server:Port' 的形式存在

If the server you wish to connect to is registered with an OPC UA discovery server, you can get its URL from the query_io_interface operator using the 'io_device_names' generic parameter if the discovery server is reachable via the URL 'opc.tcp://localhost:4840', or from the control_io_interface operator using the 'discovery' action if it is not. Please see the example opc_ua_discovery.hdev for details.

HALCON和OPC之间转换数据

OPC UA拥有丰富的数据类型,必须在输入和输出上映射到HALCON控制元组数据类型整数、实数和字符串。HALCON OPC UA I/O设备接口支持以下内置OPC UA数据类型及其派生:

NodeId

该类型根据OPC UA XML模式在HALCON字符串之间进行转换。语法如下:

'ns=<namespaceindex>;<type>=<identifier>'

<namespaceindex>是命名空间的索引,格式化为以10为基数的数字。如果索引为0,则可以省略整个'ns=0;'子句。

一个服务器的名称空间可以通过'namespaces'参数调用get_io_device_param函数来确定;名称空间按其索引的顺序返回。

<类型>是指定<标识符>类型的标志。可能取值如下:

  1. i(数字)-标识符是一个数字;
  2. s(字符串)-标识符是一个字符串;
  3. g (guid) -标识符是一个guid字符串;
  4. b(不透明)-标识符是一个(不透明)字节字符串。

<标识符>是使用标识符类型的XML数据类型映射编码为字符串的标识符。标识符可以包含任何非空UTF-8字符。

请注意,由于接口使用的OPC UA SDK的限制,当从节点ID转换为HALCON字符串时,如果节点ID超过255个字符,它将被截断,不能用于识别节点。

ExpandedNodeId

该类型使用以下语法转换为或从HALCON字符串:

'<Server>|<NamespaceURI>|<NodeId>'

<Server>是服务器的索引,格式化为基数10的数字。

<NamespaceURI>是要使用的名称空间的URI,覆盖了<NodeId>中指定的名称空间。

保留字符&|必须用前缀&转义,例如|必须写成&|

<NodeId>是在上面详细描述的OPC UA XML模式中编写的节点ID

QualifiedName

该类型在HALCON字符串之间进行转换。这些字符串可以直接用作control_io_device的转换操作的路径元素。该字符串的语法如下:

'[<ns>:]<name>'

<ns>(可选的)命名空间索引,写为一个或多个数字,后跟一个:。如果没有指定命名空间,则假定命名空间为0

<name>是名称。保留字符/.<>#!,或&必须用前缀&转义,例如<必须写成&<

LocalizedText

使用以下语法将它们转换为或从HALCON字符串:

'<locale>|<text>'

<locale>RFC 3066中定义的区域ID,例如“en”标识英语。

<text>是在指定语言环境中编码的文本。

Boolean

一个布尔值,转换为HALCON字符串“true”和“false”。

SByte, Int16, Int32, and Int64

这些类型在HALCON整数值之间进行转换。在32位系统上,不能表示32位整数范围之外的64位整数。

Byte, UInt16, UInt32, and UInt64

这些类型在HALCON带符号整数值之间进行转换。HALCON有符号整数范围之外的无符号值表示为与无符号整数的位模式对应的有符号整数。在32位系统上,不能表示32位整数范围之外的64位整数。

ByteString

该数据类型在一个包含HALCON整数值的元组(范围为[0..255])之间进行转换。

DateTime

将日期转换为从197011日以来的秒数,并将其转换为HALCON实值。

Double and Float

这些类型在HALCON实值之间进行转换。

Guid, String and XmlElement

这些类型用HALCON字符串表示。请注意,OPC UA I/O接口返回的字符串均为UTF-8编码。

X.509证书

虽然X.509证书本身不是OPC UA数据类型;它们用于在创建安全连接时识别服务器和客户机。X.509证书在HALCON中表示为证书的DER编码的Base64编码字符串。

接口支持内置OPC UA数据类型的派生类型。这些类型在HALCON数据类型之间进行转换,就像派生它们的内置OPC UA类型一样。然而,在处理这些类型时,有一些要点需要考虑:

  1. HALCON I/O接口不能交换图标数据,因此OPC UA Image数据类型被视为内置类型ByteString
  2. 一些派生类型可能对它们接受的值有限制,请参考您的服务器文档,因为这些限制留给用户处理。

该接口还支持从Structures, Unions, OptionSet Enumerations继承的OPC UA复杂数据类型。如果您需要更多细节,请参阅OPC基金会的官方文档第3部分“地址空间模型”、第5部分“信息模型”和第6部分“映射”。请考虑以下注意事项:

Enumerations

表示定义的数值列表。从该数据类型继承的节点总是由OPC UA表示为Int32。这些节点可以具有两个可选属性enumstringEnumValues中的一个,它们提供人类可读的枚举值表示。请参阅示例opc_ua_enumeration.hdev获取更多信息。

Structures

这些节点表示一组变量(字段),这些变量可以是服务器已知的任何数据类型。对 Structure 的读写是使用HALCON字典完成的。字段名用作字典值的键。Structure 可以具有强制字段和可选字段。如果一个字段是强制的,那么它必须始终存在于字典中。如果某个字段是可选的,则该值可能不存在。如果Structure包含具有复杂数据类型的字段,则字典必须包含具有相应值的附加字典。请参阅示例opc_ua_structure.hdev获取更多信息。

Unions

这些节点是一种特殊类型的Structure,允许在同一个节点中存储不同的数据类型(内置或复杂)。可以有多个字段的联合,但在任何给定时间只能有一个字段处于活动状态。对union的读写是使用HALCON字典完成的。'SwitchField'键必须在写入/读取时提供,节点的值必须使用字段名作为字典中值的keyswitch值和字段名必须对应。设置或获取值为0SwitchField意味着未设置Union,因此不需要提供值或可用值。请参见示例opc_ua_union.hdev获取更多信息。

OptionSet

这些节点是表示位掩码的一种特殊类型的结构。对union的读写是使用HALCON字典完成的。每种OptionSet类型都有一个属性'OptionSetValues',它包含OptionSet中使用的相应位的人类可读表示。OptionSet变量的值由两个必填字段“value”和“ValidBits”组成。字段'Value'是一个ByteString,表示OptionSet中的位。ByteString的长度取决于比特的数量。字段'ValidBits'是一个与'Value'大小相同的字节串。当你读取OptionSet时,'ValidBits'提供了位掩码中哪些位有意义的信息。如果一个位是1,那么对应的位值是有效的。如果它被设置为0,它应该被忽略。当向一个变量写入一个值时,'ValidBits'定义了应该写入哪些位。只有那些在“ValidBits”中定义的位(设置为1)在位掩码中被更改,所有其他的位都不会写入。请参阅示例opc_ua_option_set.hdev获取更多信息。

Arrays

该接口还支持一维数组。具有基本数据类型之一的数组的变量节点将映射到一个HALCON元组。对于ByteString数组,其中每个数组元素被映射到一个元组,完整的数组被转换为一个字典元组。每个字典都将ByteString存储在特殊键'h_values'下。如果要进行多通道读写操作,并且其中一个通道是数组,那么数组值将被存储在字典中的特殊键'h_values'下的元组中。如果调用一个方法,并且输出参数的输入参数之一是一个数组,那么数组的值将被存储在字典中的特殊键'h_values'下的元组中。不支持多维数组。

指定OPC UA节点

OPC UA节点的引用方式是将它们的节点ID作为query_io_deviceopen_io_channel函数中的通道参数写入OPC UA XML模式后面的字符串。请参阅上面转换OPC UA数据类型的部分,了解如何编写节点id。除了写入命名空间的索引外,你还可以写入命名空间的URI,用^个字符括起来。

以下是引用服务器的ServerStatus节点的所有有效方法:

'i=2256'

'ns=0;i=2256'

'ns=^http://opcfoundation.org/UA/^;i=2256'

OPC UA事件处理

设备级和通道级都支持通过消息队列进行事件处理。在设备级别上,当连接状态改变时,可以使用它来接收消息。对于给定的通道,目前唯一支持的事件是订阅变量节点的DataChange事件。

事件是使用HALCON消息队列处理的。您可以使用参数'event_message_queue'向通道提供消息队列句柄,以便在服务器上的值发生更改时立即接收更新。

通过将参数'event_message_queue'设置为0(HNULL),可以从设备或通道中删除消息队列。这不会取消变量订阅本身,接口将继续在后台更新缓存值。若要删除订阅,请参考文档中的相关参数。

在为事件退出消息队列后,可以使用操作符get_message_tuple访问消息中包含的信息。该消息将始终包含以下字段的信息:

id:接口名称和服务器地址组成的字符串。如'OPC_UA:opc.tcp://Server:Port'

event_name:包含触发事件名称的字符串。这可以是'DataChange''ConnectionStatusChange'

其他信息取决于事件的类型。

对于ConnectionStatusChange事件:

connection_status:服务器连接的新状态(get_io_device_param中的“connection_status”值相同。

对于DataChange事件:

node_id: 触发事件的节点ID

status_code: 更新值的状态码。

value: 节点更新后的值。

消息队列以FIFO方式处理,在同一消息队列中处理多个变量订阅需要在所有传入事件可用时处理它们。

请参阅示例opc_ua_monitor_subscription.hdevopc_ua_monitor_connection.hdev获取更多信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值