自 TIA Portal V13 SP1 版本起,搭配 S7 - 1200 CPU 的 V4.0 固件版本,系统开始支持一系列用于处理 Variant 类型变量的指令,具体指令如 图 1 所示 。 图1:指令位置
图2:VariantGet指令详情
表1:VariantGet指令说明 1:指令功能:该指令用于从 FC(功能)/FB(功能块)的输入 / 输出 / 输入输出 / 临时变量,以及 OB(组织块)的临时变量中,读取 Variant 类型的参数,并将 Variant 参数所指向的变量数据,复制到 DST 指定的变量内。 2:数据匹配要求:为确保数据读取正确,Variant 参数指向的变量类型,必须与 DST 变量的类型一致。 3:NULL 值检查建议:在执行读取操作前,强烈建议运用 IS_NULL 指令,检查 Variant 是否指向 NULL 值,以便提前规避读取错误。 4:变量类型判断:借助 Variant 判断指令,能够明确 Variant 指向的变量类型或数组类型。 5:数组读取规则: 1:若两个数组类型相同但长度不同,VariantGet 指令仅读取双方元素数量较少的那个数组的长度。 2:若两个数组类型不同,指令将不会执行读取操作,且若启用指令的 ENO 功能,ENO 将被设置为 False。
详细内容见表 2 : SRC 严禁为复杂数据类型的数组。同时,VariantPut 指令无法对 Variant 类型的变量执行初始化操作。所以,在执行 VariantPut 指令前,务必保证 Variant 参数所指向的变量已完成正确初始化或赋值。1:指令功能:VariantPut 指令的作用是将 SRC 变量的数据写入到 Variant 参数指向的变量之中。 2:数据匹配要求:为实现准确写入,Variant 参数与 SRC 变量的类型必须完全匹配。 3:NULL 值检查建议:在执行写入操作前,强烈推荐运用 IS_NULL 指令检查 Variant 是否指向 NULL 值,以此提前避免写入错误。 4:变量类型判断:通过 Variant 判断指令,可明确 Variant 指向的变量类型或数组类型。 5:数组写入规则: 1:若两个数组类型相同但长度不同,VariantPut 指令仅写入双方元素数量较少的那个数组的数据。 2:若两个数组类型不同,指令将不会执行写入操作,并且若启用指令的 ENO 功能,ENO 将被设置为 False。 在使用 VariantPut 指令时,务必严格保证 Variant 参数指向的变量与 SRC 变量类型匹配,并遵循上述各项注意事项 。在工业自动化编程场景中,当面对不定长度数组(数组长度存在固定上限),或者多种数据类型混合的数组时,VariantGet 和 VariantPut 指令展现出极高的处理效率。
这得益于它们能够直接处理 Variant 类型参数,避免了额外的类型转换与数据匹配操作,显著提升处理速度。
同时,Variant 类型本身具备灵活性,使得这两个指令可依据实际数据类型自适应处理,有效规避因数据类型不匹配引发的错误与性能损耗,极大提高程序运行的效率与准确性。
此外,借助 DB_ANY_TO_VARIANT 指令,VariantGet 和 VariantPut 还能进一步拓展功能,实现更复杂的数据交互与处理。
以创建 FC16 函数块为例,该函数块功能为依据传入的不同输入类型,分别调用 FC17 和 FC18 函数块。
其中,FC17 的输入 / 输出参数标记为 “VGP1”,FC18 的输入 / 输出参数标记为 “VGP2”。
关于具体的调用逻辑与参数配置,可参考图 4 与图 5 。通过这一示例能够直观看到,在实际应用中,合理运用 VariantGet、VariantPut 以及 DB_ANY_TO_VARIANT 指令,可有效提升程序的处理能力与适应性 。 图4:参数设置 图5:例子程序
在工业自动化编程中,CountOfElements 指令在处理特定类型的操作数时十分实用。下面为你详细介绍其使用规则、注意事项、使用方法及示例。
功能概述当操作数在 FC(功能)或 FB(功能块)的 Input(输入)、Output(输出)、InOut(输入输出)或 Temp(临时)参数里被定义为 Variant 类型,并且对应的实参为数组或者 P# 指针格式时,使用 CountOfElements(操作数) 指令,就能返回该操作数元素的总个数。
注意事项
使用方法要获取元素个数,可按以下语法使用 CountOfElements 指令:
元素个数(UDInt) := CountOfElements(操作数);
其中,元素个数的数据类型为无符号双整型(UDInt)。
使用示例我们编写一个 FC 来检查输入的 3 个 Variant 变量类型。此 FC 会分别判断每个实参是否为数组形式,若为数组则输出 True,否则输出 False。同时,若实参是数组,会输出数组的元素个数;若不是数组,则输出 0。
具体的逻辑实现和参数配置可参考图 6 - 9 图7:例子程序1 图8例子程序2 图9FC10调用从图 9 可以清晰看出不同类型数组的元素个数情况:
1:对于 Array[0..1] of "UDT_1" 这种一维数组,其元素个数为 2:Array[0..1, 0..2] of Byte 是一个二维数组,通过计算可得其元素总个数为 2×3 = 6。 3:把 P#M100.0 BYTE 2 视作数组时,它的元素个数为 2。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |