本文接《為什么我離開了PLC編程行業(yè)(上)》內(nèi)容。
在截止日期前一周,當(dāng)大部分故障排除工作完成時(shí),外部工程公司的項(xiàng)目經(jīng)理提出要求,在PLC程序中實(shí)現(xiàn)手動模式:必須能夠在顯示屏上輸入代碼,選擇電機(jī)、泵、閥門,將這些設(shè)置為手動模式,并切換這些執(zhí)行器的輸出。這是一個巨大的變化,為了實(shí)現(xiàn)這一點(diǎn),我必須將所有輸出執(zhí)行器移出單個步驟,并在將位輸出到實(shí)際執(zhí)行器之前,將其與條件自動/手動模式位相結(jié)合。更改這將非常耗時(shí)。我當(dāng)然提出了反對意見,但項(xiàng)目經(jīng)理堅(jiān)持要求必須加入這個手動模式。我正考慮給高級工程師打電話。
為什么我沒打呢?我在想……這種整個編程方法根本毫無意義。中央步進(jìn)控制FB寫得非常緊湊,雖然你可能會在PLC中使用極端智能的編碼來節(jié)省空間,并允許使用更小的PLC型號,但節(jié)省空間就會寫出無法閱讀的代碼,然后又浪費(fèi)更多空間去寫冗余代碼,這是沒有意義的。我不得不花費(fèi)數(shù)月時(shí)間輸入所有這些條件和執(zhí)行器的列表,這既令人沮喪又耗時(shí),而且最終證明在需要更改時(shí)非常不靈活,就在我要做的第一個項(xiàng)目中就遇到了這個問題。中央步進(jìn)控制FB沒有按預(yù)期工作,這非常奇怪,因?yàn)槿绻教幎荚谑褂茫敲此鼞?yīng)該能夠正常工作。在截止日期前一周才提出手動模式的要求,這完全出乎意料。如果這種編程方式到處都在使用,項(xiàng)目經(jīng)理怎么可能不知道這個請求將意味著需要更改編程呢?現(xiàn)在我知道,我應(yīng)該要求把這些要求的更改寫在紙上,這樣就不會有任何爭議了,但請記住,我剛從大學(xué)畢業(yè),我不知道該如何處理這種情況。但回到問題上:為什么我沒有給高級項(xiàng)目經(jīng)理打電話?再想一想……這五個月來,我一直在輸入這些無聊的條件和執(zhí)行器的列表……我真的想把這個作為職業(yè)嗎?
我記得我在大學(xué)期間參加的PLC課程。我們有做過這些PLC編程練習(xí)。因?yàn)槲以诟咧袝r(shí)就已經(jīng)做過一些PLC編程,所以我知道有一種簡單的方法可以避免復(fù)雜的梯形圖邏輯編程:只需使用標(biāo)記定義狀態(tài),當(dāng)滿足下一個步驟的條件時(shí)設(shè)置下一個標(biāo)記,并使用反轉(zhuǎn)標(biāo)記來重置前一個步驟的標(biāo)記,很容易做到。我們的小組是所有小組中最快完成這些練習(xí)的。當(dāng)老師發(fā)現(xiàn)我使用這種方法時(shí),她給我布置了特別的作業(yè),要求我不能使用這種狀態(tài)編程方法,以讓我改掉這種編程習(xí)慣!現(xiàn)在,兩年后,我在這里,面對著這一大堆復(fù)制的代碼,根本沒有更改的余地,因?yàn)槿绻倚枰谝粋€步驟FB中更改某些內(nèi)容,為了保持一致性,我必須在所有步驟FB中都進(jìn)行更改……這不是很諷刺嗎?這顯示了基于狀態(tài)的編程實(shí)際上是多么低效和不靈活。我必須做出決定。
我評估了更改以允許集成手動模式而無需重寫所有內(nèi)容的可能性。有一個解決方案:你可以在當(dāng)前掃描周期中再次重寫輸出,因?yàn)榫彌_輸出只有在掃描周期結(jié)束時(shí)才會寫入到實(shí)際輸出中。這是一個糟糕的設(shè)計(jì),因?yàn)楝F(xiàn)在你必須跟蹤PLC程序中哪個輸出是實(shí)際寫入的。這可以避免重寫所有的步驟FB,但有一個問題:我必須避免程序在手動模式下跳轉(zhuǎn)到下一步。不運(yùn)行中央步驟控制FB是不行的,因?yàn)橛行┹敵鲆蕾囉诓襟EFB內(nèi)的輸入:這是一個Mealy型狀態(tài)機(jī),而不是Moore型。還剩下兩個選項(xiàng):在每個步驟FB的下一步中添加手動條件,但這樣做我必須更改每個步驟FB。因此,重寫中央步進(jìn)控制FB的代碼以避免在手動模式下步進(jìn)是剩下的最后一個選項(xiàng)。這花了一天時(shí)間,實(shí)施后我沒有遇到任何問題。
然后是對最新代碼的測試,因?yàn)槲冶仨毺砑舆@個手動模式代碼,而且我們只剩下一周時(shí)間了,我們必須熬夜進(jìn)行測試和故障排除,直到每天凌晨三四點(diǎn)。這包括在比利時(shí)奧瓦爾附近阿爾登地區(qū)冬季可能最冷的酒店房間里夜間編寫代碼。請注意,如果外部工程公司的項(xiàng)目經(jīng)理沒有要求手動模式,這個項(xiàng)目上周就已經(jīng)完成了。周日下午,也就是截止日期的前一天,它準(zhǔn)備好了,在短短5周多一點(diǎn)的時(shí)間里,它已經(jīng)完全編程、實(shí)施并測試完畢。
周一早上,我所在公司的部門主管給我打電話,詢問項(xiàng)目的進(jìn)展情況。我回答說我們遇到了很多問題,但項(xiàng)目已經(jīng)完全實(shí)施并投入使用了。他要求我明天到現(xiàn)場去。第二天他并沒來現(xiàn)場,這讓我感到奇怪。那天我還與外部公司的項(xiàng)目經(jīng)理通了電話,那次通話中并沒有提到什么緊急的情況。
那天晚上,我被叫到了人力資源部。人力資源部的人說他們聽到了關(guān)于我的一些不好的事情,說我很固執(zhí)己見。之后我一直在問自己這些問題:難道我沒有向外部公司的項(xiàng)目經(jīng)理抱怨過他們沒有提前要求手動模式,導(dǎo)致我不得不重寫步驟控制功能塊(FB)嗎?難道我沒有向她解釋過我必須更改步驟控制FB才能讓手動模式正常工作嗎?為什么部門主管沒有問我對發(fā)生的事情的看法?為什么截止日期剛好設(shè)定在我6個月試用期結(jié)束的前一天?為什么部門主管一開始就沒有為這個項(xiàng)目指派項(xiàng)目經(jīng)理呢?
一些觀察:我很確定部門主管沒有看過我的代碼,因?yàn)椋何沂窃诰薮蟮臅r(shí)間壓力下決定重寫這個步進(jìn)控制FB的,而且這些更改可以很快恢復(fù)。我說的只是一頁AWL代碼!我沒有告訴他,所有的更改都只在我的筆記本電腦上,直到他不在辦公室的最后一天。此外,我還記得有一次部門主管非常粗略地審查了我的代碼,只花了最多10秒鐘,還有另一次他處理了一個5周的工作,他說他可以在一個周末完成。這絕對是我職業(yè)生涯中遇到過的最糟糕的雇主。他沒有提供任何指導(dǎo),只是利用我來輸入成千上萬行枯燥的代碼。
這些事件讓我重新考慮了我的職業(yè)生涯。很可能我只是被雇來做那些枯燥的錄入工作,以減輕他們的工作負(fù)擔(dān)。顯然,這種編程方式的真正意圖是為了讓某人能夠輕易地被替換,這在PLC編程中是非常容易的。自動化領(lǐng)域是一個非常保守的領(lǐng)域:公司對PLC技術(shù)的主要擔(dān)憂是其可靠性和可用性。公司寧愿堅(jiān)持使用已經(jīng)證明可靠且不僅替換零件容易獲得,而且程序員數(shù)量也眾多的昂貴PLC技術(shù)(提示:西門子)。很多PLC程序員只是技術(shù)人員,只是用于現(xiàn)有基礎(chǔ)設(shè)施的維護(hù)。這意味著我必須與很多愿意接受更低工資的人競爭。這顯然不是一個最好的工作環(huán)境,所以我決定換一個領(lǐng)域。
我決定換到網(wǎng)絡(luò)領(lǐng)域。互聯(lián)網(wǎng)剛剛開始興起并變得流行起來,這是一個充滿新技術(shù)且正在成為主流的令人興奮的新領(lǐng)域:TCP/IP、思科、網(wǎng)絡(luò)瀏覽器、防火墻、Linux、Windows NT、代理服務(wù)器、Exchange、電子郵件。
我申請了一家翻譯公司的初級職位,負(fù)責(zé)管理公司的網(wǎng)絡(luò)和服務(wù)器。兩周內(nèi)我就找到了新工作,而且薪水更高。我記得我去應(yīng)聘的那天,當(dāng)我走進(jìn)大樓的門廳時(shí):我看到大樓是這家公司與另一家公司共享的。左邊是翻譯公司的標(biāo)志,但右邊竟然是我過去五個月一直在為其工作的那家外部工程公司的標(biāo)志!……
說真的……(想想看,我們國家有十幾萬家公司!)
所以你可以想象,一年后,我遇到了去年一起工作的項(xiàng)目經(jīng)理。我問她項(xiàng)目后來怎么樣了,我寫的代碼是不是都被扔掉了?她說:“沒有沒有,你的代碼里有很多非常棒的想法!”
如今,當(dāng)我再次審視自動化行業(yè)時(shí),我看到了這些工業(yè)PC,它們在Windows機(jī)器上運(yùn)行著實(shí)時(shí)內(nèi)核,速度比PLC快得多。但當(dāng)我檢查編程環(huán)境時(shí),發(fā)現(xiàn)同樣的編程技術(shù)仍然適用。雖然實(shí)施了一些改進(jìn)(比如IEC 61131-3、面向?qū)ο缶幊痰取?,但當(dāng)我嘗試屏幕編程時(shí),我想起了在SCADA工作時(shí)那種同樣的恐懼:處理GUI元素是多么的不靈活。
如今,當(dāng)我審視專業(yè)的IT世界時(shí),我看到了所有這些技術(shù)正在以非常結(jié)構(gòu)化的方式改變著這個領(lǐng)域:大規(guī)模葉脊數(shù)據(jù)中心、虛擬化、融合、去重、Docker、軟件定義網(wǎng)絡(luò)、微分段、軟件應(yīng)用、Puppet、云網(wǎng)絡(luò)等等,不一而足。在編程方面,Python正在向前發(fā)展,并推動著像lambda、列表推導(dǎo)式、生成器、裝飾器等函數(shù)式編程概念。新的數(shù)據(jù)庫概念如NoSQL已經(jīng)出現(xiàn)。非常快速的開發(fā)和交付流程被廣泛應(yīng)用。下一代網(wǎng)絡(luò)技術(shù)物聯(lián)網(wǎng)(IoT)將更進(jìn)一步改變格局:現(xiàn)在你將得到所有這些內(nèi)置無線網(wǎng)絡(luò)的設(shè)備。然后還有數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)……
與IT行業(yè)相比,PLC行業(yè)缺乏新的PLC編程概念,而這些概念本可以極大地改變這個行業(yè)。原因顯而易見,維護(hù)和保養(yǎng)現(xiàn)有設(shè)備的優(yōu)先級高于嘗試一些新的技術(shù),并且需要冒著這種技術(shù)失敗時(shí)沒有支持的風(fēng)險(xiǎn)。它仍然是一個非常代代相傳的行業(yè)。所以,如果問我我還愿意回到自動化行業(yè)嗎?不,我不打算再回到PLC編程了,但對于那些愿意進(jìn)入這個行業(yè)的人,請三思:“軟件正在吞噬世界”。這種情況會持續(xù)多久,我不知道。
后續(xù)
自從我寫下這篇文章后,我一直在問自己,我究竟在什么時(shí)候能夠意識到這種微觀管理其實(shí)是為了控制,而不是為了支持管理。第一件奇怪的事情是,項(xiàng)目工程師在逆向工程狀態(tài)圖,因?yàn)樗究梢韵蛲獠抗こ坦舅饕@些圖,但這僅僅表明了一次遷移。我收到的第一個實(shí)際暗示是在我前往設(shè)施之前與經(jīng)理的最后一次通話中。在解釋完我要做的事情后,他突然跳到另一個話題上。他說在這個項(xiàng)目之后,他會繼續(xù)和我一起工作,將他基于狀態(tài)的S5編程方案遷移到新的S7編程語言。當(dāng)他在解釋這件事的時(shí)候,我問自己:“為什么你現(xiàn)在要談這個?”S7語言大多是向后兼容的,所以他可以在10分鐘內(nèi)遷移他那只有20行的步驟控制塊。不幸的是,我在測試期間忘記了這次簡短的對話。回想起來,現(xiàn)在很清楚這次遷移工作是多么微不足道,這也直接表明他只是想讓我相信他在項(xiàng)目結(jié)束后還想繼續(xù)雇用我。這件事發(fā)生在我職業(yè)生涯的早期,當(dāng)時(shí)我以為發(fā)生在我身上的事情都是正常的。現(xiàn)在,隨著我的工作經(jīng)驗(yàn)越來越豐富,我可以說我的第一直覺大多是正確的,而自我懷疑往往是我背叛自己的原因,換句話說:當(dāng)事情不合邏輯時(shí),背后一定是有原因的。
現(xiàn)在,這些事情給我上了一堂人生課。看看這些事情:經(jīng)理真的從這種策略中受益了嗎?實(shí)際上沒有:他不僅解雇了正在從事他項(xiàng)目的工程師,而且最可能的結(jié)果是項(xiàng)目經(jīng)理接替了這個角色,不得不“糾正”一切。我知道這件事的結(jié)果,他在我被解雇后的第二個月就決定離開公司了。所以項(xiàng)目經(jīng)理只是看了看我的工作就決定離開了。巧合嗎?我認(rèn)為不是。對我來說,這開啟了我職業(yè)生涯中的一條新道路,我再也不會僅僅根據(jù)事情呈現(xiàn)給我的樣子來假設(shè)它們了。
作者:Jurgen Kobierczynski





