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