FB和FC有什么区别.docx

上传人:牧羊曲112 文档编号:3157032 上传时间:2023-03-11 格式:DOCX 页数:9 大小:40.98KB
返回 下载 相关 举报
FB和FC有什么区别.docx_第1页
第1页 / 共9页
FB和FC有什么区别.docx_第2页
第2页 / 共9页
FB和FC有什么区别.docx_第3页
第3页 / 共9页
FB和FC有什么区别.docx_第4页
第4页 / 共9页
FB和FC有什么区别.docx_第5页
第5页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《FB和FC有什么区别.docx》由会员分享,可在线阅读,更多相关《FB和FC有什么区别.docx(9页珍藏版)》请在三一办公上搜索。

1、FB和FC有什么区别用西门子PLC编程时,可以用到功能块FB和功能FC资料上说FB与FC都可以作为用户编写的子程序,但是我不明白这两个组织块之间到底有什么区别阿?在应用上到底有什么不同之处吗? FB-功能块,带背景数据块 FC-功能,相当于函数 他们之间的主要区别是:FC使用的是共享数据块,FB使用的是背景数据块 举个例子,如果您要对3个参数相同的电机进行控制,那么只需要使用FB编程外加3个背景数据块就可以了,但是,如果您使用FC,那么您需要不断的修改共享数据块,否则会导致数据丢失。FB确保了3个电机的参数互不干扰。 FB,FC本质都是一样的,都相当于子程序,可以被其他程序调用。他们的最大区别

2、是,FB与DB配合使用,DB中保存着FB使用的数据,即使FB退出后也会一直保留。FC就没有一个永久的数据块来存放数据,只在运行期间会被分配一个临时的数据区。在实际编程中,是使用FB还是FC,要看实际的需要决定。FB的好处楼上以讲得很好了。 FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数据块,被多个对象调用。 FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。 S7-300plc中的FB和FC的分别?FB带有自己的背景D

3、B而FC没有自己的背景DB, 用FC 和FB 有什么分别呢,他们都能实现控制功能,到底该用FB还是该用FC,什么时候用FB什么时候用FC? FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数据块,被多个对象调用。 FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。 每次调用FC的I/O区域必须要自己每次手动输入,而FB就不要,省去不少麻烦,如果在上位机控制直接输入DB控制地址就可!. 我简单的说说FB和FC的区别,FB是具

4、有存储功能的,FC没有存储功能,这是一般的理解;FB需要背景数据块,而FC是没有的;参数的传递方式不同,FB的输入输出对应着背景数据块地址,而FC的输入输出是没有实际地址对应的,只有的程序调用时,才会和实际的地址产生对应关系。FB参数传递的是数据,FC参数传递的是数据的地址。 FB的处理方式是围绕着数据块处理数据,他的入口参数和出口参数都是数据块里的数据,以及STAT的数据都是数据块里,入口参数和出口参数、STAT可以认为是静态数据,这些数据不会因为函数消失而逝去,他会一直保存在数据块里。FB里的变量与他的背景数据块是一一对应的,而他的对应并不是一层不变的。更确切的说,FB里的变量在调用时将根

5、据AR2的值当作偏移量与背景数据块是一一对应。如果一个FB功能块里没有入口参数、出口参数及STAT数据,他将不需要背景数据块,这时的FB和没有入口出口参数的FC就没有什么区别了,就只能使用临时变量和全局变量了。 用很多人认为,FB的背景数据块必须由FB生成、FB里的第一个变量对应着背景数据块的第一个变量,还有就是由FB生成的数据块只能作为FB的背景数据块使用。其实这些理解是错误的,FB的背景数据块不一定是通过FB生成的,可以像生成共享数据块一样生成FB的背景数据块,换句话说,普通的数据块也可以作为FB的背景数据块,不过这种做法是有一定前提的,就是这个数据块的字节数必须大于等于FB所需的字节数,

