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
- 在循环中断OB的运行组中将"TIME_BEG"排序第一。n
- 在循环中断OB的运行组中将"TIME_END排序最后。n
- 将"TIME_BEG块的"TM"输出连至"TIME_END"块的"TM"输入。
编译下载程序后,循环中断OB的运行时间在 "TIME_END" 块的"TM-DIFF"输出。n
图 1:确定循环中断OB的运行时间n
注意:
如果CPU中有不只一个循环中断OB块,或者在执行过程中调用了OB8x或OB12x的故障中断,则计算时间会有偏差。因为,更高优先级的OB可以中断循环中断OB的执行过程。中断时间同样会被记录。n
如何确定循环中断OB的时基
在硬件组态的"CPU Properties > Cyclic Interrupts"中定义每个循环中断OB的时基。n
图 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_VARVAR_OUTPUT
Q_SampleTime : REAL; // sec
END_VARQ_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_VARVAR_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_VARret := 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
图 3: CFC中的两个块n
注意:
必须在相关OB的运行组中插入这些块。
注意第一个例子中时间单位是秒,第二个例子中是毫秒。n
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc331866.html