AssignmentAttempt:引用的赋值操作 (S7-1500) 说明 使用“AssignmentAttempt”指令,可对引用变量进行赋值。 支持以下赋值操作: • 尝试将 VARIANT 分配给一个引用 • 尝试将 DB_ANY 分配给一个工艺对象的引用 尝试将 VARIANT 分配给一个引用 引用变量的数据类型在声明时确定,而 VARIANT 变量的数据类型则在运行时确定。引用变 量不允许进行隐式数据转换。因此,为两个变量指定两个数据类型时,可使用赋值尝试指令。 借助赋值操作,会在运行期间进行检查,以确认分配的变量的数据类型是否正确。如果正确, 则执行该指令。如果该指令执行成功,则目标变量中包含一个有效的引用,否则为 NULL。 尝试赋值后,可以检查尝试是否成功,并根据该结果继续处理程序。在 LAD 和 FBD 中,可 以将使能输出“ENO”用于检查操作。如果赋值尝试成功,“ENO”将返回信号状态“1”。只有成 功后才能在程序段中继续执行后续指令。 在 STL 和 SCL 中,可使用指令“IS_NULL”或“NOT_NULL”来检查赋值尝试是否成功等。 以下规则适用于 VARIANT 的赋值尝试。在运行过程中,如果 VARIANT 变量不符合以下规则, 则返回值“NULL”。 • VARIANT 需指向一个优化存储区中的地址。 • VARIANT 不得指向临时存储区中的地址。 • 如需将 VARIANT 指定给一个 ARRAY 引用,则需遵循以下规则: – VARIANT 变量必须指向一个限值与所声明的引用完全相同的 ARRAY。指向 ARRAY [0..9] 的 VARIANT 变量与变量 REF_TO ARRAY[1..10] 不匹配。 – 此外,在固件版本为 V2.5 的 S7-1500 系列 CPU 中,用于生成 VARIANT 变量值的块还 应执行一次编译操作。
• VARIANT 不能指定给一个工艺对象的引用。 • 在 SCL 中,赋值操作无法用于多重赋值运算 (a := b := c;) 中。 尝试将 DB_ANY 分配给一个工艺对象的引用 工艺对象的引用始终指向特定的工艺对象,例如 REF_TO TO_SpeedAxis。如果要在运行期间 通过 DB_ANY 类型的变量分配工艺对象,需要检查该工艺对象与声明的引用是否匹配。为此, 可使用赋值操作。尝试赋值时,运行过程中将检查该工艺对象是否具有所声明的类型。如果 数据类型正确,则会执行分配。如果分配执行成功,则目标变量中包含一个有效的引用,否 则为 NULL。 尝试将 DB_ANY 分配给一个工艺对象的引用时,遵循以下规则: • DB_ANY 必须指向优化存储区中的工艺对象。 • 两个相同类型的工艺对象可以相互分配。 • 派生类型可以分配给其基本类型。 • 基本类型不能分配给其派生类型。SRC Input VARIANT DB_ANY • FC 的块接 口: Input、 Output、 InOut、 Temp • FB 的块接 口: Input、 InOut、 Temp 指针指向其地址 待读取的源变量 DST Output 如果 SRC = VARIANT,则引 用: • 位序列, BOOL 除外、 • 整数、 • 浮点数、 • 字符串、 • PLC 数据类型 (UDT)、 • 系统数据类 型 (SDT)、 • ARRAY of <已 命名的数据类 型> 如果 SRC = DB_ANY,则引 用: • 工艺对象 • FC 的块接 口:Input、 Output、 Temp、 Return • FB 的块接 口:Temp 引用地址待传送 源变量的地址 有关有效数据类型的更多信息,请参见“另请参见”。 示例 以下示例说明了该指令的工作原在程序代码中,尝试将“myVariant”分配给引用变量“myReference”。在运行过程中,如果 “myVariant”的数据类型为“Int”,则"myReference" 中包含一个指向 VARIANT 源变量的有效引 用,否则为 NULL。分配成功时,使能输出“ENO”的信号状态为“1”,同时将值“10”写入目标 变量中。 在另一程序段中,尝试将 "myDB" 分配给引用变量 "myReferenceTO"。如果运行期间 "myDB" 指向类型为“定位轴”的工艺对象,则 "myReferenceTO" 包含有效引用,否则为 NULL。分 配成功时,使能输出“ENO”的信号状态为“1”,同时可将值“1”写入工艺对象中的目标变量。
SWAP:交换 (S7-1200, S7-1500) 说明 可以使用“交换”指令更改输入 IN 中字节的顺序,并在输出 OUT 中查询结果。 下图说明了如何使用“交换”指令交换数据类型为 DWORD 的操作数的字节:ARRAY 数据块 (S7-1500) ReadFromArrayDB:从 ARRAY 数据块中读取 (S7-1500) 说明 可以使用“从 ARRAY 数据块中读取”(Read from ARRAY data block) 指令从索引引用的 ARRAY DB 块类型的数据块中读取元素并将元素值写入目标范围。 ARRAY 数据块是仅包含一个 ARRAY of <数据类型> 的数据块。ARRAY 的元素可以是 PLC 数据 类型或其它任何基本数据类型。ARRAY 通常从下限“0”开始计数。 如果满足下列条件之一,使能输出 ENO 将返回信号状态 FALSE: • 使能输入 EN 返回信号状态 FALSE。 • 如果在执行该指令过程中发生错误。WriteToArrayDB:写入 ARRAY 数据块 (S7-1500) 说明 可以使用“写入 ARRAY 数据块”(Write to ARRAY data block) 指令将索引引用的元素写入 ARRAY DB 块类型的数据块中。 ARRAY 数据块是仅包含一个 ARRAY of <数据类型> 的数据块。ARRAY 的元素可以是 PLC 数据 类型或其它任何基本数据类型。ARRAY 通常从下限“0”开始计数。 如果满足下列条件之一,使能输出 ENO 将返回信号状态 FALSE: • 使能输入 EN 返回信号状态 FALSE。 • 如果在执行该指令过程中发生错误。导致该错误的原因有以下两种: • VALUE 参数的大小与 ARRAY 数据块中的元素长度不匹配。 • 这两个变量不在具有“优化访问”的存储区内。有关存储区访问类型的更多 信息,请参见“块访问的基本知识 (页 63)” * 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显式格式的更多信息, 请参见“另请参见”。ReadFromArrayDBL:从装载存储器的 ARRAY 数据块中读取 (S7-1500) 说明 可以使用“从装载存储器的 ARRAY 数据块中读取”(Read from ARRAY data block in load memory) 指令从装载存储器 ARRAY DB 块类型的数据块中读取索引应用的元素并将其写入目 标范围。 ARRAY 数据块是仅包含一个 ARRAY of <数据类型> 的数据块。ARRAY 的元素可以是 PLC 数据 类型或其它任何基本数据类型。ARRAY 通常从下限“0”开始计数。如果 ARRAY 数据块使用块属性“仅存储在装载存储器”进行指定,则该数组数据块将仅存 储在装载存储器中。 当 REQ 参数中检测到信号上升沿时,将执行该指令。参数 BUSY 的信号状态将为“1”。当 BUSY 参数中检测到信号下降沿时,将终止该指令。在一个程序周期内,DONE 参数的信号状态为 “1”,而且在该周期内,读取的值将输出到 VALUE 参数中。在所有其它程序周期内,参数 VALUE 的值将保持不变。 如果满足下列条件之一,使能输出 ENO 将返回信号状态 FALSE: • 使能输入 EN 返回信号状态 FALSE。 • 如果在执行该指令过程中发生错误。如果操作数“TagIn1”的信号状态为“1”且在操作数“TagReq”处检测到上升沿,将执行该指令。 将读取“ArrayDB”中的第二个元素并输出到“VALUE”参数中。在操作数“TagBusy”处检测到下降 沿时,将中止该指令的执行同时参数 VALUE 将不再变化。如果该指令执行成功,则使能输出 ENO 的信号状态为 TRUE,同时置位输出“TagOut”。该指令执行后,操作数“TagDone”的信号 状态将为 TRUE。WriteToArrayDBL:写入装载存储器的 ARRAY 数据块 (S7-1500) 说明 可以使用“写入装载存储器的 ARRAY 数据块”(Write to ARRAY data block in load memory) 指 令将索引引用的元素写入装载存储器 ARRAY DB 块类型的数据块中。 ARRAY 数据块是仅包含一个 ARRAY of <数据类型> 的数据块。ARRAY 的元素可以是 PLC 数据 类型或其它任何基本数据类型。ARRAY 通常从下限“0”开始计数。 如果 ARRAY 数据块使用块属性“仅存储在装载存储器”进行指定,则该数组数据块将仅存 储在装载存储器中。 当 REQ 参数中检测到信号上升沿时,将执行该指令。参数 BUSY 的信号状态将为“1”。如果在 BUSY 参数中检测到信号下降沿,则将终止该指令同时将 VALUE 参数中的值写入该数据块中。 在一个程序周期内,参数 DONE 的信号状态为“1”。 如果满足下列条件之一,使能输出 ENO 将返回信号状态“0”: • 使能输入 EN 的信号状态为“0”。 • 如果在执行该指令过程中发生错误。指向待读取工作存储器中 的 DB 的指针,并写入该 工作存储器的值。 不必使用“TEMP”部分的本 地常数或变量。如果在该指令执行期间出 错,则在参数 ERROR 中输 出一个错误代码。