0822 【萬(wàn)泉河】解讀一個(gè)用循環(huán)法PK萬(wàn)泉河80模擬量例子的例子程序
大約兩個(gè)月前,寫(xiě)過(guò)一篇文章:
《0628 【萬(wàn)泉河】?jī)?yōu)雅的PLC程序一定是用EXCEL寫(xiě)出來(lái)的》,其中介紹了我用EXCEL做出80個(gè)模擬量轉(zhuǎn)換程序。
眾多網(wǎng)友看到后,大呼有收獲。
然而也有另外一批同行, 見(jiàn)到我的程序之后,直呼笑掉大牙。 嘲笑我竟然連循環(huán)語(yǔ)法都不會(huì)。 所以,經(jīng)常在一些微信群中,遇到一些熱心網(wǎng)友要教給我循環(huán)語(yǔ)法。
然后我就說(shuō),不要只看循環(huán)的那三五句語(yǔ)法,不要做口炮黨,動(dòng)下手,你們按同樣的變量表,把同樣功能的程序做一遍出來(lái)。然后大家比較一下。
然后來(lái)了。
下面從原理開(kāi)始講解一下。
我原始的優(yōu)雅程序,在PLC程序中,就是如圖這樣的簡(jiǎn)單羅列調(diào)用。
循環(huán)派說(shuō),你看看, 后面的數(shù)據(jù)結(jié)果VD1000, VD1004,VD1008是有地址規(guī)律的數(shù)據(jù),可以用指針,間接尋址或者數(shù)組的方式給序列化。 具體方法取決于所使用的PLC平臺(tái)支持情況。 比如SMART 200,就可以用指針。
先把VD1000指針化,送到LD22中, 循環(huán)中調(diào)用一次數(shù)值送到LD22指向的地址, 執(zhí)行完成之后指針增加4, 即指向了VD1004,下一周期即處理了第二個(gè)模擬量數(shù)據(jù)。
如此循環(huán)80次, 即只使用區(qū)區(qū)5-6行語(yǔ)句就實(shí)現(xiàn)了所有模擬量的處理。 而如果數(shù)量有改變,比如改為800個(gè),那也只是把上面的循環(huán)數(shù)由80改為800即可。
即
然而,事情其實(shí)并非如此簡(jiǎn)單。 不僅輸出側(cè)變量需要序列化, 輸入側(cè)的變量也同樣需要。 首先,量程上下限對(duì)每一個(gè)測(cè)點(diǎn)來(lái)說(shuō)都不一樣,那么就無(wú)法使用固定值, 也需要做成變量組,而輸入的模擬量通道地址,也不會(huì)是完美連續(xù)的。 比如有時(shí)候數(shù)據(jù)來(lái)自通訊。 比如我做例子的時(shí)候有一部分?jǐn)?shù)據(jù)直接來(lái)自VW。
那么需要對(duì)這些數(shù)據(jù)做IO映射處理。 即,模擬量通道部分,分配了VW2000開(kāi)始的數(shù)據(jù)區(qū),量程上下限則分別分配了VD3000,VD4000的數(shù)據(jù)區(qū),分別傳送到指針LD10, LD14, LD18中。
所以, 真實(shí)可用的程序是:
程序行數(shù)增加了一點(diǎn)點(diǎn),忽略不計(jì)。
然而IO映射就沒(méi)有那么容易了。 因?yàn)榈刂凡⒉荒鼙WC規(guī)則連續(xù), 所以必須逐行用MOVE指令來(lái)傳送。 這樣子:
MOVW AI_V064:AIW100, VW2090
MOVW AI_V065:AIW102, VW2092
MOVW AI_V066:AIW104, VW2094
MOVW AI_V067:AIW106, VW2096
MOVW AI_V068:AIW108, VW2098
MOVW AI_V069:AIW110, VW300
MOVW AI_V070:VW2, VW302
MOVW AI_V071:VW4, VW304
MOVW AI_V072:VW6, VW306
總計(jì)有80行程序, 一行都少不了。 我這里只是截取了中間的部分,看到數(shù)據(jù)地址是不規(guī)則的。
而量程上下限,常數(shù)值可以用MOVD方法同樣實(shí)現(xiàn),也可以直接定義到數(shù)據(jù)塊中,數(shù)據(jù)塊增加2個(gè)表量程L和量程H,錄入數(shù)據(jù)分別為:
每個(gè)表分別是80行,80*3=240。
然而這樣的程序是不完整的。 使用掉的V區(qū)數(shù)據(jù)都需要做到符號(hào)表中, 給分配符號(hào)名稱。 就像我原本給QOUT分配到V1000一樣。
那么數(shù)據(jù)工作量為80*3=240行。
這些數(shù)據(jù),以及MOVE指令做IO映射的程序,都需要從EXCEL整理好之后復(fù)制過(guò)來(lái)。 所以可以認(rèn)為其實(shí)數(shù)據(jù)塊和符號(hào)表與程序基本相同的工作量,都是程序的一部分。
所以程序的總量480行比我不用循環(huán)的做法其實(shí)反而增加了400行。
然而,我做程序時(shí)候, EXCEL表格是一次性完成的, 這里需要把工藝變量表拆分到6個(gè)表中,整理好了之后分別復(fù)制6次。這里模擬量處理的輸出部分恰巧是內(nèi)部數(shù)據(jù),所以可以是完整的序列。 而其它類(lèi)的設(shè)備, 輸出部分也需要做IO映射,也仍然需要工作量。
是的。這個(gè)PK程序其實(shí)也仍然是我自己親自做的。 我雖然早就知道這里面的全部的工作量,我寫(xiě)上一篇文章原本就是針對(duì)的某些文章和視頻做的所謂循環(huán)處理技巧,我自己工作中斷然不會(huì)使用,但為了把例子貢獻(xiàn)出來(lái), 還是忍著惡心給完整做了一下。
這個(gè)循環(huán)法實(shí)現(xiàn)的程序,為了爽那一下下的幾句指令,同時(shí)還消耗了V2000-V4000的3000byte的數(shù)據(jù)區(qū)。 而且,程序也仍然沒(méi)有做到徹底標(biāo)準(zhǔn)化。 比如,1000個(gè)byte,只能存放250個(gè)浮點(diǎn)數(shù)數(shù)據(jù),即,如果真的要處理800個(gè)模擬量, 可不是僅僅把80改為800,而是所有數(shù)據(jù)區(qū)規(guī)劃都需要更改。因?yàn)樵镜囊?guī)劃區(qū)不夠用了, 循環(huán)跑不成去了。
而倒過(guò)來(lái), 如果只是8個(gè)模擬量的程序, 現(xiàn)在的這套浪費(fèi)了3000個(gè)數(shù)據(jù)區(qū)的程序, 也是搞笑的。 浪費(fèi)量驚人, 也需要優(yōu)化修改。
所以其實(shí)就是, 你沒(méi)針對(duì)一個(gè)新項(xiàng)目,都需要根據(jù)實(shí)際的模擬量數(shù)量, 重新做數(shù)據(jù)區(qū)優(yōu)化規(guī)劃。
那些嘲笑我,要教我循環(huán)語(yǔ)法的驕傲的年輕人, 只執(zhí)著于跟我演示那三五句語(yǔ)法,我都懶得看,他們卻非常自豪的要反復(fù)演示,以為那已經(jīng)是自動(dòng)化工作頂尖絕技。我反復(fù)提醒他們動(dòng)動(dòng)手把程序做完整的時(shí)候, 理都不理。 還只在那里教育我勿要做井底之蛙, 不曉得天外有天。
指望著那些又輕浮又懶惰的年輕人,我永遠(yuǎn)也得不到跟我PK的樣本。
我這里辛辛苦苦把對(duì)標(biāo)PK的例子程序做出來(lái),提供給那些懶得動(dòng)手的循環(huán)派年輕人,如果我了解有偏差之處,還可以在我基礎(chǔ)上再修改完善,哪些工作是因?yàn)槲矣薮雷龆嗔耍?可以做減法刪除掉, 這樣對(duì)他們來(lái)說(shuō),就不會(huì)畏懼親自動(dòng)手了。
每一個(gè)年輕人,未來(lái)要有成長(zhǎng),在勤奮與聰明之間,必須擁有一樣。 而且很多時(shí)候勤奮比聰明還更重要一點(diǎn)。 尤其是你怎么點(diǎn)化都不能領(lǐng)悟的自以為是的小聰明。
我這里把PK80程序同樣放到80工位雙聯(lián)開(kāi)關(guān)QQ群文件中,群1已經(jīng)滿員, 群2還有空位,可以申請(qǐng)加入870566908后獲取。
0822 【萬(wàn)泉河】解讀一個(gè)用循環(huán)法PK萬(wàn)泉河80模擬量例子的例子程序.pdf (138 K) 下载次数:187