HALCON 21.11:学习笔记—OPC_UA(I/O)
本章主要提供有关
OPC_UA
的信息。
系统要求
-
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.
-
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.
-
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.
-
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
的版本子目录下。
限制
-
OPC UA I/O
接口返回的字符串均为
UTF-8
编码。
-
所有日期和时间都假定为
UTC
。
-
OPC UA
数据类型
‘ImageBMP’
,
‘ImageGIF’
,
‘ImageJPG’
和
‘ImagePNG’
被表示为字节串,因为
HALCON
的
I/O
接口不允许交换图标数据。
-
在
32
位系统上,
64
位
OPC UA
整数值
(
包括有符号的和无符号的
)
不能正确表示。只有当实际值适合
32
位整数时,才可以使用它们。
-
OPC UA
节点
id
在其
XML
表示中最多限制为
255
个字符。如果服务器的节点
id
很长,这会导致
‘translate’ control_io_device
动作和
‘browse’ query_io_device
参数出现问题。
-
目前支持的
OPC UA
用户令牌的唯一类型是
Anonymous
和
UserPassword
。
-
不支持
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
函数来确定;名称空间按其索引的顺序返回。
<
类型
>
是指定
<
标识符
>
类型的标志。可能取值如下:
-
i(
数字
)-
标识符是一个数字;
-
s(
字符串
)-
标识符是一个字符串;
-
g (guid) –
标识符是一个
guid
字符串;
-
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
将日期转换为从
1970
年
1
月
1
日以来的秒数,并将其转换为
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
类型一样。然而,在处理这些类型时,有一些要点需要考虑:
-
HALCON I/O
接口不能交换图标数据,因此
OPC UA Image
数据类型被视为内置类型
ByteString
。
-
一些派生类型可能对它们接受的值有限制,请参考您的服务器文档,因为这些限制留给用户处理。
该接口还支持从
Structures, Unions, OptionSet
和
Enumerations
继承的
OPC UA
复杂数据类型。如果您需要更多细节,请参阅
OPC
基金会的官方文档第
3
部分“地址空间模型”、第
5
部分“信息模型”和第
6
部分“映射”。请考虑以下注意事项:
Enumerations
表示定义的数值列表。从该数据类型继承的节点总是由
OPC UA
表示为
Int32
。这些节点可以具有两个可选属性
enumstring
或
EnumValues
中的一个,它们提供人类可读的枚举值表示。请参阅示例
opc_ua_enumeration.hdev
获取更多信息。
Structures
这些节点表示一组变量
(
字段
)
,这些变量可以是服务器已知的任何数据类型。对
Structure
的读写是使用
HALCON
字典完成的。字段名用作字典值的键。
Structure
可以具有强制字段和可选字段。如果一个字段是强制的,那么它必须始终存在于字典中。如果某个字段是可选的,则该值可能不存在。如果
Structure
包含具有复杂数据类型的字段,则字典必须包含具有相应值的附加字典。请参阅示例
opc_ua_structure.hdev
获取更多信息。
Unions
这些节点是一种特殊类型的
Structure
,允许在同一个节点中存储不同的数据类型
(
内置或复杂
)
。可以有多个字段的联合,但在任何给定时间只能有一个字段处于活动状态。对
union
的读写是使用
HALCON
字典完成的。
‘SwitchField’
键必须在写入
/
读取时提供,节点的值必须使用字段名作为字典中值的
key
。
switch
值和字段名必须对应。设置或获取值为
0
的
SwitchField
意味着未设置
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_device
和
open_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.hdev
和
opc_ua_monitor_connection.hdev
获取更多信息。