依你的發問內容來說,不是單純分析程式,是在做逆向工程這種勞心勞力的工作
做逆向工程不容易,基本上被交代這種難搞的任務,請先評估一下自己能掌握的資源和時間有多少?自己的能力到何種程度?
沒掌握到一定程度以上的資源和能力,時間又很緊迫時,這種任務能推辭就儘量推掉,不要自找麻煩;若是時間充足又想多學點東西就另當別論
逆向工程要具備的能力是什麼?
第一就是耐心,逆向工程是曠日廢時勞心勞力的工作,沒有相當的耐心絕對做不下去
第二就是知識,PLC和LabVIEW程式大多和機器設備或儀器關連,相關的知識雖不要求專精,最少也要有一定程度的了解,或有可以隨時查閱的手冊資料;或是有具備這些知識可以配合的團隊
接下來說明分析、改寫或重寫PLC和LabVIEW程式的部分,步驟流程是實際操作過的經驗,因為是個人體驗其他人不一定適用,所以僅提供參考
首先PLC程式分析、改寫或重寫的部分,依我做過的經驗有幾種狀況:
1.老舊機器設備需要重新配電,或是要研究仿製其他廠商的機器設備:前者通常控制電路多是傳統工配沒用到PLC,或是PLC型號已停產很久無法讀取PLC程式碼。後者更別想說能拿到PLC程式碼,大多數廠商機器的PLC程式碼都保護的很好;研究仿製其他廠商的機器設備是否有侵權的問題不在討論之內,我做過的類似案子幾乎都是大專院校或政府相關單位的委託,仿製國外有而台灣沒有的設備。大多數還會加上一堆不知是否用的上的功能,骨子裏差不多,但已可算是不同的設備,基本上該避開的關鍵部分還是會避開改寫
這種情況下主要是重寫PLC程式:最大的問題大概就是惟一可供參考的資訊只有機器設備,分析非常耗時。好處是可以用自己熟悉型號的PLC來重寫程式
做這一類的案子要有一定程度的工業配電、氣液壓控制、機械機構的知識
操作流程:
a.觀察並記錄機器設備的所有動作順序流程:這是最基本必做的,能就近觀察機器設備的動作並記錄最好;我做過的類似案子更多是只有影片可看,委託的政府相關單位連原型機都沒有,真的是只看影片去推測該機器設備的動作順序流程
b.有實體機器可看時,打開電控箱,詳細記錄設備上所有輸入(光電開關、按鈕、人機螢幕...等)和輸出(電磁開關、電磁閥、人機螢幕...等)線路的編號;若是傳統工配的控制線路,同時再畫成電路圖;若是PLC型號已停產很久的機種,就記錄對應的控制元件在PLC上使用的輸出入接點編號;沒有實體機器可看時這一步驟可跳過
c.接下來就是整合前兩個步驟的資料寫程式
其中使用傳統工配的控制線路若已畫成電路圖,要寫成PLC程式相對較簡單。輸入元件(光電開關、按鈕...等)電路接腳對應到PLC的輸入接點,輸出元件(電磁開關、電磁閥...等)電路接腳對應到PLC的輸出接點,間接輔助控制元件(繼電器、固態電驛...等)對應到PLC的內部輔助接點。計時或計數器則保留電路接腳對應到PLC的輸入接點,或是改用PLC內的計時或計數器
其他有使用PLC但拿不到PLC程式碼的機器設備,就只能以記錄的所有動作順序流程重寫PLC程式
2.老舊機器設備找不到原廠商維修,原廠商有留下的程式碼和詳細註解,PLC型號已停產很久必需使用新型的PLC或是其他廠牌的PLC改寫程式
做這一類的案子需要的是多種廠牌PLC的知識,了解不同廠牌PLC間相對應功能的應用指令和用法的差異
操作流程:
a.若是同一廠牌的PLC,通常新型仍會相容或沿用舊型的指令,甚至程式不用改寫即可沿用
b.若是不同廠牌的PLC,先把接點編號作轉換,其次轉換應用指令;一些應用指令在不同廠牌的PLC間使用方法不同,可能要改寫成具有同功能的程式
3.有拿到PLC的程式碼,但沒有任何註解說明文件,連動作流程或用途也不明
這種情況遇多了也摸出一些較快的處理流程;不過有些人寫程式可能怕別人研究,會留下很多謎之程式片段。就曾遇到某一程式是原先配合廠商寫的,因為對方要到大陸發展,就把程式留下要我自己處理後續維修問題。結果在一個月分析完後才發現,有超過一半以上程式是沒有在動作的。遇到這種程式只能用耐心和毅力來處理
操作流程:
a.先瀏覽大致判斷程式是傳統式的寫法還是SFC的寫法,有沒有用到ST語法;有使用到ST語法的部分我會先跳過不分析,因為分析的難度較高;然後找出程式中是否有宣告使用到特殊模組,從程式宣告的內容可以判斷使用的是哪一種特殊模組
b.若是是SFC的寫法,分析比較簡單,不過依PLC廠牌和使用軟體的新舊版會有一定的難度;例如三菱PLC舊版軟體FXGPWIN和新版軟體GPPW或GX Works寫的SFC程式就有很大的差別,歐姆龍PLC寫的SFC也有自己的語法
SFC分析首先要先找出"起始步進點",從"起始步進點"找出轉移到下一"步進點"的編號和轉移條件,依這順序找出所有"步進點"的先後次序,從"步進點"的先後次序就可以大致了解整個程式的動作流程
其次再一一分析每個"步進點"內的接點動作,就可以了解整個程式的內容
c.若是傳統式的階梯圖寫法,我分成已知道輸出接點動作次序和不知道輸出接點動作次序兩種,分析較複雜;還有要了解PLC程式是否有配合人機或PC電腦控制,在後續分析時是重點
已知道輸出接點動作次序:從優先動作的輸出接點逆推找出控制動作的接點,依序逆推往上找直到最源頭的輸入接點。當所有輸出接點都逆推找出最源頭的輸入接點時,整個程式也就分析完畢了;在分析完程式後還會發現有些程式片段不在動作流程內,這些程式片段大約都是"初始化"或"無用"的程式
不知道輸出接點動作次序:從編號最小的輸出接點逆推找出控制動作的接點,依序逆推往上找直到最源頭的輸入接點。當所有輸出接點都逆推找出最源頭的輸入接點時,整個程式的動作次序也分析完畢了;在分析完程式後還會發現有些程式片段不在動作流程內,這些程式片段大約都是"初始化"或"無用"的程式
另外逆推往上找到最源頭的輸入接點若是內部輔助接點,而不是實體輸入接點時:若PLC程式有配合人機或PC電腦控制,那內部輔助接點就應該是由人機或PC電腦控制的接點。若PLC程式沒有配合人機或PC電腦控制,那段程式就有可能是"無用"的程式
要特別注意的是傳統式階梯圖寫法,程式碼的所在上下位置會影響到執行結果;PLC程式的執行順序是由上到下,同一個輸出接點若有多個控制接點,那每次PLC程式掃描執行時,是以底下有動作中的控制接點為輸出結果
在能拿到程式碼的情況下,整個分析流程如下圖
LabVIEW程式分析、改寫或重寫的部分:
LabVIEW程式分析的重點是,要謹記LabVIEW是資料流控制,有疑問時就先找出連接的資料類型是否正確;資料類型通常來說,大多是單橘線或雙橘線(DBL倍精數資料),咖啡線(Waveform DBL具有起點、時距與資料),與LabVIEW自己發明的奇怪藍線(Dynamic data)...等等
拿到手的程式先判別程式的複雜度;基本上螢幕畫面不用捲動就能看到全部程式碼,選擇元件(Case Structure)在10層以內的,大都可列為簡單的程式
另外若已知道程式是哪方面的用途,最好還是具備相關的知識才能順利分析;曾有承接一個關於影像的案子,在討論會議中客戶有提供一個Sub VI,並要求程式一定要使用HLS處理。結果除了客戶和我知道HLS是什麼之外,配合的團隊成員居然沒人知道,當下討論會議的氣氛變得很尷尬
1.不管程式是複雜還是簡單,基本上首先在程式面板(Front Panel)找看看是否有開始程式流程的按鈕(不一定會有)
若是有開始程式流程的按鈕,接著在程式碼畫面(Block Diagram)找到對應的按鈕元件,從那個按鈕元件開始查看資料流線條的動向。只要程式不是太複雜,通常都可順利釐清程式的動作流程
若是沒有開始程式流程的按鈕,那就在程式面板(Front Panel)找輸出的顯示元件,找的順序以圖表顯示元件為優先,其次才是數字、文字、布林燈號這些元件。找到輸出的顯示元件後,接著在程式碼畫面(Block Diagram)找到對應的顯示元件,從那個顯示元件開始逆向查看資料流線條的動向。同樣只要程式不是太複雜,通常也都可順利釐清程式的動作流程
2.其次在程式面板(Front Panel)找看看是否有關閉程式或緊急停止的按鈕(不一定會有)
簡單的程式很多是只執行完畢就自動停止的,較複雜的程式往往都有關閉程式或緊急停止的按鈕;若有就在程式碼畫面(Block Diagram)找到對應的按鈕元件,可以分析程式為何在那個流程階段設置停止點
到以上兩步驟為止,主要都是在先了解程式的動作流程。其中儀器廠商提供的Sub VI或是程式作者自己寫的Sub VI先跳過不去研究內容
3.已了解程式的動作流程後,再來是從流程的源頭進一步分析程式;不管程式是簡單或複雜,多少都會分成幾個區塊,可以大約以程式區塊為單位去了解每個區塊的用途
4.若程式中有用到儀器,大多儀器廠商有提供Sub VI和函數及手冊可以使用,可以對照手冊逐步分析那些Sub VI的內容;也有少數廠商只提供手冊沒有Sub VI可用,相關函數要自己網路尋找下載,這就要考驗你對手冊能看懂到什麼程度以及手冊內容是否夠詳細;但有些廠商手冊中完全沒有提到這些重點,這種的只好放棄分析了
至於儀器用到的連接控制介面,不管是RS232、DAQ...或是其他種類的介面,基本上要分析研究前就應該要先學習這方面的知識
曾有某網友詢問程式問題有使用到某德國儀器,代理商提供的原廠手冊中沒有CRC的運算法,代理商也無法諮詢到原廠CRC的正確運算法,原廠也沒有提供Sub VI可用。只憑代理商提供的不完整資料怎樣也測不出結果,只能勸他換家儀器廠商了
5.最後是程式作者自己寫的Sub VI分析;好心的作者大多沒有保護可以看到程式內容,但我接觸過的程式(尤其是大專院校教授寫的)大多有密碼保護,或是屏蔽讓人看不到程式碼內容
程式作者自行製作的Sub VI分析方法如上幾個步驟,但往往混亂而不易看懂,能看懂的原因往往就只是因為他剛好真的夠簡單。如果是初學者,建議在心情好的時候才認真打開Sub VI來看,不然你很可能分析到滿肚子火
若Sub VI有密碼保護,最快的方法是找人破解密碼。不過我從不這麼做,我大多用以下方法
若Sub VI是被屏蔽讓人看不到程式碼內容,先了解Sub VI的接線(Pin definition),分析輸入和輸出的資料類型和資料大小。接著從Sub VI的前後程式大約推測要輸入什麼樣的資料,會輸出什麼樣的結果,可以大約推論出這個Sub VI的動作。然後以推論的結果自己重寫一個新的Sub VI,給輸入一樣的資料,看是否可以得出同樣的結果;若是Sub VI內還包含有其他的Sub VI,或是Sub VI內是調用API或其他函數,這個方法幾乎沒用,分析成功的機率不高
因為技轉的關係我也分析過一些大專院校教授寫的程式,雖然有屏蔽讓人看不到程式碼內容,不過我想說看到執行畫面就可以猜出流程原理的程式有屏蔽的必要?更何況我是承接技轉的廠商,還需要留一手?難怪大專院校技轉出去的東西很難商品化
LabVIEW程式整個分析流程如下圖
留言列表