发表于:2026/7/11 6:28:35
#0楼
正常是TONR放在CASE外面,当然也是最合理的,但是,如果CASE太长,TONR太多,看起来也乱也不方便管理,所有考虑放到CASE里面,这样也有好处,不用的TONR不用每个周期都去判断一次。
直接上代码。<关键点:当TONR.Q=1的时候,断开TONR.IN,TONR本身还要扫描一遍,这样它自身各种状态就会复位,TONR.R一般我是没用。>
//B0启动,两个定时器2000MS来回跳转
CASE vi_step OF
0://启动,
if b0 THEN
vi_step:=10;
END_IF;
10://进入step10,定时器IN=1,
//TONR.IN=1,开始工作,
//当TONR.Q=1的时候,TONR.IN=0,+STEP跳转,
//*关键,TONR需要再次扫描一遍,它就恢复初始状态。
vb_t[0,0]:=TRUE;
if vb_t[1,0] THEN
vb_t[0,0]:=FALSE;
vi_step:=20;
end_if;
TONR(IN := vb_t[0,0],PT := 2000,R := ,Q =>vb_t[1,0] ,ET => vd_Et[0]);
20:
vb_t[0,1]:=TRUE;
if vb_t[1,1] THEN
vb_t[0,1]:=FALSE;
vi_step:=10;
end_if;
TONR(IN := vb_t[0,1],PT := 2000,R := ,Q =>vb_t[1,1] ,ET => vd_Et[1]);
END_CASE;
以上,如果自己写FB TON,应该也需要一样的时序,TON如果需要在当前STEP复位,需要多扫描一次。
当然,也可以优化一下,TONR.IN:= vi_step=当前步,这样也可以的,节约变量,代码长度
GIF 效果:
直接上代码。<关键点:当TONR.Q=1的时候,断开TONR.IN,TONR本身还要扫描一遍,这样它自身各种状态就会复位,TONR.R一般我是没用。>
//B0启动,两个定时器2000MS来回跳转
CASE vi_step OF
0://启动,
if b0 THEN
vi_step:=10;
END_IF;
10://进入step10,定时器IN=1,
//TONR.IN=1,开始工作,
//当TONR.Q=1的时候,TONR.IN=0,+STEP跳转,
//*关键,TONR需要再次扫描一遍,它就恢复初始状态。
vb_t[0,0]:=TRUE;
if vb_t[1,0] THEN
vb_t[0,0]:=FALSE;
vi_step:=20;
end_if;
TONR(IN := vb_t[0,0],PT := 2000,R := ,Q =>vb_t[1,0] ,ET => vd_Et[0]);
20:
vb_t[0,1]:=TRUE;
if vb_t[1,1] THEN
vb_t[0,1]:=FALSE;
vi_step:=10;
end_if;
TONR(IN := vb_t[0,1],PT := 2000,R := ,Q =>vb_t[1,1] ,ET => vd_Et[1]);
END_CASE;
以上,如果自己写FB TON,应该也需要一样的时序,TON如果需要在当前STEP复位,需要多扫描一次。
当然,也可以优化一下,TONR.IN:= vi_step=当前步,这样也可以的,节约变量,代码长度
GIF 效果:
[此贴子已经被作者于2026/7/11 6:39:28编辑过]






