电工学习网

 找回密码
 立即注册
查看: 2899|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2019-8-14 13:09:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
     随着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中的两个字类型的接口变量:
       有效避开200Smart子程序堆栈限制的方法
                                                                  图 1
方法2:
       对于BOOL型接口变量多的子程序,压缩成WORD型变量外,需要多个两字节、四字节变量的时候,我一般采用几个DWORD型接口变量将全局变量的地址,传送入子程序中,子程序利用这些地址,通过间接寻址、数学和逻辑运算后,将计算结果通过间接寻址直接写入全局变量中,规避了子程序堆栈字节数和变量数的限制。
      主程序中调用子程序也很简单,直接赋值WORD型实参和DWORD型地址实参即可,参考下图2:
         有效避开200Smart子程序堆栈限制的方法

                                                             图  2
        方法2中使用了间接寻址,存在的弊端是其他人比较难读懂程序,必要时要结合交叉索引检查变量使用情况。
      如果项目允许,我尽量将子程序简化,使用最少的接口参数结合接口参数数量和类型的压缩,来实现多数项目程序的编写。
来源:西门子工业技术论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-5-13 07:24

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表