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

圖 2 :通過定義I/O接口、變量和代碼來構造UDFB。
最后
UDFB是PLC編程的一個強大的、必須具備的技術。UDFB可以簡化代碼,并提供預構建和測試模塊的有價值的庫。與此同時,我要再次提醒您為了清晰而編程。不要太聰明!難以理解的UDFB可能會給故障排除過程增加混亂和延遲。這是非常不可取的,因為當我們考慮到生產損失,商譽損失,浪費材料,閑置勞動力以及恢復目標的高加班成本時,PLC的停機是非常昂貴的。
評論