[西门子] 西门子S7-200 SMART PLC编程技巧精粹——TEMP数据探秘

[复制链接]
查看288 | 回复0 | 2024-9-24 10:33:19 | 显示全部楼层 |阅读模式

Step 1

利用TEMP数据给功能块增加输入/输出引脚



假设现在有需求,需要对32个BOOL量进行某些逻辑运算,得到相应的结果,这时就需要制作一个SBR功能块。然而,由于SBR的引脚数量限制,这个功能不能直接实现,所以需要先扩充引脚功能。

首先,为功能块设置32个引脚变量,故需要扩充,从而使其全部都在TEMP区,如图1所示。

图1 功能块变量表

图2 引脚扩充块变量表

前3行的占位在这里没有真实意义,只是为了占用扩充引脚模块所使用的IN_OUT数据区,另外当功能块的真正逻辑功能需要使用引脚,比如计算得到的结果点亮一个Q输出时,可以使用这些变量空间,只要保证后面的数据区地址不变即可。

建立引脚扩充的功能块,功能块一次可以扩充8个引脚,引脚扩充块变量表如图2所示。

给引脚扩充块中编制程序,如图3所示。

图3 引脚扩充块程序逻辑

在骨架型SBR中实现程序调用,分为前处理、功能块和后处理三部分,如图4所示。

图4 程序块调用

实现了将所有32个引脚均读入程序块的功能,这里的程序其实原本仍是LAD编写的,然而在LAD中占用篇幅过多,切换到STL后篇幅较小,因此采用了STL格式截图。然而这样的简单程序,即便在STL中也很容易读懂,并且复制和编辑内容都很方便。所以读者也可以学习并习惯读懂一些简单的STL程序。

为了验证运行正确,功能块中将LD6的值送到MD10,然后监控并测试修改MD0的值,发现MD10的值总与MD0值相等,功能得以验证。

程序解读



1)设置了方向引脚,两者方向不同,分别对应了前处理和后处理:
①把引脚来的源数据复制到目标位置;
②把目标位置的数值复制回源数据,即到引脚。由于两个方向的数据结构是相同的,所以在前处理程序参数输入完成后,只需要将其程序段复制到后处理,再将方向参数修改即可。这样可大幅度减轻输入参数的工作量,并减少出错概率。
2)本例子程序中这些IN_OUT引脚的数据只是用于输入,未对其数据进行修改,然而后处理时将数据原样送出也并不会影响到数据的值。
3)设计了位置引脚后,根据指定的位置,将源数据同步到目标位置。由于 SBR内的TEMP变量并不支持指针和变址等功能,所以程序逻辑中判断位置6、 7、8、9是直接通过枚举实现的。
4)通过前处理+后处理的处理方法,数据区内的数据获得了与IN_OUT同样的属性能力,这种前处理+后处理的技巧方法在未来章节中会反复用到。
5)程序功能实现的最重要的前提是这里调用部分的顺序不可以随意改变, 程序块的调用之间也不可以再插入其他的程序块。
6)这里虽然使用了M变量,但只是用于测试,实际功能的实现并没有使用 M变量。比如,如果实际的点来自IO信号,则实参部分应该是顺序不规则的一个个的IO点。然而程序功能并没有使用M变量,所以程序块可以重复使用,也可以随意复制到需要同样功能的项目程序中。




Step 2

相同功能例子的传统方法实现



实际应用中,当数据格式为BYTE,INT等时,也都可以用与3.3节相同的方法实现。即便是BOOL数据,不管是否使用全局变量M数据,都可以在功能块上增加一个DOWORD引脚,外部通过拆位聚合的方式准备和送入数据,所编写的程序的简洁程度与3.3节模块化方法编写的都会有一定差距。

现在进行比较。首先,功能块增加一个DWORD数据类型的IN_OUT引脚,并调用。同样不使用M变量,使用骨架SBR中的TEMP变量LD6,如图5所示。

图5 功能块调用 2

图6 为 8 个 BIT 赋值

