Library Parameters

Library Parameters 为设计时的参数化以及运行时的参数化提供了几个主要优势:

  • 它允许为可能深度嵌套在层级结构中的特定参数设置路径。这样一来,甚至连受保护层级框(或嵌套在其他受保护层级框中的受保护层级框)中的参数都可以在运行时进行设置和重置,因为它们的参数化接口已被提升到未限制访问的层级。
  • 您可以在设计中设置参数网络和/或参数链,从而将一个参数值转发给其他各种算子。通过这种方式,您可以简化最终 applet 的参数化:最终用户例如只需设置一次参数,并且由此写入过程触发,设计内的其他各种参数也会相应地进行设置,而无需进行任何其他用户交互。
  • 利用库中的转换器算子,您不仅可以转发参数值,还可以让设计根据各个参数的当前值计算出新值,并将结果写入设计中任何其他地方的参数。您可以自行定义公式。公式的语法符合 GenICam 标准(GenICam API 2.0 版),详见下文。

Parameters library 的好处在于,您可以在设计中的参数值之间建立连接(网络或链),而实际无需触及设计的数据流结构。

Library Parameters 包含七个引用算子和四个转换算子。有关这两种算子的更多信息,请参见下文。

You find example designs using the operators of the Parameters Library in your VisualApplets installation: <installation_directory>\VisualApplets\Examples\AdvancedVAFunctions\Parameters Library.

************************************************************

引用算子

Parameters 库的 Reference 算子允许将算子参数 1:1 映射到引用算子的映射参数 Value(或 Field)。您可以在参数“Reference”中指定被引用的参数(路径和名称)。

您可以在设计层级中定义一个目标,以便使被引用的参数可见且可访问。该目标由两个参数定义:“DisplayHierarchy”和“DisplayName”。在“DisplayHierarchy”中,您可以寻址引用算子本身所在的同一进程中的层级框。在参数“DisplayName”中,您可为目标参数设置名称。“DisplayHierarchy”和“DisplayName”均已设置时,由“DisplayName”定义的参数将在“DisplayHierarchy”寻址的层级框中可用。如果“DisplayName”为空,则不会创建任何参数。如果设置了“DisplayName”,但“DisplayHierarchy”为空,则由“DisplayName”定义的参数将添加至父层级(即引用算子本身所在的层级框)。

这使您可以使设计的参数在所需的任何层级(设计层级)上可用。例如,您可以直接在受保护层级框本身的属性下,使受保护层级框内的模块参数可用于参数化。

映射参数本身也可以被引用。因此,您可以引用引用算子中参数 Value 的内容,或者引用您在参数“DisplayName”和“DisplayHierarchy”中定义的参数。当受保护层级框由其他受保护层级框构建而成时,这一点尤为重要。

[注意] 所有相关参数同时更新

如果更改了其中一个连接的参数(引用的参数、映射参数“Value”或目标参数),则所有其他连接参数中的值也会随之更改。

要设置映射参数,只需简单进行 2 到 3 个步骤:

  1. 实例化一个引用算子。
  2. 定义源参数(例如,深度嵌套在层级结构中的参数)。源参数的值会立即镜像到引用算子实例的映射参数中。
  3. (可选)定义第二个映射参数的名称和位置(目标层级框的路径以及参数名称)。

所有映射参数在环境中均被视为普通参数。您可以通过 Framegrabber API 或 Framegrabber SDK 工具(microDiagnostics 和 microDisplay)访问它们,方式与访问“原始”算子参数相同。

引用算子的每个实例都允许在设计中任何参数的值与引用算子实例的映射参数(参数 Value)之间建立 1:1 的关系。

引用算子支持的数据类型:

要创建映射参数,首先需要实例化一个引用算子。每种可能的数据类型都有一个可用的引用算子:

算子名称 此算子支持的数据类型
IntParamReference 整数 (VA_SINT, VA_UINT)
EnumParamReference 枚举 (VA_ENUM)
FloatParamReference 浮点数 (VA_DOUBLE)
IntFieldParamReference 整型字段 (VA_SINTFIELD, VA_UINTFIELD)
FloatFieldParamReference 浮点型字段 (VA_DOUBLEFIELD)
StringParamReference 字符串 (VA_STRING, VA_FILENAME, VA_METADATA)
ResourceReference 整数 (VA_SINT, VA_UINT)

表 48. 引用算子支持的数据类型


