0803 【萬泉河】巧用程序塊臨時(shí)變量
上一篇文章《0728 【萬泉河】談虎色變雙線圈再談再變》有網(wǎng)友評(píng)論說, 文章題目應(yīng)該叫做巧用臨時(shí)變量,我說, 我舉例的程序中用的都是全局變量,所以不能這么叫。 然而我可以以這個(gè)名字寫一篇文章, 真的是巧用臨時(shí)變量的。
先看芳季大俠寫過的系列文章:
入口在:
擁有屬于自己的指令第一集-技術(shù)視頻免費(fèi)看-西門子工業(yè)1847會(huì)員–西門子中國 (siemens.com.cn)
具體內(nèi)容,里面涉及的知識(shí)點(diǎn)如果有不懂的,可以去仔細(xì)研讀,甚至可以配合文章, 也自己實(shí)驗(yàn)摸索得到。
然而,我是不會(huì)從這樣最基本的步驟一步步開講,我只能把實(shí)際用過的理論方法一步到位給一個(gè)終極的解決方案。 如果芳老師不再出第五集,把我本文的內(nèi)容當(dāng)做其第五集,我給來個(gè)狗尾續(xù)貂也可以。
芳老師在第四集有一張附圖:
本文的內(nèi)容就從這張圖展開。
這張圖的意思是,在系統(tǒng)堆棧中,每一個(gè)同一級(jí)別的子程序TEMP變量同享的是同一片L空間。
這里先多講一點(diǎn)TEMP變量的本質(zhì)是什么?其實(shí)仍然是計(jì)算機(jī)的內(nèi)存RAM。原本作為RAM,是可以被全局訪問的, 只不過軟件系統(tǒng)做了保護(hù)限制, 不允許外部訪問。
多講這一點(diǎn)的意義在于, 對(duì)于一些連子程序功能都沒有, 或者有子程序, 然而子程序功能不如SMART這樣強(qiáng)大的PLC, 主要是西門子之外的一些其他品牌的小PLC, 它們的系統(tǒng)中沒有TEMP變量的時(shí)候,我們通過編程手段自己部署一部分內(nèi)存數(shù)據(jù)區(qū)給當(dāng)做TEMP變量使用。 這時(shí)候,操作系統(tǒng)本身自然不會(huì)限制, 那么我們?cè)诰幊痰臅r(shí)候就要格外小心, 要對(duì)這篇數(shù)據(jù)保護(hù)好。這是題外話。
回到上面的圖片,圖中我用紅色方框圈出來,CDEF四個(gè)子程序,它們是同一級(jí)別的。 那么除了說它們共享L變量空間之外,其實(shí)還有一個(gè)含義, 就是當(dāng)程序執(zhí)行完了子程序C,又進(jìn)入子程序D的時(shí)候, 在子程序D開始時(shí), TEMP區(qū)的內(nèi)容,除了INPUT對(duì)應(yīng)的部分被輸入管腳的值刷新了之外, 其余的所有數(shù)值其實(shí)就是離開子程序C時(shí)的內(nèi)容。
即所有數(shù)據(jù)值,現(xiàn)場被完整保留。
這就是我們平常教育新手的時(shí)候, 總要強(qiáng)調(diào), TEMP的數(shù)據(jù),不要先讀, 不要先讀,不要讀操作在先。 應(yīng)該先寫操作,賦值以后,后面的數(shù)值才是真實(shí)可控的,邏輯才可控。
有的人會(huì)不信, 說自己明明做子程序驗(yàn)證過了,我就是先讀數(shù)值了, 也沒有問題。 那是因?yàn)槟銣y試程序中同一級(jí)別的子程序數(shù)量太少, 可能只有它自己。比如圖中的F。 那么數(shù)據(jù)區(qū)就不會(huì)被別的子程序污染。 你做的邏輯暫時(shí)好用。然而等到了現(xiàn)場, 真實(shí)應(yīng)用中, 子程序多了, 數(shù)據(jù)就混亂了,邏輯就亂套了。
所以, 我經(jīng)常建議對(duì)TEMP變量屬性不熟悉的新手,調(diào)試中遇到疑惑的時(shí)候, 不防在子程序的開始時(shí)候, 把用到的一片TEMP變量全部清零。 后面程序功能都好用,才叫好用。
這是傳統(tǒng)做法。
今天則是顛覆傳統(tǒng),利用前面說的進(jìn)入下一個(gè)子程序后,前一個(gè)子程序的TEMP數(shù)據(jù)現(xiàn)場被完整保留集成的這個(gè)特性,我們可以用來做點(diǎn)文章。才是題目宣稱的巧用臨時(shí)變量。
我在3年前寫過一篇文章,做過程序編程方法征集:
《【萬泉河】有償征集2:S7-200函數(shù)塊BLOCK_MOVE》
https://www.ad.siemens.com.cn/club/bbs/PostStory.aspx?a_id=1574124&b_id=80&s_id=157&num=3#anch需要把一整塊的數(shù)據(jù)用BLOKMOVE的方法傳送到一個(gè)完全封裝的子程序的內(nèi)部。 然而并沒有如愿得到答案。 還是我自己在去年底的時(shí)候,對(duì)TEMP變量思考到上述的內(nèi)容后,得到了解決。
即,數(shù)據(jù)傳送部分下降層級(jí),放到相鄰調(diào)用的前一個(gè)子程序中,直接對(duì)TEMP數(shù)據(jù)BLOKMOVE, 后面的子程序中的TEMP就自然收到了數(shù)值。
空講理論光說不練可能有些難懂。 下面做個(gè)例子來演示下實(shí)現(xiàn)方法以及實(shí)際的應(yīng)用。
通常SMART的子程序的管腳數(shù)量有限制,可能是16個(gè),數(shù)值不精確,但是沒意義,總之系統(tǒng)給的再多,在做標(biāo)準(zhǔn)化庫函數(shù)時(shí)也會(huì)不夠用。所以總要有有擴(kuò)張管腳的需求。
我們有建立一個(gè)子程序叫做“功能塊”:
其原生管腳很少,然而我們把更多的管腳建立到LB10,LB11,LB12的L數(shù)據(jù)區(qū)中。
做一個(gè)“功能塊前處理”的子程序 ,在其中調(diào)用BLOCKMOVE功能:
即實(shí)現(xiàn)了對(duì)內(nèi)部TEMP變量的批量賦值, VB10的數(shù)據(jù)可以作為功能塊的INPUT數(shù)據(jù)使用了。
當(dāng)然,我們還可以做個(gè)“功能塊后處理”,數(shù)值的傳送方向顛倒一下:
那么建立的IN11-IN34的臨時(shí)變量事實(shí)上成為了功能塊的INOUT管腳。
程序的調(diào)用過程變?yōu)椋?br />
如此實(shí)現(xiàn)了給功能塊擴(kuò)張了24個(gè)管腳。 如果還需要更多,則簡單修改即可。
我做的標(biāo)準(zhǔn)化煙臺(tái)方法的分享項(xiàng)目的SMART 200的程序, 在2022年春節(jié)左右,做了一次V2.0的升級(jí), 其中包含了本文講解的技術(shù)方法,使得程序更加簡練,優(yōu)雅, 封裝更徹底。
V2.0的升級(jí)程序不是完整的項(xiàng)目程序,而只是做了一部分功能的演示, 學(xué)員需要在加入學(xué)習(xí)營后,從QQ群文件中自行下載。學(xué)習(xí)掌握之后改進(jìn)升級(jí)到所有程序功能。 在掌握之前,還是仍然可以只學(xué)習(xí)V1.0的方法,以及工程應(yīng)用。其實(shí)只是我一個(gè)人的心結(jié), 追求更優(yōu)雅更完美的程序架構(gòu),實(shí)際功能是一樣的。
0803 【萬泉河】巧用程序塊臨時(shí)變量 (1).pdf (298 K) 下载次数:99