万泉河
WX:ZHO6371995,欢迎+
级别: 略有小成
精华主题: 0
发帖数量: 130 个
工控威望: 246 点
下载积分: 831 分
在线时间: 11(小时)
注册时间: 2021-06-11
最后登录: 2024-11-07
查看万泉河的 主题 / 回贴
楼主  发表于: 2022-08-13 15:45
0811 【万泉河】双线圈第五弹:双线圈与手自动



我写文章探讨PLC编程中的双线圈问题,这是第五篇了。 前面四篇分别是:



0428 【万泉河】PLC编程:谈虎色变双线圈

0509 【万泉河】双线圈前传:关于线圈的定义

0512 【万泉河】破除双线圈禁忌:给PLC新手的系列直播讲座计划

0728 【万泉河】谈虎色变双线圈再谈再变



很不幸, 我写文章的顺序不是由浅及深逐步来的, 而是倒过来的。



因为我是在实际的技术应用中以及标准化推广过程中发现和总结一些技术观点,以自认为够通俗直白的方式写出来。



然后根据读者讨论和反馈 的情况, 针对讨论过程中的疑问以及发现的读者群体中普遍存在的认知盲区, 再提炼总结更浅显的道理,写成文章发表出来。



有同行嘲笑万老师连双线圈这种破事,都能攒出好几篇文章来, 是不是有点太小题大做没事找事了。



是的呀, 我本来也希望一篇浅文,对一个方面的技术细节有个结论, 文章发完即了事,然而,往往事与愿违, 而且不是由我个人决定的。 因为是受读者的反馈决定的。 如果文章发完, 大家异口同声地回复,OKOK,懂了懂了, 还可以这样,学习get到了新姿势。 那文章算是达到了初始目的,大家皆大欢喜。



然而, 如果后面反馈的争论声音很大, 各种杂音都有,就说明这个理论观点在同行中没有得到普遍的认同, 有可能是最开始的文章立意出发点高了, 导致有一些人看不懂,所以才会有较大的争议。 那么就只能不断的把出发点拉低再拉低, 换个角度再重复强调,以达成技术上的共识。



而在反馈的声音中,除了技术观点反对的之外, 竟然还有指责漫骂的,甚至上升到人身攻击。 这样的,基本上是回复者个人道德水准有问题, 或羡慕嫉妒恨, 或情商低到认为受到了歧视。 总之, 网络是有记忆力的, 这些谩骂者只要自己不怕丢人现眼, 这些帖子回复会一直存在,一直留给世人观瞻看笑话。如果自认为一辈子就是个不知名的无名小卒也倒罢了, 而如果那些自认为还有些身份, 有些名望的, 然后却在这种极其简单的小问题上面舔着脸来跟我纠缠的, 那反而是自己的脸都豁出去了。 完全咎由自取, 我踹起脸来可是毫不留情面的。



因为其实,我的文章的第一目标受众是参加了烟台方法学习的学员, 把这些技术原理和观点, 用浅显的文字表述出来,让他们可以更直观的了解到烟台方法程序架构中的基本思想, 可以通过文章帮助理解研读程序原理, 以及在后面他们自己公司的设备标准化程序研发过程中,可以搞好地搭建自己的标准化系统架构。



所以,文章写成之后,总是先发到学员群中, 学员们之间可以先进行一波讨论。如果这些技术点在培训示范项目中有用到, 我会指出来在用在了什么地方, 而如果还没用到,我也会指出来将来可以应用到什么场合。大家提前拥有技术储备, 将来需要时自然可以派上用场。



所以,学员之外的其他读者,其实是跟着搭顺风车了。 理解也好, 不理解也罢,以及支持与不支持,其实与我都没有什么直接关系的。 只不过同行有一些普遍性的的错误认知,表达出来了, 如果我认为比较典型, 就可以拿出来作为典型实例, 再重复强调提醒给学员们。



前面四篇文章都发了之后, 有一天,在微信群中的讨论时, 非常熟悉的请过我吃过好几次饭的胖哥,发表个观点,把我惊讶到了。



说的是:我编程的原则是程序中不碰双线圈。



我这儿谈虎色变的文章写过了,再谈虎再色变的文章也发过了,也没办法说这是谈虎色变了啊!也只好再基础的科普了。



首先, 我说谈虎色变的时候, 意思是反对这种惊慌恐惧的态度。不是我反对双线圈或者支持双线圈。



其次, “双线圈”是个特有词汇,完整的定义是:梯形图逻辑中因为对同一个变量不恰当的多次重复线圈类型的写操作,而带来的程序逻辑错误。



所以,当我们说双线圈的时候, 指的是程序有错误。 而且不见得一定是2次线圈,有可能是多次。 只要超过2次而出错,都叫双线圈错误。



另外, 也不是所有的对线圈的写操作都会发生双线圈错误, 除了前面文章讨论的SR和起保停之外,即便是最通常的:



|-----|I0.0 |---------(Q0.0)



这样的语法结构, 如果多次发生,外形上看起来是双线圈,三菱等PLC软件中会提醒有双线圈,也未必一定会发生双线圈错误。



比如:



|-----|I0.0 |-----|I0.1 |----|I0.2 |----|I0.3 |--------(M0.0)



|-----|M0.0 |-----|I0.5 |----|I0.6 |----|I0.7 |--------(Q0.0)



|-----|I1.0 |-----|I1.1 |----|I1.2 |----|I1.3 |--------(M0.0)



|-----|M0.0 |-----|I1.5 |----|I1.6 |----|I1.7 |--------(Q1.0)



