1)FC的返回值RET_VAL实际上输出参数,因此有无动态变量(STAT)是二者的局部变量的本质区别,功能块的静态变量用北京数据块来保存,如果功能有执行完后需要保存的数据,只能存放在全局变量(I/O、PI/PO、M、T、共享数据块DB中),但是这样会影响功能的可移植性,如果功能或功能块的内部不使用全局变量,只使用局部变量,不需要做任何修改,就可以将块移植到其他项目,如果块使用了全局变量,在移植时需要重新统一分配它们的内部使用的全局变量地址,以保证不会出现地址冲突,当程序复杂,子程序和中断程序很多时,这种重新分配全局变量地址的工作量非常大,也容易出错。如果逻辑块有执行完成需要保存的数据,显然应使用功能块,而不是功能。
2)功能块的输出参数不仅与来自外部的输入参数有关,还与用静态变量保存的内部状态数据有关,功能因为没有静态变量,相同的输入参数产生的执行结果是相同。
3)功能块有背景数据块DB,功能没有背景数据块,只能在功能内部访问功能的局部变量,其他逻辑块与人机界面可以访问相应背景数据块中的变量。
4)不能给功能的局部比啊娘设置初始值,可以给功能块的局部变量(不包含TEMP)设置初始值,在调用功能块时如果没有设置某些输入参数的实参,将使用背景数据块中的初始值,或上一次执行后的值,调用功能时应给所有的形参指定实参。
举例说明:
1、生成功能
打开SIMATIC管理器执行【插入】-【S7块】-【功能】如下图所示
2、生成局部数据
双击打开FC1,如下图,将分隔条向下拉,分隔条上面是功能的变量声明表,下面为程序编写区,
在变量声明表中定义局部变量,(局部变量只能在所在的功能中使用),
1)IN:由调用它的块提供的输入参数
2)OUT:返回给调用它的块的输出参数
3)IN_OUT:初值由调用它的块提供,块执行后返回给调用它的块。
4)TEMP:暂时保存在局部数据堆栈中的数据,只是在执行块时使用临时数据,执行完后,不再保存临时数据的数值,它可能被别的数据覆盖。
5)RETURN中的RET_VAL属于输出参数。
本例IN和OUT参数如下图
3、生成功能中的程序
STEP7自动在局部变量的前面加#号,如#start。
4、调用功能
在OB1导入FC1,如下图
启动仿真如下: