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低有效字节开 始)。 例如,如果 "src[i]" 参数引用一个数据类型为 BOOL 的变量,同时 "srcOffsets[i]" 参数中的值 为 29,则该指令将读取源缓冲区字节 3 中的值(偏移量 5)。数组“Input_ResolvedSymbols”中已解析的符号值将以 Big-Endian 格式写入 "dst" 参数的目标 缓冲区 "#InOut_Buffer" 内。 使用 "firstIndex" 和 "lastIndex" 参数中的两个常量,可限制需复制其值的变量数。 “Input_Offset”操作数中包含各个待写入值的偏移量。根据该偏移量,可确定在目标缓冲区中 写入已解析符号值的位置。
为确保 "srcOffsets[i]" 中包含有 "dst[i]" 的偏移量,"srcOffsets" 和 "dst" 处的数组限值必须相 同。 这样,可精准指定目标缓冲区中待复制的值。但请注意,该指令不会验证所指定的偏移量是 否重叠。此时,不会发送错误消息,而且可能随机读取值。 "status" 参数是一个 INT 数组。为确保 "status[i]" 中包含有 "dst[i]" 的状态,该参数的限值必 须与 "dst" 和 "srcOffsets" 参数的相同。 对于 WSTRING 和 STRING,将复制源字符串的当前长度。如果源字符串比目标字符串长,则 不复制源字符串的其余字符。 说明 SDT“ResolvedSymbol”中的引用无效 如果在 RUN 模式下因加载导致被引用的变量覆盖,则 SDT "ResolvedSymbol" 中的引用可能 变为无效。引用可能指向不存在的变量。“status”参数中的错误代码指示引用无效。 此时,需使用“ResolveSymbols”指令对该符号进行重新解析。源缓冲区“Input_Buffer”中的变量值以 Big-Endian 格式读取,并通过 "#InOut_ResolvedSymbols" 中的引用写入到已解析符号中。 "firstIndex" 和 "lastIndex" 参数中的两个常量用于限制需在目标缓冲区中写入其值的变量数。 根据操作数“Input_Offset”中的偏移量确定在源缓冲区中读取数值的位置。LOWER_BOUND:读取 ARRAY 的下限 (S7-1200, S7-1500) 说明 在函数块或函数的块接口中,可声明 ARRAY[*] 数据类型的变量。这些局部变量可读取 ARRAY 限值。此时,需要在 DIM 参数中指定维数。 可以使用“读取 ARRAY 下限”(Read out ARRAY low limit) 指令,读取 ARRAY 的变量下限。 如果满足下列条件之一,使能输出 ENO 将返回信号状态“0”: • 使能输入 EN 的信号状态为“0”。 • 输入 DIM 处指定的维数不存在。 说明 该指令的可用性 该指令可用于于固件版本为 V4.2 及以上版本的 S7-1200 系列 CPU 和固件版本为 V2.0 及以 上版本的 S7-1500 系列 CPU。 参数 下表列出了“读取 ARRAY 下限”(Read out ARRAY low limit) 指令的参数: 参数 声明 数据类型 存储区 说明 EN Input BOOL I、Q、M、D、L 或常量 使能输入 ENO Output BOOL I、Q、M、D、L 使能输出 ARR Input ARRAY[*] FB => InOut 部分 FC => Input 和 InOut 部分 待读取可变下限的 ARRAY。 DIM Input UDINT I、Q、M、D、 L、P 或常量 待读取可变下限的 ARRAY 维度。 OUT Output DINT I、Q、M、D、 L、P 结果。如果操作数“Enable_Start”返回信号状态“1”,则执行该指令。该指令将从第二维度读取 ARRAY #ARRAY_A 的可变下限值。如果成功执行该指令,则结果将写入操作数“Enable_Out”中并置 位操作数“Result”。UPPER_BOUND:读取 ARRAY 的上限 (S7-1200, S7-1500) 说明 在函数块或函数的块接口中,可声明 ARRAY[*] 数据类型的变量。这些局部变量可读取 ARRAY 限值。此时,需要在 DIM 参数中指定维数。 可以使用“读取 ARRAY 上限”(Read out ARRAY high limit) 指令,读取 ARRAY 的变量上限。 如果满足下列条件之一,使能输出 ENO 将返回信号状态“0”: • 使能输入 EN 的信号状态为“0”。 • 输入 DIM 处指定的维数不存在。 说明 该指令的可用性 该指令可用于于固件版本为 V4.2 及以上版本的 S7-1200 系列 CPU 和固件版本为 V2.0 及以 上版本的 S7-1500 系列 CPU。如果操作数“Enable_Start”返回信号状态“1”,则执行该指令。该指令将从第二维度读取 ARRAY #ARRAY_A 的可变上限值。如果成功执行该指令,则结果将写入操作数“Enable_Out”中并置 位操作数“Result”。传统 (S7-1500) FieldRead:读取域 (S7-1500) 说明 可以使用“读取域”指令读出参数 MEMBER 中指定域的特定组成部分,并将其内容传送到 参数 VALUE 中的变量。可以使用参数 INDEX 定义要读取的域元素的下标。在参数 MEMBER 中,指定要读取的域的第一个元素。 参数 MEMBER 中的域元素和参数 VALUE 中的变量的数据类型必须与指令“读取域”的数据 类型相一致,因为无法进行隐式转换。 如果满足下列条件之一,则使能输出 ENO 的信号状态为“0”: • 使能输入 EN 的信号状态为“0”。 • 参数 INDEX 中指定的域元素未在参数 MEMBER 指定的域中定义。 • 执行过程中发生溢出之类的错误。FieldWrite:写入域 (S7-1500) 说明 可以使用“写入域”指令将 VALUE 输入中变量的内容传送到 MEMBER 输出中域的特定元素。 使用 INDEX 输入的值指定所述域元素的下标。在输出 MEMBER 中输入待写入域的第一个元素。 参数 MEMBER 中的域元素和参数 VALUE 中的变量的数据类型必须与指令“读取域”的数据 类型相一致,因为无法进行隐式转换。 如果满足下列条件之一,则使能输出 ENO 的信号状态为“0”: • 使能输入 EN 的信号状态为“0”。 • 输入 INDEX 中指定的域元素未在输出 MEMBER 中定义。 • 执行过程中发生溢出之类的错误。变量“a_real”的值“10.54”,将写入域“Main_Field[-10 ... 10] of REAL”中下标为 4 的域元素。通 过 INDEX 输入中的值,指定要传送变量“a_real”内容的域元素的下标。BLKMOV:块移动 (S7-1500) 说明 可以使用“块移动”指令将一个存储区(源区域)的数据移动到另一个存储区(目标区域) 中。移动操作沿地址升序方向执行。可使用 VARIANT 来定义源区域和目标区域。 说明 该指令的变量仅适用于未激活“优化块访问”属性的存储区中。适用于数据块 (DB)、组织块 (OB)、函数 (FC)、位存储器 (M)、输入 (I) 和输出 (Q)。 如果指令的变量已通过保持性设置“在 IDB 中设置”进行声明,仍可在“优化块访问”的存 储区中使用该变量。源数据和目标数据一致 请确保在执行“块移动”指令的过程中,源数据保持不变,否则无法保证目标数据的一致性。 可中断性 嵌套深度没有限制。存储区 可以使用“块移动”指令移动以下存储区的数据: • 数据块区域 • 位存储区 • 过程映像输入 • 过程映像输出 移动操作的通用规则 源区域和目标区域不得重叠。如果源区域和目标区域的长度不同,将仅移动较小长度区域中 的数据。 如果源区域小于目标区域,则将整个源区域的数据都写入到目标区域中。而目标区域的其余 字节则保持不变。 如果目标区域小于源区域,将写满整个目标区域。而忽略源区域的剩余字节。 如果数据类型为 BOOL 的块被移动,则必须对变量进行juedui寻址,且为该区域指定的长度必 须为 8 的倍数,否则不执行该指令。 移动字符串的规则 还可以使用“块移动”指令移动 STRING 数据类型的源区域和目标区域。如果只有源区域为 STRING 数据类型,则仅移动字符串中实际包含的字符。有关实际长度和Zui大长度信息不会 写入目标区域中。如果源和目标区域都是 STRING 数据类型,则将目标区域中字符串的当前 长度设置为实际移动的字符数。 如果要移动关于字符串实际长度和Zui大长度的信息,则需要以字节为单位将相关区域指定给 SRCBLK 和 DSTBLK 参数。此外,也可使用“Serialize”/“Deserialize”指令。