在FB功能块的不同接口处使用UDT数据类型的比较
时间:2023-03-04作者:佚名
|
之前在做一个项目时用了很多FB功能块,并且把对应的上位机监控数据放在了IN-OUT接口,结果运行时发现CPU扫描周期很大,接近100ms,控制非常吃力。后来发现是因为在FB的IN-OUT接口使用了UDT类型数据的缘故,因为在IN-OUT接口使用UDT后FB的背景数据块就只保存访问指针,运行时采用指针的方式直接访问接口实参,在FB中每引用一次IN-OUT接口的UDT类型变量元素,程序的工作存储器占用就有40多字节,而普通变量只占用不到10字节。最后没办法把所有IN-OUT接口的UDT拆分到IN和OUT接口,工作存储器马上就降下来了,扫描周期降低了很多,见下图比较。这个问题之前也发帖讨论过。
自从发现上述问题后,我一直不敢再把UDT类型的上位接口放到IN-OUT区了,但是也带来了一些麻烦,比如有的时候需要程序判断上位输入是否合理,如果不合理就通过程序纠正,如果上位接口在IN区就无法在FB内赋值纠正。为了彻底搞清楚这个问题,我最近做了一个测试比较,方法就是创建一个UDT数据类型,包括8个BOOL,2个INT和2个REAL,然后在FB中写三行程序,分别调用三种变量。通过把UDT放到IN接口和IN-OUT接口比较FB占用的装载存储区和工作存储区的大小区别,还通过增加BOOL和INT变量调用比较每增加一次调用占用的装载存储区和工作存储区的大小区别。程序如下
STEP7软件采用5.5SP4,组态CPU为315-2PN/DP V3.2,比较结果如下:
|