使用引用算子创建映射值的步骤:

  1. 实例化所需数据类型的引用算子。

  2. 双击引用算子实例以打开其模块 Property。

  3. 在 Parameter Reference 中,指定 您希望引用算子实例连接到的 源 Parameter。

在以下示例中,名为 Reference Operator Example 的算子 IntParamReference 实例连接到了 模块 Buffer 中的 Parameter YLength。在本示例中,这两个模块 (Reference Operator Example 和 Buffer)位于同一层级上。

被引用的 Parameter 的路径:

被引用的 Parameter:

[注意] 引用语法

语法如下:

<Path> is the relative path to the hierarchical level where the referenced module "Module" is located. Use a slash as separator between different hierarchical levels. Define the path as relative path from the hierarchical level the reference operator instance is located in.

<Module> is the name of the module (operator instance or hierarchical box) that contains the referenced parameter.

<ParamName> is the actual name of the referenced parameter.

If <Path> starts with a slash, the path is interpreted as absolute path starting from design level (e.g., /Process0/UUT/SetParam.Value)。

您还可以使用 ../ 以返回上一 层级。但是,在设计可自由复制 或可重定位的模块时,请注意不要使用此选项。

  1. 将 Parameter Activate 设置为 "Yes"。

  2. 点击 Apply。被引用 Parameter 的值将显示在 Parameter Value (即映射 Parameter)中。

在我们的示例中,算子 Buffer 中的 Parameter YLength 的值现在也可用在引用算子实例的 Parameter Value 中:

利用引用算子中的 Parameter Value, 您可以执行许多操作。

例如,您可以使 Parameter Value 中的值在设计中任意位置的 另一个模块(算子实例或层级框)中可用。为此:

  1. 定义要承载与 Parameter Value 相同的值的全新 Parameter 的名称。您可以在引用算子的 Parameter DisplayName 中执行此操作。 您可以完全自由地定义该名称。

  2. 定义设计中要承载此新 Parameter 的模块。 您可以在引用算子的 Parameter DisplayHierarchy 中 执行此操作。

[注意] 设置显示目标路径的语法

如果您希望新 Parameter 显示在设计的其他位置, 则需要在 Parameter DisplayHierarchy 中指定 包含新 Parameter 的层级框的路径。

语法如下:

<Path> is the relative path from process level to the hierarchical level of the design where the <Hierarchical Box> is located that is to receive the new parameter. Thus, parameter DisplayHierarchy can only address hierarchical boxes within the same process. Use a slash as separator between different hierarchical levels.

<HierarchicalBox> is the name of the hierarchical box that is to receive the new map parameter.

示例: Level0/Level1

在我们的示例中,引用算子实例的 Parameter Value 连接到了模块 ModuleWithConnectedParameter 的新 Parameter ConnectionToYLengthInModuleBuffer:

如果将 Parameter Activate 设置为 "Yes",在 点击 Apply 按钮后,新 Parameter 将以正确的值 显示在连接的模块中:

因此,模块 ModuleWithConnectedParameter 的 新 Parameter ConnectionToYLengthInModuleBuffer 具有与模块 Buffer 的 Parameter YLength 相同的值。

映射由引用算子实例完成。

如果重置这三个模块中任一个模块的已连接 Parameter, 则所有其他模块中的值也将被重置:

分层框:

Parameters 库中的 Reference 算子允许您将设计中的参数提供给所需的任何分层级别(设计层级)。如果您希望在运行时允许对嵌套在受保护分层框深处的参数进行参数化(即,希望将其用作动态写入参数),这会非常有用。为了便于对分层框进行参数化,分层框现在可以携带参数(作为分层框自身的 Properties 中的参数)。

Reference 算子允许设置从分层框表面(分层框的 Properties)到可能深度嵌入的特定参数的路径。通过这种方式,即使是受保护分层框(或嵌套在其他受保护分层框中的受保护分层框)中的参数也可以在运行时进行设置和重置,因为其参数化接口在层次结构中被提升到了一个访问不受限制的分层级别。

映射参数本身可以被引用。因此,您可以在引用算子中引用参数 Value(或 Field)的内容,或者引用您在引用算子的参数 DisplayName 和 DisplayHierarchy 中定义的参数。当受保护的分层框由其他受保护的分层框构成时,这一点尤为重要。

在我们的示例中,这意味着您可以引用模块 ReferenceOperatorExample 中的参数 Value,以及模块 ModuleWithConnectedParameter 中的参数 ConnectionToYLengthInModuleBuffer。

对引用算子实例 ReferenceOperatorExample 的参数 Value 的引用:

