技术论坛

 【征文】有效避开200Smart子程序堆栈限制的方法

返回主题列表
作者 主题
weiyt
奇侠

经验值: 9605
发帖数: 1550
精华帖: 14
楼主    2019-08-14 12:56:34
主题:【征文】有效避开200Smart子程序堆栈限制的方法

       随着200CN产品的退市和200Smart产品的升级,200Smart产品的功能越来越丰富,产品的市场份额也在不断增加,尤其最近的V2.4版本增加了PROFINET控制器功能、默认携带开放式通讯库,给广大中小型项目的用户带来很大福音,相信该产品的市场会越来越大。

       我们在使用200CN、200SMART的时候,是否遇到过子程序堆栈限制问题呢?我是经常遇到,系统给子程序开辟的堆栈是64个字节,真正给用户做变量来使用的其实只有60字节,如果使用四字节变量,最多也就15个变量吧!

       原来使用200CN时,我尽量控制接口变量的使用数量,但是这又是矛盾的:使用接口变量,有利于子程序的标准化,将子程序中的全局变量使用数量减少,甚至全部使用接口变量,才算的上是子程序块满足标准化的条件吧!如果子程序接口变量数量达到上限,子程序编程时必须采用全局变量的话,会降低子程序标准化的可能性,只要子程序中使用一个全局变量,那么这个子程序就不是标准化的块,需要重复使用时修改其中的全局变量,防止重复的全局变量导致程序逻辑出现异常。

      上个月在调试一个200Smart项目时发现,200Smart子程序的堆栈区,除受60字节限制外,还受16个变量的限制,即使我使用超过16个BOOL变量也是不允许的,16个BOOL变量才2字节啊,为啥剩余的L区地址就不让我用了呢?估计系统是按四字节变量计算堆栈使用情况的吧,16个变量,无论你使用BOOL型还是Real型,统统按变量个数计算,超出就不能用啦。

      针对系统的这一特性,我们怎么来最大化的使用好200Smart的堆栈呢?下面我来说说我规避200Smart子程序堆栈限制的几个方法,和大家一起探讨交流,不当之处请各位专家批评指正!

方法1:

       将BOOL型变量改成WORD型变量,一个WORD型变量可以包含16个位变量,这样在子程序中结合逻辑与指令,就可以顺利取出字变量中的位,进行位逻辑判断并将位输出顺利赋值到字变量的某个位,通过两个字类型的接口变量即可实现16位的输入、输出,参考附图1中的两个字类型的接口变量:

       

                                                                  图 1

方法2:

       对于BOOL型接口变量多的子程序,压缩成WORD型变量外,需要多个两字节、四字节变量的时候,我一般采用几个DWORD型接口变量将全局变量的地址,传送入子程序中,子程序利用这些地址,通过间接寻址、数学和逻辑运算后,将计算结果通过间接寻址直接写入全局变量中,规避了子程序堆栈字节数和变量数的限制。

      主程序中调用子程序也很简单,直接赋值WORD型实参和DWORD型地址实参即可,参考下图2:

        


                                                             图  2

        方法2中使用了间接寻址,存在的弊端是其他人比较难读懂程序,必要时要结合交叉索引检查变量使用情况。

      如果项目允许,我尽量将子程序简化,使用最少的接口参数结合接口参数数量和类型的压缩,来实现多数项目程序的编写。


shine
至圣

经验值: 19950
发帖数: 8944
精华帖: 39
2楼    2019-08-15 14:04:46
主题:回复:【征文】有效避开200Smart子程序堆栈限制的方法

可以参考一下库程序的库内存的做法。

实际上,大多数程序并不需要那么多的接口变量,很多是中间变量,库编程中,中间变量是使用一批连续地址的命名变量,调用库程序的时候,从V区给库程序分配地址空间,可以避开L区空间的限制。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。