[2017年整理]功能块和功能的区别

上传人:豆浆 文档编号:913010 上传时间:2017-05-21 格式:DOCX 页数:14 大小:20.54KB
返回 下载 相关 举报
[2017年整理]功能块和功能的区别_第1页
第1页 / 共14页
[2017年整理]功能块和功能的区别_第2页
第2页 / 共14页
[2017年整理]功能块和功能的区别_第3页
第3页 / 共14页
[2017年整理]功能块和功能的区别_第4页
第4页 / 共14页
[2017年整理]功能块和功能的区别_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《[2017年整理]功能块和功能的区别》由会员分享,可在线阅读,更多相关《[2017年整理]功能块和功能的区别(14页珍藏版)》请在金锄头文库上搜索。

1、功能: Function , 简称 FC功能块: Function Block , 简称 FBFB 和 FC 根本的区别是:FB 支持静态变量,而 FC 只支持临时变量。静态变量:是调用 FB 返回时,仍然要为 FB 保留此变量区,因此不会改变这一区域的数据值。临时变量却没有这样的特* 。所以在 FC 中如果在对临时数据变量处写入确定的数据前,就去读时就可能产生不可预见的结果,而对于静态变量却不会,因为它会保留你上次写入的结果。另外,楼下的某位大侠的回答也很详细,你可以看看“我简单的说说 FB 和 FC 的区别,FB 是具有存储功能的,FC 没有存储功能,这是一般的理解;FB 需要背景数据块,

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

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

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

5、,会不会有人现在就开始自己试了,怎么不行呢,一调用程序就程序红色,有错误啊。告诉你,使用 CALL 指令编写时 SETP7会自动检查 DB 块和 FB 的关系,要是时间标记和大小不一致就会报错。在这里我们可以使用 UC 指令调用FB,UC 指令是不传递参数的(对于这个说法,我不太认同,我将会在使用 UC 调用 FC 时是如何传递参数一节讲述),那么我们如何将参数传递给 FB 呢?又如何将 FB的输出读出来呢?我在前面说过,背景数据块是可以像访问普通数据块一样使用共享数据块访问,这就解决了我们参数传递的问题。下面我给出一个例子大家看看:使用 UC 调用 FBL PIW 290T tDIPd.PV

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

7、2.0= M 8.0A DBX 42.1= M 8.1L DBW 22T PQW 306L DBD 34T MD 4/从上面我们可以看出 DBX42.0、DBX42.1 和 DBD34 是输入输出行数据下面这段程序是使用传统的方法 CALL 调用 FBCALL TCONT_CP , tDIPdPV_IN :=PV_PER :=PIW290DISV :=INT_HPOS:=INT_HNEG:=SELECT :=PV :=LMN :=LMN_PER :=PQW306QPULSE :=QLMN_HLM:=QLMN_LLM:=QC_ACT :=CYCLE :=CYCLE_P :=SP_INT :=MD

8、4MAN :=COM_RST :=M8.0MAN_ON :=M8.1上面这两段程序的执行效果是一样的,但是他们的写法和思路是完全不一样的,使用 UC 调用时, FB 的输入输出参数的附值很自由,可以在程序的任何地方书写,没有条条框框的限制,而 CALL 就不同了,他给出了书写参数的位置。当然使用 CALL 时也可以使用共享数据块方式传递参数,但是这样就乱了,也没有这个必要。从中我们可以得到一个结论,FB 的数据参数传递是通过数据块来传递的,而且数据块是静态的,所以我们给 FB 传递参数时,可以在任何地方都可以给 FB 传递参数。UC 和 CALL 的区别还有,UC 可以通过 AR2 修改 FB

9、 参数与背景数据块的对应关系。而 CALL 指令是不行的。通过改变 AR2 的值使得对应关系产生偏移。FC(功能),他是没有存储能力的,这是一般的说法,给定入口参数,执行完了,从出口参数读出数据,FC 的功能就消失,就像 C 语言里的函数。如果在 FC 里使用全局数据(M 区数据,数据块数据),那就会是另外一种效果。上面说过,FC 里的参数是没有实际地址的,使形式参数,只有在调用时才会把实际参数的地址传递到 FC 的参数里。下面,我使用一个例子可以证明 FC 的参数传递的不是数据,而是地址,建立一个 FC 如下:FC_DEMO : WORDTITLE =VERSION : 0.1VAR_INP

10、UTIN0 : WORD ; END_VARVAR_OUTPUTOUT1 : BYTE ; END_VARBEGINNETWORKTITLE =L P#IN0; LAR1 ; L P#OUT1; LAR1 ; L P#RET_VAL; LAR1 ; END_在 OB1 里调用该 FCCALL FC_DEMOIN0 :=DBW0RET_VAL:=LW20OUT1 :=MB0把程序下载到 PLC 里,监视 FC_DEMO 里的程序,打开AR1 的监视第 2 行里的 AR1 值是 DBX 0.0第 4 行里的 AR1 值是 M 0.0第 6 行里的 AR1 值是 V 20.0注:V 指的是 VL 区

11、的地址,既是先前的局部变量,也就是说先前未完成块的局部变量,在本段程序里指的就是调用FC_DEMO的 OB1 的局部变量从这个程序我们可以看出,IN0 的地址是 DBW0 ,OUT1的地址是 MB0 ,RET_VAL 的地址是 VLB20 。由此我们可以看出,在 OB1 调用FC_DEMO时并没有把实际参数的数据传递给FC_DEMO的参数里,而是把地址传递过去了。这时,在FC_DEMO里 IN0 的实际地址就是DBW0 , OUT1 的实际地址就是 MB0 , RET_VAL 的实际地址就是 VLB20 .一般的,程序调用 FC 时,参数的传递就是传递变量的地址。但是还是有特殊情况的,在有传递

12、的参数是立即数、指针 Pointer 和指针 ANY 时,情况就大不一样,还有就是将指定数据块编号的数据, 在这种情况下,会将数据先传给一个局部变量, 然后再把该局部变量的地址传递给 FC 的参数里.从这个例子我们可以看出 FC 的参数实际就是一个指针,我们在调用 FC 时就给 FC 的这些指针附值, 而这些指针又是隐含着的,姑且我们可以这样理解 .说了那么多,我就说说如何利用 UC 指令调用 FC,UC 指令调用 FC 与调用 FB 有本质的区别,FB 的输入输出参数有实际地址,只要在调用前打开 FB 的背景数据块就可以了 ,而 FC 则不同 ,FC 的输入输出参数没有实际地址, 上面说了,

13、他只是一个指针,我们必须初始化这些指针才行, 那么我们如何初始化他呢,因为我们根本就不知道这些指针的地址在那里.所以我们不能使用 UC 直接调用 FC,那样就不知道FC 执行会影响那些数据,这样,我们的另寻方法了。上面我们说过,UC 指令是不能传递参数的,但是并不代表UC 指令不能传递地址 (SETP7 手册没有关于这方面的文档资料), 在实际中发现 UC 调用 FC 时可以传递地址,语句的格式是: UC FCxaddr1,addr2,.,addrn; 这种使用方法只能在 STL 文本状态下使用 ,在非文本模式下无法书写,但是可以显示,在非文本下显示的格式是 :UC FCxaddr1addr2

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号