admin管理员组

文章数量:1531525

2024年6月20日发(作者:)

西门子 PLC中OB、FC、FB、SFC、SFB中功能块使用概述

(2013-12-05 16:13:52)

S7-300/400PLC程序采用结构化程序,把程序分成多个模块,各模块完成相应的

功能。结合起来就能实现一个复杂的控制系统。就像高级语言一样,用子程序实

现特定的功能,再通过主程序调用各子程序,从而能实现复杂的程序。

在S7-300/400PLC中写在OB1模块里和程序就是主程序,子程序写在功

能(FC),功能块(FB)。

FC运行是产生临时变量执行结束后数据就丢失-----不具有储存功能

FB运行时需要调用各种参数,于是就产生了背景数据块DB。例如用FB

41来作PID控制,则它的PID控制参数就要存在DB里面。FB具有储存功能

系统功能块(SFB)和系统功能(SFC)也是相当于子程序,只不过SFB

和SFC是集成在S7 CPU中的功能块,用户能直接调用不需自已写程序。

SFC与FC不具有储存功能,FB和SFB具有储存功能 。

OB模块相当于子程序,负责调用其他模块。如果程序简单只需要OB就

可以实现。

用西门子PLC编程时,可以用到功能块FB和功能FC(FB、FC都是组织

块)资料上说FB与FC都可以作为用户编写的子程序,但是我不明白这两个组织

块之间到底有什么区别阿?在应用上到底有什么不同之处吗?

FB--功能块,带背景数据块

FC--功能,相当于函数

他们之间的主要区别是:FC使用的是共享数据块,FB使用的是背景数

据块

举个例子,如果您要对3个参数相同的电机进行控制,那么只需要使

用FB编程外加3个背景数据块就可以了,但是,如果您使用FC,那么您需要不

断的修改共享数据块,否则会导致数据丢失。FB确保了3个电机的参数互不干

扰。

FB,FC本质都是一样的,都相当于子程序,可以被其他程序调用(也

可以调用其他子程序)。他们的最大区别是,FB与DB配合使用,DB中保存着F

B使用的数据,即使FB退出后也会一直保留。FC就没有一个永久的数据块来存

放数据,只在运行期间会被分配一个临时的数据区。

在实际编程中,是使用FB还是FC,要看实际的需要决定。

FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB

带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的

背景数据块,被多个对象调用。

FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用

时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。

这是一般的理解;FB需要背景数据块,而FC是没有的;参数的传递

方式不同,FB的输入输出对应着背景数据块地址,而FC的输入输出是没有实

际地址对应的,只有的程序调用时,才会和实际的地址产生对应关系。FB参数

传递的是数据,FC参数传递的是数据的地址。

FB(功能块)的处理方式是围绕着数据块处理数据,他的入口参数和

出口参数都是数据块里的数据,以及STAT的数据都是数据块里,入口参数和出

口参数、STAT可以认为是静态数据,这些数据不会因为函数消失而逝去,他会

一直保存在数据块里。FB里的变量与他的背景数据块是一一对应的,而他的对

应并不是一层不变的。更确切的说,FB里的变量在调用时将根据AR2的值当作

偏移量与背景数据块是一一对应。如果一个FB功能块里没有入口参数、出口参

数及STAT数据,他将不需要背景数据块,这时的FB和没有入口出口参数的

FC就没有什么区别了,就只能使用临时变量和全局变量了。用很多人认为,FB

的背景数据块必须由FB生成、FB里的第一个变量对应着背景数据块的第一个

变量,还有就是由FB生成的数据块只能作为FB的背景数据块使用。其实这些

理解是错误的,FB的背景数据块不一定是通过FB生成的,可以像生成共享数

据块一样生成FB的背景数据块,换句话说,普通的数据块也可以作为FB的背

景数据块,不过这种做法是有一定前提的,就是这个数据块的字节数必须大于等

于FB所需的字节数,如果小于FB所需的字节数时,FB访问到超出背景数据块

的变量时就会找不到变量的地址,肯定会出错了。FB里的第一个变量对应可以

对应数据块字节数减去FB所需背景数据块字节数里的任意位置的变量,我觉得

这个比较好理解,在多重背景里不就是这样吗。

谈到这里我得说点别的,好像这种情况下,FB里不可以有多重背景,

在S7里,多重背景好像是不允许嵌套的,说道这里我马上在S7做了测试,证

明我的想法是错误的,多重背景是可以嵌套的。话回正题,由FB生成的数据块

也是可以像访问普通数据块一样通过共享数据块方式访问,不信,你可以自己试

一试。说说如何使用普通的数据块作为FB的背景数据块,会不会有人现在就开

始自己试了,怎么不行呢,一调用程序就程序红色,有错误啊。告诉你,使用

CALL指令编写时SETP7会自动检查DB块和FB的关系,要是时间标记和大小

不一致就会报错。在这里我们可以使用UC指令调用FB,UC指令是不传递参

数的(对于这个说法,我不太认同,我将会在使用UC调用FC时是如何传递参

数一节讲述),那么我们如何将参数传递给FB呢?又如何将FB的输出读出来

呢?

我在前面说过,背景数据块是可以像访问普通数据块一样使用共享数

据块访问,这就解决了我们参数传递的问题。

本文标签: 数据背景变量调用使用