万泉河
WX:ZHO6371995,欢迎+
级别: 略有小成
精华主题: 0
发帖数量: 130 个
工控威望: 246 点
下载积分: 831 分
在线时间: 11(小时)
注册时间: 2021-06-11
最后登录: 2024-11-07
查看万泉河的 主题 / 回贴
楼主  发表于: 2022-08-03 09:55
0803 【万泉河】巧用程序块临时变量

上一篇文章《0728 【万泉河】谈虎色变双线圈再谈再变》有网友评论说, 文章题目应该叫做巧用临时变量,我说, 我举例的程序中用的都是全局变量,所以不能这么叫。 然而我可以以这个名字写一篇文章, 真的是巧用临时变量的。

先看芳季大侠写过的系列文章:

入口在:
拥有属于自己的指令第一集-技术视频免费看-西门子工业1847会员–西门子中国 (siemens.com.cn)
具体内容,里面涉及的知识点如果有不懂的,可以去仔细研读,甚至可以配合文章, 也自己实验摸索得到。

然而,我是不会从这样最基本的步骤一步步开讲,我只能把实际用过的理论方法一步到位给一个终极的解决方案。 如果芳老师不再出第五集,把我本文的内容当做其第五集,我给来个狗尾续貂也可以。

芳老师在第四集有一张附图:

本文的内容就从这张图展开。

这张图的意思是,在系统堆栈中,每一个同一级别的子程序TEMP变量同享的是同一片L空间。

这里先多讲一点TEMP变量的本质是什么?其实仍然是计算机的内存RAM。原本作为RAM,是可以被全局访问的, 只不过软件系统做了保护限制, 不允许外部访问。

多讲这一点的意义在于, 对于一些连子程序功能都没有, 或者有子程序, 然而子程序功能不如SMART这样强大的PLC, 主要是西门子之外的一些其他品牌的小PLC, 它们的系统中没有TEMP变量的时候,我们通过编程手段自己部署一部分内存数据区给当做TEMP变量使用。 这时候,操作系统本身自然不会限制, 那么我们在编程的时候就要格外小心, 要对这篇数据保护好。这是题外话。

回到上面的图片,图中我用红色方框圈出来,CDEF四个子程序,它们是同一级别的。 那么除了说它们共享L变量空间之外,其实还有一个含义, 就是当程序执行完了子程序C,又进入子程序D的时候, 在子程序D开始时, TEMP区的内容,除了INPUT对应的部分被输入管脚的值刷新了之外, 其余的所有数值其实就是离开子程序C时的内容。

即所有数据值,现场被完整保留。

这就是我们平常教育新手的时候, 总要强调, TEMP的数据,不要先读, 不要先读,不要读操作在先。 应该先写操作,赋值以后,后面的数值才是真实可控的,逻辑才可控。

有的人会不信, 说自己明明做子程序验证过了,我就是先读数值了, 也没有问题。 那是因为你测试程序中同一级别的子程序数量太少, 可能只有它自己。比如图中的F。 那么数据区就不会被别的子程序污染。 你做的逻辑暂时好用。然而等到了现场, 真实应用中, 子程序多了, 数据就混乱了,逻辑就乱套了。

所以, 我经常建议对TEMP变量属性不熟悉的新手,调试中遇到疑惑的时候, 不防在子程序的开始时候, 把用到的一片TEMP变量全部清零。 后面程序功能都好用,才叫好用。

这是传统做法。

今天则是颠覆传统,利用前面说的进入下一个子程序后,前一个子程序的TEMP数据现场被完整保留集成的这个特性,我们可以用来做点文章。才是题目宣称的巧用临时变量。

我在3年前写过一篇文章,做过程序编程方法征集:
《【万泉河】有偿征集2:S7-200函数块BLOCK_MOVE》
https://www.ad.siemens.com.cn/club/bbs/PostStory.aspx?a_id=1574124&b_id=80&s_id=157&num=3#anch

需要把一整块的数据用BLOKMOVE的方法传送到一个完全封装的子程序的内部。 然而并没有如愿得到答案。 还是我自己在去年底的时候,对TEMP变量思考到上述的内容后,得到了解决。

即,数据传送部分下降层级,放到相邻调用的前一个子程序中,直接对TEMP数据BLOKMOVE, 后面的子程序中的TEMP就自然收到了数值。
空讲理论光说不练可能有些难懂。 下面做个例子来演示下实现方法以及实际的应用。

通常SMART的子程序的管脚数量有限制,可能是16个,数值不精确,但是没意义,总之系统给的再多,在做标准化库函数时也会不够用。所以总要有有扩张管脚的需求。

我们有建立一个子程序叫做“功能块”:  


其原生管脚很少,然而我们把更多的管脚建立到LB10,LB11,LB12的L数据区中。
做一个“功能块前处理”的子程序 ,在其中调用BLOCKMOVE功能:


即实现了对内部TEMP变量的批量赋值, VB10的数据可以作为功能块的INPUT数据使用了。
当然,我们还可以做个“功能块后处理”,数值的传送方向颠倒一下:

那么建立的IN11-IN34的临时变量事实上成为了功能块的INOUT管脚。

程序的调用过程变为:


如此实现了给功能块扩张了24个管脚。 如果还需要更多,则简单修改即可。

我做的标准化烟台方法的分享项目的SMART 200的程序, 在2022年春节左右,做了一次V2.0的升级, 其中包含了本文讲解的技术方法,使得程序更加简练,优雅, 封装更彻底。

V2.0的升级程序不是完整的项目程序,而只是做了一部分功能的演示, 学员需要在加入学习营后,从QQ群文件中自行下载。学习掌握之后改进升级到所有程序功能。 在掌握之前,还是仍然可以只学习V1.0的方法,以及工程应用。其实只是我一个人的心结, 追求更优雅更完美的程序架构,实际功能是一样的。
0803 【万泉河】巧用程序块临时变量 (1).pdf (298 K) 下载次数:93
爱在日落之后
所有的伟大,源于一个勇敢的开始
级别: 家园常客
精华主题: 0
发帖数量: 665 个
工控威望: 702 点
下载积分: 3436 分
在线时间: 139(小时)
注册时间: 2022-07-25
最后登录: 2024-10-31
查看爱在日落之后的 主题 / 回贴
1楼  发表于: 2022-08-03 13:18
狗尾续貂好评
ldf710613
级别: 论坛先锋
精华主题: 0
发帖数量: 367 个
工控威望: 1154 点
下载积分: 1301 分
在线时间: 31(小时)
注册时间: 2022-04-09
最后登录: 2023-12-18
查看ldf710613的 主题 / 回贴
2楼  发表于: 2022-08-05 16:48
学习一下