|
简单的说FB是具有存储功能的,FC没有存储功能,这是一般的理解:FB需要背景数据块,而FC是没有的;参数的传递方式不同,FB的输入输出对应背景DB地址,而FC的输入输出没有实际地址对应的,只有程序调用时,才会和实际的地址产生关系。FB参数传递的是数据,FC参数传递的是数据的地址。
FB功能块的处理方式是围绕着数据块处理数据,它的输入输出参数都是数据块里的数据,以及STAT的数据都是数据块里的,入口参数和出口参数,这些数据不会因为函数消失而消失,它会一直保持在数据块里。FB里的变量与它的背景数据块是一一对应的,而它的对应并不是一层不变的,更确切的说,FB里的变量在调用时将根据AR2的值当作偏移量与背景数据块是一一对应的。
如果一个FB功能块没有入口参数、出口参数及STAT数据,它将不需要背景数据块,这时的FB块和没有出、入口参数的FC就没什么区别了,也就只能使用临时变量和全局变量,当然这时的FB块是没有实际作用了。
有人会认为,FB的背景数据块必须由FB生成、FB的第一个变量对应背景数据块的第一个变量,还有就是由FB块生成的数据块只能作FB的背景数据块使用。其实这些理解都是错误的,FB的背景数据块不一定是通过FB生成的,可以像生成共享数据块一样生成FB的背景数据块,换句话说,普通的数据块也可以作为FB的背景数据块使用,只是这种做发是有前提的:就是这个数据块的字节数必须大于或等于FB所需的字节数,如果小于FB所需的字节数,FB访问到超出背景数据块的变量时就会找不到变量的地址,当然也就出错了。
FC功能块里的参数没有实际的地址,都是使形参数,只有在调用时才会把实际的参数地址传送到FC的参数里。FC是没有存储能力的,这是一班的说法,给定入口参数,执行完了,从出口参数读出数据,FC的功能就消失。如果在FC里使用全局变量,也可以达到FB块一样的效果,但是这样的FC块是没有可移植性的。下面,实际工程,编写的FC与FB块
实例1:FC块(这是一个用于西门子PLC向直流装置6RA70写过程数据的FC块)
A( L #in0 L #in1 >R ) JNB _001 L #in1 T #temp0 _001: NOP 0 A( L #in0 L #in2
) JNB _002 L #in2 T #temp0 _002: NOP 0 L #in0 L #in1 <=R = #temp5 L #in0 L #in2 >=R = #temp5 A #temp5 A #temp5 JNB _003 L #in0 T #temp0 _003: NOP 0 L #in0 L 0.000000e+000
= #out1 L #temp0 ABS T #temp1 NOP 0 A( L #temp1 L 1.638400e+004 *R T #temp2 AN OV SAVE CLR A BR ) JNB _004 L #temp2 L #in1 /R T #temp3 _004: NOP 0 A( L #temp3 RND T #TEMP4 AN OV SAVE CLR A BR ) JNB _005 L #TEMP4 T #out0 _005: NOP 0
在FC块中调用FC
CALL FC 30 in0 :=DB3.DBD2090 in1 :=6.000000e+002 in2 :=0.000000e+000 out0:=PQW590 out1:=M203.3 NOP 0 从这个程序可以看出,IN0的地址是DB3.DBD2090,OUT0的地址是PQW590。由此可以看出,在FC块中调用FC30市并没有把有实际参数的数据传递给FC30的参数里,而是把地址传递过去了。这时,在FC30里IN0的实际地址就是DB3.DBD2090,OUT0的的实际地址就是PQW590,也就是说程序调用FC时参数的传送就是传送变量的地址。
但是还有特殊的情况,在有传递的参数是立即数和指针时,情况就不一样了,在这种情况下,会将数据先给一个局部变量,然后再把该局部变量的地址传给FC的参数里。从这个例子我们可以看出FC的参数实际就是一个指针,我们在调用FC时就给FC的这些指针附值,而这写指针又是隐含着的。
实例2:FB块(这是一个用于西门子PLC向ABB变频器写控制字的FB块) A( O #in0 O #out1 ) AN #out4 = L 0.0 A L 0.0 BLD 102 = #out1 A L 0.0 AN #out2 AN #out3 JNB _001 L #in5 T #out0 _001: NOP 0 A( O #in1 O #out2 ) A #in4 AN #out3 AN #out4 = L 0.0 A L 0.0 BLD 102 = #out2 A L 0.0 JNB _002 L #in6 T #out0 _002: NOP 0 A( O #in2 O #out3 ) AN #in1 AN #out4 = L 0.0 A L 0.0 BLD 102 = #out3 A L 0.0 JNB _003 L #in7 T #out0 _003: NOP 0 A( O #in3 O #out4 ) AN #in0 = L 0.0 A L 0.0 BLD 102 = #out4 A L 0.0 JNB _004 L #in8 T #out0 _004: NOP 0 在FC块中调用FB
A #TEMP20 = L 46.0 BLD 103 A #TEMP21 = L 46.1 BLD 103 A #TEMP22 = L 46.2 BLD 103 A #TEMP23 = L 46.3 BLD 103 A DB1.DBX 6.0 = L 46.4 BLD 103 CALL FB 1 , DB10 in0 :=L46.0 in1 :=L46.1 in2 :=L46.2 in3 :=L46.3 in4 :=L46.4 in5 :=W#1简单的说FB是具有存储功能的,FC没有存储功能,这是一般的理解:FB需要背景数据块,而FC是没有的;参数的传递方式不同,FB的输入输出对应背景DB地址,而FC的输入输出没有实际地址对应的,只有程序调用时,才会和实际的地址产生关系。FB参数传递的是数据,FC参数传递的是数据的地址。
FB功能块的处理方式是围绕着数据块处理数据,它的输入输出参数都是数据块里的数据,以及STAT的数据都是数据块里的,入口参数和出口参数,这些数据不会因为函数消失而消失,它会一直保持在数据块里。FB里的变量与它的背景数据块是一一对应的,而它的对应并不是一层不变的,更确切的说,FB里的变量在调用时将根据AR2的值当作偏移量与背景数据块是一一对应的。
如果一个FB功能块没有入口参数、出口参数及STAT数据,它将不需要背景数据块,这时的FB块和没有出、入口参数的FC就没什么区别了,也就只能使用临时变量和全局变量,当然这时的FB块是没有实际作用了。
有人会认为,FB的背景数据块必须由FB生成、FB的第一个变量对应背景数据块的第一个变量,还有就是由FB块生成的数据块只能作FB的背景数据块使用。其实这些理解都是错误的,FB的背景数据块不一定是通过FB生成的,可以像生成共享数据块一样生成FB的背景数据块,换句话说,普通的数据块也可以作为FB的背景数据块使用,只是这种做发是有前提的:就是这个数据块的字节数必须大于或等于FB所需的字节数,如果小于FB所需的字节数,FB访问到超出背景数据块的变量时就会找不到变量的地址,当然也就出错了。
FC功能块里的参数没有实际的地址,都是使形参数,只有在调用时才会把实际的参数地址传送到FC的参数里。FC是没有存储能力的,这是一班的说法,给定入口参数,执行完了,从出口参数读出数据,FC的功能就消失。如果在FC里使用全局变量,也可以达到FB块一样的效果,但是这样的FC块是没有可移植性的。下面,实际工程,编写的FC与FB块
实例1:FC块(这是一个用于西门子PLC向直流装置6RA70写过程数据的FC块)
A( L #in0 L #in1 >R ) JNB _001 L #in1 T #temp0 _001: NOP 0 A( L #in0 L #in2
) JNB _002 L #in2 T #temp0 _002: NOP 0 L #in0 L #in1 <=R = #temp5 L #in0 L #in2 >=R = #temp5 A #temp5 A #temp5 JNB _003 L #in0 T #temp0 _003: NOP 0 L #in0 L 0.000000e+000
= #out1 L #temp0 ABS T #temp1 NOP 0 A( L #temp1 L 1.638400e+004 *R T #temp2 AN OV SAVE CLR A BR ) JNB _004 L #temp2 L #in1 /R T #temp3 _004: NOP 0 A( L #temp3 RND T #TEMP4 AN OV SAVE CLR A BR ) JNB _005 L #TEMP4 T #out0 _005: NOP 0
在FC块中调用FC
CALL FC 30 in0 :=DB3.DBD2090 in1 :=6.000000e+002 in2 :=0.000000e+000 out0:=PQW590 out1:=M203.3 NOP 0 从这个程序可以看出,IN0的地址是DB3.DBD2090,OUT0的地址是PQW590。由此可以看出,在FC块中调用FC30市并没有把有实际参数的数据传递给FC30的参数里,而是把地址传递过去了。这时,在FC30里IN0的实际地址就是DB3.DBD2090,OUT0的的实际地址就是PQW590,也就是说程序调用FC时参数的传送就是传送变量的地址。
但是还有特殊的情况,在有传递的参数是立即数和指针时,情况就不一样了,在这种情况下,会将数据先给一个局部变量,然后再把该局部变量的地址传给FC的参数里。从这个例子我们可以看出FC的参数实际就是一个指针,我们在调用FC时就给FC的这些指针附值,而这写指针又是隐含着的。
实例2:FB块(这是一个用于西门子PLC向ABB变频器写控制字的FB块) A( O #in0 O #out1 ) AN #out4 = L 0.0 A L 0.0 BLD 102 = #out1 A L 0.0 AN #out2 AN #out3 JNB _001 L #in5 T #out0 _001: NOP 0 A( O #in1 O #out2 ) A #in4 AN #out3 AN #out4 = L 0.0 A L 0.0 BLD 102 = #out2 A L 0.0 JNB _002 L #in6 T #out0 _002: NOP 0 A( O #in2 O #out3 ) AN #in1 AN #out4 = L 0.0 A L 0.0 BLD 102 = #out3 A L 0.0 JNB _003 L #in7 T #out0 _003: NOP 0 A( O #in3 O #out4 ) AN #in0 = L 0.0 A L 0.0 BLD 102 = #out4 A L 0.0 JNB _004 L #in8 T #out0 _004: NOP 0 在FC块中调用FB
A #TEMP20 = L 46.0 BLD 103 A #TEMP21 = L 46.1 BLD 103 A #TEMP22 = L 46.2 BLD 103 A #TEMP23 = L 46.3 BLD 103 A DB1.DBX 6.0 = L 46.4 BLD 103 CALL FB 1 , DB10 in0 :=L46.0 in1 :=L46.1 in2 :=L46.2 in3 :=L46.3 in4 :=L46.4 in5 :=W#16#1477 in6 :=W#16# 147F in7 :=W#16#1477 in8 :=W#16#1476 out0:=PQW280 out1:=DB1.DBX1500.1 out2:=DB1.DBX1500.3 out3:=DB1.DBX1500.5 out4:=DB1.DBX1500.7 NOP 0 从这个程序我们可以看出,入口参数和出口参数传递的是实时的数据而不是地址。如图所示: 由此可以看出,FB功能块的处理方式是围绕着数据块处理数据,它的输入输出参数都是数据块里的数据,以及STAT的数据都是数据块里的,入口参数和出口参数,这些数据不会因为函数消失而消失,它会一直保持在数据块里。6#1477 in6 :=W#16# 147F in7 :=W#16#1477 in8 :=W#16#1476 out0:=PQW280 out1:=DB1.DBX1500.1 out2:=DB1.DBX1500.3 out3:=DB1.DBX1500.5 out4:=DB1.DBX1500.7 NOP 0 从这个程序我们可以看出,入口参数和出口参数传递的是实时的数据而不是地址。如图所示: 由此可以看出,FB功能块的处理方式是围绕着数据块处理数据,它的输入输出参数都是数据块里的数据,以及STAT的数据都是数据块里的,入口参数和出口参数,这些数据不会因为函数消失而消失,它会一直保持在数据块里。
|