发布于 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]
这是咋回事呢?