VARIANT (S7-1200, S7-1500) VARIANT_TO_DB_ANY:将 VARIANT 转换为DB_ANY (S7-1200, S7-1500) 说明 可以使用指令“将 VARIANT 转换为 DB_ANY”查询 IN参数地址指定的操作数的数据块编号。 它可以是背景数据块或 ARRAY 数据块。IN 参数的操作数具有数据类型 VARIANT,这意味着在创建程序时不需要知道将被查询编号的数据块的数据类型。在运行期间将会读取数据块编 号,并将其写入 RET_VAL 参数指定的操作数。要求 如果满足条件,则执行该指令。如果不满足条件,则输出“0”作为数据块编号。 输出变量... 转换结果... 转换选项VARIANT ... 作为 PLC 数据类型或系统 数据类型 (SDT) 的背景数据块 的数据块。 可以将该输出变量转换为数据块编号。 VARIANT ... 作为 ARRAY 数据块的数据 块。 可以将该输出变量转换为数据块编号。REF:创建一个对变量的引用 (S7-1500) 说明使用关键字“REF()”,可指定先前所声明引用将指向的变量。即,通过参数指定待引用的变 量。规则 以下规则适用于“引用”: •括号中指定的变量数据类型必须与所声明引用的数据类型完全匹配。即,数据类型为 “REF_TOInt”的引用只能指向数据类型为“Int”的变量。而不进行数据类型转换。 • 指定为“REF()”参数的变量必须位于优化存储区内。 •该引用不得引用以下数据: – 临时数据 (TEMP) – PLC 变量表中的全局变量 – 块参数 – 常量 – 写保护的变量以下规则适用于数组引用: • 数组限值、引用维数以及被引用的变量数必须相同。 • 不支持 Array[*]。 •必须使用以下语句创建基于 PLC 数据类型的 ARRAY DB 引用:输出变量... 转换结果... 转换选项 VARIANT ...带有基本数据类型的对象 由于数据块中并不仅仅只包 含一个基本数据类型,无法将该输出变量转换为数 据库编号。 VARIANT... 数据块中的结构 由于该结构仅仅是数据块中 的一部分,无法将该输 出变量转换为数据库编号。 参数 下表列出了该指令的参数:参数 声明 数据类型 存储区 说明 IN Input VARIANT L(可在块接口 的“Input”、 “InOut”和“Temp”部分进行 声明。) 待读取的变量 (“DB_ANY_TO_VARIANT” 指令的函数值)。IN 参数处可使用全局变量或局部 变量。 ERR Output INT I、Q、M、D、L 错误信息 函数值 (RET_VAL) DB_ANYI、Q、M、D、L 结果:背景数据块的编号 有关有效数据类型的更多信息,请参见“另请参见”。
读取 tempVARIANT操作数中指定的数据块的编号。由于操作数具有数据类型 VARIANT,所 以在创建程序时不需要知道变量的数据类型。编号将写入具有DB_ANY 数据类型的 “OutputDBNumber”变量。DB_ANY_TO_VARIANT:将 DB_ANY 转换为VARIANT (S7-1200, S7-1500) 说明 可以使用指令“将 DB_ANY 转换为VARIANT”从符合以下要求的数据块生成 VARIANT 变量。IN 参数的操作数具有数据类型DB_ANY,这意味着在创建程序时不需要知道数据块。将在运行 时读取数据块编号。 要求如果满足条件,则执行该指令。如果不满足条件或数据块不存在,则在 RET_VAL 参数中输 出值 NULL。所有使用 RET_VAL变量的其它访问都将失败。 以下数据类型的输入变量 ... 转换结果... 转换选项 DB_ANY ...作为 PLC 数据类型或系统数据类型 (SDT) 的背景数据块的 数据块。 可以转换 DB_ANY ...作为 ARRAY 数据块的数据 块。 可以转换DB_ANY ...作为函数块或全局数据块中 的背景数据块的数据块。 不可转换 参数 下表列出了该指令的参数: 参数 声明 数据类型存储区 说明 IN Input DB_ANY I、Q、M、D、L 要读取其编号的数据块 IN 参数处可使用全局变量或 局部变量。ERR Output INT I、Q、M、D、L 错误信息 函数值 (RET_VAL) 1) VARIANT L(可在块接口的“Input”、 “InOut”和 “Temp”部分进行 声明。) 数据块编号 1) RET_VAL 参数声明为Output,因为数据流入变量。但此变量本身在块接口中必须声明为 InOut。1) 输出错误代码 #8155 的原因为: 声明了一个PLC 数据类型 (UDT1) 并创建了一个数据类型为“UDT1”的数据块 (DB2)。变量表 中含有一个数据类型为 DB_ANY的变量 (3)。随后,在程序块 (4) 中调用了指令 “DB_ANY_TO_VARIANT”并在 IN 参数中提供变量(3)。执行时,指令“DB_ANY_TO_VARIANT” 返回错误代码 16#8155。 通过以下步骤消除该错误代码: 1.创建函数 (FC5) 并在 InOut 接口中声明数据类型为 VARIANT 的变量。 2. 创建另一函数 (FC6)并在该函数中调用 FC5。 3. 在 FC6 中的 Temp 接口中创建数据类型为“UDT1”的变量 (7)。 4. 为 FC5 的InOut 接口提供变量 (7)。 5. 编译函数块(FC5 和 FC6)并下载到 CPU 中。在用户程序中无需调用这些块(FC5 和FC6)。 结果: 由于用户程序现已熟悉该数据类型,将不再输出错误代码 16#8155。但如果在调用了“DB_ANY_TO_VARIANT”指令后调用“VariantGet”或“VariantPut”两条指令之一,则无需执行上述程序。在“InputDB”操作数中指定的所有数据块的编号将用于生成对数据块进行寻址的 VARIANT 数据类型的变量。由于 IN 参数的操作数具有 DB_ANY 数据类型,在创建程序时不需要知道将在运行时使用的数据块(既不需要知道数据块的名称,也不需要知道其编号)。.由于 参数 RET_VAL 的操作数具有数据类型VARIANT,在创建程序时不需要知道数据块的数 据类型。传统 (S7-1500) SCALE:缩放 (S7-1500) 说明可以使用“缩放”指令将参数 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) 并输出一个错 误。 如果指定的下限值大于上限值 (LO_LIM> HI_LIM),则结果将对输入值进行反向缩放。UNSCALE:取消缩放 (S7-1500) 说明可以使用“取消缩放”(Unscale) 指令,取消在上限和下限之间以物理单位为增量对参数 IN 中的浮点数进行缩放,并将其转换为整数。使用参数 LO_LIM 和 HI_LIM 指定取消缩放输入值取值范围的下限和上限。指令的结果在参数 OUT 中输出。 “取消缩放”指令将按以下公式进行计算: OUT =[((IN–LO_LIM)/(HI_LIM–LO_LIM)) ∗ (K2–K1)] + K1 常数“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 的值超出 HI_LIM 和 LO_LIM 定义的限值时,将输出一个错误并将结果设置为Zui接 近的限值。如果指定的下限值大于上限值 (LO_LIM > HI_LIM),则结果将对输入值进行反向缩放。程序控制指令 (S7-1200,S7-1500) IF:条件执行 (S7-1200, S7-1500) 说明使用“条件执行”指令,可以根据条件控制程序流的分支。该条件是结果为布尔值(TRUE 或FALSE)的表达式。可以将逻辑表达式或比较表达式作为条件。 执行该指令时,将对指定的表达式进行运算。如果表达式的值为TRUE,则表示满足该条件; 如果其值为 FALSE,则表示不满足该条件。在满足条件时,要执行的指令。如果不满足 条件,则执行ELSE 后编写的指令。如果不满 足程序循环内的任何条件,则执行这些指令。