发布于 2011-01-10 17:13:31
9楼
这种情况可以写个FB,
下面的程序用SCL写的,总共有200个延时点,若想再多的话可以修改数组元素的个数及循环次数,或者再调用一次FB,用另一个背景块。思路:采用数扫描周期的方法,扫描周期的个数可以通过改变常量改变,这样的好处是不占用系统定时器和DB块,在SCL中编译一下后OB1调用FB210,背景块是DB210,在定义200个点的情况下DB210.DBX4.0是输入点,DB210.DBX30.0是延时输出点。
//有好几百个点需要采集,而且每个点需要做上升、下降延时。
//用的是CPU315-2DP,书上说该CPU定时器最多128个?那远远不够用啊,
//于是我用SFB4/SFB5代替定时器,但这两个块又占用DB,据书上又说
//该型号CPU的最大DB块也是128?算下来还是不够用啊,怎么办,急求高手指条路。
DATA_BLOCK DB210 FB210
//
// Block Comment...
//
BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK FB210
VAR_TEMP
i:INT;
END_VAR
VAR
ON_time:INT:=50;//常量,开延时的扫描周期
OFF_time:INT:=50;//常量,关延时的扫描周期
IN_BOOL:ARRAY[0..199]OF BOOL;//输入变量
OUT_BOOL:ARRAY[0..199]OF BOOL;//延时输出变量
P:ARRAY[0..199]OF BOOL;//上升沿
N:ARRAY[0..199]OF BOOL;//下降沿
JA:ARRAY[0..199]OF INT;//开计数用
JB:ARRAY[0..199]OF INT;//关计数用
END_VAR
FOR i:= 0 TO 199 BY 1 DO
IF IN_BOOL[i]=true THEN
JA[i]:=JA[i]+1;
IF JA[i]>ON_time THEN
OUT_BOOL[i]:=true;
END_IF;
IF JA[i]>ON_time+2 THEN
JA[i]:=JA[i]+1;
END_IF;
ELSE;
JB[i]:=JB[i]+1;
IF JB[i]>OFF_time THEN
OUT_BOOL[i]:=False;
END_IF;
IF JB[i]>OFF_time+2 THEN
JB[i]:=JB[i]+1;
END_IF;
END_IF;
IF IN_BOOL[i] AND NOT P[i] THEN
JA[i]:=0;
JB[i]:=0;
END_IF;
P[i]:=IN_BOOL[i];
IF NOT IN_BOOL[i] AND N[i] THEN
JA[i]:=0;
JB[i]:=0;
END_IF;
N[i]:=IN_BOOL[i];
;
END_FOR;
END_FUNCTION_BLOCK
让学习成为一种习惯