前幾天,有群友在群中提了一個(gè)疑問(wèn)。
他做的MODBUS通訊的程序,原本只需要從通訊中讀來(lái)1個(gè)字/位,然而卻發(fā)現(xiàn)交叉引用中提示占用了4個(gè)字節(jié), 即一個(gè)DWORD,問(wèn)是怎么回事。
大致如圖所示。
然后群友們的回答各種各樣,有猜測(cè)變量在別的地方占用的,也有其它各種猜測(cè),莫衷一是。
我就回復(fù)提醒說(shuō), 你把上面的count改為20,或者100,看看會(huì)怎么樣。
他改過(guò)之后更懵逼了,交叉引用提示的還是只有4個(gè)BYTE被使用。我都要讀寫(xiě)100多個(gè)字了,怎么還提示4呢, 其它的占用咋不提示呢?? ? ? ? ?
我就把文章的題目作為總結(jié)和忠告告訴了提問(wèn)題的網(wǎng)友和所有群友們,以及再次忠告所有的同行。? ? ? ?
即, PLC編程軟件中提供了交叉引用工具,便于你查找變量的使用情況。然而,這個(gè)工具的統(tǒng)計(jì)是不精確的。你不可以把他當(dāng)成智能的讀程序機(jī)器人,甚至還指望它幫你檢查程序?qū)﹀e(cuò)。? ? ? ? ?
尤其對(duì)指針等的應(yīng)用,通常交叉引用是無(wú)能為力的。比如上面的程序段,其實(shí)調(diào)用的就是指針。這就要求程序的設(shè)計(jì)者,在設(shè)計(jì)規(guī)劃程序時(shí),對(duì)指針的訪問(wèn)區(qū)域必須自己有嚴(yán)格清晰的限定,而不能全指望交叉引用幫你管理和發(fā)現(xiàn)問(wèn)題。? ? ? ? ?
對(duì)于指針使用,除了上述的直接使用&VB100之外,還可以先將其送到寄存器比如AC0中,而程序塊的管腳使用這個(gè)寄存器AC0,得到的運(yùn)行效果是一樣的。
如圖:
更進(jìn)一步,你還可以在程序運(yùn)行中監(jiān)控這里的數(shù)值,比如讀到的會(huì)是類似16#8000064之類。我這里PLC沒(méi)有在線,就不驗(yàn)證具體數(shù)值了, 有志者自行在線驗(yàn)證數(shù)值正確。? ? ? ? ?
然后我們?cè)儆眠@個(gè)數(shù)值替代程序中的&VB100或者AC0, 再次運(yùn)行, 程序的運(yùn)行結(jié)果仍然是相同的。? ? ? ? ?
然而,這時(shí)候再去檢索交叉引用里的字節(jié)使用,會(huì)發(fā)現(xiàn)別說(shuō)4個(gè)字節(jié)了, 完全找不到使用的痕跡了。
這是一個(gè)技巧。如果之前沒(méi)有掌握的人,可以趁機(jī)了解一下。
這項(xiàng)技巧是個(gè)雙刃劍。即可以實(shí)現(xiàn)正反兩方面的功能。 ? ?
比如你要在程序中做點(diǎn)手腳,不希望后面讀程序的人輕易發(fā)現(xiàn),就可以使用這種方式。
而另一個(gè)方面,程序的功能中,需要使用一整片的V區(qū)數(shù)據(jù),然而使用完了以后會(huì)立即恢復(fù)其原貌,所以本質(zhì)上并沒(méi)有使用,只是暫時(shí)借用。那么也可以用這種手法來(lái)實(shí)現(xiàn)。這樣正常審查程序時(shí)程序會(huì)比較干凈,自己也不會(huì)被交叉引用中大片無(wú)效的變量使用而干擾。? ? ? ? ?
最后這一段比較繞,對(duì)SMART 200編程使用不深的用戶可能難于理解。不過(guò)我的新書(shū)《西門子S7-200 SMART PLC編程技巧精粹》副標(biāo)題:“給SMART插上FB的翅膀”,書(shū)中有對(duì)這一技能做了比較詳盡的描述。? ? ? ? ?
書(shū)稿是在6月底交給出版社的,最近反饋的消息已經(jīng)在復(fù)審階段,到正式出版還需要一段時(shí)間,讀者們?cè)偕晕⒛托牡却? ? ? ? ?
上面碎片的技術(shù)話題到此結(jié)束。? ? ? ? ?
后面是講道理的環(huán)節(jié)。本來(lái)按照常規(guī)的定式,應(yīng)該是先把道理講完,然后再講案例的。然而咱們有一些同行,不喜歡看道理,大篇幅的邏輯的話會(huì)因?yàn)椴荒蜔┒床幌氯?。那就可以現(xiàn)在就關(guān)閉不看了。??
我為什么要把這點(diǎn)技術(shù)細(xì)節(jié)專門拿出來(lái)講解?因?yàn)檫@個(gè)話題又再次印證了我講過(guò)的標(biāo)準(zhǔn)化編程可以不使用交叉引用的觀點(diǎn)。見(jiàn)文章《【萬(wàn)泉河】PLC高級(jí)編程:拋棄交叉索引》? ? ? ? ?
同時(shí),這也是我總結(jié)的工控行業(yè)五連鞭技能的1/5的內(nèi)容。
萬(wàn)線圈, 不用MT, 不用交叉索引, 不用IO映射, 不用UDT?!た匦袠I(yè)五連鞭
五連鞭中的第一條萬(wàn)線圈,本質(zhì)上是不畏懼雙線圈,如何避免雙線圈錯(cuò)誤的方法。所以5條技能的主題全部是否定式的 “不”。?? ? ? ? ?
而有的同行可能是只讀題目,根本不會(huì)去仔細(xì)閱讀理解全文的內(nèi)容。然后就在后面各種回復(fù):UDT挺好的呀, 你是不是不會(huì)用??!是不是不會(huì)用交叉索引???廠家設(shè)計(jì)了M和T你還不用,還不讓人用,太霸道了。你咋不去跟廠家建議把這些功能取消呢!? ? ? ? ?
這些同行們都是基本邏輯理解能力有問(wèn)題。忽略了我在講到這些技能的時(shí)候,都有基本的前提條件:標(biāo)準(zhǔn)化編程煙臺(tái)方法。? ? ? ? ?
而這些被我摒棄的功能中,有的是隱含了殺雞不用宰牛刀,有的是因?yàn)榧寄芴岣吆?,可以廢棄不用的工具,其中一些工具的使用帶來(lái)便捷的同時(shí)還帶來(lái)了更多麻煩。? ? ? ? ?
比如老祖宗講殺雞不用宰牛刀的時(shí)候,他聽(tīng)不到前半句殺雞的前提,只看到了不用宰牛刀,就覺(jué)得很驚訝,為什么不用宰牛刀,我家里要?dú)⑴#?你不讓用,是不是壞?你有牛刀而不用,是不是傻?? ? ? ? ?
另外還有一個(gè)道理:質(zhì)疑和否定別人的觀點(diǎn), 并不會(huì)使自己顯得更高明更偉大。? ? ? ? ?
我這兒寫(xiě)幾千字的文章, 有人在后面回復(fù)區(qū)區(qū)幾十個(gè)字不認(rèn)可不接受,只能表示他自己的理解能力還沒(méi)有達(dá)到水平。有的時(shí)候我的回復(fù),只是在幫助他, 或者幫助其他的圍觀讀者,以防他們被誤導(dǎo)。而其實(shí)我對(duì)這些雜音壓根兒都不當(dāng)回事的。? ? ? ? ?
要想引起我的重視,很簡(jiǎn)單,對(duì)等的寫(xiě)和我一樣長(zhǎng)度的旗幟鮮明觀點(diǎn)的文章或者案例故事,發(fā)表在你自己的專欄,博客,公號(hào),或者只不過(guò)是一篇論壇帖子,也可以。? ? ? ? ?
就像我的導(dǎo)師(爺爺)錢偉長(zhǎng)先生,曾經(jīng)和他的弟子胡海昌院士關(guān)于《廣義變分原理》的學(xué)術(shù)觀點(diǎn)有過(guò)長(zhǎng)達(dá)十幾年的論戰(zhàn),都是通過(guò)在科學(xué)期刊上長(zhǎng)篇論文的形式。學(xué)術(shù)的觀點(diǎn)對(duì)錯(cuò)與我們無(wú)關(guān),是否有個(gè)人誤會(huì)也無(wú)所謂,但這種論戰(zhàn)方式至少是對(duì)等的。? ? ? ? ?
比如最近就有一些文章發(fā)表的觀點(diǎn),比如“我為什么要用T”, “我為什么也不用M”,“我為什么也不用IO映射”,“我為什么用了IO映射”等等,雖然有個(gè)別的并不是在講普遍道理,而只是講述了他遇到的特殊應(yīng)用需求?;蛘哂械氖歉业挠^點(diǎn)相左,有的則是跟我觀點(diǎn)相同。? ? ? ? ?
這些都很好,都很令我欣賞。? ? ? ? ?
經(jīng)常有人拿這些同行的文章轉(zhuǎn)發(fā)給我看,看看又有人反對(duì)我了,支持我了,或者直接在復(fù)制轉(zhuǎn)發(fā)我的文章而不署名,我說(shuō),不管是反對(duì)還是支持這些都無(wú)所謂。? ? ? ? ?
編程技術(shù),是個(gè)極易驗(yàn)證的行業(yè)。正確的方法可以很容易驗(yàn)證正確,錯(cuò)誤的方法也很容易被證偽。(題外話,這不是一個(gè)非常高深莫測(cè)的高科技行業(yè))。那些發(fā)表的和我相同的言論,可以從時(shí)間間隔長(zhǎng)度上可以看到差距。比如是相差1年,2年還是5年6年?當(dāng)然,如果一直沒(méi)人發(fā)表同樣觀點(diǎn), 那也只是在不斷增加這種差距:5,10,15,20 ….? ? ? ? ?
而那些相反的言論,有沒(méi)有拿出證偽我的觀點(diǎn)或者方法不可行的證據(jù)?如果沒(méi)有, 那也只是給他自己立了個(gè)標(biāo)簽,證明XXXX年XX月XX日,XX人還未掌握XX技能。所以有人以為我遇到了反對(duì)意見(jiàn)會(huì)很生氣到跳腳,那是誤會(huì)。恰恰相反,我會(huì)很高興。這是證明差距的最好的證據(jù)了,我樂(lè)都來(lái)不及呢!? ? ? ? ?
而有能力對(duì)我所有文章所有觀點(diǎn)證偽的最有力的一擊是,比如某位煙臺(tái)方法的學(xué)員,在閱讀了我的資料或者講座教程后,跳出來(lái)反水,證明我文章所述是空話,我自己都沒(méi)能實(shí)現(xiàn)的技能,自己先在文章中吹牛逼了。? ? ?
有沒(méi)有這種可能?是不是有人很期待這種情況的發(fā)生?? ? ? ? ?
別鬧了, 我寫(xiě)這些文章,更大的用處在于幫助煙臺(tái)方法的學(xué)員學(xué)習(xí)理解和提高。他們通過(guò)學(xué)習(xí)我給的例程,我寫(xiě)的書(shū), 畢竟所涵蓋的行業(yè)范圍還是有限,有時(shí)候一些細(xì)節(jié)沒(méi)能提及,那么通過(guò)這些小短文,可以給他們多重印證的機(jī)會(huì)。? ? ? ? ?
而外人不知道的是, 在學(xué)員群中,經(jīng)常有學(xué)員不堪忍受所在的公司所在的行業(yè),被逼迫使用一些所謂的行業(yè)模板框架,而被其中海量的多層嵌套的UDT給惡心到,或者為了讀垃圾程序被交叉索引給繞到頭暈,跑學(xué)員群中發(fā)牢騷發(fā)泄,然后其他學(xué)員們?cè)谕榈耐瑫r(shí),發(fā)出不懷好意的笑聲。
審核編輯:黃飛
評(píng)論
查看更多