0811 【萬(wàn)泉河】雙線圈第五彈:雙線圈與手自動(dòng)
我寫文章探討PLC編程中的雙線圈問(wèn)題,這是第五篇了。 前面四篇分別是:
0428 【萬(wàn)泉河】PLC編程:談虎色變雙線圈
0509 【萬(wàn)泉河】雙線圈前傳:關(guān)于線圈的定義
0512 【萬(wàn)泉河】破除雙線圈禁忌:給PLC新手的系列直播講座計(jì)劃
0728 【萬(wàn)泉河】談虎色變雙線圈再談再變
很不幸, 我寫文章的順序不是由淺及深逐步來(lái)的, 而是倒過(guò)來(lái)的。
因?yàn)槲沂窃趯?shí)際的技術(shù)應(yīng)用中以及標(biāo)準(zhǔn)化推廣過(guò)程中發(fā)現(xiàn)和總結(jié)一些技術(shù)觀點(diǎn),以自認(rèn)為夠通俗直白的方式寫出來(lái)。
然后根據(jù)讀者討論和反饋 的情況, 針對(duì)討論過(guò)程中的疑問(wèn)以及發(fā)現(xiàn)的讀者群體中普遍存在的認(rèn)知盲區(qū), 再提煉總結(jié)更淺顯的道理,寫成文章發(fā)表出來(lái)。
有同行嘲笑萬(wàn)老師連雙線圈這種破事,都能攢出好幾篇文章來(lái), 是不是有點(diǎn)太小題大做沒(méi)事找事了。
是的呀, 我本來(lái)也希望一篇淺文,對(duì)一個(gè)方面的技術(shù)細(xì)節(jié)有個(gè)結(jié)論, 文章發(fā)完即了事,然而,往往事與愿違, 而且不是由我個(gè)人決定的。 因?yàn)槭鞘茏x者的反饋決定的。 如果文章發(fā)完, 大家異口同聲地回復(fù),OKOK,懂了懂了, 還可以這樣,學(xué)習(xí)get到了新姿勢(shì)。 那文章算是達(dá)到了初始目的,大家皆大歡喜。
然而, 如果后面反饋的爭(zhēng)論聲音很大, 各種雜音都有,就說(shuō)明這個(gè)理論觀點(diǎn)在同行中沒(méi)有得到普遍的認(rèn)同, 有可能是最開始的文章立意出發(fā)點(diǎn)高了, 導(dǎo)致有一些人看不懂,所以才會(huì)有較大的爭(zhēng)議。 那么就只能不斷的把出發(fā)點(diǎn)拉低再拉低, 換個(gè)角度再重復(fù)強(qiáng)調(diào),以達(dá)成技術(shù)上的共識(shí)。
而在反饋的聲音中,除了技術(shù)觀點(diǎn)反對(duì)的之外, 竟然還有指責(zé)漫罵的,甚至上升到人身攻擊。 這樣的,基本上是回復(fù)者個(gè)人道德水準(zhǔn)有問(wèn)題, 或羨慕嫉妒恨, 或情商低到認(rèn)為受到了歧視。 總之, 網(wǎng)絡(luò)是有記憶力的, 這些謾罵者只要自己不怕丟人現(xiàn)眼, 這些帖子回復(fù)會(huì)一直存在,一直留給世人觀瞻看笑話。如果自認(rèn)為一輩子就是個(gè)不知名的無(wú)名小卒也倒罷了, 而如果那些自認(rèn)為還有些身份, 有些名望的, 然后卻在這種極其簡(jiǎn)單的小問(wèn)題上面舔著臉來(lái)跟我糾纏的, 那反而是自己的臉都豁出去了。 完全咎由自取, 我踹起臉來(lái)可是毫不留情面的。
因?yàn)槠鋵?shí),我的文章的第一目標(biāo)受眾是參加了煙臺(tái)方法學(xué)習(xí)的學(xué)員, 把這些技術(shù)原理和觀點(diǎn), 用淺顯的文字表述出來(lái),讓他們可以更直觀的了解到煙臺(tái)方法程序架構(gòu)中的基本思想, 可以通過(guò)文章幫助理解研讀程序原理, 以及在后面他們自己公司的設(shè)備標(biāo)準(zhǔn)化程序研發(fā)過(guò)程中,可以搞好地搭建自己的標(biāo)準(zhǔn)化系統(tǒng)架構(gòu)。
所以,文章寫成之后,總是先發(fā)到學(xué)員群中, 學(xué)員們之間可以先進(jìn)行一波討論。如果這些技術(shù)點(diǎn)在培訓(xùn)示范項(xiàng)目中有用到, 我會(huì)指出來(lái)在用在了什么地方, 而如果還沒(méi)用到,我也會(huì)指出來(lái)將來(lái)可以應(yīng)用到什么場(chǎng)合。大家提前擁有技術(shù)儲(chǔ)備, 將來(lái)需要時(shí)自然可以派上用場(chǎng)。
所以,學(xué)員之外的其他讀者,其實(shí)是跟著搭順風(fēng)車了。 理解也好, 不理解也罷,以及支持與不支持,其實(shí)與我都沒(méi)有什么直接關(guān)系的。 只不過(guò)同行有一些普遍性的的錯(cuò)誤認(rèn)知,表達(dá)出來(lái)了, 如果我認(rèn)為比較典型, 就可以拿出來(lái)作為典型實(shí)例, 再重復(fù)強(qiáng)調(diào)提醒給學(xué)員們。
前面四篇文章都發(fā)了之后, 有一天,在微信群中的討論時(shí), 非常熟悉的請(qǐng)過(guò)我吃過(guò)好幾次飯的胖哥,發(fā)表個(gè)觀點(diǎn),把我驚訝到了。
說(shuō)的是:我編程的原則是程序中不碰雙線圈。
我這兒談虎色變的文章寫過(guò)了,再談虎再色變的文章也發(fā)過(guò)了,也沒(méi)辦法說(shuō)這是談虎色變了啊!也只好再基礎(chǔ)的科普了。
首先, 我說(shuō)談虎色變的時(shí)候, 意思是反對(duì)這種驚慌恐懼的態(tài)度。不是我反對(duì)雙線圈或者支持雙線圈。
其次, “雙線圈”是個(gè)特有詞匯,完整的定義是:梯形圖邏輯中因?yàn)閷?duì)同一個(gè)變量不恰當(dāng)?shù)亩啻沃貜?fù)線圈類型的寫操作,而帶來(lái)的程序邏輯錯(cuò)誤。
所以,當(dāng)我們說(shuō)雙線圈的時(shí)候, 指的是程序有錯(cuò)誤。 而且不見得一定是2次線圈,有可能是多次。 只要超過(guò)2次而出錯(cuò),都叫雙線圈錯(cuò)誤。
另外, 也不是所有的對(duì)線圈的寫操作都會(huì)發(fā)生雙線圈錯(cuò)誤, 除了前面文章討論的SR和起保停之外,即便是最通常的:
|-----|I0.0 |---------(Q0.0)
這樣的語(yǔ)法結(jié)構(gòu), 如果多次發(fā)生,外形上看起來(lái)是雙線圈,三菱等PLC軟件中會(huì)提醒有雙線圈,也未必一定會(huì)發(fā)生雙線圈錯(cuò)誤。
比如:
|-----|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)
這樣的程序原本是為了易讀性, 把一行長(zhǎng)程序砍斷, 分到了2行,其中使用了M中間變量,而兩次操作中使用的是同一個(gè)中間變量的線圈,然而并不會(huì)發(fā)生雙線圈錯(cuò)誤。
我知道一些同行的習(xí)慣, 程序中遇到類似上面的場(chǎng)合時(shí),習(xí)慣上絕不會(huì)重復(fù)使用同一個(gè)M0.0, 而是會(huì)換用不同的M1.0中間量來(lái)實(shí)現(xiàn)。
甚至有人還因此指責(zé)我, 你這樣程序中重復(fù)使用同一個(gè)M變量,整個(gè)程序中到處都用, 導(dǎo)致程序多難讀啊!
我的回復(fù)是:恰恰相反,這樣的程序才更容易讀呢!
稍微有些讀程序的經(jīng)驗(yàn), 只要見到一個(gè)變量這樣的被重復(fù)的寫,讀, 寫, 讀, 寫,讀, 寫, 讀, 那就可以知道, 這個(gè)變量只是個(gè)臨時(shí)使用,用過(guò)就丟的臨時(shí)變量,只在當(dāng)下的上下文的程序中起作用,而不需要全程序區(qū)域檢索閱讀了。
所以這是我與胖哥以及大多數(shù)同行做程序的原則出發(fā)點(diǎn)的不同之處, 拋開雙線圈專有詞匯的概念之外, 胖哥說(shuō)的意思是盡量不重復(fù)使用變量,而我的觀點(diǎn)是要盡量重復(fù)使用變量。 但凡有機(jī)會(huì)可以重復(fù)使用的,都要盡量重復(fù)使用, 以節(jié)省變量資源。
這個(gè)觀點(diǎn)其實(shí)在以前的文章中已經(jīng)表達(dá)過(guò)了, 文章的題目叫做《1944 「萬(wàn)泉河」給你的PLC程序洗洗澡》 ,沒(méi)讀過(guò)的或者讀過(guò)又忘記了的,可以去搜來(lái)看看。
雙線圈的理念或者說(shuō)禁區(qū)對(duì)本行業(yè)的影響可謂是深且久遠(yuǎn)。 一個(gè)最常見的場(chǎng)景是設(shè)備的手自動(dòng)模式切換。
傳統(tǒng)的控制系統(tǒng)中, 每一臺(tái)設(shè)備都要有手動(dòng)自動(dòng)的模式切換。 比如就地安裝的風(fēng)機(jī)水泵柜, 會(huì)在電氣控制回路上做兩種模式,手動(dòng)部分繼電器邏輯通過(guò)盤面的啟停按鈕控制,而自動(dòng)模式則接受來(lái)自PLC系統(tǒng)的硬線或者通訊的控制指令啟停。
然后進(jìn)化到PLC或者DCS控制之后,這個(gè)特性也被原樣繼承下來(lái)了。 比如DCS系統(tǒng)的電機(jī)塊, 都要有手自動(dòng)模式切換。
其實(shí)根源就來(lái)自雙線圈。
有過(guò)不少初進(jìn)入PLC行業(yè)的初學(xué)者,在開始學(xué)寫PLC程序的時(shí)候,會(huì)把一臺(tái)設(shè)備的手動(dòng)和自動(dòng)邏輯分到不同的模塊中,然后再在子程序中分別逐個(gè)調(diào)用。 然后到調(diào)試的時(shí)候就出了問(wèn)題,對(duì)一個(gè)線圈多次寫操作了!雙線圈錯(cuò)誤了,程序鬧大笑話了!
也不僅僅是剛畢業(yè)的學(xué)生, 很多有過(guò)豐富IT編程經(jīng)驗(yàn)的程序員,剛摸PLC程序的時(shí)候, 也會(huì)掉進(jìn)這個(gè)坑,然后被豐富經(jīng)驗(yàn)PLC工程師老鳥的笑話之后,再也不敢這樣寫程序了。
而其實(shí), 這只是對(duì)PLC運(yùn)行機(jī)制不熟悉之前容易發(fā)生的錯(cuò)誤。 而我這樣不厭其煩地探討雙線圈話題,有一個(gè)目的,就是針對(duì)手自動(dòng)模式這點(diǎn)的。
標(biāo)準(zhǔn)化示范項(xiàng)目,使用的來(lái)自西門子官方的BST庫(kù)函數(shù),我在《PLC標(biāo)準(zhǔn)化編程原理與方法》中做了大篇幅的介紹,后來(lái)的新版的例子, BPL以及LBP, 也多次寫文章提及。 這些庫(kù)函數(shù)的統(tǒng)一的特征,都是對(duì)設(shè)備模式有手自動(dòng)的切換。
而我看它們不爽已經(jīng)很久了。
通過(guò)對(duì)雙線圈原理的分析,以及對(duì)起保停, SR等各種基礎(chǔ)原理的分析之后, 其實(shí)完全可以做到去掉手自動(dòng)模式的切換, 即便設(shè)備有手自動(dòng)模式切換問(wèn)題, 也只需要在HMI一側(cè)做切換和隱藏顯示,而不需要深入到PLC程序邏輯,甚至影響到底層塊中。
也可以實(shí)現(xiàn)手動(dòng)控制和自動(dòng)控制模式的分開,IT程序員剛接觸PLC的時(shí)候,模塊化的程序做法,手動(dòng)控制模塊和自動(dòng)控制模塊完全分開,其實(shí)是可以實(shí)現(xiàn)的。
這一點(diǎn), 我在煙臺(tái)方法學(xué)習(xí)營(yíng)中跟學(xué)員們探討過(guò), 給他們布置過(guò)作業(yè),讓他們有機(jī)會(huì)的時(shí)候嘗試實(shí)現(xiàn)。
而我自己,最近在研究信捷小型PLC標(biāo)準(zhǔn)化的時(shí)候,就把這一技能充分用上了。 底層庫(kù)函數(shù)不區(qū)分手自動(dòng), 程序邏輯手自動(dòng)分開, 整個(gè)程序架構(gòu)叫一個(gè)清爽。
xj8.jpg
優(yōu)雅程度是沒(méi)得說(shuō)了。不懂優(yōu)雅的人很難理解的高度。
不過(guò)信捷這類的小PLC性能太低,其它方面耗費(fèi)了我太多精力, 這些技巧很難用語(yǔ)言傳授給他人。另外,用過(guò)信捷的人也太少。
所以還是回到應(yīng)用最廣的西門子S7-1200或者S7-200 SMART探討這個(gè)問(wèn)題,受眾會(huì)更多一點(diǎn)。 近期打算做一次直播講座,演示如何通過(guò)我對(duì)雙線圈上述的解析, 實(shí)現(xiàn)不再需要手自動(dòng)模式切換。
地點(diǎn):雙線圈微信群
目前, 群成員有33人, 包含了前幾次參加了雙線圈講座的所有學(xué)員。 然后這回200人以內(nèi)均可以免費(fèi)參加,即掃群二維碼進(jìn)群即可。
還有需要聽講座的,可以期待下一期的講座,會(huì)再成立專門的講座微信群。
有一些平臺(tái)不許發(fā)二維碼, 見文后請(qǐng)到另外搜索找到。
正式的直播時(shí)間, 會(huì)在群中通知。
以后還有直播, 會(huì)在公眾號(hào)《PLC標(biāo)準(zhǔn)化編程》中群發(fā)信息通知,敬請(qǐng)關(guān)注。