[西门子] S7-1200 PLC:RUNTIME 指令如何精准测量程序运行时间

[复制链接]
查看71 | 回复1 | 3 天前 | 显示全部楼层 |阅读模式
自 TIA Portal V13 SP1 版本起,搭配 S7 - 1200 CPU 的 V4.0 固件版本,系统开始支持一系列用于处理 Variant 类型变量的指令,具体指令如 图 1 所示 。

1:指令位置



VariantPut指令详情


图2:VariantGet指令详情



VariantGet指令说明

表1:VariantGet指令说明

注意事项

DST 不可为复杂数据类型的数组。

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。

VariantPut 指令说明


详细内容见表 2 :

注意事项:

SRC 严禁为复杂数据类型的数组。同时,VariantPut 指令无法对 Variant 类型的变量执行初始化操作。所以,在执行 VariantPut 指令前,务必保证 Variant 参数所指向的变量已完成正确初始化或赋值。

VariantPut 指令介绍

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

在工业自动化编程中,CountOfElements 指令在处理特定类型的操作数时十分实用。下面为你详细介绍其使用规则、注意事项、使用方法及示例。


功能概述

当操作数在 FC(功能)或 FB(功能块)的 Input(输入)、Output(输出)、InOut(输入输出)或 Temp(临时)参数里被定义为 Variant 类型,并且对应的实参为数组或者 P# 指针格式时,使用 CountOfElements(操作数) 指令,就能返回该操作数元素的总个数。


注意事项

  • 单个变量情况:若 Variant 指向的是单个变量,CountOfElements 指令将返回 0。

  • 布尔数组情况:若 Variant 指向的是 Array of Bool(布尔数组),计数时会包含填充元素。例如,Array[0..1] of Bool 使用该指令将返回 8。


使用方法

要获取元素个数,可按以下语法使用 CountOfElements 指令:

plaintext
元素个数(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。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
lhsz | 前天 10:24 | 显示全部楼层
感谢楼主分享精彩内容
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则