这样的程序原本是为了易读性, 把一行长程序砍断, 分到了2行,其中使用了M中间变量,而两次操作中使用的是同一个中间变量的线圈,然而并不会发生双线圈错误。



我知道一些同行的习惯, 程序中遇到类似上面的场合时,习惯上绝不会重复使用同一个M0.0, 而是会换用不同的M1.0中间量来实现。



甚至有人还因此指责我, 你这样程序中重复使用同一个M变量,整个程序中到处都用, 导致程序多难读啊!



我的回复是:恰恰相反,这样的程序才更容易读呢!



稍微有些读程序的经验, 只要见到一个变量这样的被重复的写,读, 写, 读, 写,读, 写, 读, 那就可以知道, 这个变量只是个临时使用,用过就丢的临时变量,只在当下的上下文的程序中起作用,而不需要全程序区域检索阅读了。



所以这是我与胖哥以及大多数同行做程序的原则出发点的不同之处, 抛开双线圈专有词汇的概念之外, 胖哥说的意思是尽量不重复使用变量,而我的观点是要尽量重复使用变量。 但凡有机会可以重复使用的,都要尽量重复使用, 以节省变量资源。



这个观点其实在以前的文章中已经表达过了, 文章的题目叫做《1944 「万泉河」给你的PLC程序洗洗澡》 ,没读过的或者读过又忘记了的,可以去搜来看看。



双线圈的理念或者说禁区对本行业的影响可谓是深且久远。 一个最常见的场景是设备的手自动模式切换。



传统的控制系统中, 每一台设备都要有手动自动的模式切换。 比如就地安装的风机水泵柜, 会在电气控制回路上做两种模式,手动部分继电器逻辑通过盘面的启停按钮控制,而自动模式则接受来自PLC系统的硬线或者通讯的控制指令启停。



然后进化到PLC或者DCS控制之后,这个特性也被原样继承下来了。 比如DCS系统的电机块, 都要有手自动模式切换。



其实根源就来自双线圈。



有过不少初进入PLC行业的初学者,在开始学写PLC程序的时候,会把一台设备的手动和自动逻辑分到不同的模块中,然后再在子程序中分别逐个调用。 然后到调试的时候就出了问题,对一个线圈多次写操作了!双线圈错误了,程序闹大笑话了!



也不仅仅是刚毕业的学生, 很多有过丰富IT编程经验的程序员,刚摸PLC程序的时候, 也会掉进这个坑,然后被丰富经验PLC工程师老鸟的笑话之后,再也不敢这样写程序了。



而其实, 这只是对PLC运行机制不熟悉之前容易发生的错误。 而我这样不厌其烦地探讨双线圈话题,有一个目的,就是针对手自动模式这点的。



标准化示范项目,使用的来自西门子官方的BST库函数,我在《PLC标准化编程原理与方法》中做了大篇幅的介绍,后来的新版的例子, BPL以及LBP, 也多次写文章提及。 这些库函数的统一的特征,都是对设备模式有手自动的切换。



而我看它们不爽已经很久了。



通过对双线圈原理的分析,以及对起保停, SR等各种基础原理的分析之后, 其实完全可以做到去掉手自动模式的切换, 即便设备有手自动模式切换问题, 也只需要在HMI一侧做切换和隐藏显示,而不需要深入到PLC程序逻辑,甚至影响到底层块中。



也可以实现手动控制和自动控制模式的分开,IT程序员刚接触PLC的时候,模块化的程序做法,手动控制模块和自动控制模块完全分开,其实是可以实现的。



这一点, 我在烟台方法学习营中跟学员们探讨过, 给他们布置过作业,让他们有机会的时候尝试实现。



而我自己,最近在研究信捷小型PLC标准化的时候,就把这一技能充分用上了。 底层库函数不区分手自动, 程序逻辑手自动分开, 整个程序架构叫一个清爽。

xj8.jpg



优雅程度是没得说了。不懂优雅的人很难理解的高度。







不过信捷这类的小PLC性能太低,其它方面耗费了我太多精力, 这些技巧很难用语言传授给他人。另外,用过信捷的人也太少。  



所以还是回到应用最广的西门子S7-1200或者S7-200 SMART探讨这个问题,受众会更多一点。 近期打算做一次直播讲座,演示如何通过我对双线圈上述的解析, 实现不再需要手自动模式切换。



地点:双线圈微信群



目前, 群成员有33人, 包含了前几次参加了双线圈讲座的所有学员。 然后这回200人以内均可以免费参加,即扫群二维码进群即可。







还有需要听讲座的,可以期待下一期的讲座,会再成立专门的讲座微信群。





有一些平台不许发二维码, 见文后请到另外搜索找到。



正式的直播时间, 会在群中通知。

以后还有直播, 会在公众号《PLC标准化编程》中群发信息通知,敬请关注。
菜鸟入行
级别: 论坛先锋

精华主题: 0
发帖数量: 1381 个
工控威望: 1557 点
下载积分: 3686 分
在线时间: 177(小时)
注册时间: 2017-09-01
最后登录: 2024-06-11
查看菜鸟入行的 主题 / 回贴
1楼  发表于: 2022-08-13 16:57
讲的什么乱七八糟的!
双线圈我的见解就是:
比如Y0,可以用M1000,M1001,M1002等来作条件驱动
比如M1000是初始化输出Y0, M1001是自动时输出Y0,M1002是手动时输出Y0。
这样很好的避免了双线圈,也让编程更有逻辑
打个酱油,懂的不多
水平有限,能帮则帮
互相帮助,共同进步