回复:请教关于带参数调用的FB功能块问题

萧⑨郎

  • 帖子

    216
  • 精华

    0
  • 被关注

    5

论坛等级:游侠

注册时间:2011-02-19

普通 普通 如何晋级?

发布于 2012-11-28 22:39:59

1楼

[COLOR=blue]问题1:由于没办法贴图,就只有文字叙述了。用例子来说明:建个FB块,比如FB1,声明输入变量In_Word(WORD类型),输出变量out1,out2,out3(都为BOOL类型),静态变量Stat_Word(WORD类型)。比如我现在想取出静态变量Stat_Word的最低三个位的状态,分别通过out1,out2,out3来显示。
程序:FB1
L #IN_Word
T #Stat_Word
A DIX [AR2,P#5.0]
= #Out1
A DIX [AR2,P#5.1]
= #Out2
A DIX [AR2,P#5.2]
= #Out3
然后在OB1中调用FB1,下载,监控。
给IN_Word赋值W#16#1(则Stat_Word值为W#16#1,最低三位为001),则out1为1,out2为0,out3为0;
给IN_Word赋值W#16#2(则Stat_Word值为W#16#2,最低三位为010),则out1为0,out2为1,out3为0;
给IN_Word赋值W#16#4(则Stat_Word值为W#16#4,最低三位为100),则out1为0,out2为0,out3为1。

这种方法依据的就是在FB中,DI寄存器存放的是该FB的背景数据块,AR2寄存器存放的是改FB背景数据块的起始指针。而静态变量的值存放在背景数据块中,找到了数据块,有了指针,也知道了静态变量的地址(变量声明后面),当然就可以随心所欲的取想要的位的状态。

另,当然上述程序也可以不要AR2:
L #IN_Word
T #Stat_Word
A DIX 5.0
= #Out1
A DIX 5.1
= #Out2
A DIX 5.2
= #Out3

问题2:在重复调用的FB中不能直接使用Txx定时器,需要使用定时器的时候可以使用IEC定时器(比如延时导通定时器SFB4,使用方法是建个数据类型为SFB4的静态变量即可),也可以建个数据类型为Timer的输入变量,然后在FB外填入定时器编号。个人建议使用后面这种方法,因为使用IEC定时器虽然可以解决多次调用的FB中使用定时器问题,但是同时也导致了程序体积的增加。尤其当该FB中使用多个定时器,且该FB调用很多次的时候,这时程序体积的增加就很明显了。当然,这是在Timer数量足够的情况下。[/COLOR]
这是咋回事呢?
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54709条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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