回复:急问,定时器不够用怎么办?

虚心+学习

  • 帖子

    110
  • 精华

    6
  • 被关注

    3

论坛等级:游侠

注册时间:2003-11-05

普通 普通 如何晋级?

发布于 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


让学习成为一种习惯
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54755条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。