对模块 ModuleWithConnectedParameter 的参数 ConnectionToYLengthInModuleBuffer 的引用:

[提示] 切勿创建引用循环

请确保不要实现引用循环,例如 ModuleA.Value 引用 ModuleB.Value,而 ModuleB.Value 又引用 ModuleA.Value。

通过六个可用的引用算子,提供了所有可能作为受保护分层框中参数值出现的数据类型。

************************************************************

转换算子

parameters 库的转换算子允许对一个或多个其他算子的参数进行转换访问。

对于计算,您需要定义公式。这些公式的语法符合 GenICam API 2.0 版本,具体说明如下。

读取操作:

在参数 ReadAction 中,您可以定义对转换算子的参数 Value 进行读取访问时发生的情况。

与引用算子的主要区别之一在于,转换算子不仅简单地保存一个值。相反,参数 Value 的值是通过公式计算得出的。该公式在参数 ReadAction 中定义。

一旦对参数 Value 发生读取访问,就会执行您在 ReadAction 中定义的公式,并将结果转发给请求该值的元素。

该公式可以包含设计中任意位置的算子参数值。一旦这些值之一发生变化,转换算子参数 Value 的计算将得出新的结果(不同于之前持有的值参数 Value)。

该公式不仅可以包含参数的值,还可以包含参数的特定属性,例如最小值、最大值、步长或枚举项的数值。

Write Action

在参数 WriteAction 中,您可以定义对转换算子的参数 Value 进行写入访问时发生的情况。

与引用算子不同,您不只是简单地将参数 Value 的值转发给设计中的另一个参数。相反,参数 Value 的值用于在转换算子的参数 WriteAction 中定义的一组写入操作。写入操作由一个或多个等式组成。通过这些等式的左侧,您可以定义哪个算子的哪个参数接收计算结果。如果您定义了多个等式,请使用分号将它们分隔开。

一旦对参数 Value 发生写入访问,就会执行您在参数 WriteAction 中定义的等式右侧的公式,并将结果转发给等式左侧指定的参数。

该公式可以引用设计中任意位置的算子参数值。一旦这些值之一发生变化,当您将与以前相同的值重新写入 Value 参数时,计算结果将会有所不同。

该公式不仅可以包含参数的值,还可以包含参数的特定属性,例如最小值、最大值、步长或枚举项的数值。

数据类型:

您选择的算子定义了其参数 Value 的数据类型,即:

算子 IntParamTranslator -> 整数值

算子 FloatParamTranslator -> 浮点 整型值

算子 EnumParamTranslator -> 枚举 项的值

然而,尽管算子定义了其参数 Value 的类型,但它并不限制在写入或读取操作期间访问的参数的数据类型。例如,算子 IntParamTranslator 定义其参数 Value 为整数类型;但算子中定义的公式可以包含对例如双精度浮点数类型参数的访问。

用于计算 Value 范围的公式

您还可以添加公式来计算参数 Value 的当前值范围。您可以在参数 RangeFrom、RangeTo 和 RangeIncrement(步长)中定义相应的公式。

这些公式既可以包含设计中任何位置的模块参数值,也可以包含这些参数的特定 Property,例如最小值、最大值、步长或枚举项的数值。

[提示] 转换运算符参数的语法

该语法符合 2.0 版的 GenICam API 标准。允许使用的公式元素与 GenICam 标准中定义的公式元素相同。有关详细说明,请参阅 FloatParamTranslator 和 IntParamTranslator 算子的各自文档。

参数路径

若要从设计中的任意位置访问算子参数,您需要在公式中提供该参数的路径。

若要访问算子的参数,请使用以下语法:

PathToModule:定义要访问其参数的算子的相对路径。指定相对于转换算子所在的层次级别的路径。指定正在访问的算子的名称。使用斜杠作为层次结构分隔符。

Module:指定算子的名称。

this:使用此名称引用转换算子实例本身。

[重要] 保持模块的独立性

通常,不要定义指向转换算子所在级别之上的层次级别的路径。此规则可确保分层模块不依赖于其实例化的环境。只有不依赖于周围层次结构的模块才能用作可自由重定位和复制的组件。

访问 Property

