UBLKMOV:不可中断的存储区移动 (S7-300, S7-400) 说明 可以使用“不可中断的存储区移动”指令将一个存储区(源区域)的数据移动到另一个存储区 (目标区域)中。移动操作沿地址升序方向执行。可使用 ANY 指针定义源区域和目标区域。 此移动操作不会被操作系统的其它任务打断。因此,在执行“不可中断的存储区移动”指令 期间,CPU 中断响应时间将增加。 说明 在该指令中,只能使用适用于 S7-300/400 系列 CPU 的数据类型。 存储区 可以使用“不可中断的存储区移动”指令移动以下存储区的数据: • 数据块区域 • 位存储区 • 过程映像输入 • 过程映像输出如果在使用“块移动”指令移动与运行系统无关的数据块时操作中断,则无法再继续执行该 指令。 如果 CPU 支持“从装载存储器的数据块中读取”指令,则需使用该指令从装载存储器中读 取与运行系统无关的数据块。如果使用“块移动”指令,则会输出错误 W#16#8092。 参数 下表列出了“块移动”指令的参数: 参数 声明 数据类型 存储区 说明 SRCBLK Input ANY I、Q、M、D、 L、P 指定待移动的存储区(源 区域)。 RET_VAL Output INT I、Q、M、D、 L、P 错误信息: 如果指令执行期间出错, 则在参数 RET_VAL 中输出 错误代码。 DSTBLK Output 1) ANY I、Q、M、D、 L、P 指定要将块移动到的存储 区(目标区域)。 1) 参数 DSTBLK 声明为 Output,但在块接口中必须声明为 InOut。 RET_VAL 参数 下表列出了 RET_VAL 参数值的含义: 错误代码 * (W#16#.. .) 说明 0000 无错误 8092 源区域或目标区域只能位于装载存储中。 8xyy 更多信息,请参见“通过输出参数 RET_VAL 评估错误 (页 184)” * 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的信息,请 参见:转换程序状态的显示格式。
移动操作的通用规则 在执行“不可中断的存储区移动”指令期间,源区域和目标区域不可以重叠。如果源区域小 于目标区域,则将整个源区域的数据都写入到目标区域中。而目标区域的其余字节则保持不 变。 如果目标区域小于源区域,将写满整个目标区域。而忽略源区域的剩余字节。 如果定义为形参的源区域或目标区域比 SRCBLK 或 DSTBLK 参数中所指定的源区域或目标区 域小,则不传送任何数据。 如果复制 BOOL 数据类型的区域,则此区域的指定长度必须能被 8 整除,否则无法执行该指 令。 可以使用“不可中断的存储区移动”指令Zui多可移动 512 个字节。注意:CPU 对此有特定 限制。 说明 如果实际的源或目标区域小于 SRCBLK 或 DSTBLK 参数所指定的源或目标区域,则响应取决 于 CPU 型号: • 以下情况适用于 S7-300 CPU: 不进行数据传输。错误代码 W#16#837F 将在参数 RET_VAL 中输出。同时在用户程序中必须 评估该错误代码。 • 以下情况适用于 S7-400 V4 CPU(V4、V4 H-CPU 和 V4.5. H CPU): 不进行数据传输。错误代码 W#16#8122 或 W#16#8323 将在参数 RET_VAL 中输出。同时在 用户程序中必须评估该错误代码。 • 对于其它型号的所有 S7-400-CPU: 进行数据传输。错误代码 W#16#8122 或 W#16#8323 将在参数 RET_VAL 中输出。同时在用 户程序中必须评估该错误代码。 移动字符串的规则 还可以使用“不可中断的存储区移动”指令移动 STRING 数据类型的源区域和目标区域。如 果只有源区域为 STRING 数据类型,则仅移动字符串中实际包含的字符。而不会将关于实际 长度和Zui大长度的信息写入目标区域中。如果源和目标区域都是 STRING 数据类型,则将目 标区域中字符串的当前长度设置为实际移动的字符数。如果要移动 STRING 数据类型的区域, 则必须将区域长度指定为“1”。下表列出了“不可中断的存储区移动”指令的参数: 参数 声明 数据类型 存储区 说明 SRCBLK Input ANY I、Q、M、D、 L、P 指定待移动的存储区(源 区域)。 RET_VAL Output INT I、Q、M、D、 L、P 错误信息: 如果指令执行期间出错, 则在参数 RET_VAL 中输出 错误代码。 DSTBLK Output 1) ANY I、Q、M、D、 L、P 指定要将块移动到的存储 区(目标区域)。 1) 参数 DSTBLK 声明为 Output,但在块接口中必须声明为 InOut。 RET_VAL 参数 下表列出了 RET_VAL 参数值的含义: 错误代码 * (W#16#.. .) 说明 0000 无错误 8091 源或目标区域只能位于装载内存中。 8xyy 更多信息,请参见:通过输出参数 RET_VAL 评估错误 (页 184) * 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的信息,请 参见:转换程序状态的显示格式。FILL:填充块 (S7-300, S7-400) 说明 可以使用“填充块”指令将一个存储区(源区域)的内容填充到另一存储区(目标区域)。 “填充块”指令将源区域的数据移动到目标区域,直到目标区域写满为止。移动操作沿地址 升序方向执行。可使用 ANY 指针定义源区域和目标区域。 说明 在该指令中,只能使用适用于 S7-300/400 系列 CPU 的数据类型。 下图说明了移动操作的原理:源和目标数据的一致性 请注意,执行“填充块”指令时,源数据需保持不变,否则将无法保证目标数据的一致性。 存储区 可使用“填充块”指令移动以下存储区的数据: • 数据块区域 • 位存储区 • 过程映像输入 • 过程映像输出 移动操作的通用规则 源区域和目标区域不得重叠。如果要预设的目标区域不是输入参数 BVAL 长度的整数倍,目 标区域仍然可写至Zui后一个字节。 如果要预置的目标区域小于源区域,此功能仅复制可以写入目标区域的数据量。 如果实际的目标或源区域小于源或目标区域分配的存储区(参数 BVAL 和 BLK),则不传输 任何数据。 如果 ANY 指针(源或目标)为 BOOL 数据类型,则指定的长度必须能被 8 整除,否则将不 会执行该指令。 如果目标区域为 STRING 数据类型,则指令将写入包含管理信息在内的整个字符串。 说明 如果实际的源或目标区域小于 BVAL 或 BLK 参数所指定的目标或源区域,则响应取决于 CPU 型号: • 以下情况适用于 S7-300 CPU: 不进行数据传输。错误代码 W#16#837F 将在参数 RET_VAL 中输出。同时在用户程序中必须 评估该错误代码。 • 以下情况适用于 S7-400 V4 CPU(V4、V4 H-CPU 和 V4.5. H CPU): 不进行数据传输。错误代码 W#16#8122 或 W#16#8323 将在参数 RET_VAL 中输出。同时在 用户程序中必须评估该错误代码。 • 对于其它型号的所有 S7-400-CPU: 进行数据传输。错误代码 W#16#8122 或 W#16#8323 将在参数 RET_VAL 中输出。同时在用 户程序中必须评估该错误代码。移动结构的规则 当将结构作为输入参数传送时,必须谨记结构的长度应始终为偶数个字节。如果声明一个具 有奇数个字节的结构,此结构还需要另一个字节的存储空间。 参数 下表列出了“填充块”指令的参数: 参数 声明 数据类型 存储区 说明 BVAL Input ANY I、Q、M、D、 L、P 指定存储区域(源区 域),将使用该存储区域 中的内容填充 BLK 参数中 指定的目标区域。 RET_VAL Output INT I、Q、M、D、 L、P 错误信息: 如果指令执行期间出错, 则在参数 RET_VAL 中输出 错误代码。 BLK Output 1) ANY I、Q、M、D、 L、P 指定要使用源区域的数据 填充的存储区。 1) 参数 BLK 声明为 Output,但在块接口中必须声明为 InOut。转换操作 (S7-300, S7-400) SCALE:缩放 (S7-300, S7-400) 说明 可以使用“缩放”指令将参数 IN 上的整数转换为浮点数,该浮点数在介于上下限值之间的 物理单位内进行缩放。通过参数 LO_LIM 和 HI_LIM 来指定缩放输入值取值范围的下限和上 限。指令的结果在参数 OUT 中输出。 “缩放”指令将按以下公式进行计算: OUT = [((FLOAT (IN) – K1)/(K2–K1)) ∗ (HI_LIM–LO_LIM)] + LO_LIM 常数“K1”和“K2”的值取决于参数 BIPOLAR 的信号状态。参数 BIPOLAR 可能有下列信号状态: • 信号状态“1”:假设参数 IN 的值为双极性且取值范围是 -27648 到 27648。此时,常数“K1” 的值为“-27648.0”,而常数“K2”的值为“+27648.0”。 • 信号状态“0”:假设参数 IN 的值为单极性且取值范围是 0 到 27648。此时,常数“K1”的值为 “0.0”,而常数“K2”的值为“+27648.0”。 如果参数 IN 的值大于常数“K2”的值,则将指令的结果设置为上限值 (HI_LIM) 并输出一个错误。 如果参数 IN 的值小于常数“K1”的值,则将指令的结果设置为下限值 (LO_LIM) 并输出一个错 误。