找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9102|回复: 20

实例讲解PLC程序FB块和FC块的区别和使用方法

 火.. [复制链接]
  • 打卡等级:常驻代表
  • 打卡总天数:34
  • 打卡月天数:6
  • 打卡总奖励:9027
  • 最近打卡:2025-12-17 23:15:51

2823

主题

541

回帖

2万

积分

管理员

积分
22569
发表于 2019-3-10 19:41:04 | 显示全部楼层 |阅读模式
简单的说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的数据都是数据块里的,入口参数和出口参数,这些数据不会因为函数消失而消失,它会一直保持在数据块里。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
工控课堂 www.gkket.com
  • 打卡等级:常驻代表
  • 打卡总天数:34
  • 打卡月天数:6
  • 打卡总奖励:9027
  • 最近打卡:2025-12-17 23:15:51

2823

主题

541

回帖

2万

积分

管理员

积分
22569
 楼主| 发表于 2019-3-10 19:42:48 | 显示全部楼层
我只是路过打酱油的。
工控课堂 www.gkket.com

0

主题

172

回帖

537

积分

中级会员

积分
537
发表于 2019-3-10 19:44:20 | 显示全部楼层
在遇到你之前我对人世间是否有技术大佬保有怀疑,现在我是彻底被你征服了
工控课堂 www.gkket.com

0

主题

154

回帖

471

积分

注册会员

积分
471
发表于 2019-3-10 19:48:53 | 显示全部楼层
看了楼主的帖子,不由得精神一振,豁然开朗,牛掰
工控课堂 www.gkket.com

0

主题

101

回帖

318

积分

注册会员

积分
318
发表于 2019-3-10 19:56:57 | 显示全部楼层
老师四个微信公众号都可以关注吗?是否有免费资料下载!
工控课堂 www.gkket.com

0

主题

140

回帖

436

积分

注册会员

积分
436
发表于 2019-3-10 20:15:43 | 显示全部楼层
我只是路过打酱油的。
工控课堂 www.gkket.com

1

主题

398

回帖

2167

积分

高级会员

积分
2167
发表于 2019-3-10 23:04:44 | 显示全部楼层
感谢{author}无私分享!
工控课堂 www.gkket.com

0

主题

422

回帖

2642

积分

高级会员

积分
2642
发表于 2019-4-15 09:57:34 | 显示全部楼层
党的好公民,人民的好公仆。。。
工控课堂 www.gkket.com

0

主题

110

回帖

383

积分

注册会员

积分
383
发表于 2019-5-16 23:55:53 | 显示全部楼层
无私奉献,好工控人,32个赞送给你!!
工控课堂 www.gkket.com

0

主题

114

回帖

439

积分

注册会员

积分
439
发表于 2019-5-31 09:57:41 | 显示全部楼层
强烈支持楼主ing……
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 02:34 , Processed in 0.163302 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表