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