《FB和FC有什么区别(1).docx》由会员分享,可在线阅读,更多相关《FB和FC有什么区别(1).docx(11页珍藏版)》请在三一办公上搜索。
1、FB和FC有什么区别OB、FC、FB、SFC、SFB的区别 S7-300/400PLC程序采用结构化程序,把程序分成多个模块,各模块完成相应的功能。结合起来就能实现一个复杂的控制系统。就像高级语言一样,用子程序实现特定的功能,再通过主程序调用各子程序,从而能实现复杂的程序。 在S7-300/400PLC中写在OB1模块里和程序就是主程序,子程序写在功能(FC),功能块(FB)。 FC运行是产生临时变量执行结束后数据就丢失-不具有储存功能 FB运行时需要调用各种参数,于是就产生了背景数据块DB。例如用FB41来作PID控制,则它的PID控制参数就要存在DB里面。FB具有储存功能 系统功能块和系统
2、功能也是相当于子程序,只不过SFB和SFC是集成在S7 CPU中的功能块,用户能直接调用不需自已写程序。 SFC与FC 不具有储存功能,FB和SFB具有储存功能 。 OB模块相当于子程序,负责调用其他模块。如果程序简单只需要OB就可以实现。 FB和功能FC的区别 用西门子PLC编程时,可以用到功能块FB和功能FC资料上说FB与FC都可以作为用户编写的子程序,但是我不明白这两个组织块之间到底有什么区别阿?在应用上到底有什么不同之处吗? FB-功能块,带背景数据块 FC-功能,相当于函数 他们之间的主要区别是:FC使用的是共享数据块,FB使用的是背景数据块 举个例子,如果您要对3个参数相同的电机进
3、行控制,那么只需要使用FB编程外加3个背景数据块就可以了,但是,如果您使用FC,那么您需要不断的修改共享数据块,否则会导致数据丢失。FB确保了3个电机的参数互不干扰。 FB,FC本质都是一样的,都相当于子程序,可以被其他程序调用。他们的最大区别是,FB与DB配合使用,DB中保存着FB使用的数据,即使FB退出后也会一直保留。FC就没有一个永久的数据块来存放数据,只在运行期间会被分配一个临时的数据区。 在实际编程中,是使用FB还是FC,要看实际的需要决定。 FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数
4、据块,被多个对象调用。 FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。 S7-300plc中的FB和FC的分别? FB带有自己的背景DB而FC没有自己的背景DB, 用FC 和FB 有什么分别呢,他们都能实现控制功能,到底该用FB还是该用FC,什么时候用FB什么时候用FC? FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数据块,被多个对象调用。 FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可
5、以保留,而FC的变量只在调用期内有效,下次调用又重新更换。 每次调用FC的I/O区域必须要自己每次手动输入,而FB就不要,省去不少麻烦,如果在上位机控制直接输入DB控制地址就可!. 我简单的说说FB和FC的区别,FB是具有存储功能的,FC没有存储功能, 这是一般的理解;FB需要背景数据块,而FC是没有的;参数的传递方式不同,FB的输入输出对应着背景数据块地址,而FC的输入输出是没有实际地址对应的,只有的程序调用时,才会和实际的地址产生对应关系。FB参数传递的是数据,FC参数传递的是数据的地址。 FB的处理方式是围绕着数据块处理数据,他的入口参数和出口参数都是数据块里的数据,以及STAT的数据都
6、是数据块里,入口参数和出口参数、STAT可以认为是静态数据,这些数据不会因为函数消失而逝去,他会一直保存在数据块里。FB里的变量与他的背景数据块是一一对应的,而他的对应并不是一层不变的。更确切的说,FB里的变量在调用时将根据AR2的值当作偏移量与背景数据块是一一对应。如果一个FB功能块里没有入口参数、出口参数及STAT数据,他将不需要背景数据块,这时的FB和没有入口出口参数的FC就没有什么区别了,就只能使用临时变量和全局变量了。 用很多人认为,FB的背景数据块必须由FB生成、FB里的第一个变量对应着背景数据块的第一个变量,还有就是由FB生成的数据块只能作为FB的背景数据块使用。其实这些理解是错
7、误的,FB的背景数据块不一定是通过FB生成的,可以像生成共享数据块一样生成FB的背景数据块,换句话说,普通的数据块也可以作为FB的背景数据块,不过这种做法是有一定前提的,就是这个数据块的字节数必须大于等于FB所需的字节数,如果小于FB所需的字节数时,FB访问到超出背景数据块的变量时就会找不到变量的地址,肯定会出错了。FB里的第一个变量对应可以对应数据块字节数减去FB所需背景数据块字节数里的任意位置的变量,我觉得这个比较好理解,在多重背景里不就是这样吗。谈到这里我得说点别的,好像这种情况下,FB里不可以有多重背景,在S7里,多重背景好像是不允许嵌套的,说道这里我马上在S7做了测试,证明我的想法是
8、错误的,多重背景是可以嵌套的。话回正题,由FB生成的数据块也是可以像访问普通数据块一样通过共享数据块方式访问,不信,你可以自己试一试。说说如何使用普通的数据块作为FB的背景数据块,会不会有人现在就开始自己试了,怎么不行呢,一调用程序就程序红色,有错误啊。告诉你,使用CALL指令编写时SETP7会自动检查DB块和FB的关系,要是时间标记和大小不一致就会报错。在这里我们可以使用UC指令调用FB,UC指令是不传递参数的,那么我们如何将参数传递给FB呢?又如何将FB的输出读出来呢? 我在前面说过,背景数据块是可以像访问普通数据块一样使用共享数据块访问,这就解决了我们参数传递的问题。下面我给出一个例子大
9、家看看: 使用UC调用FB L PIW 290 T tDIPd.PV_PER /tDIPd是TCONT_CP的背景数据块,我们在这里使用共享数据块方式对数据块写入数据 L MD 4 T DBD 34 A M 8.0 A DBX 42.0 A M 8.1 = DBX 42.1 /以上的是参数输入部分 LAR2 P#0.0 /该语句指名了FB和背景数据块的对应关系,就是FB的第一个参数对应背景数据的地址 CDB /交换共享数据块和背景数据块,将当前的共享数据块变为背景数据块 UC TCONT_CP /使用UC调用FB,FB的背景数据块就是上面打开的数据块即tDIPd CDB /交换共享数据块和背景
10、数据块,将当前的背景数据块变为共享数据块 /以下是参数输出部分 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 /从上面我们可以看出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_
11、HLM:= QLMN_LLM:= QC_ACT := CYCLE := CYCLE_P := SP_INT :=MD4 MAN := COM_RST :=M8.0 MAN_ON :=M8.1 上面这两段程序的执行效果是一样的,但是他们的写法和思路是完全不一样的,使用UC调用时,FB的输入输出参数的附值很自由,可以在程序的任何地方书写,没有条条框框的限制,而CALL就不同了,他给出了书写参数的位置。当然使用CALL时也可以使用共享数据块方式传递参数,但是这样就乱了,也没有这个必要。从中我们可以得到一个结论,FB的数据参数传递是通过数据块来传递的,而且数据块是静态的,所以我们给FB传递参数时,可以
12、在任何地方都可以给FB传递参数。UC和CALL的区别还有,UC可以通过AR2修改FB参数与背景数据块的对应关系。而CALL指令是不行的。通过改变AR2的值使得对应关系产生偏移。 FC,他是没有存储能力的,这是一般的说法,给定入口参数,执行完了,从出口参数读出数据,FC的功能就消失,就像C语言里的函数。如果在FC里使用全局数据,那就会是另外一种效果。 上面说过,FC里的参数是没有实际地址的,使形式参数,只有在调用时才会把实际参数的地址传递到FC的参数里。 下面,我使用一个例子可以证明FC的参数传递的不是数据,而是地址, 建立一个FC如下: FC_DEMO : WORD TITLE = VERSI
13、ON : 0.1 VAR_INPUT IN0 : WORD ; END_VAR VAR_OUTPUT OUT1 : BYTE ; END_VAR BEGIN NETWORK TITLE = L P#IN0; LAR1 ; 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
14、 注:V 指的是VL区的地址,既是先前的局部变量,也就是说先前未完成块的局部变量,在本段程序里指的就是调用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时,参数的传递就是传递变量的地址。但是还是有特殊情况的,在有传递的参
15、数是立即数、指针Pointer和指针ANY时,情况就大不一样,还有就是将指定数据块编号的数据,在这种情况下,会将数据先传给一个局部变量,然后再把该局部变量的地址传递给FC的参数里. 从这个例子我们可以看出FC的参数实际就是一个指针,我们在调用FC时就给FC的这些指针附值,而这些指针又是隐含着的,姑且我们可以这样理解. 说了那么多,我就说说如何利用UC指令调用FC,UC指令调用FC与调用FB有本质的区别,FB的输入输出参数有实际地址,只要在调用前打开FB的背景数据块就可以了,而FC则不同,FC的输入输出参数没有实际地址,上面说了,他只是一个指针,我们必须初始化这些指针才行,那么我们如何初始化他呢
16、,因为我们根本就不知道这些指针的地址在那里.所以我们不能使用UC直接调用FC,那样就不知道FC执行会影响那些数据,这样,我们的另寻方法了。 上面我们说过,UC指令是不能传递参数的,但是并不代表UC指令不能传递地址(SETP7手册没有关于这方面的文档资料),在实际中发现UC调用FC时可以传递地址,语句的格式是: UC FCxaddr1,addr2,.,addrn; 这种使用方法只能在STL文本状态下使用,在非文本模式下无法书写,但是可以显示,在非文本下显示的格式是: UC FCx addr1 addr2 . . . addrn 有了UC调用FC的传递地址格式,我们还要知道地址和我们FC的参数对应
17、方法: 输入参数 - 返回参数 - 输出参数 - 输入输出参数 . 有了上面的方法,我们可以使用UC来调用带参数的FC了,我们还是以上面的程序为例,在OB1中使用UC调用FC_DEMO , . /其他程序代码 UC FC_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指令的效果是一样的。 你要确认你建立的DB块是否连接你的FB块?也就是你在建立DB块
18、时属性里的instance db要对应你要连接的FB块。然后打开保存一下,再调用就不会出现你所说的那样了。不用提前给FB定义背景数据块,建好FB后,在程序中调用时直接CALL FBx ,然后输入需要新建的DB块,如:DB5,系统提示是否新建,选新建即可,系统自动建立背景数据块了。 db块是不需要你建立的,如果想建立,你可以生成instance db,然后后面的fb块的地方选择你的那个FB。然后再程序里面写call fbx,dbx,或者直接在ob中call fbx,dbx(这个db号必须是不存在的),然后会自动生成一个db块,它就是这个FB的背景数据块。可以参考楼上的回答,另外我想补充的是调用时要用CALL 令,不能用CC或UC命令来调用FB。这一点请楼主注意,否则调用FB也会出现问题。 位读取:DB1.DBX0.0 后面0.0是位地址可以变,以下类同 字节读取:DB1.DBB0 字读取:DB1.DBW0 双字读取:DB1.DBD0 从上面的分析,我说说使用CALL指令时,FB和FC的区别。在使用CALL指令调用FB时,我们可以不给FB的参数附值,这很显然,FB的参数是有实际地址的,他的地址就是背景数据块的地址。FB在运行时就会根据背景数据块进行计算了。而FC不行,他的参数没有实际地址,只有在调用时给他附值,要不然程序就不知道如何执行了。