这些公式不仅可以包含参数值,还可以包含参数的特定 Property,例如最小值、最大值或步长:

  • ${PathToModule/Module.ParamName.From} 或 ${PathToModule/Module.ParamName.Min}:的有效最小值 PathToModule/Module.ParamName 参数。
  • ${PathToModule/Module.ParamName.To} 或 ${ PathToModule/Module.ParamName.Max}:的有效最大值 PathToModule/Module.ParamName 参数。
  • ${PathToModule/Module.ParamName.Inc}:两个有效值之间的 增量(步长) PathToModule/Module.ParamName 参数。
  • ${PathToModule/Module.ParamName.Enum("EnumName")}:枚举名称的整数 值 EnumName.

写访问公式语法

在 WriteAction 参数中为写操作定义方程。写访问公式具有以下语法:

在这里,您可以为多个目标参数定义多个方程。使用分号作为各个方程之间的分隔符。

this:引用转换算子实例本身。

WriteAction 方程示例:

示例:

读访问方程语法

在以下参数中定义读取操作的方程式: ReadAction 参数。读取访问方程式具有以下语法:

ReadAction 方程示例:

全局常量

在转换公式中,您还可以引用全局常量。在转换公式中引用全局常量时,使用 :: 前缀,例如 ${::DesignClock} 或 ${::ConstantName}.

引用全局常量

除了访问模块参数及其 Property 之外,转换公式还可以引用全局常量。全局常量提供了可在参数转换表达式中使用的系统级值。

在转换公式中,您可以使用以下内容寻址全局常量: :: 前缀。通用语法为 ${::ConstantName},例如 ${::DesignClock} 或 ${::ConstantName}

默认情况下,转换公式中可使用以下标准全局常量:

  • ${::DesignClock} – 当前设计的时钟频率(以 MHz 为单位)

  • ${::DesignClock.Min} – 最小有效时钟值

  • ${::DesignClock.Max} – 最大有效时钟值

当 值 是静态的,您可以通过将 显示层级 模块参数 :: 或 IntVariable, FloatVariable, IntParamTranslator或 FloatParamTranslator 设置为运算符来创建用户定义的全局常量。这会创建一个可在转换公式中使用的全局常量。您可以使用以下方式访问它: ${::myGlobalConst}.

运算符列表

以下列表总结了 Library Parameters 的所有运算符

算子名称 简要说明 可用版本
EnumParamReference

从数据类型为 VA_ENUM 的引用参数生成映射参数。

版本 3.0.1
EnumParamTranslator

生成 VA_ENUM 类型的已翻译映射参数。 使用 VA_ENUM 类型的参数在其他模块中创建多个已翻译的映射参数。

版本 3.0.1
EnumVariable

生成软件变量。

版本 3.1
FloatFieldParamReference

从 VA_DOUBLEFIELD 类型的引用参数生成映射参数。

版本 3.0.1
FloatParamReference

从 VA_DOUBLE 类型的引用参数生成映射参数。

版本 3.0.1
FloatParamTranslator

生成 VA_DOUBLE 类型的已翻译映射参数。 使用 VA_DOUBLE 类型的参数在其他模块中创建多个已翻译的映射参数。

版本 3.0.1
FloatVariable

生成软件变量。

版本 3.1
IntFieldParamReference

根据 VA_SINTFIELD 或 VA_UINTFIELD 类型的参考参数生成一个 map 参数。

版本 3.0.1
IntParamReference

根据 VA_SINT、VA_UINT 或 VA_ENUM 类型的参考参数生成一个 Int64 map 参数。

版本 3.0.1
IntParamTranslator

生成 VA_SINT 类型的转换后 map 参数。 使用 VA_SINT 类型的参数在其他模块中创建多个转换后的 map 参数。

版本 3.0.1
IntVariable

生成软件变量。

版本 3.1
IntFieldVariable

此算子生成一个软件变量字段。

版本 3.5
LinkProperties

允许访问已连接 link 的 Property。

版本 3.0.1
LinkParamTranslator

此算子允许读取或写入已连接 link 的 Property,并且可以执行写操作。

版本 3.3.0
StringParamReference

根据 VA_STRING、VA_FILENAME 或 VA_METADATA 类型的参考参数生成一个 map 参数(字符串)。

版本 3.0.1
ResourceReference

此算子根据对设备资源映射的参考生成一个 map 参数(整型)。

版本 3.3.0
IntParamSelector

此算子生成一个 Int64-map 参数,该参数可以在多个引用的 VA_SINT、VA_UINT 或 VA_ENUM 类型参数之间进行切换。

版本 3.3.0
FloatParamSelector

此算子生成一个可以在多个引用的 VA_DOUBLE 类型参数之间切换的 map 参数。

版本 3.3.0

表 49. Library Parameters 算子