话说自S7-300系列的V3版本CPU面世以来,性能比之前的硬件有了大幅提升。就拿本文要提的本地数据来说,单个块最大可支持2KB的大小。面对如此“海量”,一个仅仅定义了20几个字节本地变量的FB,会出现临时数据超限的问题么?不管你们信不信,反正我是真不想信。无奈在铁铮铮的事实面前,不由我不信。
那是一个平凡的工作日,我像平时一样奋战在长长的客户问题登记队列中。飞速地按下一串电话号码,短暂的铃声后,耳边传来一位美女动听的声音,不由得精神一振。可惜美女的情绪不高,她向我抱怨着一个程序块无法下载的难题:“我的一个FB下载的时候总是提示‘无法复制块’,编译都没错的啊,为什么会出现这种情况?”我询问进一步的详细信息,但是美女并没有留意,也没有记下错误代码。我想与其让客户查询后回电,还不如把这个块发过来看的清楚。于是在取得客户同意之后,很快收到了她的项目文件。
那个FB块是由一个SCL源所生成,打来粗略一扫:短短的变量声明区,临时变量和静态变量一共20多个字节。程序段也不算长。点击下载,果然出现了客户所述的不可复制块的错误提示。点开详细信息提示窗口,如下图所示:

看来这是本地数据长度的问题了。我一边好奇着什么程序2KB的本地数据容量还不够用,一边打开了块属性一探究竟。结果真是吓了一跳,此FB的本地数据长度居然有3KB还多。对于FB来说,定义的临时变量和静态变量都要占用本地数据区。除此之外,FB里面嵌套调用的其他FB或FC的临时数据,都要占用此FB的本地数据。那么接下来,势必要检查一下这个FB中都调用了什么功能或功能块。
打开参考数据中的程序结构,果然看到此FB下赫然10多个FC16在列。此FC16正是标准库中的I_STRING功能。多次调用了字符串处理的指令,怪不得本地数据长度会翻着跟头地往上窜。为什么这么说?打开SCL编辑器“选项”菜单中的“自定义”窗口便可真相大白。

且看红框中的字符串的最大长度值规定了此SCL源中所有FC的输出变量和输入/输出变量中字符串的大小。FC的接口变量均要占用其本地数据区,在这个FB块中调用了10多次的FC,本地数据长度直冲云霄也就不足为奇了。
在问过客户实际要使用的字符串长度,并且在上图所示的位置设定一个合适的数值,编译后本地数据随即“缩水”至原来的一个零头,再下载也就毫无问题了。