需要在这个调用环节之前对LD6的32个位逐个赋值,准备好数据。首先完成8个BIT的赋值,如图6所示。

而完整程序赋值应该是4次,需要32行,这里就不将所有LAD程序贴出了,读者可以自行在电脑软件中实现后进行比较。

这只是前处理,而如果也需要同样的后处理,则还需要另外的32行梯形图。比起本文方法的图3,简洁程度差出好几个量级。而且本文方法可以在文本编辑器中快速生成,而传统的方法,不管是在LAD还是STL中,都很难使用工具快速实现,只能逐个录入。

虽然最终实现了同样的功能,但设计工作效率的差距还是很明显的。而尤其重要的是这种调用环节的工作有可能会重复多次,同一个项目中会重复,不同的项目也会重复需要,因为项目不同,点位不同,每一个都要完成这样的工作量,工作量和复杂程度就逐渐翻倍了。

这里调用部分的工作,按照专业的术语称为耦合,而理想的设计工作应该是尽量做到高内聚低耦合,即功能实现的部分,难度高一点,实现过程复杂一点,都无所谓。因为只需要做一次,就可以重复使用了,所以要高内聚。而实现的部分,则主张尽量简化,最好能简化到使用便捷工具就可以完成,并且使用简单,随便一个不懂技术的人都可以胜任,那样才是最成功的设计。


Step 3

TEMP 数据实现变址



扩充4个BYTE的引脚用了重复的4行程序实现,如果再增加,比如8个BYTE乃至更多呢?现在的解决方案只能是简单再增加,比如增加LB10、LB11、LB12、LB13的段落,所以这个扩充引脚的功能块并不通用。原因是S7-200 SMART PLC 中的TEMP数据不支持地址指针,所以做不到用变量或指针方法实现对LBx的定位。

然而,在经过仔细研究后,可以借用V区数据,V区数据支持地址指针,可以沿用前文前处理+后处理的技巧,使用V区数据实现功能的同时,却不真正意义占用(污染)V区数据。

方法如下:

首先,建立一对功能块SBR,分别命名为“V数据备份”和“V数据恢复”,如图7和图8所示。

图7 V 数据备份

图8 V 数据恢复

然后改造原引脚扩充SBR,名称标识为引脚扩充V,见表3-1。

表 3-1 SBR 引脚扩充 V 程序逻辑

程序解读



实现的思路是本文提到的嵌套调用的SBR上下层之间TEMP数据互相隔离且同层传递的特性。所增加的“SBR_V数据备份”和“SBR_V数据恢复” 都处于当下的“SBR_引脚扩充V”的下一层中,而且两次调用过程中间并没用其他的子程序SBR调用,它们的TEMP数据是可以继承传递的。所以在将V区备份时的数据,在恢复时又原样恢复了。
因此,即便使用程序中应用最频繁的VB0开始的数据,也仍然不会有影响。当然,在实际程序中,为安全起见,读者可以使用更大地址编号的数据区,比如 VB5000,这样只需要修改第一段的程序地址为&VB5000即可。
这里使用的下一级调用的TEMP数据区60BYTE范围,实现了60个V区数据的临时缓存,所以只要位置小于60的地址都可以实现定位。当然引脚扩充块本身的数据区顶多也不过60BYTE,所以将来无论如何都够用,由此实现了通用性。
这里对VB0数据的应用,在程序整体的交叉引用中会检索到,但其实只是借用,并没有真正使用。所以,即便查询程序检查VB0数据区的使用情况时,也完全可以不需要打开此段的程序核查。为了不引起后来读程序的工程师的误解,可以隐藏此处VB地址的使用,具体方法是如果在监控状态读取到此处 &VB0的值为16#08000000,那么程序中直接使用这个常数数值替换&VB0地 址,所实现的功能也完全一样。
这里还使用了AC1来跨层传递地址指针。系统手册在讲解堆栈的章节中, 特别提到了并不给AC寄存器做堆栈,这里就是利用了这一点。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则