MoveResolvedSymbolsToBuffer:从已解析的符号中读取值并写入缓冲区中 (S7-1500) 说明“从已解析的符号中读取值并写入缓冲区中”指令用于从多个已解析的符号中读取数值并写 入存储区 (Array of BYTE)中。采用这种方式,可准备符号解析后的相应值,进行后续处理。 如,通过诸如 TSEND 等通信指令进行发送。 "src" 参数是一个ResolvedSymbol (SDT) 数组,其中包含对之前通过“ResolveSymbols”指令解析的变量的引用。在“dst”参数中指定一个 BYTE 数组。该数组用作写入变量值的目标缓冲区。 这两个数组的限值需相同。 使用参数"firstIndex" 和 "lastIndex" 限制将在此次指令调用过程中复制的值列表。如果不希 望对列表进行限制,则"firstIndex" 参数中的值必须等于该列表的下限且 "lastIndex" 参数中 的值需等于该列表的上限。 "mode"参数的值用于定义 "dst" 参数中的存储器格式。可通过偏移量确定目标缓冲区中已解析的符号值的存储位置。通过“dstOffsets”(Array of DINT)参数指定偏移量。每个偏移量均为位偏移,用于确定将值写入缓冲区时的起始位。可在一个 字节中存储多个 BOOL数据类型的值。其它所有数据类型的值的起始位位置必须可被 8 整除。 例如,如果 "src[i]" 参数引用一个数据类型为 REAL的变量,"dstOffsets[i]"参数中的值为 88,"mode" 参数值为2#1,则“从已解析的符号中读取值并写入缓冲区中”指令会将值复 制到字节 11 到 14 中(从Zui低有效字节开始)。 例如,如果"src[i]" 参数引用一个数据类型为 BOOL 的变量,"dstOffsets[i]" 参数中的值 为29,则“从已解析的符号中读取值并写入缓冲区中”指令会将该值复制到字节为 3 并且 偏移量为 5 的目标存储器。 为确保"dstOffsets[i]" 中包含有 "src[i]" 的偏移量,"dstOffsets" 和 "src" 处的数组限值必须相同。 这样,可准确定义目标缓冲区的结构。但请注意,该指令不会验证所指定的偏移量是否重叠。此时,不会发送错误消息,目标缓冲区中的内容不确定。目标缓冲区中的内容同样取决于这是值从优化存储器中读取,或是从非优化存储器中。这两个存储区对字节填充的规则不同。有关字节填充的更多信息,请参见“另请参见”。 "status" 参数是一个 INT 数组。为确保"status[i]" 中包含有 "src[i]" 的状态,该参数的限值必 须与 "src" 和 "dstOffsets"参数的相同。 对于 WSTRING 和 STRING,将复制源字符串的当前长度。如果源字符串比目标字符串短,则目标字符串中的其余字符保持不变。
对符号进行解析前,"referenceList" 参数中位于指定数组范围("firstIndex"和"lastIndex")内 的数组的值将复位。 该指令执行完成后,"done" 参数值将在一个周期内为 1。参数"referenceList" 中的数组会填 入对变量的引用。“execute”参数出现下降沿后,表示“ResolveSymbol”的实例不再处于激活状态。 说明 组态限值 每次Zui多可激活 10条 "ResolveSymbols" 指令。该指令的所有活动实例总共可解析Zui多 2000个符号。如果操作数“#Input_Execute”的信号状态更改为“1”,则该指令开始执行。对参数 "nameList"中的变量名称进行解析,并将变量引用写入参数 "referenceList" 中的操作数"#InOut_ResolvedSymbols"。该指令执行完成后,"done" 参数值将在一个周期内为 1。 参见运行期间进行符号化访问 (页 993) 系统数据类型 ResolvedSymbol (S7-1500) 说明执行“运行期间进行符号化访问”功能需要使用系统数据类型 "ResolvedSymbol"。该数据类 型会保存对 PLC程序中变量的引用,并会保存用于生成这些引用的状态信息。系统数据类型 需位于优化存储器中。 在固件版本 V3.0及以上版本,系统数据类型“ResolvedSymbol”可声明为 PLC 数据类型的元 素。 系统数据类型的结构"ResolvedSymbol" 系统数据类型具有以下可见元素: 参数名称 数据类型 说明 resolved BOOL指示符号是否成功解析: • 已解析 = FALSE,且 STATUS = 0 => 尚未执行符号解析。 • 已解析 =FALSE + status <> 0 => 符号解析失败 status 参数的值指示变量中无法解析的结构等 级。负值表示无法解析符号,原因包括超出范围等。 正值表示变量不可访问或不可通过 HMI/OPC UA 或 Web API 写入。 •已解析 = TRUE,且 STATUS = 0 => 符号已成功解析。 • 已解析 = TRUE,且状态 <> 0=> 符号已成功解析,但该 DB 由“RUN”模式下 的后续加载结果覆盖。
"resolved" 元素用于指示某个符号是否已成功解析。如果符号已成功解析,"status" 参数的值 为 0,且"ResolvedSymbol" 结构中包含正确的信息。除了这两个参数之外,系统数据类型还包含用于保存变量数据类型、长度和地址信息的内部 参数,但这些参数不可访问。 如果符号解析错误,则"status" 参数将返回以下值:系统数据类型“ResolvedSymbol”中的无效引用 如果在 RUN模式下因加载导致被引用的变量覆盖,则 SDT "ResolvedSymbol" 中的引用可能变为无效。引用可能指向不存在的变量。"status" 参数中的错误代码指示引用无效。 以下示例中显示了出错时在 SCL 中如何使用IF 指令中断 Move 指令的执行以及如何重新解 析该符号:在调用 „MoveResolvedSymbolsToBuffer“指令之前,需进行检查,确定符号解析是否成功以 及 „MoveResolvedSymbolsToBuffer“ 是否可以执行。符号解析成功,执行 „MoveResolvedSymbolToBuffer“ 时也可能出错。例如,在 RUN 模式下因加载导致变量覆盖。此时,返回值 „err“ 为复制失败的进程数。 如果识别到复制过程识别,则后续的 IF 指令将"EnableMove" 设置为 FALSE。这样,系统将 不再执行 "MoveResolvedSymbolsToBuffer"。之后,FOR 指令将进行检查,确定产生错误代码的相关符号。对于这些符号,会将错误代码 复制到 "status" 参数中。参数“„resolved“”设置为 FALSE。现在需要使用异步操作指令 „ResolveSymbols“ 解析符号。SDT“ResolvedSymbol”中的引用无效 如果在 RUN 模式下因加载导致被引用的变量覆盖,则 SDT"ResolvedSymbol" 中的引用可能 变为无效。引用可能指向不存在的变量。“status”参数中的错误代码指示引用无效。此时,需使用“ResolveSymbols”指令对该符号进行重新解析。数组“Input_ResolvedSymbols”中已解析的符号值将以Big-Endian 格式写入 "dst" 参数的目标 缓冲区 "#InOut_Buffer" 内。 使用 "firstIndex"和 "lastIndex" 参数中的两个常量,可限制需复制其值的变量数。“Input_Offset”操作数中包含各个待写入值的偏移量。根据该偏移量,可确定在目标缓冲区中写入已解析符号值的位置。MoveResolvedSymbolsFromBuffer:从缓冲区中读取值并写入已解析的符号中(S7-1500) 说明 “从缓冲区中读取值并写入已解析的符号中”指令用于从存储区 (Array of BYTE) 中读取数值并写入多个已解析的符号值中。采用这种方式,可处理从通信指令(如 TRCV)接收到的存 储区。 "src" 参数是一个 BYTE数组,用作读取数值的源缓冲区。"dst" 参数是一个 ResolvedSymbol (SDT)数组,其中包含对之前通过“ResolveSymbols”指令解析的变量的引用。通过使用引用, 将为变量写入来自源缓冲区的值。 通过使用"firstIndex" 和 "lastIndex" 参数,限制选择已解析符号列表中需写入值的变量。如 果不希望对列表进行限制,则"firstIndex" 参数中的值必须等于该列表的下限且 "lastIndex" 参 数中的值需等于该列表的上限。 "mode"参数的值用于定义 "src" 参数中的存储器格式。 可通过偏移量确定在源缓冲区中读取和复制已解析符号值的起始位置。通过“srcOffsets”(Array of DINT) 参数指定偏移量。每个偏移量均为位偏移,用于确定从缓冲区读取值的起始位。可在一个字节中存储多个 BOOL 数据类型的值。其它所有数据类型的值的起 始位位置必须可被 8 整除。 例如,如果"dst[i]" 参数引用一个数据类型为 REAL 的变量、"srcOffsets[i]" 参数中的值为 88, "mode"参数值为 2#1,则该指令将读取“字节 11 到 14 中的值(从Zui低有效字节开 始)。