S7 300中OB、FC、FB、SFC、SFB的区别详解
S7-300 PLC采用结构化编程,即把程序分成多个功能模块,各模块完成指定功能,通过将各个功能结合起来构成完整而复杂的控制系统。类似于高级语言,用子程序实现特定的功能,再通过主程序调用各子程序的方式实现复杂的程序。
对S7-300 PLC中, OB1中所编写的程序就是主程序,而在功能(FC),功能块(FB)中编写的程序就是子程序,前者相当于无参子程序,后者为有参子程序。
FC运行过程中会产生临时变量,程序执行结束后临时数据即丢失,不具有有储存功能。
FB运行时需要调用各种实际参数,于是就产生了所谓的背景数据块DB,专门来存放FB所需要的各种参数。例如FB41作为PID控制功能块,则它详细的PID控制参数需要存在某个DB里面。FB具有储存功能。
系统功能块(SFB)和系统功能(SFC)也是相当于子程序,只不过SFB和SFC是集成在S7 CPU中的功能块,用户直接调用即可实现特定的功能,不需要自已再编写程序。
SFC与FC类似,不具有储存功能, SFB和FB类似具有储存功能 。
问题:
用S7 300 PLC编程时,可以用到功能块FB和功能FC(FB、FC都是组织块),资料上说FB与FC都可以作为用户编写的子程序,但是我不明白这两个组织块之间到底有什么区别?在应用上到底有什么不同之处吗?
答:
FB--功能块,带背景数据块
FC--功能,相当于函数
他们之间的主要区别是:FC使用的是共享数据块,FB使用的是背景数据块。
举个例子,如果您要对3个参数相同的电机进行控制,那么只需要使用FB编程外加3个背景数据块就可以了,但是,如果您使用FC,那么您需要不断的修改共享数据块,否则会导致数据丢失。FB确保了3个电机的参数互不干扰。
FB,FC本质都是一样的,都相当于子程序,可以被其他程序调用(也可以调用其他子程序)。他们的最大区别是,FB与DB配合使用,DB中保存着FB使用的数据,即使FB退出后也会一直保留。FC就没有一个永久的数据块来存放数据,只在运行期间会被分配一个临时的数据区。
在实际编程中,是使用FB还是FC,要看实际的需要决定。
FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数据块,被多个对象调用。
FC和FB像C语言中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。
这是一般的理解;FB需要背景数据块,而FC是没有的;参数的传递方式不同,FB的输入输出对应着背景数据块地址,而FC的输入输出是没有实际地址对应的,只有在程序调用时,才会和实际的地址产生对应关系。FB参数传递的是数据,FC参数传递的是数据地址。
FB(功能块)是围绕数据块处理数据,它的IN/OUT参数及STAT参数都是数据块里的数据,数据不会因为函数关闭而丢失,而会一直保存在数据块里。FB里的变量与它的背景数据块是一一对应的,而他的对应并不是一成不变的。确切的说,FB里的变量在调用时将以AR2的值作为偏移量去与背景数据块一一对应。如果一个FB功能块里没有IN/OUT及STAT参数,它将不需要背景数据块,这样的FB和FC实质上没有区别,也只能使用临时变量和全局变量。
有很多人认为:
1.FB的背景数据块必须由FB生成、FB里的第一个变量对应着背景数据块的第一个变量。
2.由FB生成的数据块只能作为FB的背景数据块使用。
其实这些理解是错误的,FB的背景数据块未必就是通过FB生成的,可以像生成共享数据块一样生成FB的背景数据块,换言之,普通DB也可作为FB的背景数据块,但这样做有一个前提,就是这个DB字节数必须>=FB所需的字节数,如果小于FB所需的字节数,FB访问背景块时超出背景数据块字节数的变量就找不到对应的变量地址了,自然就出错了。