6、如果小于FB所需的字节数时,FB访问到超出背景数据块的变量时就会找不到变量的地址,肯定会出错了。FB里的第一个变量对应可以对应数据块字节数减去FB所需背景数据块字节数里的任意位置的变量,我觉得这个比较好理解,在多重背景里不就是这样吗。谈到这里我得说点别的,好像这种情况下,FB里不可以有多重背景,在S7里,多重背景好像是不允许嵌套的,说道这里我马上在S7做了测试,证明我的想法是错误的,多重背景是可以嵌套的。话回正题,由FB生成的数据块也是可以像访问普通数据块一样通过共享数据块方式访问,不信,你可以自己试一试。说说如何使用普通的数据块作为FB的背景数据块,会不会有人现在就开始自己试了,怎么不行呢,

7、一调用程序就程序红色,有错误啊。告诉你,使用CALL指令编写时SETP7会自动检查DB块和FB的关系,要是时间标记和大小不一致就会报错。在这里我们可以使用UC指令调用FB,UC指令是不传递参数的,那么我们如何将参数传递给FB呢?又如何将FB的输出读出来呢? 我在前面说过,背景数据块是可以像访问普通数据块一样使用共享数据块访问,这就解决了我们参数传递的问题。下面我给出一个例子大家看看: 使用UC调用FB L PIW 290 T tDIPd.PV_PER /tDIPd是TCONT_CP的背景数据块,我们在这里使用共享数据块方式对数据块写入数据 L MD 4 T DBD 34 A M 8.0 A D

8、BX 42.0 A M 8.1 = DBX 42.1 /以上的是参数输入部分 LAR2 P#0.0 /该语句指名了FB和背景数据块的对应关系,就是FB的第一个参数对应背景数据的地址 CDB /交换共享数据块和背景数据块,将当前的共享数据块变为背景数据块 UC TCONT_CP /使用UC调用FB,FB的背景数据块就是上面打开的数据块即tDIPd CDB /交换共享数据块和背景数据块,将当前的背景数据块变为共享数据块 /以下是参数输出部分 A DBX 42.0 = M 8.0 A DBX 42.1 = M 8.1 L DBW 22 T PQW 306 L DBD 34 T MD 4 /从上面我们

9、可以看出DBX42.0、DBX42.1和DBD34是输入输出行数据 下面这段程序是使用传统的方法CALL调用FB CALL TCONT_CP , tDIPd PV_IN := PV_PER :=PIW290 DISV := INT_HPOS:= INT_HNEG:= SELECT := PV := LMN := LMN_PER :=PQW306 QPULSE := QLMN_HLM:= QLMN_LLM:= QC_ACT := CYCLE := CYCLE_P := SP_INT :=MD4 MAN := COM_RST :=M8.0 MAN_ON :=M8.1 上面这两段程序的执行效果是一样

10、的,但是他们的写法和思路是完全不一样的,使用UC调用时,FB的输入输出参数的附值很自由,可以在程序的任何地方书写,没有条条框框的限制,而CALL就不同了,他给出了书写参数的位置。当然使用CALL时也可以使用共享数据块方式传递参数,但是这样就乱了,也没有这个必要。从中我们可以得到一个结论,FB的数据参数传递是通过数据块来传递的,而且数据块是静态的,所以我们给FB传递参数时,可以在任何地方都可以给FB传递参数。UC和CALL的区别还有,UC可以通过AR2修改FB参数与背景数据块的对应关系。而CALL指令是不行的。通过改变AR2的值使得对应关系产生偏移。 FC,他是没有存储能力的,这是一般的说法,给

11、定入口参数,执行完了,从出口参数读出数据,FC的功能就消失,就像C语言里的函数。如果在FC里使用全局数据,那就会是另外一种效果。 上面说过,FC里的参数是没有实际地址的,使形式参数,只有在调用时才会把实际参数的地址传递到FC的参数里。 下面,我使用一个例子可以证明FC的参数传递的不是数据,而是地址, 建立一个FC如下: FC_DEMO : WORD TITLE = VERSION : 0.1 VAR_INPUT IN0 : WORD ; END_VAR VAR_OUTPUT OUT1 : BYTE ; END_VAR BEGIN NETWORK TITLE = L P#IN0; LAR1 ;

