在 Arduino Opta PLC中的階梯邏輯(Ladder Logic)UDFB
用戶定義功能塊(UDFB)之于可編程邏輯控制器(PLC)就像功能之于微控制器一樣。兩者都是用于簡化代碼的結(jié)構(gòu),使其更容易編寫,故障排除和維護。它們也是允許代碼在將來被重用的基本結(jié)構(gòu)。
本文引用地址:http://cafeforensic.com/article/202406/459759.htm本文概述了在Arduino Opta 1中使用的簡單UDFB的構(gòu)造。該UDFB采用Arduino PLC集成開發(fā)環(huán)境 1(IDE) 1.0.3.0版本開發(fā)。本文提出的廣義UDFB思想和程序適用于大多數(shù)PLCs。
什么是UDFB?
UDFB是一種類型的程序組織單元(POU),用于組織IEC 61131-3標準中描述的PLC代碼。從C編程的角度來看,UDFB就像一個具有多個輸入和輸出的函數(shù),其中包括所有變量的static關(guān)鍵字。換句話說,UDFB具有跨函數(shù)調(diào)用存在的內(nèi)存。
為了清楚起見,我們應(yīng)該提到另一種POU,簡稱為“函數(shù)”。與UDFB不同,POU函數(shù)不具有靜態(tài)內(nèi)存的特性。另一種進行比較的方法是使用數(shù)字邏輯語言,UDFB是一個順序電路,而函數(shù)是一個組合(無內(nèi)存)操作。
為了簡單起見,我們有意將該函數(shù)與UDFB合并。從編程的角度來看,函數(shù)的操作可以由UDFB執(zhí)行,而不是反過來。如果可以構(gòu)造UDFB,那么構(gòu)造更簡單的函數(shù)就沒有問題了。
小貼士 :一名機械技師和一名電氣技師正在修理一臺柴油發(fā)動機。工作進行得不是特別順利,因為兩人都認為問題出在對方的技術(shù)人員的駕駛室里。UDFB也是如此。即使是構(gòu)造和文檔最好的UDFB 也會受到一定程度的懷疑,特別是在故障排除事件發(fā)生幾個小時后。構(gòu)造一個好的微控制器函數(shù)的相同規(guī)則適用于UDFB。讓它們簡單,讓它們把一件事做得很好。不要太聰明。相反,要簡潔明了。
如何構(gòu)建UDFB
最困難的任務(wù)之一是定義UDFB的行為。我們必須理解UDFB要執(zhí)行的輸入?yún)?shù)、輸出和任務(wù)。我們還必須了解頂層程序?qū)⑷绾螌嵗?使用或調(diào)用)UDFB。在我看來,這是整個過程中最難的部分,因為編寫UDFB的機制相對簡單。
小貼士 :弗雷德·布魯克斯在他的經(jīng)典著作《 The Mythical Man-Month》中有一句老話。轉(zhuǎn)述一下,它說我們需要計劃一個迭代的設(shè)計過程,“因此計劃扔掉一個;無論如何,你都會這么做。”我希望它不是那樣的,但是我們經(jīng)常需要構(gòu)建并實例化UDFB作為學習經(jīng)驗的一部分。只有通過構(gòu)建第一個原型,我們才能了解它是如何運作的,以及它對更大的軟件項目的影響。
作為示例,我們將構(gòu)建如圖1中突出顯示的UDFB。這個塊被用作狀態(tài)機的一部分。它的作用是充當看門人。如果機器的uiState狀態(tài)變量等于1,并且啟用了該塊,則執(zhí)行該行的其余部分。從C編程的角度來看,這就像一個以uiState為索引的開關(guān)語句。請注意,前綴ui是匈牙利語的無符號整數(shù)表示法。
這種特殊的構(gòu)造導致了一個相對干凈的階梯邏輯。梯級3的英文描述是這樣的:
如果UDFB FBuiEqual被啟用并且機器狀態(tài)(uiState)繼續(xù)
另外,如果主開關(guān)是打開的
同樣,如果瞬時選擇開關(guān)處于前進位置,則切換到狀態(tài)2
否則,如果瞬間選擇開關(guān)處于反向位置,則切換到狀態(tài)4
我們將在此結(jié)束,因為狀態(tài)對于我們的UDFB討論并不重要。也許我們可以在以后的文章中探討狀態(tài)機。相反,關(guān)注UDFB和它正在尋找的兩個條件:是否啟用和值是否匹配。
“設(shè)置輸出線”功能的實用程序
注意,橫檔(rung )從xEqual行而不是ENO行繼續(xù)從UDFB開始。這是一個方便的Arduino PLC IDE功能,稱為“Set Output Line.”。如果我們沒有使用這個選項,就需要一個中間變量來保存eEqual的值,同時還需要第二個梯級來執(zhí)行狀態(tài)改變操作。這將使梯級的數(shù)量增加一倍,從而降低代碼的可讀性。
圖 1 :突出顯示的UDFB在第3行上實例化,其操作類似于C程序中的switch語句。
定義輸入和輸出接口
構(gòu)造UDFB的第一步是確定輸入/輸出接口以及所需的變量。這是使用圖2上半部分所示的局部變量表完成的。觀察有兩個標記為uiA和uiB的無符號整數(shù)(ui)輸入。還有一個布爾(x)輸出名為xEqual。沒有顯示隱含的“rung hanging”EN和ENO I/O。這些元素在圖1中很明顯,它顯示了實例化的UDFB。
小貼士 :正如您所知,PLC可以用幾種不同的IEC 61131-3語言編程。當我們在語言之間切換時,事情就變得有趣了。例如,將塊掛在階梯邏輯梯級上的默認EN和ENO行在所有語言中都不是通用的。很明顯,像結(jié)構(gòu)化文本這樣的語言并沒有圖形化的梯級。因此,“rung hanging”的I/O沒有直接的目的,或者至少我們應(yīng)該說,目的和實現(xiàn)是可以解釋的。Arduino設(shè)計團隊似乎忽略了這些行,例如在結(jié)構(gòu)化文本中調(diào)用EQ函數(shù):OUT:= EQ(TRUE, FALSE);如您所見,EN和ENO行不存在,因為該函數(shù)只分析要比較的兩個值。
對了,還記得我說過的“搭上去就扔了”嗎?UDFB中有一個bug。你永遠不會在階梯邏輯實現(xiàn)中看到它,但它可能是結(jié)構(gòu)化文本的問題。我把問題留給你自己去發(fā)現(xiàn)。提示:我們的UDFB需要多少輸入?yún)?shù)(隱式和顯式)。
定義UDFB操作
圖2所示的表包含兩個局部變量,包括eEN和xisEqual。在第一級,我們有一個equal函數(shù)的實例化。在第2行,我們詢問是否啟用了UDFB,以及兩個值是否相等。請注意,UDFB的操作與原來的相等函數(shù)之間存在細微的差別。根據(jù)Arduino文檔,EQ塊的EN行不涉及操作。對于UDFB,我們放置了一個額外的約束,該約束要求啟用塊以及UDFB求值為true的值相等。
圖 2 :通過定義I/O接口、變量和代碼來構(gòu)造UDFB。
最后
UDFB是PLC編程的一個強大的、必須具備的技術(shù)。UDFB可以簡化代碼,并提供預構(gòu)建和測試模塊的有價值的庫。與此同時,我要再次提醒您為了清晰而編程。不要太聰明!難以理解的UDFB可能會給故障排除過程增加混亂和延遲。這是非常不可取的,因為當我們考慮到生產(chǎn)損失,商譽損失,浪費材料,閑置勞動力以及恢復目標的高加班成本時,PLC的停機是非常昂貴的。
評論