如何计算循环中断OB的运行时间和时间基数?


n

描述:
此文档叙述了以下两点:n

  • 如何确定循环中断OB的运行时间n
  • 如何确定循环中断OB的时基

如何确定循环中断OB的运行时间
从PCS 7 V7.0开始,可以使用功能块 "CPU_RT"来确定某个特定OB的循环时间(如果CPU支持SFC 78)。
在编译CFC时,会产生一个包含"@CPU_RT"的CFC图表"@CPU_RT"。这个块会自动集成在OB100、OB1、所有OB 3X和OB 8X(如果用户程序中调用的话)。通过"NET01AV"输出值读到平均运行时间,通过"NET01CUR"读到OB1当前运行时间。所有相关OB中都能读到这些值(比如,"NET36CUR"读到OB36的当前运行时间)。n

如果CPU不支持SFC 78,或者不想使用"CPU_RT"块,可以通过如下方法确定OB的运行时间。n

可以通过"TIME_BEG" (FB13)和"TIME_END"(FB12)来确定运行时间。
这些块可以在CFC目录"Libraries > CFC Library [current CFC library] > ELEMENTABlocks [blocks for general usage] > TIME"下找到。n

  1. 在循环中断OB的运行组中将"TIME_BEG"排序第一。n
  2. 在循环中断OB的运行组中将"TIME_END排序最后。n
  3. 将"TIME_BEG块的"TM"输出连至"TIME_END"块的"TM"输入。

编译下载程序后,循环中断OB的运行时间在 "TIME_END" 块的"TM-DIFF"输出。n

如何计算循环中断OB的运行时间和时间基数?
图 1:确定循环中断OB的运行时间n

注意:
如果CPU中有不只一个循环中断OB块,或者在执行过程中调用了OB8x或OB12x的故障中断,则计算时间会有偏差。因为,更高优先级的OB可以中断循环中断OB的执行过程。中断时间同样会被记录。n

如何确定循环中断OB的时基
在硬件组态的"CPU Properties > Cyclic Interrupts"中定义每个循环中断OB的时基。n

如何计算循环中断OB的运行时间和时间基数?
图 2: 设置循环中断OB的时基n

可以在程序中通过不同方式确定时基。n

  • 通过系统属性"S7_sampletime"判断(PCS 7 V5.x 以后)-考虑到了运行组的扫描率。n
  • 使用系统功能"RD_SINFO" (SFC6)-只能确定循环中断OB的时基。

以下提供一个SCL代码的示例。n

Example: S7_sampletime
此版本需要一个FB块。n

FUNCTION_BLOCK FB501

VAR_INPUT
SAMPLE_T {S7_sampletime := 'true'} : REAL;
END_VAR

VAR_OUTPUT
Q_SampleTime : REAL; // sec
END_VAR

Q_SampleTime := SAMPLE_T ;
END_FUNCTION_BLOCK

输入参数"SAMPLE_T"具备"S7_sampletime := 'true'"属性。在CFC程序编译时,这个参数会由调用OB的采样时间和运行组的扫描率决定。
在PCS 7V5.x和V6.x中,确保在编译CFC程序的时候选择了"Update sampling time" 。从PCS 7 V7.0开始,采样时间随着每一次编译更新。
如果修改了循环中断OB的时基,需要重新编译CFC以获得正确值。
注意,当采样时间更新后,需要考虑运行组的扫描率(采样时间 = 基本的循环时间 * 扫描率)。n

Example: System function RD_SINFO (SFC6)
此版本需要一个FC块。n

FUNCTION FC501 : VOID

VAR_OUTPUT
Q_OB_NR : INT;
Q_OB_Cycle : INT;
END_VAR

VAR_TEMP
OB_DAT :
STRUCT
EV_CLASS : BYTE;
EV_NUM : BYTE;
PRIORITY : BYTE;
NUM : BYTE;
TYP2_3 : BYTE;
TYP1 : BYTE;
ZI1 : WORD;
ZI2_3 : DWORD;
END_STRUCT;

tmp :
STRUCT
EV_CLASS : BYTE;
EV_NUM : BYTE;
PRIORITY : BYTE;
NUM : BYTE;
TYP2_3 : BYTE;
TYP1 : BYTE;
ZI1 : WORD;
ZI2_3 : DWORD;
END_STRUCT;

ret : INT;
END_VAR

ret := SFC6(TOP_SI := OB_DAT, START_UP_SI := tmp);

Q_OB_NR := WORD_TO_INT(BYTE_TO_WORD(OB_DAT.NUM));

Q_OB_Cycle := WORD_TO_INT(DWORD_TO_WORD (OB_DAT.ZI2_3));

IF (OB_DAT.EV_NUM = B#16#3A) THEN // µs -> ms
Q_OB_Cycle := Q_OB_Cycle / 1000;
END_IF;

END_FUNCTION

系统功能SFC6读取了关于最后一个调用的OB和最后一个启动的运行OB的启动信息。
注意这个版本中没有考虑运行组的扫描率。n

如何计算循环中断OB的运行时间和时间基数?
图 3: CFC中的两个块n

注意:
必须在相关OB的运行组中插入这些块。
注意第一个例子中时间单位是秒,第二个例子中是毫秒。n

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc331866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论