VARIANT(S7-1200, S7-1500) VariantGet:读出 VARIANT 变量值 (S7-1200, S7-1500) 说明可以使用“读出 VARIANT 变量值”指令读取 SRC 参数的 VARIANT 指向的变量值,并将其写 入 DST参数的变量。SRC 参数具有 VARIANT 数据类型。可以在 DST 参数上指定除 VARIANT 外的任何数据类型。 DST参数变量的数据类型必须与 VARIANT 指向的数据类型相匹配。 说明 要复制结构和ARRAY,可以使用“MOVE_BLK_VARIANT 指令:块移动”指令。更多信息,请 参见“另请参见”。VariantPut:写入VARIANT 变量值 (S7-1200, S7-1500) 说明 可以使用“写入 VARIANT 变量值”指令将 SRC参数的变量值写入 VARIANT 所指向的 DST 参 数存储区中。 DST 参数具有 VARIANT 数据类型。可以在 SRC参数上指定除 VARIANT 外的任何数据类型。 SRC 参数变量的数据类型必须与 VARIANT 指向的数据类型相匹配。 说明要复制结构和 ARRAY,可以使用“MOVE_BLK_VARIANT 指令:块移动”指令。更多信息,请参见“另请参见”。CountOfElements:获取 ARRAY 元素个数 (S7-1200, S7-1500) 说明可以使用“获取 ARRAY 元素的数量”指令,查询 VARIANT 指针所包含的 ARRAY 元素数量。 如果是一维ARRAY,则输出 ARRAY 元素的个数。(上限与下限 +1 的差值)。如果是多维 ARRAY,则输出所有维的数量。 如果要查询ARRAY DB 中的各个元素,则可使用指令“ReadFromArrayDB”或“WriteFromArrayDB”。这是因为,在此可对元素数目进行更为精准的错误评估。 说明 实例 VARIANT指针可以不指向实例,也可不指向多重实例或多重实例的 ARRAY。 说明 数据块中的 ARRAY。 如果要查询数据块中 ARRAY中元素的个数,则不能在该块中激活块属性“数据块在设备中 写保护”(Data block write-protected in thedevice)。否则,参数 RET_VAL 将返回结果“0”,而 与 ARRAY 包含的元素数无关。 如果 VARIANT 变量不是ARRAY,也将返回结果“0”。
符号化移动(S7-1500) 运行期间进行符号化访问 (S7-1500) 应用借助“运行期间进行符号化访问”功能,外部应用程序在运行期间可以访问 PLC 程序中的变 量。外部应用程序可以是 HMI应用程序、OPC UA 功能或其它通信功能等。可读取或写入变 量。创建程序时,并不编写静态的读写访问。实际上,在运行期间动态执行读写访问。通过手动或通过程序控制的方式输入要在运行期间访问的符号变量名称。“运行期间进行符号化访问”功能可处理优化数据以及非优化数据。这意味着相对于只能访 问非优化数据的 ANY指针而言,此功能更加灵活高效。 例如,此功能可通过外部设备或应用程序来跟踪变量。 限制 下列限制适用于运行期间的符号化访问: •符号化访问仅适用于 S7-1500 固件版本 V3.0 及以上版本。 • 变量必须具有属性“可从 HMI/OPC UA/Web API访问”或“可从 HMI/OPC UA/Web API 写 入”。 下表列出了可访问的数据:工作原理要在运行期间访问变量,需要执行两步操作: 1. 通过 HMI 等方式输入的符号化变量名必需进行“解析”。即,在 PLC程序中需创建相应变量 的引用。引用属于类型化指针,可通过该指针在 PLC 程序中寻址变量。要解析符号变量,请使用异步指令“ResolveSymbols”。 2. 可通过专门的 Move 指令读取或写入变量值。Move指令属于同步指令。该指令通过之前生成 的引用寻址变量。步骤 1 示例以下示例说明了使用指令“ResolveSymbols”解析符号变量名称的工作原理: • 在参数 "nameList"中指定一个包含要解析的变量名称的 Array of WSTRING。 • 在参数 "referenceList" 中指定保存变量引用的Array of ResolvedSymbol (SDT)。 • 这两个数组的限值需相同。 随后在参数 "referenceList"中收到对每个符号变量名称的引用。引用包含在系统数据类型 “"ResolvedSymbol"”的结构中。步骤 2 示例以下示例说明了如何使用指令“MoveResolvedSymbolsToBuffer”读取变量值并将其写入缓冲 区中: • 在参数"src" 中,指定包含对已解析变量引用的 Array of ResolvedSymbol (SDT) 。 • 在 "dst"参数中指定 Array of BYTE 。该数组用作写入变量值的目标缓冲区。 执行指令"MoveResolvedSymbolsToBuffer" 时,会通过引用读取变量值,并将其写入目标缓冲区。ResolveSymbols:解析多个符号 (S7-1500) 说明“解析多个符号”指令用于解析多个符号变量名称。执行该指令后,会收到对变量的引用。引 用属于类型化指针,可用于对变量进行读写访问。 在"nameList" 参数中指定 Array of WSTRING 。运行期间会通过此数组传送待解析的变量名称。该数组可位于优化的存储区或非优化存储区中。 在参数 "referenceList" 中指定保存引用的 Array ofResolvedSymbol (SDT)。ARRAY 需位于优 化存储区中。这两个数组的限值需相同。 符号变量名称以 WSTRING格式传输,且长度不得超过 254 个 UTF-16 字符。输入完全限定 的名称(包括命名空间)。不支持表示本地变量的限定符#。支持数组中的元素,但必须指 定固定下标才能访问元素。不支持通过可变下标(如myArray[myIndexTag])进行访问。完全限定名称示例:使用 "firstIndex" 和 "lastIndex" 参数,可以仅解析列表中的部分符号。要解析整个符号列表,可在 "firstIndex" 参数中指定下限,在 "lastIndex" 参数中指定上限。该指令以异步方式执行。参数“"execute"”出现信号上升沿时开始执行。该指令在执行过程中 (Busy =1),"nameList" 和 "referenceList" 参数中的值无法更改。对符号进行解析前,"referenceList"参数中位于指定数组范围("firstIndex"和 "lastIndex")内 的数组的值将复位。 该指令执行完成后,"done"参数值将在一个周期内为 1。参数 "referenceList" 中的数组会填 入对变量的引用。“execute”参数出现下降沿后,表示“ResolveSymbol”的实例不再处于激活状态。 说明 组态限值 每次Zui多可激活 10条 "ResolveSymbols" 指令。该指令的所有活动实例总共可解析Zui多 2000个符号。如果操作数“#Input_Execute”的信号状态更改为“1”,则该指令开始执行。对参数 "nameList"中的变量名称进行解析,并将变量引用写入参数 "referenceList" 中的操作数"#InOut_ResolvedSymbols"。该指令执行完成后,"done" 参数值将在一个周期内为 1。系统数据类型ResolvedSymbol (S7-1500) 说明 执行“运行期间进行符号化访问”功能需要使用系统数据类型"ResolvedSymbol"。该数据类 型会保存对 PLC 程序中变量的引用,并会保存用于生成这些引用的状态信息。系统数据类型需位于优化存储器中。 在固件版本 V3.0 及以上版本,系统数据类型“ResolvedSymbol”可声明为 PLC 数据类型的元素。 说明 查询被引用变量的数据类型 可以使用“TypeOf”指令查询“ResolvedSymbol”引用的变量的数据类型。另请参见“TypeOf:检查数据类型为 VARIANT 或 ResolvedSymbol 的变量 系统数据类型的结构"ResolvedSymbol" 系统数据类型具有以下可见元素: 参数名称 数据类型 说明 resolved BOOL指示符号是否成功解析: • 已解析 = FALSE,且 STATUS = 0 => 尚未执行符号解析。 • 已解析 =FALSE + status <> 0 => 符号解析失败 status 参数的值指示变量中无法解析的结构等 级。负值表示无法解析符号,原因包括超出范围等。 正值表示变量不可访问或不可通过 HMI/OPC UA 或 Web API 写入。 •已解析 = TRUE,且 STATUS = 0 => 符号已成功解析。 • 已解析 = TRUE,且状态 <> 0=> 符号已成功解析,但该 DB 由“RUN”模式下 的后续加载结果覆盖。 status INT "resolved"元素用于指示某个符号是否已成功解析。只有成功解析符号时,STATUS 参数的值 才能为“0”,且 "ResolvedSymbol"结构中包含正确的信息。 除了这两个参数之外,系统数据类型还包含用于保存变量数据类型、长度和地址信息的内部 参数,但这些参数不可访问。如果符号解析错误,则 "status" 参数将返回以下值 系统数据类型“ResolvedSymbol”中的无效引用 如果在RUN 模式下因加载导致被引用的变量覆盖,则 SDT "ResolvedSymbol" 中的引用可能变为无效。引用可能指向不存在的变量。"status" 参数中的错误代码指示引用无效。 以下示例中显示了出错时如何中断 Move指令的执行以及如何重新解析该符号。