FC和FB的区别

FC和FB的区别

在PLC编程时,如倍福或者西门子的编程,都会用到子程序 FC,FB的使用,可以提高程序的重复使用,减少代码量,降低代码的出错率,现在将两个的区别总结下。

FC块的全称是“Function”,即“函数”。

FB是具有DB背景块的特殊FC,也就是说FB具有FC的功能,同时拥有一个DB(DataBlock)。即FB=FC+DB.

FC没有背景数据块,也就是说它没有专门的数据存储区域,只是在运行期间分配了一个临时的数据区,由于没有一个永久的数据块来存放数据,因此它没有存储功能。 它的相关变量数据,在FC块运行结束的时候全部消失不见。
它的输入和输出数据是反应在接线端子上,在内部没有对应的存储地址。在FC的接口参数表中,各种参数也没有实际的地址,只是形式参数。只有在调用程序时,才能和实际的地址产生联系,八十几的参数地址传送到FC参数中,给予入口参数,经过逻辑运算,执行完毕后,从出口参数中读出数据,此后这个FC的功能就消失了。所以,FC的参数所传递的是数据的地址

FB所传递的则是是数据。 它将自身的数据(输入参数,输出参数,静态变量)永久的存储在背景数据块中。它的运行方式是围绕着数据块处理数据,并且将运算结果保持在数据块中。在FB被执行后,这些数据仍然可以使用。
FB在运行时,其运算时不带存储空间的,因此必须从外部加上数据中转储存区,被分配给FB的储存区叫做DB,也就是FB的背景数据块。这个DB被指定给该FB使用,不能作为其他的用途。FB每次被调用时,都会产生一个背景数据块,因此一个FB可以有若干个DB。
如果使用FB,有时可以简化编程。例如,如果要对多个参数相同的设备进行程序相同的控制,如果使用FC,每次调用时,其I/O区域必须手动输入各种变量,否则程序不能运行,有时这方面的工作量非常大。
而使用FB时,只要编制一套程序就行了。每次调用这个FB时,都会自动产生一个背景数据块,在背景数据块中,自动给IO区域的变量赋予地址,这里所指的是符号地址,如果需要使用绝对地址,仍然需要再IO端子上手动输入。

### 西门子PLC中FCFB的功能及区别 在西门子PLC编程中,FC(Function Call)FB(Function Block)是两种常用的程序类型,它们均可以看作子程序模,但其功能使用场景存在显著差异。以下是两者的功能及区别: #### 1. **基本定义** - **FC**:是一种函数调用,类似于传统编程语言中的函数。它没有静态存储区,所有变量必须通过形式参数传递[^2]。 - **FB**:是一种功能,具有独立的静态存储区,用于保存实例化的数据。它可以多次实例化,并且每个实例拥有独立的数据存储空间[^4]。 #### 2. **参数类型支持** - **FC**: - 所有输入、输出以及INOUT参数都必须连接外部变量。 - 不具备静态存储区域,因此无法保存中间状态或结果。 - 输出值可以在程序外部被修改[^4]。 - **FB**: - 支持输入(IN)、输出(OUT)、输入/输出(INOUT)以及静态(STATIC)变量。 - 静态存储区允许FB保存实例化后的数据,即使程序运行结束后,这些数据仍然保持不变[^4]。 - 如果输出变量链接了外部变量,则该变量的值不能在FB外部直接修改,除非将参数类型设置为INOUT。 #### 3. **实例化能力** - **FC**:不支持实例化,每次调用时共享同一组数据,适用于不需要保存状态的通用计算任务[^3]。 - **FB**:支持多次实例化,每次实例化都会生成独立的静态存储区,适用于需要保存状态或处理多个独立任务的场景[^4]。 #### 4. **应用场景** - **FC**:适合完成简单的、无状态的计算任务,例如数学运算、逻辑判断等[^2]。 - **FB**:适合复杂的、需要保存状态的任务,例如定时器、计数器、PID控制等功能模[^1]。 #### 5. **示例代码对比** 以下是一个简单的示例,展示如何使用FCFB分别实现加法运算: ##### FC示例 ```python // 定义FC FUNCTION Add : INT VAR_INPUT a : INT; b : INT; END_VAR Add := a + b; END_FUNCTION // 调用FC VAR result : INT; END_VAR result := Add(10, 20); ``` ##### FB示例 ```python // 定义FB FUNCTION_BLOCK AddWithMemory VAR_INPUT a : INT; b : INT; END_VAR VAR_OUTPUT sum : INT; END_VAR VAR memory : INT; // 静态变量 END_VAR memory := memory + 1; // 每次调用累加1 sum := a + b + memory; END_FUNCTION_BLOCK // 调用FB VAR fbInstance : AddWithMemory; result : INT; END_VAR fbInstance(a := 10, b := 20); result := fbInstance.sum; ``` #### 6. **总结** FCFB的主要区别在于是否支持静态存储区实例化。FC适用于无状态的简单计算任务,而FB则更适合需要保存状态或处理多个独立任务的复杂场景[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值