实验目的:加深对FB的调用机制的理解
实验内容:以SFB4为例,使用共享数据块DB1为SFB4提供背景数据实现输入输出参数的传递,在DB1里定义SFB4的接口参数数据类型结构和SFB4的背景数据块完全一致,如果要多次调用可以新建一个自定义类型UDT1,在DB1里直接使用UDT1,用UC无条件调用SFB4。
A I 0.0 //SFB4的使能EN
JNB _001 //不使能则跳过
OPN DI 1 //打开数据块
LAR2 P#DBX0.0 //背景数据指向定义的区域,这里定义在DB1开始的22个字节
A I 0.1
= DIX [AR2,P#0.0] //SFB4的输入IN,也就是定时器的启停
L T#15S
T DID [AR2,P#2.0] //SFB4的输入PT,也就是定时时间
UC SFB4 //无条件调用SFB4
A DIX [AR2,P#6.0] //SFB4的输出Q,也就是定时器位
= Q 0.0
L DID [AR2,P#8.0] //SFB4的输出ET,也就是实时时间输出
T MD 0
_001: NOP 0
实验结果:通过在PLCSIM里测试,实际调用和CALL SFB4,DB1效果等同,FB的调用自动使用了DINO数据块寄存器和AR2地址寄存器用于接口参数的定位,这种方法调用可以使用共享数据块,多次调用等同于FB里的多重背景,在OB、FC里都可以使用,缺点是接口参数都要用指针的方式寻址,不太直观。
——————————————————————————————————
2011-06-20补充:
使用CALL调用FB或SFB,调用后DBNO会变成对应的背景数据块号,DINO和AR2则保持调用前的,使用UC调用FB则和调用FC一样,DBNO和DINO保持调用前的,AR1和AR2则根据改变而变。