「年终技术工作笔记」输出参数无法初始化
这几百文字不能算是工作笔记,也就是个随笔,昨晚整理代码,编译竟然提示“参数无法初始化”,编译出现警告,这不符合人情世故嘛。
在西门子的软件编程平台TIA Portal中,一个FC/FB的接口下,有几种参数分区,如input,output,inout,static,temp,constant,每种分类的参数,在使用它们时,都有老生常谈的,一定的约束条件,如input只能读不能写,output最好是只写不读,inout要注意数据安全性的问题,static最好不要域外(在FB本体外)写操作,temp一定要先赋值再使用,另外不能用作边沿标志,不能跨扫描周期使用,constant倒是事儿少。
这里主要说的是,对于output参数的只写不读,在实践中总是有违规的“漏网之鱼”,对某个output参数不自觉地进行了读写操作,而且还踩了类似temp参数的“先赋值,后使用”的红线,结果呢?规则是硬性的,违反了就有不好的结果,最轻的就是给你一个警告,如下图所示,程序在编译时给出警告提示,提示内容是“参数#sum无法初始化”,如果你是个不敏感的人,大可以对其置之不理,如果你不是的,那就要处理一下,如何处理,下面细说。

编译出现警告的根源是,在对变量#sum进行首次赋值之前,就对其进行了读操作,而此时#sum的值是不确定的,这就是原因,解决办法通常有如下几种:
1、 更改#sum的分类为inout

2、在程序开始处先对#sum进行一次性初始化

但是这样操作有个问题,就是FB每次被调用都会先初始化,那么最后#sum的值将会是1,不符合程序预期;那么我们可以只执行一次初始化操作,防止其值固定为1,
这里借助了一个静态变量实施块内一次初始化,尽管下面还会提示警告,但是这是编译器静态分析的短处,当运行时,在读#sum时,已经对其提前赋值了。
3、 借助static实现曲径通幽

综合上面所有的应对方法,还是围绕着“先赋值,后读取”做文章,所以,对于output还是尽量的只写不读!
上面就是我先扔出的一块糙砖,坛内大佬云集,期待大佬们随手更优秀文章与大家见面!
西家有活动,当然得捧场,所谓“落笔小功夫,用心大文章”,毕竟,态度才更重要嘛。