12、L P#OUT1; LAR1 ; L P#RET_VAL; LAR1 ; END_ 在OB1里调用该FC CALL FC_DEMO IN0 :=DBW0 RET_VAL:=LW20 OUT1 :=MB0 把程序下载到PLC里,监视FC_DEMO里的程序,打开AR1的监视 第2行里的AR1值是 DBX 0.0 第4行里的AR1值是 M 0.0 第6行里的AR1值是 V 20.0 注:V 指的是VL区的地址,既是先前的局部变量,也就是说先前未完成块的局部变量,在本段程序里指的就是调用FC_DEMO的OB1的局部变量 从这个程序我们可以看出,IN0的地址是DBW0 ,OUT1 的地址是MB0 ,RE

13、T_VAL 的地址是VLB20 。由此我们可以看出,在OB1调用FC_DEMO时并没有把实际参数的数据传递给FC_DEMO的参数里,而是把地址传递过去了。这时,在FC_DEMO里IN0的实际地址就是DBW0 , OUT1的实际地址就是MB0 , RET_VAL 的实际地址就是VLB20 .一般的,程序调用FC时,参数的传递就是传递变量的地址。但是还是有特殊情况的,在有传递的参数是立即数、指针Pointer和指针ANY时,情况就大不一样,还有就是将指定数据块编号的数据,在这种情况下,会将数据先传给一个局部变量,然后再把该局部变量的地址传递给FC的参数里. 从这个例子我们可以看出FC的参数实际就是

14、一个指针,我们在调用FC时就给FC的这些指针附值,而这些指针又是隐含着的,姑且我们可以这样理解. 说了那么多,我就说说如何利用UC指令调用FC,UC指令调用FC与调用FB有本质的区别,FB的输入输出参数有实际地址,只要在调用前打开FB的背景数据块就可以了,而FC则不同,FC的输入输出参数没有实际地址,上面说了,他只是一个指针,我们必须初始化这些指针才行,那么我们如何初始化他呢,因为我们根本就不知道这些指针的地址在那里.所以我们不能使用UC直接调用FC,那样就不知道FC执行会影响那些数据,这样,我们的另寻方法了。 上面我们说过,UC指令是不能传递参数的,但是并不代表UC指令不能传递地址(SETP

15、7手册没有关于这方面的文档资料),在实际中发现UC调用FC时可以传递地址,语句的格式是: UC FCxaddr1,addr2,.,addrn; 这种使用方法只能在STL文本状态下使用,在非文本模式下无法书写,但是可以显示,在非文本下显示的格式是: UC FCx addr1 addr2 . . . addrn 有了UC调用FC的传递地址格式,我们还要知道地址和我们FC的参数对应方法: 输入参数 - 返回参数 - 输出参数 - 输入输出参数 . 有了上面的方法,我们可以使用UC来调用带参数的FC了,我们还是以上面的程序为例,在OB1中使用UC调用FC_DEMO , . /其他程序代码 UC FC_

16、DEMO P#DBX 0.0,P#L 20.0,P#M 0.0; . /其他程序代码 编译后,在非文本模式下看OB1的代码, . /其他程序代码 UC FC_DEMO P#DBX 0.0 P#L 20.0 P#M 0.0 . /其他程序代码 我们把程序下载到PLC去执行,他的效果和使用CALL指令的效果是一样的。 从上面的分析,我说说使用CALL指令时,FB和FC的区别。在使用CALL指令调用FB时,我们可以不给FB的参数附值,这很显然,FB的参数是有实际地址的,他的地址就是背景数据块的地址。FB在运行时就会根据背景数据块进行计算了。而FC不行,他的参数没有实际地址,只有在调用时给他附值,要不然程序就不知道如何执行了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号